221 UNDERSCORE_IDENTIFIER(MIN, JDK8),
222 PRIVATE_INTERFACE_METHODS(JDK9, Fragments.FeaturePrivateIntfMethods, DiagKind.PLURAL),
223 LOCAL_VARIABLE_TYPE_INFERENCE(JDK10),
224 VAR_SYNTAX_IMPLICIT_LAMBDAS(JDK11, Fragments.FeatureVarSyntaxInImplicitLambda, DiagKind.PLURAL),
225 IMPORT_ON_DEMAND_OBSERVABLE_PACKAGES(JDK1_2, JDK8),
226 SWITCH_MULTIPLE_CASE_LABELS(JDK14, Fragments.FeatureMultipleCaseLabels, DiagKind.PLURAL),
227 SWITCH_RULE(JDK14, Fragments.FeatureSwitchRules, DiagKind.PLURAL),
228 SWITCH_EXPRESSION(JDK14, Fragments.FeatureSwitchExpressions, DiagKind.PLURAL),
229 NO_TARGET_ANNOTATION_APPLICABILITY(JDK14),
230 TEXT_BLOCKS(JDK15, Fragments.FeatureTextBlocks, DiagKind.PLURAL),
231 PATTERN_MATCHING_IN_INSTANCEOF(JDK16, Fragments.FeaturePatternMatchingInstanceof, DiagKind.NORMAL),
232 REIFIABLE_TYPES_INSTANCEOF(JDK16, Fragments.FeatureReifiableTypesInstanceof, DiagKind.PLURAL),
233 RECORDS(JDK16, Fragments.FeatureRecords, DiagKind.PLURAL),
234 SEALED_CLASSES(JDK17, Fragments.FeatureSealedClasses, DiagKind.PLURAL),
235 CASE_NULL(JDK21, Fragments.FeatureCaseNull, DiagKind.NORMAL),
236 PATTERN_SWITCH(JDK21, Fragments.FeaturePatternSwitch, DiagKind.PLURAL),
237 REDUNDANT_STRICTFP(JDK17),
238 UNCONDITIONAL_PATTERN_IN_INSTANCEOF(JDK21, Fragments.FeatureUnconditionalPatternsInInstanceof, DiagKind.PLURAL),
239 RECORD_PATTERNS(JDK21, Fragments.FeatureDeconstructionPatterns, DiagKind.PLURAL),
240 STRING_TEMPLATES(JDK21, Fragments.FeatureStringTemplates, DiagKind.PLURAL),
241 WARN_ON_ILLEGAL_UTF8(MIN, JDK21),
242 UNNAMED_VARIABLES(JDK21, Fragments.FeatureUnnamedVariables, DiagKind.PLURAL),
243 ;
244
245 enum DiagKind {
246 NORMAL,
247 PLURAL;
248 }
249
250 private final Source minLevel;
251 private final Source maxLevel;
252 private final Fragment optFragment;
253 private final DiagKind optKind;
254
255 Feature(Source minLevel) {
256 this(minLevel, null, null);
257 }
258
259 Feature(Source minLevel, Fragment optFragment, DiagKind optKind) {
260 this(minLevel, MAX, optFragment, optKind);
278
279 public boolean isPlural() {
280 Assert.checkNonNull(optKind);
281 return optKind == DiagKind.PLURAL;
282 }
283
284 public Fragment nameFragment() {
285 Assert.checkNonNull(optFragment);
286 return optFragment;
287 }
288
289 public Fragment fragment(String sourceName) {
290 Assert.checkNonNull(optFragment);
291 return optKind == DiagKind.NORMAL ?
292 Fragments.FeatureNotSupportedInSource(optFragment, sourceName, minLevel.name) :
293 Fragments.FeatureNotSupportedInSourcePlural(optFragment, sourceName, minLevel.name);
294 }
295
296 public Error error(String sourceName) {
297 Assert.checkNonNull(optFragment);
298 return optKind == DiagKind.NORMAL ?
299 Errors.FeatureNotSupportedInSource(optFragment, sourceName, minLevel.name) :
300 Errors.FeatureNotSupportedInSourcePlural(optFragment, sourceName, minLevel.name);
301 }
302 }
303
304 public static SourceVersion toSourceVersion(Source source) {
305 return switch(source) {
306 case JDK1_2 -> RELEASE_2;
307 case JDK1_3 -> RELEASE_3;
308 case JDK1_4 -> RELEASE_4;
309 case JDK5 -> RELEASE_5;
310 case JDK6 -> RELEASE_6;
311 case JDK7 -> RELEASE_7;
312 case JDK8 -> RELEASE_8;
313 case JDK9 -> RELEASE_9;
314 case JDK10 -> RELEASE_10;
315 case JDK11 -> RELEASE_11;
316 case JDK12 -> RELEASE_12;
317 case JDK13 -> RELEASE_13;
|
221 UNDERSCORE_IDENTIFIER(MIN, JDK8),
222 PRIVATE_INTERFACE_METHODS(JDK9, Fragments.FeaturePrivateIntfMethods, DiagKind.PLURAL),
223 LOCAL_VARIABLE_TYPE_INFERENCE(JDK10),
224 VAR_SYNTAX_IMPLICIT_LAMBDAS(JDK11, Fragments.FeatureVarSyntaxInImplicitLambda, DiagKind.PLURAL),
225 IMPORT_ON_DEMAND_OBSERVABLE_PACKAGES(JDK1_2, JDK8),
226 SWITCH_MULTIPLE_CASE_LABELS(JDK14, Fragments.FeatureMultipleCaseLabels, DiagKind.PLURAL),
227 SWITCH_RULE(JDK14, Fragments.FeatureSwitchRules, DiagKind.PLURAL),
228 SWITCH_EXPRESSION(JDK14, Fragments.FeatureSwitchExpressions, DiagKind.PLURAL),
229 NO_TARGET_ANNOTATION_APPLICABILITY(JDK14),
230 TEXT_BLOCKS(JDK15, Fragments.FeatureTextBlocks, DiagKind.PLURAL),
231 PATTERN_MATCHING_IN_INSTANCEOF(JDK16, Fragments.FeaturePatternMatchingInstanceof, DiagKind.NORMAL),
232 REIFIABLE_TYPES_INSTANCEOF(JDK16, Fragments.FeatureReifiableTypesInstanceof, DiagKind.PLURAL),
233 RECORDS(JDK16, Fragments.FeatureRecords, DiagKind.PLURAL),
234 SEALED_CLASSES(JDK17, Fragments.FeatureSealedClasses, DiagKind.PLURAL),
235 CASE_NULL(JDK21, Fragments.FeatureCaseNull, DiagKind.NORMAL),
236 PATTERN_SWITCH(JDK21, Fragments.FeaturePatternSwitch, DiagKind.PLURAL),
237 REDUNDANT_STRICTFP(JDK17),
238 UNCONDITIONAL_PATTERN_IN_INSTANCEOF(JDK21, Fragments.FeatureUnconditionalPatternsInInstanceof, DiagKind.PLURAL),
239 RECORD_PATTERNS(JDK21, Fragments.FeatureDeconstructionPatterns, DiagKind.PLURAL),
240 STRING_TEMPLATES(JDK21, Fragments.FeatureStringTemplates, DiagKind.PLURAL),
241 PRIMITIVE_CLASSES(JDK21, Fragments.FeaturePrimitiveClasses, DiagKind.PLURAL),
242 VALUE_CLASSES(JDK21, Fragments.FeatureValueClasses, DiagKind.PLURAL),
243 WARN_ON_ILLEGAL_UTF8(MIN, JDK21),
244 UNNAMED_VARIABLES(JDK21, Fragments.FeatureUnnamedVariables, DiagKind.PLURAL),
245 ;
246
247 enum DiagKind {
248 NORMAL,
249 PLURAL;
250 }
251
252 private final Source minLevel;
253 private final Source maxLevel;
254 private final Fragment optFragment;
255 private final DiagKind optKind;
256
257 Feature(Source minLevel) {
258 this(minLevel, null, null);
259 }
260
261 Feature(Source minLevel, Fragment optFragment, DiagKind optKind) {
262 this(minLevel, MAX, optFragment, optKind);
280
281 public boolean isPlural() {
282 Assert.checkNonNull(optKind);
283 return optKind == DiagKind.PLURAL;
284 }
285
286 public Fragment nameFragment() {
287 Assert.checkNonNull(optFragment);
288 return optFragment;
289 }
290
291 public Fragment fragment(String sourceName) {
292 Assert.checkNonNull(optFragment);
293 return optKind == DiagKind.NORMAL ?
294 Fragments.FeatureNotSupportedInSource(optFragment, sourceName, minLevel.name) :
295 Fragments.FeatureNotSupportedInSourcePlural(optFragment, sourceName, minLevel.name);
296 }
297
298 public Error error(String sourceName) {
299 Assert.checkNonNull(optFragment);
300 if (this == PRIMITIVE_CLASSES) {
301 return Errors.PrimitiveClassesNotSupported(minLevel.name);
302 }
303 return optKind == DiagKind.NORMAL ?
304 Errors.FeatureNotSupportedInSource(optFragment, sourceName, minLevel.name) :
305 Errors.FeatureNotSupportedInSourcePlural(optFragment, sourceName, minLevel.name);
306 }
307 }
308
309 public static SourceVersion toSourceVersion(Source source) {
310 return switch(source) {
311 case JDK1_2 -> RELEASE_2;
312 case JDK1_3 -> RELEASE_3;
313 case JDK1_4 -> RELEASE_4;
314 case JDK5 -> RELEASE_5;
315 case JDK6 -> RELEASE_6;
316 case JDK7 -> RELEASE_7;
317 case JDK8 -> RELEASE_8;
318 case JDK9 -> RELEASE_9;
319 case JDK10 -> RELEASE_10;
320 case JDK11 -> RELEASE_11;
321 case JDK12 -> RELEASE_12;
322 case JDK13 -> RELEASE_13;
|