  Line 48) setName(name) ==> com.github.javaparser.ast.expr.AnnotationExpr.setName(com.github.javaparser.ast.expr.NameExpr)
  Line 49) setPairs(pairs) ==> com.github.javaparser.ast.expr.NormalAnnotationExpr.setPairs(java.util.List<com.github.javaparser.ast.expr.MemberValuePair>)
  Line 54) setName(name) ==> com.github.javaparser.ast.expr.AnnotationExpr.setName(com.github.javaparser.ast.expr.NameExpr)
  Line 55) setPairs(pairs) ==> com.github.javaparser.ast.expr.NormalAnnotationExpr.setPairs(java.util.List<com.github.javaparser.ast.expr.MemberValuePair>)
  Line 60) v.visit(this, arg) ==> com.github.javaparser.ast.visitor.GenericVisitor.visit(com.github.javaparser.ast.expr.NormalAnnotationExpr, A)
  Line 65) v.visit(this, arg) ==> com.github.javaparser.ast.visitor.VoidVisitor.visit(com.github.javaparser.ast.expr.NormalAnnotationExpr, A)
  Line 69) ensureNotNull(pairs) ==> com.github.javaparser.utils.Utils.ensureNotNull(java.util.List<T>)
  Line 75) setAsParentNodeOf(this.pairs) ==> com.github.javaparser.ast.Node.setAsParentNodeOf(java.util.List<? extends com.github.javaparser.ast.Node>)
  Line 85) addPair(key, name(value)) ==> com.github.javaparser.ast.expr.NormalAnnotationExpr.addPair(java.lang.String, com.github.javaparser.ast.expr.NameExpr)
  Line 85) name(value) ==> com.github.javaparser.ast.expr.NameExpr.name(java.lang.String)
  Line 95) getPairs().add(memberValuePair) ==> java.util.List.add(E)
  Line 95) getPairs() ==> com.github.javaparser.ast.expr.NormalAnnotationExpr.getPairs()
  Line 96) memberValuePair.setParentNode(this) ==> com.github.javaparser.ast.Node.setParentNode(com.github.javaparser.ast.Node)
