  Line 46) a.getBegin().compareTo(b.getBegin()) ==> com.github.javaparser.Position.compareTo(com.github.javaparser.Position)
  Line 46) a.getBegin() ==> com.github.javaparser.ast.Node.getBegin()
  Line 46) b.getBegin() ==> com.github.javaparser.ast.Node.getBegin()
  Line 121) range.withBegin(begin) ==> com.github.javaparser.Range.withBegin(com.github.javaparser.Position)
  Line 129) range.withEnd(end) ==> com.github.javaparser.Range.withEnd(com.github.javaparser.Position)
  Line 158) this.comment.setCommentedNode(null) ==> com.github.javaparser.ast.comments.Comment.setCommentedNode(com.github.javaparser.ast.Node)
  Line 162) this.comment.setCommentedNode(this) ==> com.github.javaparser.ast.comments.Comment.setCommentedNode(com.github.javaparser.ast.Node)
  Line 175) setComment(new LineComment(comment)) ==> com.github.javaparser.ast.Node.setComment(com.github.javaparser.ast.comments.Comment)
  Line 184) setComment(new BlockComment(comment)) ==> com.github.javaparser.ast.Node.setComment(com.github.javaparser.ast.comments.Comment)
  Line 195) accept(visitor, null) ==> com.github.javaparser.ast.Node.accept(com.github.javaparser.ast.visitor.VoidVisitor<A>, A)
  Line 196) visitor.getSource() ==> com.github.javaparser.ast.visitor.DumpVisitor.getSource()
  Line 201) accept(visitor, null) ==> com.github.javaparser.ast.Node.accept(com.github.javaparser.ast.visitor.VoidVisitor<A>, A)
  Line 202) visitor.getSource() ==> com.github.javaparser.ast.visitor.DumpVisitor.getSource()
  Line 207) toString().hashCode() ==> java.lang.String.hashCode()
  Line 207) toString() ==> com.github.javaparser.ast.Node.toString()
  Line 215) EqualsVisitor.equals(this, (Node) obj) ==> com.github.javaparser.ast.visitor.EqualsVisitor.equals(com.github.javaparser.ast.Node, com.github.javaparser.ast.Node)
  Line 220) this.accept(new CloneVisitor(), null) ==> com.github.javaparser.ast.Node.accept(com.github.javaparser.ast.visitor.GenericVisitor<R, A>, A)
  Line 231) classType.isAssignableFrom(parent.getClass()) ==> java.lang.Class.isAssignableFrom(java.lang.Class<? extends java.lang.Object>)
  Line 231) parent.getClass() ==> java.lang.Object.getClass()
  Line 243) range.contains(other.range) ==> com.github.javaparser.Range.contains(com.github.javaparser.Range)
  Line 247) orphanComments.add(comment) ==> java.util.List.add(E)
  Line 248) comment.setParentNode(this) ==> com.github.javaparser.ast.Node.setParentNode(com.github.javaparser.ast.Node)
  Line 276) comments.addAll(getOrphanComments()) ==> java.util.List.addAll(java.util.Collection<? extends E>)
  Line 276) getOrphanComments() ==> com.github.javaparser.ast.Node.getOrphanComments()
  Line 278) getChildrenNodes() ==> com.github.javaparser.ast.Node.getChildrenNodes()
  Line 279) child.getComment() ==> com.github.javaparser.ast.Node.getComment()
  Line 280) comments.add(child.getComment()) ==> java.util.List.add(E)
  Line 280) child.getComment() ==> com.github.javaparser.ast.Node.getComment()
  Line 282) comments.addAll(child.getAllContainedComments()) ==> java.util.List.addAll(java.util.Collection<? extends E>)
  Line 282) child.getAllContainedComments() ==> com.github.javaparser.ast.Node.getAllContainedComments()
  Line 297) this.parentNode.childrenNodes.remove(this) ==> java.util.List.remove(java.lang.Object)
  Line 302) this.parentNode.childrenNodes.add(this) ==> java.util.List.add(E)
  Line 309) current.setParentNode(this) ==> com.github.javaparser.ast.Node.setParentNode(com.github.javaparser.ast.Node)
  Line 316) childNode.setParentNode(this) ==> com.github.javaparser.ast.Node.setParentNode(com.github.javaparser.ast.Node)
  Line 324) range.isAfter(position) ==> com.github.javaparser.Range.isAfter(com.github.javaparser.Position)
  Line 328) range.isBefore(position) ==> com.github.javaparser.Range.isBefore(com.github.javaparser.Position)
  Line 336) getParentNodeOfType(CompilationUnit.class) ==> com.github.javaparser.ast.Node.getParentNodeOfType(java.lang.Class<T>)
  Line 338) parentNode.addImport(clazz) ==> com.github.javaparser.ast.CompilationUnit.addImport(java.lang.Class<?>)
  Line 349) getChildrenNodes() ==> com.github.javaparser.ast.Node.getChildrenNodes()
  Line 350) clazz.isInstance(child) ==> java.lang.Class.isInstance(java.lang.Object)
  Line 351) nodes.add(clazz.cast(child)) ==> java.util.List.add(E)
  Line 351) clazz.cast(child) ==> java.lang.Class.cast(java.lang.Object)
  Line 353) nodes.addAll(child.getNodesByType(clazz)) ==> java.util.List.addAll(java.util.Collection<? extends E>)
  Line 353) child.getNodesByType(clazz) ==> com.github.javaparser.ast.Node.getNodesByType(java.lang.Class<N>)
  Line 373) userData.get(key) ==> java.util.IdentityHashMap.get(java.lang.Object)
  Line 394) userData.put(key, object) ==> java.util.IdentityHashMap.put(K, V)
