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