137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti/* 237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Copyright (C) 2007-2010 Júlio Vilmar Gesser. 337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Copyright (C) 2011, 2013-2015 The JavaParser Team. 437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * This file is part of JavaParser. 637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * JavaParser can be used either under the terms of 837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * a) the GNU Lesser General Public License as published by 937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * the Free Software Foundation, either version 3 of the License, or 1037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * (at your option) any later version. 1137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * b) the terms of the Apache License 1237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 1337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * You should have received a copy of both licenses in LICENCE.LGPL and 1437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * LICENCE.APACHE. Please refer to those files for details. 1537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 1637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * JavaParser is distributed in the hope that it will be useful, 1737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * but WITHOUT ANY WARRANTY; without even the implied warranty of 1837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * GNU Lesser General Public License for more details. 2037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 2137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 2237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassettipackage com.github.javaparser.ast; 2337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 2437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassettiimport java.util.Iterator; 2537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassettiimport java.util.LinkedList; 2637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassettiimport java.util.List; 2737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 2837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassettiimport com.github.javaparser.ast.comments.Comment; 2937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassettiimport com.github.javaparser.ast.visitor.*; 3037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 3137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti/** 3237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Abstract class for all nodes of the AST. 3337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 3437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Each Node can have one associated comment which describe it and 3537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * a number of "orphan comments" which it contains but are not specifically 3637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * associated to any element. 3737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 3837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @author Julio Vilmar Gesser 3937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 4037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassettipublic abstract class Node implements Cloneable { 4137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 4237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti private int beginLine; 4337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 4437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti private int beginColumn; 4537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 4637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti private int endLine; 4737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 4837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti private int endColumn; 4937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 5037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti private Node parentNode; 5137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 5237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti private List<Node> childrenNodes = new LinkedList<Node>(); 5337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti private List<Comment> orphanComments = new LinkedList<Comment>(); 5437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 5537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 5637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * This attribute can store additional information from semantic analysis. 5737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 5837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti private Object data; 5937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 6037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti private Comment comment; 6137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 6237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public Node() { 6337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 6437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 6537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public Node(final int beginLine, final int beginColumn, final int endLine, final int endColumn) { 6637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti this.beginLine = beginLine; 6737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti this.beginColumn = beginColumn; 6837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti this.endLine = endLine; 6937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti this.endColumn = endColumn; 7037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 7137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 7237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 7337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Accept method for visitor support. 7437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 7537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @param <R> 7637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * the type the return value of the visitor 7737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @param <A> 7837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * the type the argument passed to the visitor 7937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @param v 8037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * the visitor implementation 8137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @param arg 8237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * the argument passed to the visitor 8337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @return the result of the visit 8437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 8537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public abstract <R, A> R accept(GenericVisitor<R, A> v, A arg); 8637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 8737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 8837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Accept method for visitor support. 8937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 9037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @param <A> 9137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * the type the argument passed for the visitor 9237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @param v 9337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * the visitor implementation 9437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @param arg 9537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * any value relevant for the visitor 9637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 9737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public abstract <A> void accept(VoidVisitor<A> v, A arg); 9837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 9937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 10037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Return the begin column of this node. 10137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 10237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @return the begin column of this node 10337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 10437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public final int getBeginColumn() { 10537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return beginColumn; 10637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 10737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 10837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 10937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Return the begin line of this node. 11037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 11137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @return the begin line of this node 11237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 11337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public final int getBeginLine() { 11437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return beginLine; 11537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 11637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 11737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 11837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * This is a comment associated with this node. 11937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 12037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @return comment property 12137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 12237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public final Comment getComment() { 12337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return comment; 12437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 12537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 12637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 12737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Use this to retrieve additional information associated to this node. 12837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 12937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @return data property 13037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 13137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public final Object getData() { 13237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return data; 13337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 13437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 13537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 13637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Return the end column of this node. 13737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 13837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @return the end column of this node 13937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 14037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public final int getEndColumn() { 14137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return endColumn; 14237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 14337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 14437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 14537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Return the end line of this node. 14637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 14737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @return the end line of this node 14837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 14937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public final int getEndLine() { 15037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return endLine; 15137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 15237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 15337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 15437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Sets the begin column of this node. 15537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 15637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @param beginColumn 15737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * the begin column of this node 15837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 15937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public final void setBeginColumn(final int beginColumn) { 16037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti this.beginColumn = beginColumn; 16137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 16237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 16337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 16437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Sets the begin line of this node. 16537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 16637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @param beginLine 16737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * the begin line of this node 16837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 16937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public final void setBeginLine(final int beginLine) { 17037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti this.beginLine = beginLine; 17137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 17237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 17337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 17437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Use this to store additional information to this node. 17537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 17637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @param comment to be set 17737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 17837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public final void setComment(final Comment comment) { 17937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti if (comment != null && (this instanceof Comment)) { 18037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti throw new RuntimeException("A comment can not be commented"); 18137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 18237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti if (this.comment != null) 18337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti { 18437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti this.comment.setCommentedNode(null); 18537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 18637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti this.comment = comment; 18737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti if (comment != null) { 18837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti this.comment.setCommentedNode(this); 18937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 19037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 19137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 19237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 19337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Use this to store additional information to this node. 19437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 19537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @param data to be set 19637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 19737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public final void setData(final Object data) { 19837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti this.data = data; 19937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 20037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 20137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 20237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Sets the end column of this node. 20337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 20437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @param endColumn 20537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * the end column of this node 20637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 20737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public final void setEndColumn(final int endColumn) { 20837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti this.endColumn = endColumn; 20937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 21037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 21137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 21237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Sets the end line of this node. 21337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 21437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @param endLine 21537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * the end line of this node 21637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 21737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public final void setEndLine(final int endLine) { 21837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti this.endLine = endLine; 21937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 22037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 22137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 22237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Return the String representation of this node. 22337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 22437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @return the String representation of this node 22537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 22637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti @Override 22737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public final String toString() { 22837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti final DumpVisitor visitor = new DumpVisitor(); 22937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti accept(visitor, null); 23037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return visitor.getSource(); 23137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 23237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 23337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public final String toStringWithoutComments() { 23437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti final DumpVisitor visitor = new DumpVisitor(false); 23537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti accept(visitor, null); 23637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return visitor.getSource(); 23737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 23837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 23937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti @Override 24037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public final int hashCode() { 24137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return toString().hashCode(); 24237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 24337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 24437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti @Override 24537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public boolean equals(final Object obj) { 24637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti if (obj == null || !(obj instanceof Node)) { 24737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return false; 24837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 24937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return EqualsVisitor.equals(this, (Node) obj); 25037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 25137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 25237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti @Override 25337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public Node clone() { 25437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return this.accept(new CloneVisitor(), null); 25537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 25637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 25737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public Node getParentNode() { 25837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return parentNode; 25937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 26037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 26137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public List<Node> getChildrenNodes() { 26237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return childrenNodes; 26337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 26437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 26537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public boolean contains(Node other) { 26637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti if (getBeginLine() > other.getBeginLine()) return false; 26737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti if (getBeginLine() == other.getBeginLine() && getBeginColumn() > other.getBeginColumn()) return false; 26837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti if (getEndLine() < other.getEndLine()) return false; 26937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti if (getEndLine() == other.getEndLine() && getEndColumn() < other.getEndColumn()) return false; 27037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return true; 27137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 27237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 27337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public void addOrphanComment(Comment comment) { 27437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti orphanComments.add(comment); 27537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti comment.setParentNode(this); 27637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 27737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 27837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 27937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * This is a list of Comment which are inside the node and are not associated 28037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * with any meaningful AST Node. 28137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 28237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * For example, comments at the end of methods (immediately before the parenthesis) 28337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * or at the end of CompilationUnit are orphan comments. 28437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 28537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * When more than one comments preceed a statement, the one immediately preceeding it 28637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * it is associated with the statements, while the others are "orphan". 28737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @return all comments that cannot be attributed to a concept 28837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 28937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public List<Comment> getOrphanComments() { 29037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return orphanComments; 29137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 29237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 29337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 29437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * This is the list of Comment which are contained in the Node either because 29537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * they are properly associated to one of its children or because they are floating 29637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * around inside the Node 29737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @return all Comments within the node as a list 29837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 29937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public List<Comment> getAllContainedComments() { 30037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti List<Comment> comments = new LinkedList<Comment>(); 30137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti comments.addAll(getOrphanComments()); 30237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 30337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti for (Node child : getChildrenNodes()) { 30437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti if (child.getComment() != null) { 30537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti comments.add(child.getComment()); 30637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 30737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti comments.addAll(child.getAllContainedComments()); 30837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 30937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 31037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return comments; 31137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 31237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 31337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti /** 31437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * Assign a new parent to this node, removing it 31537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * from the list of children of the previous parent, if any. 31637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * 31737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti * @param parentNode node to be set as parent 31837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti */ 31937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public void setParentNode(Node parentNode) { 32037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti // remove from old parent, if any 32137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti if (this.parentNode != null) { 32237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti this.parentNode.childrenNodes.remove(this); 32337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 32437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti this.parentNode = parentNode; 32537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti // add to new parent, if any 32637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti if (this.parentNode != null) { 32737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti this.parentNode.childrenNodes.add(this); 32837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 32937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 33037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 33137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti protected void setAsParentNodeOf(List<? extends Node> childNodes) { 33237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti if (childNodes != null) { 33337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti Iterator<? extends Node> it = childNodes.iterator(); 33437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti while (it.hasNext()) { 33537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti Node current = it.next(); 33637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti current.setParentNode(this); 33737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 33837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 33937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 34037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 34137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti protected void setAsParentNodeOf(Node childNode) { 34237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti if (childNode != null) { 34337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti childNode.setParentNode(this); 34437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 34537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 34637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 34737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public static final int ABSOLUTE_BEGIN_LINE = -1; 34837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public static final int ABSOLUTE_END_LINE = -2; 34937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 35037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public boolean isPositionedAfter(int line, int column) { 35137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti if (line == ABSOLUTE_BEGIN_LINE) return true; 35237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti if (getBeginLine() > line) { 35337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return true; 35437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } else if (getBeginLine() == line) { 35537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return getBeginColumn() > column; 35637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } else { 35737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return false; 35837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 35937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 36037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 36137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public boolean isPositionedBefore(int line, int column) { 36237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti if (line == ABSOLUTE_END_LINE) return true; 36337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti if (getEndLine() < line) { 36437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return true; 36537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } else if (getEndLine() == line) { 36637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return getEndColumn() < column; 36737f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } else { 36837f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return false; 36937f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 37037f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 37137f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti 37237f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti public boolean hasComment() 37337f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti { 37437f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti return comment != null; 37537f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti } 37637f93be6476b00be051173d0cde614fc8a3677e5Federico Tomassetti} 377