aoqi@0: /* aoqi@0: * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. Oracle designates this aoqi@0: * particular file as subject to the "Classpath" exception as provided aoqi@0: * by Oracle in the LICENSE file that accompanied this code. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: */ aoqi@0: aoqi@0: package com.sun.tools.javac.code; aoqi@0: aoqi@0: import java.util.*; aoqi@0: aoqi@0: import javax.lang.model.SourceVersion; aoqi@0: import static javax.lang.model.SourceVersion.*; aoqi@0: aoqi@0: import com.sun.tools.javac.jvm.Target; aoqi@0: import com.sun.tools.javac.util.*; aoqi@0: import static com.sun.tools.javac.main.Option.*; aoqi@0: aoqi@0: /** The source language version accepted. aoqi@0: * aoqi@0: *

This is NOT part of any supported API. aoqi@0: * If you write code that depends on this, you do so at your own risk. aoqi@0: * This code and its internal interfaces are subject to change or aoqi@0: * deletion without notice. aoqi@0: */ aoqi@0: public enum Source { aoqi@0: /** 1.0 had no inner classes, and so could not pass the JCK. */ aoqi@0: // public static final Source JDK1_0 = new Source("1.0"); aoqi@0: aoqi@0: /** 1.1 did not have strictfp, and so could not pass the JCK. */ aoqi@0: // public static final Source JDK1_1 = new Source("1.1"); aoqi@0: aoqi@0: /** 1.2 introduced strictfp. */ aoqi@0: JDK1_2("1.2"), aoqi@0: aoqi@0: /** 1.3 is the same language as 1.2. */ aoqi@0: JDK1_3("1.3"), aoqi@0: aoqi@0: /** 1.4 introduced assert. */ aoqi@0: JDK1_4("1.4"), aoqi@0: aoqi@0: /** 1.5 introduced generics, attributes, foreach, boxing, static import, aoqi@0: * covariant return, enums, varargs, et al. */ aoqi@0: JDK1_5("1.5"), aoqi@0: aoqi@0: /** 1.6 reports encoding problems as errors instead of warnings. */ aoqi@0: JDK1_6("1.6"), aoqi@0: aoqi@0: /** 1.7 introduced try-with-resources, multi-catch, string switch, etc. */ aoqi@0: JDK1_7("1.7"), aoqi@0: aoqi@0: /** 1.8 covers the to be determined language features that will be added in JDK 8. */ aoqi@0: JDK1_8("1.8"); aoqi@0: aoqi@0: private static final Context.Key sourceKey aoqi@0: = new Context.Key(); aoqi@0: aoqi@0: public static Source instance(Context context) { aoqi@0: Source instance = context.get(sourceKey); aoqi@0: if (instance == null) { aoqi@0: Options options = Options.instance(context); aoqi@0: String sourceString = options.get(SOURCE); aoqi@0: if (sourceString != null) instance = lookup(sourceString); aoqi@0: if (instance == null) instance = DEFAULT; aoqi@0: context.put(sourceKey, instance); aoqi@0: } aoqi@0: return instance; aoqi@0: } aoqi@0: aoqi@0: public final String name; aoqi@0: aoqi@0: private static final Map tab = new HashMap(); aoqi@0: static { aoqi@0: for (Source s : values()) { aoqi@0: tab.put(s.name, s); aoqi@0: } aoqi@0: tab.put("5", JDK1_5); // Make 5 an alias for 1.5 aoqi@0: tab.put("6", JDK1_6); // Make 6 an alias for 1.6 aoqi@0: tab.put("7", JDK1_7); // Make 7 an alias for 1.7 aoqi@0: tab.put("8", JDK1_8); // Make 8 an alias for 1.8 aoqi@0: } aoqi@0: aoqi@0: private Source(String name) { aoqi@0: this.name = name; aoqi@0: } aoqi@0: aoqi@0: public static final Source DEFAULT = JDK1_8; aoqi@0: aoqi@0: public static Source lookup(String name) { aoqi@0: return tab.get(name); aoqi@0: } aoqi@0: aoqi@0: public Target requiredTarget() { aoqi@0: if (this.compareTo(JDK1_8) >= 0) return Target.JDK1_8; aoqi@0: if (this.compareTo(JDK1_7) >= 0) return Target.JDK1_7; aoqi@0: if (this.compareTo(JDK1_6) >= 0) return Target.JDK1_6; aoqi@0: if (this.compareTo(JDK1_5) >= 0) return Target.JDK1_5; aoqi@0: if (this.compareTo(JDK1_4) >= 0) return Target.JDK1_4; aoqi@0: return Target.JDK1_1; aoqi@0: } aoqi@0: aoqi@0: /** Allow encoding errors, giving only warnings. */ aoqi@0: public boolean allowEncodingErrors() { aoqi@0: return compareTo(JDK1_6) < 0; aoqi@0: } aoqi@0: public boolean allowAsserts() { aoqi@0: return compareTo(JDK1_4) >= 0; aoqi@0: } aoqi@0: public boolean allowCovariantReturns() { aoqi@0: return compareTo(JDK1_5) >= 0; aoqi@0: } aoqi@0: public boolean allowGenerics() { aoqi@0: return compareTo(JDK1_5) >= 0; aoqi@0: } aoqi@0: public boolean allowDiamond() { aoqi@0: return compareTo(JDK1_7) >= 0; aoqi@0: } aoqi@0: public boolean allowMulticatch() { aoqi@0: return compareTo(JDK1_7) >= 0; aoqi@0: } aoqi@0: public boolean allowImprovedRethrowAnalysis() { aoqi@0: return compareTo(JDK1_7) >= 0; aoqi@0: } aoqi@0: public boolean allowImprovedCatchAnalysis() { aoqi@0: return compareTo(JDK1_7) >= 0; aoqi@0: } aoqi@0: public boolean allowEnums() { aoqi@0: return compareTo(JDK1_5) >= 0; aoqi@0: } aoqi@0: public boolean allowForeach() { aoqi@0: return compareTo(JDK1_5) >= 0; aoqi@0: } aoqi@0: public boolean allowStaticImport() { aoqi@0: return compareTo(JDK1_5) >= 0; aoqi@0: } aoqi@0: public boolean allowBoxing() { aoqi@0: return compareTo(JDK1_5) >= 0; aoqi@0: } aoqi@0: public boolean allowVarargs() { aoqi@0: return compareTo(JDK1_5) >= 0; aoqi@0: } aoqi@0: public boolean allowAnnotations() { aoqi@0: return compareTo(JDK1_5) >= 0; aoqi@0: } aoqi@0: // hex floating-point literals supported? aoqi@0: public boolean allowHexFloats() { aoqi@0: return compareTo(JDK1_5) >= 0; aoqi@0: } aoqi@0: public boolean allowAnonOuterThis() { aoqi@0: return compareTo(JDK1_5) >= 0; aoqi@0: } aoqi@0: public boolean addBridges() { aoqi@0: return compareTo(JDK1_5) >= 0; aoqi@0: } aoqi@0: public boolean enforceMandatoryWarnings() { aoqi@0: return compareTo(JDK1_5) >= 0; aoqi@0: } aoqi@0: public boolean allowTryWithResources() { aoqi@0: return compareTo(JDK1_7) >= 0; aoqi@0: } aoqi@0: public boolean allowBinaryLiterals() { aoqi@0: return compareTo(JDK1_7) >= 0; aoqi@0: } aoqi@0: public boolean allowUnderscoresInLiterals() { aoqi@0: return compareTo(JDK1_7) >= 0; aoqi@0: } aoqi@0: public boolean allowStringsInSwitch() { aoqi@0: return compareTo(JDK1_7) >= 0; aoqi@0: } aoqi@0: public boolean allowSimplifiedVarargs() { aoqi@0: return compareTo(JDK1_7) >= 0; aoqi@0: } aoqi@0: public boolean allowObjectToPrimitiveCast() { aoqi@0: return compareTo(JDK1_7) >= 0; aoqi@0: } aoqi@0: public boolean enforceThisDotInit() { aoqi@0: return compareTo(JDK1_7) >= 0; aoqi@0: } aoqi@0: public boolean allowPoly() { aoqi@0: return compareTo(JDK1_8) >= 0; aoqi@0: } aoqi@0: public boolean allowLambda() { aoqi@0: return compareTo(JDK1_8) >= 0; aoqi@0: } aoqi@0: public boolean allowMethodReferences() { aoqi@0: return compareTo(JDK1_8) >= 0; aoqi@0: } aoqi@0: public boolean allowDefaultMethods() { aoqi@0: return compareTo(JDK1_8) >= 0; aoqi@0: } aoqi@0: public boolean allowStaticInterfaceMethods() { aoqi@0: return compareTo(JDK1_8) >= 0; aoqi@0: } aoqi@0: public boolean allowStrictMethodClashCheck() { aoqi@0: return compareTo(JDK1_8) >= 0; aoqi@0: } aoqi@0: public boolean allowEffectivelyFinalInInnerClasses() { aoqi@0: return compareTo(JDK1_8) >= 0; aoqi@0: } aoqi@0: public boolean allowTypeAnnotations() { aoqi@0: return compareTo(JDK1_8) >= 0; aoqi@0: } aoqi@0: public boolean allowAnnotationsAfterTypeParams() { aoqi@0: return compareTo(JDK1_8) >= 0; aoqi@0: } aoqi@0: public boolean allowRepeatedAnnotations() { aoqi@0: return compareTo(JDK1_8) >= 0; aoqi@0: } aoqi@0: public boolean allowIntersectionTypesInCast() { aoqi@0: return compareTo(JDK1_8) >= 0; aoqi@0: } aoqi@0: public boolean allowGraphInference() { aoqi@0: return compareTo(JDK1_8) >= 0; aoqi@0: } aoqi@0: public boolean allowFunctionalInterfaceMostSpecific() { aoqi@0: return compareTo(JDK1_8) >= 0; aoqi@0: } vromero@2531: public boolean allowPostApplicabilityVarargsAccessCheck() { vromero@2531: return compareTo(JDK1_8) >= 0; vromero@2531: } aoqi@0: public static SourceVersion toSourceVersion(Source source) { aoqi@0: switch(source) { aoqi@0: case JDK1_2: aoqi@0: return RELEASE_2; aoqi@0: case JDK1_3: aoqi@0: return RELEASE_3; aoqi@0: case JDK1_4: aoqi@0: return RELEASE_4; aoqi@0: case JDK1_5: aoqi@0: return RELEASE_5; aoqi@0: case JDK1_6: aoqi@0: return RELEASE_6; aoqi@0: case JDK1_7: aoqi@0: return RELEASE_7; aoqi@0: case JDK1_8: aoqi@0: return RELEASE_8; aoqi@0: default: aoqi@0: return null; aoqi@0: } aoqi@0: } aoqi@0: }