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: }