176 }
177
178 private Source(String name) {
179 this.name = name;
180 }
181
182 public static final Source MIN = Source.JDK8;
183
184 private static final Source MAX = values()[values().length - 1];
185
186 public static final Source DEFAULT = MAX;
187
188 public static Source lookup(String name) {
189 return tab.get(name);
190 }
191
192 public boolean isSupported() {
193 return this.compareTo(MIN) >= 0;
194 }
195
196 public Target requiredTarget() {
197 return switch(this) {
198 case JDK23 -> Target.JDK1_23;
199 case JDK22 -> Target.JDK1_22;
200 case JDK21 -> Target.JDK1_21;
201 case JDK20 -> Target.JDK1_20;
202 case JDK19 -> Target.JDK1_19;
203 case JDK18 -> Target.JDK1_18;
204 case JDK17 -> Target.JDK1_17;
205 case JDK16 -> Target.JDK1_16;
206 case JDK15 -> Target.JDK1_15;
207 case JDK14 -> Target.JDK1_14;
208 case JDK13 -> Target.JDK1_13;
209 case JDK12 -> Target.JDK1_12;
210 case JDK11 -> Target.JDK1_11;
211 case JDK10 -> Target.JDK1_10;
212 case JDK9 -> Target.JDK1_9;
213 case JDK8 -> Target.JDK1_8;
214 case JDK7 -> Target.JDK1_7;
215 case JDK6 -> Target.JDK1_6;
239 SWITCH_MULTIPLE_CASE_LABELS(JDK14, Fragments.FeatureMultipleCaseLabels, DiagKind.PLURAL),
240 SWITCH_RULE(JDK14, Fragments.FeatureSwitchRules, DiagKind.PLURAL),
241 SWITCH_EXPRESSION(JDK14, Fragments.FeatureSwitchExpressions, DiagKind.PLURAL),
242 NO_TARGET_ANNOTATION_APPLICABILITY(JDK14),
243 TEXT_BLOCKS(JDK15, Fragments.FeatureTextBlocks, DiagKind.PLURAL),
244 PATTERN_MATCHING_IN_INSTANCEOF(JDK16, Fragments.FeaturePatternMatchingInstanceof, DiagKind.NORMAL),
245 REIFIABLE_TYPES_INSTANCEOF(JDK16, Fragments.FeatureReifiableTypesInstanceof, DiagKind.PLURAL),
246 RECORDS(JDK16, Fragments.FeatureRecords, DiagKind.PLURAL),
247 SEALED_CLASSES(JDK17, Fragments.FeatureSealedClasses, DiagKind.PLURAL),
248 CASE_NULL(JDK21, Fragments.FeatureCaseNull, DiagKind.NORMAL),
249 PATTERN_SWITCH(JDK21, Fragments.FeaturePatternSwitch, DiagKind.PLURAL),
250 REDUNDANT_STRICTFP(JDK17),
251 UNCONDITIONAL_PATTERN_IN_INSTANCEOF(JDK21, Fragments.FeatureUnconditionalPatternsInInstanceof, DiagKind.PLURAL),
252 RECORD_PATTERNS(JDK21, Fragments.FeatureDeconstructionPatterns, DiagKind.PLURAL),
253 STRING_TEMPLATES(JDK21, Fragments.FeatureStringTemplates, DiagKind.PLURAL),
254 IMPLICIT_CLASSES(JDK21, Fragments.FeatureImplicitClasses, DiagKind.PLURAL),
255 WARN_ON_ILLEGAL_UTF8(MIN, JDK21),
256 UNNAMED_VARIABLES(JDK22, Fragments.FeatureUnnamedVariables, DiagKind.PLURAL),
257 PRIMITIVE_PATTERNS(JDK23, Fragments.FeaturePrimitivePatterns, DiagKind.PLURAL),
258 SUPER_INIT(JDK22, Fragments.FeatureSuperInit, DiagKind.NORMAL),
259 ;
260
261 enum DiagKind {
262 NORMAL,
263 PLURAL;
264 }
265
266 private final Source minLevel;
267 private final Source maxLevel;
268 private final Fragment optFragment;
269 private final DiagKind optKind;
270
271 Feature(Source minLevel) {
272 this(minLevel, null, null);
273 }
274
275 Feature(Source minLevel, Fragment optFragment, DiagKind optKind) {
276 this(minLevel, MAX, optFragment, optKind);
277 }
278
|
176 }
177
178 private Source(String name) {
179 this.name = name;
180 }
181
182 public static final Source MIN = Source.JDK8;
183
184 private static final Source MAX = values()[values().length - 1];
185
186 public static final Source DEFAULT = MAX;
187
188 public static Source lookup(String name) {
189 return tab.get(name);
190 }
191
192 public boolean isSupported() {
193 return this.compareTo(MIN) >= 0;
194 }
195
196 public static boolean isSupported(Feature feature, int majorVersion) {
197 Source source = null;
198 for (Target target : Target.values()) {
199 if (majorVersion == target.majorVersion) {
200 source = lookup(target.name);
201 }
202 }
203 if (source != null) {
204 return feature.allowedInSource(source);
205 }
206 return false;
207 }
208
209 public Target requiredTarget() {
210 return switch(this) {
211 case JDK23 -> Target.JDK1_23;
212 case JDK22 -> Target.JDK1_22;
213 case JDK21 -> Target.JDK1_21;
214 case JDK20 -> Target.JDK1_20;
215 case JDK19 -> Target.JDK1_19;
216 case JDK18 -> Target.JDK1_18;
217 case JDK17 -> Target.JDK1_17;
218 case JDK16 -> Target.JDK1_16;
219 case JDK15 -> Target.JDK1_15;
220 case JDK14 -> Target.JDK1_14;
221 case JDK13 -> Target.JDK1_13;
222 case JDK12 -> Target.JDK1_12;
223 case JDK11 -> Target.JDK1_11;
224 case JDK10 -> Target.JDK1_10;
225 case JDK9 -> Target.JDK1_9;
226 case JDK8 -> Target.JDK1_8;
227 case JDK7 -> Target.JDK1_7;
228 case JDK6 -> Target.JDK1_6;
252 SWITCH_MULTIPLE_CASE_LABELS(JDK14, Fragments.FeatureMultipleCaseLabels, DiagKind.PLURAL),
253 SWITCH_RULE(JDK14, Fragments.FeatureSwitchRules, DiagKind.PLURAL),
254 SWITCH_EXPRESSION(JDK14, Fragments.FeatureSwitchExpressions, DiagKind.PLURAL),
255 NO_TARGET_ANNOTATION_APPLICABILITY(JDK14),
256 TEXT_BLOCKS(JDK15, Fragments.FeatureTextBlocks, DiagKind.PLURAL),
257 PATTERN_MATCHING_IN_INSTANCEOF(JDK16, Fragments.FeaturePatternMatchingInstanceof, DiagKind.NORMAL),
258 REIFIABLE_TYPES_INSTANCEOF(JDK16, Fragments.FeatureReifiableTypesInstanceof, DiagKind.PLURAL),
259 RECORDS(JDK16, Fragments.FeatureRecords, DiagKind.PLURAL),
260 SEALED_CLASSES(JDK17, Fragments.FeatureSealedClasses, DiagKind.PLURAL),
261 CASE_NULL(JDK21, Fragments.FeatureCaseNull, DiagKind.NORMAL),
262 PATTERN_SWITCH(JDK21, Fragments.FeaturePatternSwitch, DiagKind.PLURAL),
263 REDUNDANT_STRICTFP(JDK17),
264 UNCONDITIONAL_PATTERN_IN_INSTANCEOF(JDK21, Fragments.FeatureUnconditionalPatternsInInstanceof, DiagKind.PLURAL),
265 RECORD_PATTERNS(JDK21, Fragments.FeatureDeconstructionPatterns, DiagKind.PLURAL),
266 STRING_TEMPLATES(JDK21, Fragments.FeatureStringTemplates, DiagKind.PLURAL),
267 IMPLICIT_CLASSES(JDK21, Fragments.FeatureImplicitClasses, DiagKind.PLURAL),
268 WARN_ON_ILLEGAL_UTF8(MIN, JDK21),
269 UNNAMED_VARIABLES(JDK22, Fragments.FeatureUnnamedVariables, DiagKind.PLURAL),
270 PRIMITIVE_PATTERNS(JDK23, Fragments.FeaturePrimitivePatterns, DiagKind.PLURAL),
271 SUPER_INIT(JDK22, Fragments.FeatureSuperInit, DiagKind.NORMAL),
272 VALUE_CLASSES(JDK22, Fragments.FeatureValueClasses, DiagKind.PLURAL),
273 ;
274
275 enum DiagKind {
276 NORMAL,
277 PLURAL;
278 }
279
280 private final Source minLevel;
281 private final Source maxLevel;
282 private final Fragment optFragment;
283 private final DiagKind optKind;
284
285 Feature(Source minLevel) {
286 this(minLevel, null, null);
287 }
288
289 Feature(Source minLevel, Fragment optFragment, DiagKind optKind) {
290 this(minLevel, MAX, optFragment, optKind);
291 }
292
|