1 /* Generated By:JJTree: Do not edit this line. Node.java */
2
3 package net.sourceforge.pmd.lang.ast;
4
5 import java.util.List;
6
7 import net.sourceforge.pmd.lang.dfa.DataFlowNode;
8
9 import org.jaxen.JaxenException;
10 import org.w3c.dom.Document;
11
12 /* All AST nodes must implement this interface. It provides basic
13 machinery for constructing the parent and child relationships
14 between nodes. */
15
16 public interface Node {
17
18 /**
19 * This method is called after the node has been made the current
20 * node. It indicates that child nodes can now be added to it.
21 */
22 void jjtOpen();
23
24 /**
25 * This method is called after all the child nodes have been
26 * added.
27 */
28 void jjtClose();
29
30 /**
31 * This pair of methods are used to inform the node of its
32 * parent.
33 */
34 void jjtSetParent(Node parent);
35
36 Node jjtGetParent();
37
38 /**
39 * This method tells the node to add its argument to the node's
40 * list of children.
41 */
42 void jjtAddChild(Node child, int index);
43
44 /**
45 * This method returns a child node. The children are numbered
46 * from zero, left to right.
47 *
48 * @param index the child index. Must be nonnegative and less than
49 * {@link #jjtGetNumChildren}.
50 */
51 Node jjtGetChild(int index);
52
53 /**
54 * Return the number of children the node has.
55 */
56 int jjtGetNumChildren();
57
58 int jjtGetId();
59
60 String getImage();
61
62 void setImage(String image);
63
64 boolean hasImageEqualTo(String image);
65
66 int getBeginLine();
67
68 int getBeginColumn();
69
70 int getEndLine();
71
72 int getEndColumn();
73
74 DataFlowNode getDataFlowNode();
75
76 void setDataFlowNode(DataFlowNode dataFlowNode);
77
78 boolean isFindBoundary();
79
80 Node getNthParent(int n);
81
82 <T> T getFirstParentOfType(Class<T> parentType);
83
84 <T> List<T> getParentsOfType(Class<T> parentType);
85
86 /**
87 * Traverses the children to find all the instances of type childType.
88 *
89 * @see #findDescendantsOfType(Class) if traversal of the entire tree is needed.
90 *
91 * @param childType class which you want to find.
92 * @return List of all children of type childType. Returns an empty list if none found.
93 */
94 <T> List<T> findChildrenOfType(Class<T> childType);
95
96 /**
97 * Traverses down the tree to find all the descendant instances of type descendantType.
98 *
99 * @param targetType class which you want to find.
100 * @return List of all children of type targetType. Returns an empty list if none found.
101 */
102 <T> List<T> findDescendantsOfType(Class<T> targetType);
103
104 /**
105 * Traverses down the tree to find all the descendant instances of type descendantType.
106 *
107 * @param targetType class which you want to find.
108 * @param results list to store the matching descendants
109 * @param crossFindBoundaries if <code>false</code>, recursion stops for nodes for which {@link #isFindBoundary()} is <code>true</code>
110 */
111 <T> void findDescendantsOfType(Class<T> targetType, List<T> results, boolean crossFindBoundaries);
112
113 /**
114 * Traverses the children to find the first instance of type childType.
115 *
116 * @see #getFirstDescendantOfType(Class) if traversal of the entire tree is needed.
117 *
118 * @param childType class which you want to find.
119 * @return Node of type childType. Returns <code>null</code> if none found.
120 */
121 <T> T getFirstChildOfType(Class<T> childType);
122
123 /**
124 * Traverses down the tree to find the first descendant instance of type descendantType.
125 *
126 * @param descendantType class which you want to find.
127 * @return Node of type descendantType. Returns <code>null</code> if none found.
128 */
129 <T> T getFirstDescendantOfType(Class<T> descendantType);
130
131 /**
132 * Finds if this node contains a descendant of the given type.
133 *
134 * @param type the node type to search
135 * @return <code>true</code> if there is at least one descendant of the given type
136 */
137 <T> boolean hasDescendantOfType(Class<T> type);
138
139 /**
140 * Returns all the nodes matching the xpath expression.
141 *
142 * @param xpathString the expression to check
143 * @return List of all matching nodes. Returns an empty list if none found.
144 * @throws JaxenException
145 */
146 List<? extends Node> findChildNodesWithXPath(String xpathString) throws JaxenException;
147
148 /**
149 * Checks whether at least one descendant matches the xpath expression.
150 *
151 * @param xpathString the expression to check
152 * @return true if there is a match
153 */
154 boolean hasDescendantMatchingXPath(String xpathString);
155
156 /**
157 * Get a DOM Document which contains Elements and Attributes representative
158 * of this Node and it's children. Essentially a DOM tree representation of
159 * the Node AST, thereby allowing tools which can operate upon DOM to
160 * also indirectly operate on the AST.
161 */
162 Document getAsDocument();
163
164 /**
165 * Get the user data associated with this node. By default there is no data,
166 * unless it has been set via {@link #setUserData(Object)}.
167 * @return The user data set on this node.
168 */
169 Object getUserData();
170
171 /**
172 * Set the user data associated with this node.
173 * <p>
174 * PMD itself will never set user data onto a node. Nor should any Rule
175 * implementation, as the AST nodes are shared between concurrently executing
176 * Rules (i.e. it is <strong>not</strong> thread-safe).
177 * <p>
178 * This API is most useful for external applications looking to leverage
179 * PMD's robust support for AST structures, in which case application
180 * specific annotations on the AST nodes can be quite useful.
181 *
182 * @param userData The data to set on this node.
183 */
184 void setUserData(Object userData);
185 }