31
31
import static javax .lang .model .SourceVersion .*;
32
32
33
33
import com .sun .tools .javac .jvm .Target ;
34
+ import com .sun .tools .javac .resources .CompilerProperties .Errors ;
35
+ import com .sun .tools .javac .resources .CompilerProperties .Fragments ;
34
36
import com .sun .tools .javac .util .*;
37
+ import com .sun .tools .javac .util .JCDiagnostic .Error ;
38
+ import com .sun .tools .javac .util .JCDiagnostic .Fragment ;
39
+
35
40
import static com .sun .tools .javac .main .Option .*;
36
41
37
42
/** The source language version accepted.
@@ -59,22 +64,22 @@ public enum Source {
59
64
60
65
/** 1.5 introduced generics, attributes, foreach, boxing, static import,
61
66
* covariant return, enums, varargs, et al. */
62
- JDK1_5 ( "1. 5" ),
67
+ JDK5 ( " 5" ),
63
68
64
69
/** 1.6 reports encoding problems as errors instead of warnings. */
65
- JDK1_6 ( "1. 6" ),
70
+ JDK6 ( " 6" ),
66
71
67
72
/** 1.7 introduced try-with-resources, multi-catch, string switch, etc. */
68
- JDK1_7 ( "1. 7" ),
73
+ JDK7 ( " 7" ),
69
74
70
75
/** 1.8 lambda expressions and default methods. */
71
- JDK1_8 ( "1. 8" ),
76
+ JDK8 ( " 8" ),
72
77
73
78
/** 1.9 modularity. */
74
- JDK1_9 ( "1. 9" ),
79
+ JDK9 ( " 9" ),
75
80
76
81
/** 1.10 covers the to be determined language features that will be added in JDK 10. */
77
- JDK1_10 ( "1. 10" );
82
+ JDK10 ( " 10" );
78
83
79
84
private static final Context .Key <Source > sourceKey = new Context .Key <>();
80
85
@@ -97,19 +102,19 @@ public static Source instance(Context context) {
97
102
for (Source s : values ()) {
98
103
tab .put (s .name , s );
99
104
}
100
- tab .put ("5" , JDK1_5 ); // Make 5 an alias for 1.5
101
- tab .put ("6" , JDK1_6 ); // Make 6 an alias for 1.6
102
- tab .put ("7" , JDK1_7 ); // Make 7 an alias for 1.7
103
- tab .put ("8" , JDK1_8 ); // Make 8 an alias for 1.8
104
- tab .put ("9" , JDK1_9 ); // Make 9 an alias for 1.9
105
- tab .put ("10" , JDK1_10 ); // Make 10 an alias for 1.10
105
+ tab .put ("1. 5" , JDK5 ); // Make 5 an alias for 1.5
106
+ tab .put ("1. 6" , JDK6 ); // Make 6 an alias for 1.6
107
+ tab .put ("1. 7" , JDK7 ); // Make 7 an alias for 1.7
108
+ tab .put ("1. 8" , JDK8 ); // Make 8 an alias for 1.8
109
+ tab .put ("1. 9" , JDK9 ); // Make 9 an alias for 1.9
110
+ tab .put ("1. 10" , JDK10 ); // Make 10 an alias for 1.10
106
111
}
107
112
108
113
private Source (String name ) {
109
114
this .name = name ;
110
115
}
111
116
112
- public static final Source MIN = Source .JDK1_6 ;
117
+ public static final Source MIN = Source .JDK6 ;
113
118
114
119
private static final Source MAX = values ()[values ().length - 1 ];
115
120
@@ -120,114 +125,108 @@ public static Source lookup(String name) {
120
125
}
121
126
122
127
public Target requiredTarget () {
123
- if (this .compareTo (JDK1_10 ) >= 0 ) return Target .JDK1_10 ;
124
- if (this .compareTo (JDK1_9 ) >= 0 ) return Target .JDK1_9 ;
125
- if (this .compareTo (JDK1_8 ) >= 0 ) return Target .JDK1_8 ;
126
- if (this .compareTo (JDK1_7 ) >= 0 ) return Target .JDK1_7 ;
127
- if (this .compareTo (JDK1_6 ) >= 0 ) return Target .JDK1_6 ;
128
- if (this .compareTo (JDK1_5 ) >= 0 ) return Target .JDK1_5 ;
128
+ if (this .compareTo (JDK10 ) >= 0 ) return Target .JDK1_10 ;
129
+ if (this .compareTo (JDK9 ) >= 0 ) return Target .JDK1_9 ;
130
+ if (this .compareTo (JDK8 ) >= 0 ) return Target .JDK1_8 ;
131
+ if (this .compareTo (JDK7 ) >= 0 ) return Target .JDK1_7 ;
132
+ if (this .compareTo (JDK6 ) >= 0 ) return Target .JDK1_6 ;
133
+ if (this .compareTo (JDK5 ) >= 0 ) return Target .JDK1_5 ;
129
134
if (this .compareTo (JDK1_4 ) >= 0 ) return Target .JDK1_4 ;
130
135
return Target .JDK1_1 ;
131
136
}
132
137
133
- public boolean allowDiamond () {
134
- return compareTo (JDK1_7 ) >= 0 ;
135
- }
136
- public boolean allowMulticatch () {
137
- return compareTo (JDK1_7 ) >= 0 ;
138
- }
139
- public boolean allowImprovedRethrowAnalysis () {
140
- return compareTo (JDK1_7 ) >= 0 ;
141
- }
142
- public boolean allowImprovedCatchAnalysis () {
143
- return compareTo (JDK1_7 ) >= 0 ;
144
- }
145
- public boolean allowModules () {
146
- return compareTo (JDK1_9 ) >= 0 ;
147
- }
148
- public boolean allowTryWithResources () {
149
- return compareTo (JDK1_7 ) >= 0 ;
150
- }
151
- public boolean allowEffectivelyFinalVariablesInTryWithResources () {
152
- return compareTo (JDK1_9 ) >= 0 ;
153
- }
154
- public boolean allowBinaryLiterals () {
155
- return compareTo (JDK1_7 ) >= 0 ;
156
- }
157
- public boolean allowUnderscoresInLiterals () {
158
- return compareTo (JDK1_7 ) >= 0 ;
159
- }
160
- public boolean allowStringsInSwitch () {
161
- return compareTo (JDK1_7 ) >= 0 ;
162
- }
163
- public boolean allowDeprecationOnImport () {
164
- return compareTo (JDK1_9 ) < 0 ;
165
- }
166
- public boolean allowSimplifiedVarargs () {
167
- return compareTo (JDK1_7 ) >= 0 ;
168
- }
169
- public boolean allowObjectToPrimitiveCast () {
170
- return compareTo (JDK1_7 ) >= 0 ;
171
- }
172
- public boolean enforceThisDotInit () {
173
- return compareTo (JDK1_7 ) >= 0 ;
174
- }
175
- public boolean allowPoly () {
176
- return compareTo (JDK1_8 ) >= 0 ;
177
- }
178
- public boolean allowLambda () {
179
- return compareTo (JDK1_8 ) >= 0 ;
180
- }
181
- public boolean allowMethodReferences () {
182
- return compareTo (JDK1_8 ) >= 0 ;
183
- }
184
- public boolean allowDefaultMethods () {
185
- return compareTo (JDK1_8 ) >= 0 ;
186
- }
187
- public boolean allowStaticInterfaceMethods () {
188
- return compareTo (JDK1_8 ) >= 0 ;
189
- }
190
- public boolean allowStrictMethodClashCheck () {
191
- return compareTo (JDK1_8 ) >= 0 ;
192
- }
193
- public boolean allowEffectivelyFinalInInnerClasses () {
194
- return compareTo (JDK1_8 ) >= 0 ;
195
- }
196
- public boolean allowTypeAnnotations () {
197
- return compareTo (JDK1_8 ) >= 0 ;
198
- }
199
- public boolean allowAnnotationsAfterTypeParams () {
200
- return compareTo (JDK1_8 ) >= 0 ;
201
- }
202
- public boolean allowRepeatedAnnotations () {
203
- return compareTo (JDK1_8 ) >= 0 ;
204
- }
205
- public boolean allowIntersectionTypesInCast () {
206
- return compareTo (JDK1_8 ) >= 0 ;
207
- }
208
- public boolean allowGraphInference () {
209
- return compareTo (JDK1_8 ) >= 0 ;
210
- }
211
- public boolean allowFunctionalInterfaceMostSpecific () {
212
- return compareTo (JDK1_8 ) >= 0 ;
213
- }
214
- public boolean allowPostApplicabilityVarargsAccessCheck () {
215
- return compareTo (JDK1_8 ) >= 0 ;
216
- }
217
- public boolean mapCapturesToBounds () {
218
- return compareTo (JDK1_8 ) < 0 ;
219
- }
220
- public boolean allowPrivateSafeVarargs () {
221
- return compareTo (JDK1_9 ) >= 0 ;
222
- }
223
- public boolean allowDiamondWithAnonymousClassCreation () {
224
- return compareTo (JDK1_9 ) >= 0 ;
225
- }
226
- public boolean allowUnderscoreIdentifier () {
227
- return compareTo (JDK1_8 ) <= 0 ;
138
+ /**
139
+ * Models a feature of the Java programming language. Each feature can be associated with a
140
+ * minimum source level, a maximum source level and a diagnostic fragment describing the feature,
141
+ * which is used to generate error messages of the kind {@code feature XYZ not supported in source N}.
142
+ */
143
+ public enum Feature {
144
+
145
+ DIAMOND (JDK7 , Fragments .FeatureDiamond , DiagKind .NORMAL ),
146
+ MULTICATCH (JDK7 , Fragments .FeatureMulticatch , DiagKind .PLURAL ),
147
+ IMPROVED_RETHROW_ANALYSIS (JDK7 ),
148
+ IMPROVED_CATCH_ANALYSIS (JDK7 ),
149
+ MODULES (JDK9 , Fragments .FeatureModules , DiagKind .PLURAL ),
150
+ TRY_WITH_RESOURCES (JDK7 , Fragments .FeatureTryWithResources , DiagKind .NORMAL ),
151
+ EFFECTIVELY_FINAL_VARIABLES_IN_TRY_WITH_RESOURCES (JDK9 , Fragments .FeatureVarInTryWithResources , DiagKind .PLURAL ),
152
+ BINARY_LITERALS (JDK7 , Fragments .FeatureBinaryLit , DiagKind .PLURAL ),
153
+ UNDERSCORES_IN_LITERALS (JDK7 , Fragments .FeatureUnderscoreLit , DiagKind .PLURAL ),
154
+ STRINGS_IN_SWITCH (JDK7 , Fragments .FeatureStringSwitch , DiagKind .PLURAL ),
155
+ DEPRECATION_ON_IMPORT (MIN , JDK9 ),
156
+ SIMPLIFIED_VARARGS (JDK7 ),
157
+ OBJECT_TO_PRIMITIVE_CAST (JDK7 ),
158
+ ENFORCE_THIS_DOT_INIT (JDK7 ),
159
+ POLY (JDK8 ),
160
+ LAMBDA (JDK8 , Fragments .FeatureLambda , DiagKind .PLURAL ),
161
+ METHOD_REFERENCES (JDK8 , Fragments .FeatureMethodReferences , DiagKind .PLURAL ),
162
+ DEFAULT_METHODS (JDK8 , Fragments .FeatureDefaultMethods , DiagKind .PLURAL ),
163
+ STATIC_INTERFACE_METHODS (JDK8 , Fragments .FeatureStaticIntfMethods , DiagKind .PLURAL ),
164
+ STATIC_INTERFACE_METHODS_INVOKE (JDK8 , Fragments .FeatureStaticIntfMethodInvoke , DiagKind .PLURAL ),
165
+ STRICT_METHOD_CLASH_CHECK (JDK8 ),
166
+ EFFECTIVELY_FINAL_IN_INNER_CLASSES (JDK8 ),
167
+ TYPE_ANNOTATIONS (JDK8 , Fragments .FeatureTypeAnnotations , DiagKind .PLURAL ),
168
+ ANNOTATIONS_AFTER_TYPE_PARAMS (JDK8 , Fragments .FeatureAnnotationsAfterTypeParams , DiagKind .PLURAL ),
169
+ REPEATED_ANNOTATIONS (JDK8 , Fragments .FeatureRepeatableAnnotations , DiagKind .PLURAL ),
170
+ INTERSECTION_TYPES_IN_CAST (JDK8 , Fragments .FeatureIntersectionTypesInCast , DiagKind .PLURAL ),
171
+ GRAPH_INFERENCE (JDK8 ),
172
+ FUNCTIONAL_INTERFACE_MOST_SPECIFIC (JDK8 ),
173
+ POST_APPLICABILITY_VARARGS_ACCESS_CHECK (JDK8 ),
174
+ MAP_CAPTURES_TO_BOUNDS (MIN , JDK7 ),
175
+ PRIVATE_SAFE_VARARGS (JDK9 ),
176
+ DIAMOND_WITH_ANONYMOUS_CLASS_CREATION (JDK9 , Fragments .FeatureDiamondAndAnonClass , DiagKind .NORMAL ),
177
+ UNDERSCORE_IDENTIFIER (MIN , JDK8 ),
178
+ PRIVATE_INTERFACE_METHODS (JDK9 , Fragments .FeaturePrivateIntfMethods , DiagKind .PLURAL ),
179
+ LOCAL_VARIABLE_TYPE_INFERENCE (JDK10 );
180
+
181
+ enum DiagKind {
182
+ NORMAL ,
183
+ PLURAL ;
184
+ }
185
+
186
+ private final Source minLevel ;
187
+ private final Source maxLevel ;
188
+ private final Fragment optFragment ;
189
+ private final DiagKind optKind ;
190
+
191
+ Feature (Source minLevel ) {
192
+ this (minLevel , null , null );
193
+ }
194
+
195
+ Feature (Source minLevel , Fragment optFragment , DiagKind optKind ) {
196
+ this (minLevel , MAX , optFragment , optKind );
197
+ }
198
+
199
+ Feature (Source minLevel , Source maxLevel ) {
200
+ this (minLevel , maxLevel , null , null );
201
+ }
202
+
203
+ Feature (Source minLevel , Source maxLevel , Fragment optFragment , DiagKind optKind ) {
204
+ this .minLevel = minLevel ;
205
+ this .maxLevel = maxLevel ;
206
+ this .optFragment = optFragment ;
207
+ this .optKind = optKind ;
208
+ }
209
+
210
+ public boolean allowedInSource (Source source ) {
211
+ return source .compareTo (minLevel ) >= 0 &&
212
+ source .compareTo (maxLevel ) <= 0 ;
213
+ }
214
+
215
+ public Fragment fragment (String sourceName ) {
216
+ Assert .checkNonNull (optFragment );
217
+ return optKind == DiagKind .NORMAL ?
218
+ Fragments .FeatureNotSupportedInSource (optFragment , sourceName , minLevel .name ) :
219
+ Fragments .FeatureNotSupportedInSourcePlural (optFragment , sourceName , minLevel .name );
220
+ }
221
+
222
+ public Error error (String sourceName ) {
223
+ Assert .checkNonNull (optFragment );
224
+ return optKind == DiagKind .NORMAL ?
225
+ Errors .FeatureNotSupportedInSource (optFragment , sourceName , minLevel .name ) :
226
+ Errors .FeatureNotSupportedInSourcePlural (optFragment , sourceName , minLevel .name );
227
+ }
228
228
}
229
- public boolean allowPrivateInterfaceMethods () { return compareTo (JDK1_9 ) >= 0 ; }
230
- public boolean allowLocalVariableTypeInference () { return compareTo (JDK1_10 ) >= 0 ; }
229
+
231
230
public static SourceVersion toSourceVersion (Source source ) {
232
231
switch (source ) {
233
232
case JDK1_2 :
@@ -236,17 +235,17 @@ public static SourceVersion toSourceVersion(Source source) {
236
235
return RELEASE_3 ;
237
236
case JDK1_4 :
238
237
return RELEASE_4 ;
239
- case JDK1_5 :
238
+ case JDK5 :
240
239
return RELEASE_5 ;
241
- case JDK1_6 :
240
+ case JDK6 :
242
241
return RELEASE_6 ;
243
- case JDK1_7 :
242
+ case JDK7 :
244
243
return RELEASE_7 ;
245
- case JDK1_8 :
244
+ case JDK8 :
246
245
return RELEASE_8 ;
247
- case JDK1_9 :
246
+ case JDK9 :
248
247
return RELEASE_9 ;
249
- case JDK1_10 :
248
+ case JDK10 :
250
249
return RELEASE_10 ;
251
250
default :
252
251
return null ;
0 commit comments