@Override
 protected HighlightedTextWriter hilightSpecial(
     String text, HighlightSpecialType type, String specialValue, HighlightData data) {
   HighlightData ndata = new HighlightData();
   ndata.merge(data);
   ndata.subtype = type;
   ndata.specialValue = specialValue;
   start(ndata, HighlightType.SPECIAL);
   appendNoHilight(text);
   return end(HighlightType.SPECIAL);
 }
 @Override
 public HighlightedTextWriter append(String str, long offset, long fileOffset) {
   Highlighting h = null;
   if (hilight) {
     HighlightData data = new HighlightData();
     data.offset = offset;
     data.fileOffset = fileOffset;
     h = new Highlighting(sb.length() - newLineCount, data, HighlightType.OFFSET, str);
     instructionHilights.add(h);
   }
   appendToSb(str);
   if (h != null) {
     h.len = sb.length() - newLineCount - h.startPos;
   }
   return this;
 }
 @Override
 public HighlightedTextWriter appendWithData(String str, HighlightData data) {
   Highlighting h = null;
   if (!offsets.empty()) {
     GraphSourceItemPosition itemPos = offsets.peek();
     GraphSourceItem src = itemPos.graphSourceItem;
     int pos = itemPos.position;
     if (src != null && hilight) {
       HighlightData ndata = new HighlightData();
       ndata.merge(itemPos.data);
       ndata.merge(data);
       ndata.offset = src.getAddress() + pos;
       ndata.fileOffset = src.getFileOffset();
       if (itemPos.startLineItem != null) {
         ndata.firstLineOffset = itemPos.startLineItem.getLineOffset();
       }
       h = new Highlighting(sb.length() - newLineCount, ndata, HighlightType.OFFSET, str);
       instructionHilights.add(h);
     }
   }
   appendToSb(str);
   if (h != null) {
     h.len = sb.length() - newLineCount - h.startPos;
   }
   return this;
 }
 /**
  * Highlights specified text as trait by adding special tags
  *
  * @param index Trait index
  * @return HighlightedTextWriter
  */
 @Override
 public HighlightedTextWriter startTrait(long index) {
   HighlightData data = new HighlightData();
   data.index = index;
   return start(data, HighlightType.TRAIT);
 }
 @Override
 public HighlightedTextWriter startClass(String className) {
   HighlightData data = new HighlightData();
   data.localName = className;
   return start(data, HighlightType.CLASS);
 }
 /**
  * Highlights specified text as class by adding special tags
  *
  * @param index Class index
  * @return HighlightedTextWriter
  */
 @Override
 public HighlightedTextWriter startClass(long index) {
   HighlightData data = new HighlightData();
   data.index = index;
   return start(data, HighlightType.CLASS);
 }
 @Override
 public HighlightedTextWriter startFunction(String name) {
   HighlightData data = new HighlightData();
   data.localName = name;
   return start(data, HighlightType.METHOD);
 }
 /**
  * Highlights specified text as method by adding special tags
  *
  * @param index MethodInfo index
  * @return HighlightedTextWriter
  */
 @Override
 public HighlightedTextWriter startMethod(long index) {
   HighlightData data = new HighlightData();
   data.index = index;
   return start(data, HighlightType.METHOD);
 }