@Override protected Iterator<? extends AbstractTraceRegion> getChildren(@Nullable Object object) { if (object == null) return Iterators.emptyIterator(); AbstractTraceRegion casted = (AbstractTraceRegion) object; return casted.getNestedRegions().iterator(); } /**
@Override public String toString() { List<AbstractTraceRegion> nested = getNestedRegions(); String nestedText; if (nested.isEmpty()) nestedText = ""; else nestedText = " nestedRegions={\n " + Joiner.on("\n").join(nested).replace("\n", "\n ") + "\n}"; List<ILocationData> associated = getAssociatedLocations(); String associatedText; if (associated.isEmpty()) associatedText = ""; else associatedText = " associations={\n " + Joiner.on("\n").join(associated).replace("\n", "\n ") + "\n}"; return getClass().getSimpleName() + " [myOffset=" + getMyOffset() + ", myLength=" + getMyLength() + "]" + associatedText + nestedText; }
private int doAnnotateTrace(String input, StringBuilder result, int nextOffset) { if (nextOffset < getMyOffset()) { result.append(input.substring(nextOffset, getMyOffset())); nextOffset = getMyOffset(); } result.append('<'); List<ILocationData> associatedLocations = getAssociatedLocations(); for(int i = 0; i < associatedLocations.size(); i++) { if (i != 0) result.append("/"); ILocationData associatedLocation = associatedLocations.get(i); result.append(associatedLocation.getOffset()).append(':').append(associatedLocation.getLength()); } result.append("["); for(AbstractTraceRegion nested: getNestedRegions()) { nextOffset = nested.doAnnotateTrace(input, result, nextOffset); } if (nextOffset < getMyOffset() + getMyLength()) { result.append(input.substring(nextOffset, getMyOffset() + getMyLength())); nextOffset = getMyOffset() + getMyLength(); } result.append(']'); return nextOffset; }
@Nullable protected AbstractTraceRegion findTraceRegionAt(int offset, boolean includeRegionEnd) { AbstractTraceRegion candidate = getRootTraceRegion(); if (candidate == null || !encloses(candidate, offset, includeRegionEnd)) { // we have an inconsistent state - no candidate matches return null; } outer: while(candidate != null) { List<? extends AbstractTraceRegion> children = candidate.getNestedRegions(); if (children.isEmpty()) { return candidate; } for(AbstractTraceRegion child: children) { if (encloses(child, offset, includeRegionEnd)) { candidate = child; continue outer; } else { if (child.getMyOffset() > offset) { return candidate; } } } return candidate; } return null; }
protected Set<Integer> createSmapInfo(AbstractTraceRegion targetRegion, Set<LineMapping> lineMappings) { Set<Integer> mapped = newHashSet(); for (AbstractTraceRegion nested : targetRegion.getNestedRegions()) { mapped.addAll(createSmapInfo(nested, lineMappings)); } if (targetRegion.isUseForDebugging()) { ILocationData location = targetRegion.getMergedAssociatedLocation(); if (location != null) { final URI path = targetRegion.getAssociatedPath(); if (path != null) { int myLineNumber = targetRegion.getMyLineNumber(); int myEndLineNumber = targetRegion.getMyEndLineNumber(); for (int i = myLineNumber; i <= myEndLineNumber; i++) { if (!mapped.contains(i)) { final LineMapping e = new LineMapping(location.getLineNumber() + 1, i, i, path); lineMappings.add(e); mapped.add(i); } } } } } return mapped; }
protected boolean isConsistentWithParent() { AbstractTraceRegion parent = getParent(); if (parent == null) return true; if (parent.getMyOffset() > getMyOffset()) return false; if (parent.getMyOffset() + parent.getMyLength() < getMyOffset() + getMyLength()) return false; if (parent.getMyLineNumber() > getMyLineNumber()) return false; if (parent.getMyEndLineNumber() < getMyEndLineNumber()) return false; List<AbstractTraceRegion> siblings = parent.getNestedRegions(); if (siblings.size() >= 2 && siblings.get(siblings.size() - 1) == this) { AbstractTraceRegion prev = siblings.get(siblings.size() - 2); if (prev.getMyEndLineNumber() > getMyLineNumber()) { return false; } } return true; }
protected AbstractTraceRegion firstLeafOfCurrent() { while(!current.getNestedRegions().isEmpty()) { AbstractTraceRegion next = current.getNestedRegions().get(0); if (next.getMyOffset() != current.getMyOffset()) { AbstractTraceRegion result = new TemporaryTraceRegion( current.getMyOffset(), next.getMyOffset() - current.getMyOffset(), current.getMyLineNumber(), next.getMyLineNumber(), current.getAssociatedLocations(), current); traversalIndizes.add(-1); expectedOffset = next.getMyOffset(); expectedLine = next.getMyLineNumber(); return result; } traversalIndizes.add(0); current = next; } expectedOffset = current.getMyOffset() + current.getMyLength(); expectedLine = current.getMyEndLineNumber(); return current; } }
return firstLeafOfCurrent(); } else { if (current.getNestedRegions().isEmpty()) current = current.getParent(); int idx = traversalIndizes.removeLast(); while(idx == current.getNestedRegions().size() - 1) { if (expectedOffset != current.getMyOffset() + current.getMyLength()) { traversalIndizes.add(idx); idx = traversalIndizes.removeLast(); if (idx < current.getNestedRegions().size() - 1) { AbstractTraceRegion next = current.getNestedRegions().get(idx + 1); if (next.getMyOffset() < expectedOffset) { return endOfData();
public void writeRegion(AbstractTraceRegion region, Callback<AbstractTraceRegion, ILocationData> callback) throws IOException { callback.doWriteRegion(region.getMyOffset(), region.getMyLength(), region.getMyLineNumber(), region.getMyEndLineNumber(), region.getAssociatedLocations(), region.getNestedRegions()); }