104 public final String name;
105
106 private static final Map<String,Source> tab = new HashMap<>();
107 static {
108 for (Source s : values()) {
109 tab.put(s.name, s);
110 }
111 tab.put("1.5", JDK5); // Make 5 an alias for 1.5
112 tab.put("1.6", JDK6); // Make 6 an alias for 1.6
113 tab.put("1.7", JDK7); // Make 7 an alias for 1.7
114 tab.put("1.8", JDK8); // Make 8 an alias for 1.8
115 tab.put("1.9", JDK9); // Make 9 an alias for 1.9
116 tab.put("1.10", JDK10); // Make 10 an alias for 1.10
117 // Decline to make 1.11 an alias for 11.
118 }
119
120 private Source(String name) {
121 this.name = name;
122 }
123
124 public static final Source MIN = Source.JDK6;
125
126 private static final Source MAX = values()[values().length - 1];
127
128 public static final Source DEFAULT = MAX;
129
130 public static Source lookup(String name) {
131 return tab.get(name);
132 }
133
134 public Target requiredTarget() {
135 if (this.compareTo(JDK12) >= 0) return Target.JDK1_12;
136 if (this.compareTo(JDK11) >= 0) return Target.JDK1_11;
137 if (this.compareTo(JDK10) >= 0) return Target.JDK1_10;
138 if (this.compareTo(JDK9) >= 0) return Target.JDK1_9;
139 if (this.compareTo(JDK8) >= 0) return Target.JDK1_8;
140 if (this.compareTo(JDK7) >= 0) return Target.JDK1_7;
141 if (this.compareTo(JDK6) >= 0) return Target.JDK1_6;
142 if (this.compareTo(JDK5) >= 0) return Target.JDK1_5;
143 if (this.compareTo(JDK1_4) >= 0) return Target.JDK1_4;
144 return Target.JDK1_1;
145 }
146
147 /**
148 * Models a feature of the Java programming language. Each feature can be associated with a
149 * minimum source level, a maximum source level and a diagnostic fragment describing the feature,
150 * which is used to generate error messages of the kind {@code feature XYZ not supported in source N}.
151 */
152 public enum Feature {
153
154 DIAMOND(JDK7, Fragments.FeatureDiamond, DiagKind.NORMAL),
155 MULTICATCH(JDK7, Fragments.FeatureMulticatch, DiagKind.PLURAL),
156 IMPROVED_RETHROW_ANALYSIS(JDK7),
157 IMPROVED_CATCH_ANALYSIS(JDK7),
158 MODULES(JDK9, Fragments.FeatureModules, DiagKind.PLURAL),
159 TRY_WITH_RESOURCES(JDK7, Fragments.FeatureTryWithResources, DiagKind.NORMAL),
160 EFFECTIVELY_FINAL_VARIABLES_IN_TRY_WITH_RESOURCES(JDK9, Fragments.FeatureVarInTryWithResources, DiagKind.PLURAL),
161 BINARY_LITERALS(JDK7, Fragments.FeatureBinaryLit, DiagKind.PLURAL),
162 UNDERSCORES_IN_LITERALS(JDK7, Fragments.FeatureUnderscoreLit, DiagKind.PLURAL),
163 STRINGS_IN_SWITCH(JDK7, Fragments.FeatureStringSwitch, DiagKind.PLURAL),
164 DEPRECATION_ON_IMPORT(MIN, JDK8),
165 SIMPLIFIED_VARARGS(JDK7),
166 OBJECT_TO_PRIMITIVE_CAST(JDK7),
167 ENFORCE_THIS_DOT_INIT(JDK7),
168 POLY(JDK8),
169 LAMBDA(JDK8, Fragments.FeatureLambda, DiagKind.PLURAL),
170 METHOD_REFERENCES(JDK8, Fragments.FeatureMethodReferences, DiagKind.PLURAL),
171 DEFAULT_METHODS(JDK8, Fragments.FeatureDefaultMethods, DiagKind.PLURAL),
172 STATIC_INTERFACE_METHODS(JDK8, Fragments.FeatureStaticIntfMethods, DiagKind.PLURAL),
173 STATIC_INTERFACE_METHODS_INVOKE(JDK8, Fragments.FeatureStaticIntfMethodInvoke, DiagKind.PLURAL),
174 STRICT_METHOD_CLASH_CHECK(JDK8),
175 EFFECTIVELY_FINAL_IN_INNER_CLASSES(JDK8),
176 TYPE_ANNOTATIONS(JDK8, Fragments.FeatureTypeAnnotations, DiagKind.PLURAL),
177 ANNOTATIONS_AFTER_TYPE_PARAMS(JDK8, Fragments.FeatureAnnotationsAfterTypeParams, DiagKind.PLURAL),
178 REPEATED_ANNOTATIONS(JDK8, Fragments.FeatureRepeatableAnnotations, DiagKind.PLURAL),
179 INTERSECTION_TYPES_IN_CAST(JDK8, Fragments.FeatureIntersectionTypesInCast, DiagKind.PLURAL),
180 GRAPH_INFERENCE(JDK8),
181 FUNCTIONAL_INTERFACE_MOST_SPECIFIC(JDK8),
182 POST_APPLICABILITY_VARARGS_ACCESS_CHECK(JDK8),
183 MAP_CAPTURES_TO_BOUNDS(MIN, JDK7),
184 PRIVATE_SAFE_VARARGS(JDK9),
185 DIAMOND_WITH_ANONYMOUS_CLASS_CREATION(JDK9, Fragments.FeatureDiamondAndAnonClass, DiagKind.NORMAL),
186 UNDERSCORE_IDENTIFIER(MIN, JDK8),
187 PRIVATE_INTERFACE_METHODS(JDK9, Fragments.FeaturePrivateIntfMethods, DiagKind.PLURAL),
|
104 public final String name;
105
106 private static final Map<String,Source> tab = new HashMap<>();
107 static {
108 for (Source s : values()) {
109 tab.put(s.name, s);
110 }
111 tab.put("1.5", JDK5); // Make 5 an alias for 1.5
112 tab.put("1.6", JDK6); // Make 6 an alias for 1.6
113 tab.put("1.7", JDK7); // Make 7 an alias for 1.7
114 tab.put("1.8", JDK8); // Make 8 an alias for 1.8
115 tab.put("1.9", JDK9); // Make 9 an alias for 1.9
116 tab.put("1.10", JDK10); // Make 10 an alias for 1.10
117 // Decline to make 1.11 an alias for 11.
118 }
119
120 private Source(String name) {
121 this.name = name;
122 }
123
124 public static final Source MIN = Source.JDK7;
125
126 private static final Source MAX = values()[values().length - 1];
127
128 public static final Source DEFAULT = MAX;
129
130 public static Source lookup(String name) {
131 return tab.get(name);
132 }
133
134 public Target requiredTarget() {
135 if (this.compareTo(JDK12) >= 0) return Target.JDK1_12;
136 if (this.compareTo(JDK11) >= 0) return Target.JDK1_11;
137 if (this.compareTo(JDK10) >= 0) return Target.JDK1_10;
138 if (this.compareTo(JDK9) >= 0) return Target.JDK1_9;
139 if (this.compareTo(JDK8) >= 0) return Target.JDK1_8;
140 if (this.compareTo(JDK7) >= 0) return Target.JDK1_7;
141 if (this.compareTo(JDK6) >= 0) return Target.JDK1_6;
142 if (this.compareTo(JDK5) >= 0) return Target.JDK1_5;
143 if (this.compareTo(JDK1_4) >= 0) return Target.JDK1_4;
144 return Target.JDK1_1;
145 }
146
147 /**
148 * Models a feature of the Java programming language. Each feature can be associated with a
149 * minimum source level, a maximum source level and a diagnostic fragment describing the feature,
150 * which is used to generate error messages of the kind {@code feature XYZ not supported in source N}.
151 */
152 public enum Feature {
153
154 DIAMOND(JDK7, Fragments.FeatureDiamond, DiagKind.NORMAL),
155 MODULES(JDK9, Fragments.FeatureModules, DiagKind.PLURAL),
156 EFFECTIVELY_FINAL_VARIABLES_IN_TRY_WITH_RESOURCES(JDK9, Fragments.FeatureVarInTryWithResources, DiagKind.PLURAL),
157 DEPRECATION_ON_IMPORT(MIN, JDK8),
158 POLY(JDK8),
159 LAMBDA(JDK8, Fragments.FeatureLambda, DiagKind.PLURAL),
160 METHOD_REFERENCES(JDK8, Fragments.FeatureMethodReferences, DiagKind.PLURAL),
161 DEFAULT_METHODS(JDK8, Fragments.FeatureDefaultMethods, DiagKind.PLURAL),
162 STATIC_INTERFACE_METHODS(JDK8, Fragments.FeatureStaticIntfMethods, DiagKind.PLURAL),
163 STATIC_INTERFACE_METHODS_INVOKE(JDK8, Fragments.FeatureStaticIntfMethodInvoke, DiagKind.PLURAL),
164 STRICT_METHOD_CLASH_CHECK(JDK8),
165 EFFECTIVELY_FINAL_IN_INNER_CLASSES(JDK8),
166 TYPE_ANNOTATIONS(JDK8, Fragments.FeatureTypeAnnotations, DiagKind.PLURAL),
167 ANNOTATIONS_AFTER_TYPE_PARAMS(JDK8, Fragments.FeatureAnnotationsAfterTypeParams, DiagKind.PLURAL),
168 REPEATED_ANNOTATIONS(JDK8, Fragments.FeatureRepeatableAnnotations, DiagKind.PLURAL),
169 INTERSECTION_TYPES_IN_CAST(JDK8, Fragments.FeatureIntersectionTypesInCast, DiagKind.PLURAL),
170 GRAPH_INFERENCE(JDK8),
171 FUNCTIONAL_INTERFACE_MOST_SPECIFIC(JDK8),
172 POST_APPLICABILITY_VARARGS_ACCESS_CHECK(JDK8),
173 MAP_CAPTURES_TO_BOUNDS(MIN, JDK7),
174 PRIVATE_SAFE_VARARGS(JDK9),
175 DIAMOND_WITH_ANONYMOUS_CLASS_CREATION(JDK9, Fragments.FeatureDiamondAndAnonClass, DiagKind.NORMAL),
176 UNDERSCORE_IDENTIFIER(MIN, JDK8),
177 PRIVATE_INTERFACE_METHODS(JDK9, Fragments.FeaturePrivateIntfMethods, DiagKind.PLURAL),
|