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