duke@1: /*
ohair@962: * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
duke@1: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@1: *
duke@1: * This code is free software; you can redistribute it and/or modify it
duke@1: * under the terms of the GNU General Public License version 2 only, as
ohair@554: * published by the Free Software Foundation. Oracle designates this
duke@1: * particular file as subject to the "Classpath" exception as provided
ohair@554: * by Oracle in the LICENSE file that accompanied this code.
duke@1: *
duke@1: * This code is distributed in the hope that it will be useful, but WITHOUT
duke@1: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@1: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@1: * version 2 for more details (a copy is included in the LICENSE file that
duke@1: * accompanied this code).
duke@1: *
duke@1: * You should have received a copy of the GNU General Public License version
duke@1: * 2 along with this work; if not, write to the Free Software Foundation,
duke@1: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@1: *
ohair@554: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ohair@554: * or visit www.oracle.com if you need additional information or have any
ohair@554: * questions.
duke@1: */
duke@1:
duke@1: package com.sun.tools.javac.code;
duke@1:
jjg@700: import java.util.*;
jjg@700: import javax.lang.model.SourceVersion;
jjg@700: import static javax.lang.model.SourceVersion.*;
jjg@700:
duke@1: import com.sun.tools.javac.util.*;
duke@1: import com.sun.tools.javac.jvm.Target;
jjg@700:
jjg@700: import static com.sun.tools.javac.main.OptionName.*;
duke@1:
duke@1: /** The source language version accepted.
duke@1: *
jjg@581: *
This is NOT part of any supported API.
jjg@581: * If you write code that depends on this, you do so at your own risk.
duke@1: * This code and its internal interfaces are subject to change or
duke@1: * deletion without notice.
duke@1: */
duke@1: public enum Source {
duke@1: /** 1.0 had no inner classes, and so could not pass the JCK. */
duke@1: // public static final Source JDK1_0 = new Source("1.0");
duke@1:
duke@1: /** 1.1 did not have strictfp, and so could not pass the JCK. */
duke@1: // public static final Source JDK1_1 = new Source("1.1");
duke@1:
duke@1: /** 1.2 introduced strictfp. */
duke@1: JDK1_2("1.2"),
duke@1:
duke@1: /** 1.3 is the same language as 1.2. */
duke@1: JDK1_3("1.3"),
duke@1:
duke@1: /** 1.4 introduced assert. */
duke@1: JDK1_4("1.4"),
duke@1:
duke@1: /** 1.5 introduced generics, attributes, foreach, boxing, static import,
duke@1: * covariant return, enums, varargs, et al. */
duke@1: JDK1_5("1.5"),
duke@1:
duke@1: /** 1.6 reports encoding problems as errors instead of warnings. */
duke@1: JDK1_6("1.6"),
duke@1:
duke@1: /** 1.7 covers the to be determined language features that will be added in JDK 7. */
duke@1: JDK1_7("1.7");
duke@1:
duke@1: private static final Context.Key sourceKey
duke@1: = new Context.Key();
duke@1:
duke@1: public static Source instance(Context context) {
duke@1: Source instance = context.get(sourceKey);
duke@1: if (instance == null) {
duke@1: Options options = Options.instance(context);
jjg@700: String sourceString = options.get(SOURCE);
duke@1: if (sourceString != null) instance = lookup(sourceString);
duke@1: if (instance == null) instance = DEFAULT;
duke@1: context.put(sourceKey, instance);
duke@1: }
duke@1: return instance;
duke@1: }
duke@1:
duke@1: public final String name;
duke@1:
duke@1: private static Map tab = new HashMap();
duke@1: static {
duke@1: for (Source s : values()) {
duke@1: tab.put(s.name, s);
duke@1: }
duke@1: tab.put("5", JDK1_5); // Make 5 an alias for 1.5
duke@1: tab.put("6", JDK1_6); // Make 6 an alias for 1.6
duke@1: tab.put("7", JDK1_7); // Make 7 an alias for 1.7
duke@1: }
duke@1:
duke@1: private Source(String name) {
duke@1: this.name = name;
duke@1: }
duke@1:
jjg@286: public static final Source DEFAULT = JDK1_7;
duke@1:
duke@1: public static Source lookup(String name) {
duke@1: return tab.get(name);
duke@1: }
duke@1:
duke@1: public Target requiredTarget() {
duke@1: if (this.compareTo(JDK1_7) >= 0) return Target.JDK1_7;
duke@1: if (this.compareTo(JDK1_6) >= 0) return Target.JDK1_6;
duke@1: if (this.compareTo(JDK1_5) >= 0) return Target.JDK1_5;
duke@1: if (this.compareTo(JDK1_4) >= 0) return Target.JDK1_4;
duke@1: return Target.JDK1_1;
duke@1: }
duke@1:
duke@1: /** Allow encoding errors, giving only warnings. */
duke@1: public boolean allowEncodingErrors() {
duke@1: return compareTo(JDK1_6) < 0;
duke@1: }
duke@1: public boolean allowAsserts() {
duke@1: return compareTo(JDK1_4) >= 0;
duke@1: }
duke@1: public boolean allowCovariantReturns() {
duke@1: return compareTo(JDK1_5) >= 0;
duke@1: }
duke@1: public boolean allowGenerics() {
duke@1: return compareTo(JDK1_5) >= 0;
duke@1: }
mcimadamore@537: public boolean allowDiamond() {
mcimadamore@537: return compareTo(JDK1_7) >= 0;
mcimadamore@537: }
mcimadamore@550: public boolean allowMulticatch() {
mcimadamore@550: return compareTo(JDK1_7) >= 0;
mcimadamore@550: }
mcimadamore@935: public boolean allowImprovedRethrowAnalysis() {
mcimadamore@935: return compareTo(JDK1_7) >= 0;
mcimadamore@935: }
mcimadamore@935: public boolean allowImprovedCatchAnalysis() {
mcimadamore@935: return compareTo(JDK1_7) >= 0;
mcimadamore@935: }
duke@1: public boolean allowEnums() {
duke@1: return compareTo(JDK1_5) >= 0;
duke@1: }
duke@1: public boolean allowForeach() {
duke@1: return compareTo(JDK1_5) >= 0;
duke@1: }
duke@1: public boolean allowStaticImport() {
duke@1: return compareTo(JDK1_5) >= 0;
duke@1: }
duke@1: public boolean allowBoxing() {
duke@1: return compareTo(JDK1_5) >= 0;
duke@1: }
duke@1: public boolean allowVarargs() {
duke@1: return compareTo(JDK1_5) >= 0;
duke@1: }
duke@1: public boolean allowAnnotations() {
duke@1: return compareTo(JDK1_5) >= 0;
duke@1: }
duke@1: // hex floating-point literals supported?
duke@1: public boolean allowHexFloats() {
duke@1: return compareTo(JDK1_5) >= 0;
duke@1: }
duke@1: public boolean allowAnonOuterThis() {
duke@1: return compareTo(JDK1_5) >= 0;
duke@1: }
duke@1: public boolean addBridges() {
duke@1: return compareTo(JDK1_5) >= 0;
duke@1: }
duke@1: public boolean enforceMandatoryWarnings() {
duke@1: return compareTo(JDK1_5) >= 0;
duke@1: }
darcy@609: public boolean allowTryWithResources() {
darcy@609: return compareTo(JDK1_7) >= 0;
darcy@609: }
jjg@308: public boolean allowTypeAnnotations() {
jjg@308: return compareTo(JDK1_7) >= 0;
jjg@308: }
jjg@409: public boolean allowBinaryLiterals() {
jjg@409: return compareTo(JDK1_7) >= 0;
jjg@409: }
jjg@409: public boolean allowUnderscoresInLiterals() {
jjg@409: return compareTo(JDK1_7) >= 0;
jjg@409: }
mcimadamore@674: public boolean allowStringsInSwitch() {
jrose@571: return compareTo(JDK1_7) >= 0;
jrose@571: }
mcimadamore@795: public boolean allowSimplifiedVarargs() {
mcimadamore@795: return compareTo(JDK1_7) >= 0;
mcimadamore@795: }
duke@1: public static SourceVersion toSourceVersion(Source source) {
duke@1: switch(source) {
duke@1: case JDK1_2:
duke@1: return RELEASE_2;
duke@1: case JDK1_3:
duke@1: return RELEASE_3;
duke@1: case JDK1_4:
duke@1: return RELEASE_4;
duke@1: case JDK1_5:
duke@1: return RELEASE_5;
duke@1: case JDK1_6:
duke@1: return RELEASE_6;
duke@1: case JDK1_7:
duke@1: return RELEASE_7;
duke@1: default:
duke@1: return null;
duke@1: }
duke@1: }
duke@1: }