anchor.diff:      printer.PrintBrInd 2 "public NodeUserData PersistentUserData { get; private set; }"
   
       printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "public IPsiServices GetPsiServices()"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "return default(IPsiServices);"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "public IPsiModule GetPsiModule()"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "return default(IPsiModule);"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "public IPsiSourceFile GetSourceFile()"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "return default(IPsiSourceFile);"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "public ReferenceCollection GetFirstClassReferences()"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "return ReferenceCollection.Empty;"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "public void ProcessDescendantsForResolve(IRecursiveElementProcessor processor)"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "return;"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "public T GetContainingNode<T>(bool returnThis = false) where T : ITreeNode"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "return default(T);"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "public bool Contains(ITreeNode other)"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "if (this.FirstChild != null)"
  +    printer.PrintBrInd 4 "return this.Children().Contains(other);"
  +    printer.PrintBrInd 3 "else"
  +    printer.PrintBrInd 4 "return this == other;"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "public bool IsPhysical()"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "return true;"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "public bool IsValid()"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "return true;"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "public bool IsFiltered()"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "return true;"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "private int curRange = 0;"
  +    printer.PrintBrInd 2 "//Calls by external code"
  +    printer.PrintBrInd 2 "public DocumentRange GetNavigationRange()"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "List<DocumentRange> ranges = UserData.GetData(Constants.Ranges);"
  +    printer.PrintBrInd 3 "if (ranges == null || ranges.Count == 0)"
  +    printer.PrintBrInd 4 "return default(DocumentRange);"
  +    printer.PrintBr ""
  +    printer.PrintBrInd 3 "if (curRange >= ranges.Count)"
  +    printer.PrintBrInd 4 "curRange = 0;"
  +    printer.PrintBrInd 3 "return ranges[curRange++];"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "public TreeOffset GetTreeStartOffset()"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "List<DocumentRange> ranges = UserData.GetData(Constants.Ranges);"
  +    printer.PrintBrInd 3 "if (ranges == null || ranges.Count == 0)"
  +    printer.PrintBrInd 4 "return TreeOffset.InvalidOffset;"
  +    printer.PrintBr ""
  +    printer.PrintBrInd 3 "return new TreeOffset(ranges[0].TextRange.StartOffset);"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "public int GetTextLength()"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "return GetText(new StringBuilder()).Length;"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "public StringBuilder GetText(StringBuilder to)"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "List<DocumentRange> ranges = UserData.GetData(Constants.Ranges);"
  +    printer.PrintBrInd 3 "foreach (DocumentRange range in ranges)"
  +    printer.PrintBrInd 3 "{"
  +    printer.PrintBrInd 4 "to.Append(range.GetText());"
  +    printer.PrintBrInd 3 "}"
  +    printer.PrintBrInd 3 "return to;"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "public IBuffer GetTextAsBuffer()"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "return new StringBuffer(GetText());"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "public string GetText()"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "return GetText(new StringBuilder()).ToString();"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "public ITreeNode FindNodeAt(TreeTextRange treeTextRange)"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "IDocument doc = UserData.GetData(Constants.Document);"
  +    printer.PrintBrInd 3 "var needRange = new DocumentRange(doc, GetTextRange(treeTextRange));"
  +    printer.PrintBrInd 3 "List<DocumentRange> ranges = UserData.GetData(Constants.Ranges);"
  +    printer.PrintBr  ""
  +    printer.PrintBrInd 3 "bool exists = ranges.Exists(range => range.Contains(needRange));"
  +    printer.PrintBr ""
  +    printer.PrintBrInd 3 "if (!exists)"
  +    printer.PrintBrInd 4 "return null;"
  +    printer.PrintBr ""
  +    printer.PrintBrInd 3 "if (FirstChild == null)"
  +    printer.PrintBrInd 4 "return this;"
  +    printer.PrintBr ""
  +    printer.PrintBrInd 3 "for (ITreeNode child = this.FirstChild; child != null; child = child.NextSibling)"
  +    printer.PrintBrInd 3 "{"
  +    printer.PrintBrInd 4 "ITreeNode node = child.FindNodeAt(treeTextRange);"
  +    printer.PrintBrInd 4 "if (node != null)"
  +    printer.PrintBrInd 5 "return node;"
  +    printer.PrintBrInd 3 "}"
  +    printer.PrintBr ""
  +    printer.PrintBrInd 3 "return null;"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "public ICollection<ITreeNode> FindNodesAt(TreeOffset treeTextOffset)"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "return default(ICollection<ITreeNode>);"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "public ITreeNode FindTokenAt(TreeOffset treeTextOffset)"
  +    printer.PrintBrInd 2 "{"
  +    printer.PrintBrInd 3 "return null;"
  +    printer.PrintBrInd 2 "}"
  +    printer.PrintBr ""
  +
  +    printer.PrintBrInd 2 "#endregion"
  +    printer.PrintBr ""
  +
       printer.PrintBrInd 2 "public %s (string ycTokName, int ycTokNumber)" nameOfClass
       printer.PrintBrInd 2 "{"
       printer.PrintBrInd 3 "UserData = dataHolder.GetNodeUserData(this);"
  
