-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathElementVisitor.java
190 lines (179 loc) · 6.54 KB
/
ElementVisitor.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/*
* Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package javax.lang.model.element;
/**
* A visitor of program elements, in the style of the visitor design
* pattern. Classes implementing this interface are used to operate
* on an element when the kind of element is unknown at compile time.
* When a visitor is passed to an element's {@link Element#accept
* accept} method, the <code>visit<i>Xyz</i></code> method most applicable
* to that element is invoked.
*
* <p> Classes implementing this interface may or may not throw a
* {@code NullPointerException} if the additional parameter {@code p}
* is {@code null}; see documentation of the implementing class for
* details.
*
* <p> <b>WARNING:</b> It is possible that methods will be added to
* this interface to accommodate new, currently unknown, language
* structures added to future versions of the Java™ programming
* language. Therefore, visitor classes directly implementing this
* interface may be source incompatible with future versions of the
* platform. To avoid this source incompatibility, visitor
* implementations are encouraged to instead extend the appropriate
* abstract visitor class that implements this interface. However, an
* API should generally use this visitor interface as the type for
* parameters, return type, etc. rather than one of the abstract
* classes.
*
* <p>Note that methods to accommodate new language constructs could
* be added in a source <em>compatible</em> way if they were added as
* <em>default methods</em>. However, default methods are only
* available on Java SE 8 and higher releases and the {@code
* javax.lang.model.*} packages bundled in Java SE 8 were required to
* also be runnable on Java SE 7. Therefore, default methods
* were <em>not</em> used when extending {@code javax.lang.model.*}
* to cover Java SE 8 language features. However, default methods
* are used in subsequent revisions of the {@code javax.lang.model.*}
* packages that are only required to run on Java SE 8 and higher
* platform versions.
*
* @param <R> the return type of this visitor's methods. Use {@link
* Void} for visitors that do not need to return results.
* @param <P> the type of the additional parameter to this visitor's
* methods. Use {@code Void} for visitors that do not need an
* additional parameter.
*
* @author Joseph D. Darcy
* @author Scott Seligman
* @author Peter von der Ahé
* @since 1.6
*/
// 元素访问器,可以对不同种类的元素执行不同的操作
public interface ElementVisitor<R, P> {
/**
* Visits an unknown kind of element.
* This can occur if the language evolves and new kinds
* of elements are added to the {@code Element} hierarchy.
*
* @param e the element to visit
* @param p a visitor-specified parameter
*
* @return a visitor-specified result
*
* @throws UnknownElementException a visitor implementation may optionally throw this exception
*/
// 未知种类的元素
R visitUnknown(Element e, P p);
/**
* Visits an element.
*
* @param e the element to visit
* @param p a visitor-specified parameter
*
* @return a visitor-specified result
*/
// 访问所有种类的元素
R visit(Element e, P p);
/**
* Visits a variable element.
*
* @param e the element to visit
* @param p a visitor-specified parameter
*
* @return a visitor-specified result
*/
// 访问字段/变量/参数元素
R visitVariable(VariableElement e, P p);
/**
* Visits an executable element.
*
* @param e the element to visit
* @param p a visitor-specified parameter
*
* @return a visitor-specified result
*/
// 访问方法/构造器/初始化块元素
R visitExecutable(ExecutableElement e, P p);
/**
* Visits a type parameter element.
*
* @param e the element to visit
* @param p a visitor-specified parameter
*
* @return a visitor-specified result
*/
// 访问类型参数元素
R visitTypeParameter(TypeParameterElement e, P p);
/**
* Visits a type element.
*
* @param e the element to visit
* @param p a visitor-specified parameter
*
* @return a visitor-specified result
*/
// 访问类/接口元素
R visitType(TypeElement e, P p);
/**
* Visits a package element.
*
* @param e the element to visit
* @param p a visitor-specified parameter
*
* @return a visitor-specified result
*/
// 访问包元素
R visitPackage(PackageElement e, P p);
/**
* Visits a module element.
*
* @param e the element to visit
* @param p a visitor-specified parameter
*
* @return a visitor-specified result
*
* @implSpec The default implementation visits a {@code
* ModuleElement} by calling {@code visitUnknown(e, p)}.
* @spec JPMS
* @since 9
*/
// 访问模块元素
default R visitModule(ModuleElement e, P p) {
return visitUnknown(e, p);
}
/**
* A convenience method equivalent to {@code visit(e, null)}.
*
* @param e the element to visit
*
* @return a visitor-specified result
*
* @implSpec The default implementation is {@code visit(e, null)}.
*/
default R visit(Element e) {
return visit(e, null);
}
}