Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/java.compiler/share/classes/javax/annotation/processing/AbstractProcessor.java
41159 views
1
/*
2
* Copyright (c) 2005, 2020, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
package javax.annotation.processing;
27
28
import java.util.List;
29
import java.util.Set;
30
import java.util.HashSet;
31
import java.util.Collections;
32
import java.util.Objects;
33
import javax.lang.model.element.*;
34
import javax.lang.model.SourceVersion;
35
import javax.tools.Diagnostic;
36
37
/**
38
* An abstract annotation processor designed to be a convenient
39
* superclass for most concrete annotation processors. This class
40
* examines annotation values to compute the {@linkplain
41
* #getSupportedOptions options}, {@linkplain
42
* #getSupportedAnnotationTypes annotation interfaces}, and
43
* {@linkplain #getSupportedSourceVersion source version} supported by
44
* its subtypes.
45
*
46
* <p>The getter methods may {@linkplain Messager#printMessage issue
47
* warnings} about noteworthy conditions using the facilities available
48
* after the processor has been {@linkplain #isInitialized
49
* initialized}.
50
*
51
* <p>Subclasses are free to override the implementation and
52
* specification of any of the methods in this class as long as the
53
* general {@link javax.annotation.processing.Processor Processor}
54
* contract for that method is obeyed.
55
*
56
* @author Joseph D. Darcy
57
* @author Scott Seligman
58
* @author Peter von der Ah&eacute;
59
* @since 1.6
60
*/
61
public abstract class AbstractProcessor implements Processor {
62
/**
63
* Processing environment providing by the tool framework.
64
*/
65
protected ProcessingEnvironment processingEnv;
66
private boolean initialized = false;
67
68
/**
69
* Constructor for subclasses to call.
70
*/
71
protected AbstractProcessor() {}
72
73
/**
74
* If the processor class is annotated with {@link
75
* SupportedOptions}, return an unmodifiable set with the same set
76
* of strings as the annotation. If the class is not so
77
* annotated, an empty set is returned.
78
*
79
* @return the options recognized by this processor, or an empty
80
* set if none
81
*/
82
public Set<String> getSupportedOptions() {
83
SupportedOptions so = this.getClass().getAnnotation(SupportedOptions.class);
84
return (so == null) ?
85
Set.of() :
86
arrayToSet(so.value(), false, "option value", "@SupportedOptions");
87
}
88
89
/**
90
* If the processor class is annotated with {@link
91
* SupportedAnnotationTypes}, return an unmodifiable set with the
92
* same set of strings as the annotation. If the class is not so
93
* annotated, an empty set is returned.
94
*
95
* If the {@linkplain ProcessingEnvironment#getSourceVersion source
96
* version} does not support modules, in other words if it is less
97
* than or equal to {@link SourceVersion#RELEASE_8 RELEASE_8},
98
* then any leading {@linkplain Processor#getSupportedAnnotationTypes
99
* module prefixes} are stripped from the names.
100
*
101
* @return the names of the annotation interfaces supported by
102
* this processor, or an empty set if none
103
*/
104
public Set<String> getSupportedAnnotationTypes() {
105
SupportedAnnotationTypes sat = this.getClass().getAnnotation(SupportedAnnotationTypes.class);
106
boolean initialized = isInitialized();
107
if (sat == null) {
108
if (initialized)
109
processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING,
110
"No SupportedAnnotationTypes annotation " +
111
"found on " + this.getClass().getName() +
112
", returning an empty set.");
113
return Set.of();
114
} else {
115
boolean stripModulePrefixes =
116
initialized &&
117
processingEnv.getSourceVersion().compareTo(SourceVersion.RELEASE_8) <= 0;
118
return arrayToSet(sat.value(), stripModulePrefixes,
119
"annotation type", "@SupportedAnnotationTypes");
120
}
121
}
122
123
/**
124
* If the processor class is annotated with {@link
125
* SupportedSourceVersion}, return the source version in the
126
* annotation. If the class is not so annotated, {@link
127
* SourceVersion#RELEASE_6} is returned.
128
*
129
* @return the latest source version supported by this processor
130
*/
131
public SourceVersion getSupportedSourceVersion() {
132
SupportedSourceVersion ssv = this.getClass().getAnnotation(SupportedSourceVersion.class);
133
SourceVersion sv = null;
134
if (ssv == null) {
135
sv = SourceVersion.RELEASE_6;
136
if (isInitialized())
137
processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING,
138
"No SupportedSourceVersion annotation " +
139
"found on " + this.getClass().getName() +
140
", returning " + sv + ".");
141
} else
142
sv = ssv.value();
143
return sv;
144
}
145
146
147
/**
148
* Initializes the processor with the processing environment by
149
* setting the {@code processingEnv} field to the value of the
150
* {@code processingEnv} argument. An {@code
151
* IllegalStateException} will be thrown if this method is called
152
* more than once on the same object.
153
*
154
* @param processingEnv environment to access facilities the tool framework
155
* provides to the processor
156
* @throws IllegalStateException if this method is called more than once.
157
*/
158
public synchronized void init(ProcessingEnvironment processingEnv) {
159
if (initialized)
160
throw new IllegalStateException("Cannot call init more than once.");
161
Objects.requireNonNull(processingEnv, "Tool provided null ProcessingEnvironment");
162
163
this.processingEnv = processingEnv;
164
initialized = true;
165
}
166
167
/**
168
* {@inheritDoc}
169
*/
170
public abstract boolean process(Set<? extends TypeElement> annotations,
171
RoundEnvironment roundEnv);
172
173
/**
174
* {@return an empty iterable of completions}
175
*
176
* @param element {@inheritDoc}
177
* @param annotation {@inheritDoc}
178
* @param member {@inheritDoc}
179
* @param userText {@inheritDoc}
180
*/
181
public Iterable<? extends Completion> getCompletions(Element element,
182
AnnotationMirror annotation,
183
ExecutableElement member,
184
String userText) {
185
return List.of();
186
}
187
188
/**
189
* {@return {@code true} if this object has been {@linkplain #init
190
* initialized}, {@code false} otherwise}
191
*/
192
protected synchronized boolean isInitialized() {
193
return initialized;
194
}
195
196
private Set<String> arrayToSet(String[] array,
197
boolean stripModulePrefixes,
198
String contentType,
199
String annotationName) {
200
assert array != null;
201
Set<String> set = new HashSet<>();
202
for (String s : array) {
203
boolean stripped = false;
204
if (stripModulePrefixes) {
205
int index = s.indexOf('/');
206
if (index != -1) {
207
s = s.substring(index + 1);
208
stripped = true;
209
}
210
}
211
boolean added = set.add(s);
212
// Don't issue a duplicate warning when the module name is
213
// stripped off to avoid spurious warnings in a case like
214
// "foo/a.B", "bar/a.B".
215
if (!added && !stripped && isInitialized() ) {
216
processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING,
217
"Duplicate " + contentType +
218
" ``" + s + "'' for processor " +
219
this.getClass().getName() +
220
" in its " + annotationName +
221
"annotation.");
222
}
223
}
224
return Collections.unmodifiableSet(set);
225
}
226
}
227
228