positive.code:     printer.PrintBrInd 4 "UserData.PutData(Constants.Document, ranges[0].Document);"
      printer.PrintBrInd 4 "UserData.PutData(Constants.Ranges, ranges);"
      printer.PrintBrInd 3 "}"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public IPsiServices GetPsiServices()"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "return default(IPsiServices);"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public IPsiModule GetPsiModule()"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "return default(IPsiModule);"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public IPsiSourceFile GetSourceFile()"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "return default(IPsiSourceFile);"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public ReferenceCollection GetFirstClassReferences()"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "return ReferenceCollection.Empty;"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public void ProcessDescendantsForResolve(IRecursiveElementProcessor processor)"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "return;"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public T GetContainingNode<T>(bool returnThis = false) where T : ITreeNode"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "return default(T);"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public bool Contains(ITreeNode other)"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "if (this.FirstChild != null)"
      printer.PrintBrInd 4 "return this.Children().Contains(other);"
      printer.PrintBrInd 3 "else"
      printer.PrintBrInd 4 "return this == other;"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public bool IsPhysical()"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "return true;"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public bool IsValid()"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "return true;"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public bool IsStub()"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "return false;"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public bool IsFiltered()"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "return true;"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "private int curRange = 0;"
      printer.PrintBrInd 2 "//Calls by external code"
      printer.PrintBrInd 2 "public DocumentRange GetNavigationRange()"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "List<DocumentRange> ranges = UserData.GetData(Constants.Ranges);"
      printer.PrintBrInd 3 "if (ranges == null || ranges.Count == 0)"
      printer.PrintBrInd 4 "return default(DocumentRange);"
      printer.PrintBr ""
      printer.PrintBrInd 3 "if (curRange >= ranges.Count)"
      printer.PrintBrInd 4 "curRange = 0;"
      printer.PrintBrInd 3 "return ranges[curRange++];"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public TreeOffset GetTreeStartOffset()"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "List<DocumentRange> ranges = UserData.GetData(Constants.Ranges);"
      printer.PrintBrInd 3 "if (ranges == null || ranges.Count == 0)"
      printer.PrintBrInd 4 "return TreeOffset.InvalidOffset;"
      printer.PrintBr ""
      printer.PrintBrInd 3 "return new TreeOffset(ranges[0].TextRange.StartOffset);"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public int GetTextLength()"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "return GetText(new StringBuilder()).Length;"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public StringBuilder GetText(StringBuilder to)"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "List<DocumentRange> ranges = UserData.GetData(Constants.Ranges);"
      printer.PrintBrInd 3 "foreach (DocumentRange range in ranges)"
      printer.PrintBrInd 3 "{"
      printer.PrintBrInd 4 "to.Append(range.GetText());"
      printer.PrintBrInd 3 "}"
      printer.PrintBrInd 3 "return to;"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public IBuffer GetTextAsBuffer()"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "return new StringBuffer(GetText());"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public string GetText()"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "return GetText(new StringBuilder()).ToString();"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public ITreeNode FindNodeAt(TreeTextRange treeTextRange)"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "IDocument doc = UserData.GetData(Constants.Document);"
      printer.PrintBrInd 3 "var needRange = new DocumentRange(doc, GetTextRange(treeTextRange));"
      printer.PrintBrInd 3 "List<DocumentRange> ranges = UserData.GetData(Constants.Ranges);"
      printer.PrintBr  ""
      printer.PrintBrInd 3 "bool exists = ranges.Exists(range => range.Contains(needRange));"
      printer.PrintBr ""
      printer.PrintBrInd 3 "if (!exists)"
      printer.PrintBrInd 4 "return null;"
      printer.PrintBr ""
      printer.PrintBrInd 3 "if (FirstChild == null)"
      printer.PrintBrInd 4 "return this;"
      printer.PrintBr ""
      printer.PrintBrInd 3 "for (ITreeNode child = this.FirstChild; child != null; child = child.NextSibling)"
      printer.PrintBrInd 3 "{"
      printer.PrintBrInd 4 "ITreeNode node = child.FindNodeAt(treeTextRange);"
      printer.PrintBrInd 4 "if (node != null)"
      printer.PrintBrInd 5 "return node;"
      printer.PrintBrInd 3 "}"
      printer.PrintBr ""
      printer.PrintBrInd 3 "return null;"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public ICollection<ITreeNode> FindNodesAt(TreeOffset treeTextOffset)"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "return default(ICollection<ITreeNode>);"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
      printer.PrintBrInd 2 "public ITreeNode FindTokenAt(TreeOffset treeTextOffset)"
      printer.PrintBrInd 2 "{"
      printer.PrintBrInd 3 "return null;"
      printer.PrintBrInd 2 "}"
      printer.PrintBr ""
  
  
negative.code:     printer.PrintBrInd 1 "{"
  
      printer.PrintBrInd 2 "private NodeUserDataHolder dataHolder = new NodeUserDataHolder();"
      printer.PrintBr ""
      printer.PrintBrInd 2 "#region ITreeNode members"
      printer.PrintBr ""
      
  
      printer.PrintBrInd 2 "public ITreeNode Parent"
      printer.PrintBrInd 2 "{"
  