/*
* Copyright (c) 2016 Chris Newland.
* Licensed under https://github.com/AdoptOpenJDK/jitwatch/blob/master/LICENSE-BSD
* Instructions: https://github.com/AdoptOpenJDK/jitwatch/wiki
*/
package org.adoptopenjdk.jitwatch.model.bytecode;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.DEBUG_LOGGING_BYTECODE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_COLON;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_NEWLINE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_SPACE;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class BytecodeAnnotationList
{
private static final Logger logger = LoggerFactory.getLogger(BytecodeAnnotationList.class);
private Map<Integer, List<LineAnnotation>> annotationMap = new TreeMap<>();
public void addAnnotation(int bci, LineAnnotation annotation)
{
if (DEBUG_LOGGING_BYTECODE)
{
logger.debug("BCI: {} Annotation: {}", bci, annotation.getAnnotation());
}
List<LineAnnotation> existingAnnotations = annotationMap.get(bci);
if (existingAnnotations == null)
{
existingAnnotations = new ArrayList<>();
annotationMap.put(bci, existingAnnotations);
}
if (!existingAnnotations.contains(annotation))
{
existingAnnotations.add(annotation);
}
else if (DEBUG_LOGGING_BYTECODE)
{
logger.debug("suppressed duplicate LineAnnotation {} {}", bci, annotation.toString());
}
}
public List<LineAnnotation> getAnnotationsForBCI(int bci)
{
return annotationMap.get(bci);
}
public boolean hasAnnotationsForBCI(int bci)
{
return annotationMap.containsKey(bci);
}
public void clear()
{
annotationMap.clear();
}
public int annotatedLineCount()
{
return annotationMap.size();
}
public Set<Map.Entry<Integer, List<LineAnnotation>>> getEntries()
{
return annotationMap.entrySet();
}
@Override
public String toString()
{
StringBuilder builder = new StringBuilder();
for (Map.Entry<Integer, List<LineAnnotation>> entry : annotationMap.entrySet())
{
for (LineAnnotation annotation : entry.getValue())
{
builder.append(entry.getKey()).append(S_SPACE).append(S_COLON).append(S_SPACE);
builder.append(annotation.toString()).append(S_NEWLINE).append(S_NEWLINE);
}
}
return builder.toString();
}
}