| 1 | /* | 
| 2 |  * Copyright 2002-2006 Sun Microsystems, Inc.  All Rights Reserved. | 
| 3 |  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 
| 4 |  * | 
| 5 |  * This code is free software; you can redistribute it and/or modify it | 
| 6 |  * under the terms of the GNU General Public License version 2 only, as | 
| 7 |  * published by the Free Software Foundation.  Sun designates this | 
| 8 |  * particular file as subject to the "Classpath" exception as provided | 
| 9 |  * by Sun in the LICENSE file that accompanied this code. | 
| 10 |  * | 
| 11 |  * This code is distributed in the hope that it will be useful, but WITHOUT | 
| 12 |  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
| 13 |  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License | 
| 14 |  * version 2 for more details (a copy is included in the LICENSE file that | 
| 15 |  * accompanied this code). | 
| 16 |  * | 
| 17 |  * You should have received a copy of the GNU General Public License version | 
| 18 |  * 2 along with this work; if not, write to the Free Software Foundation, | 
| 19 |  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | 
| 20 |  * | 
| 21 |  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, | 
| 22 |  * CA 95054 USA or visit www.sun.com if you need additional information or | 
| 23 |  * have any questions. | 
| 24 |  */ | 
| 25 |   | 
| 26 | package com.sun.tools.javac.code; | 
| 27 |   | 
| 28 | import com.sun.tools.javac.util.*; | 
| 29 | import com.sun.tools.javac.jvm.Target; | 
| 30 | import javax.lang.model.SourceVersion; | 
| 31 | import static javax.lang.model.SourceVersion.*; | 
| 32 | import java.util.*; | 
| 33 |   | 
| 34 | /** The source language version accepted. | 
| 35 |  * | 
| 36 |  *  <p><b>This is NOT part of any API supported by Sun Microsystems.  If | 
| 37 |  *  you write code that depends on this, you do so at your own risk. | 
| 38 |  *  This code and its internal interfaces are subject to change or | 
| 39 |  *  deletion without notice.</b> | 
| 40 |  */ | 
| 41 | public enum Source { | 
| 42 |     /** 1.0 had no inner classes, and so could not pass the JCK. */ | 
| 43 |     // public static final Source JDK1_0 =              new Source("1.0"); | 
| 44 |   | 
| 45 |     /** 1.1 did not have strictfp, and so could not pass the JCK. */ | 
| 46 |     // public static final Source JDK1_1 =              new Source("1.1"); | 
| 47 |   | 
| 48 |     /** 1.2 introduced strictfp. */ | 
| 49 |     JDK1_2("1.2"), | 
| 50 |   | 
| 51 |     /** 1.3 is the same language as 1.2. */ | 
| 52 |     JDK1_3("1.3"), | 
| 53 |   | 
| 54 |     /** 1.4 introduced assert. */ | 
| 55 |     JDK1_4("1.4"), | 
| 56 |   | 
| 57 |     /** 1.5 introduced generics, attributes, foreach, boxing, static import, | 
| 58 |      *  covariant return, enums, varargs, et al. */ | 
| 59 |     JDK1_5("1.5"), | 
| 60 |   | 
| 61 |     /** 1.6 reports encoding problems as errors instead of warnings. */ | 
| 62 |     JDK1_6("1.6"), | 
| 63 |   | 
| 64 |     /** 1.7 covers the to be determined language features that will be added in JDK 7. */ | 
| 65 |     JDK1_7("1.7"); | 
| 66 |   | 
| 67 |     private static final Context.Key<Source> sourceKey | 
| 68 |         = new Context.Key<Source>(); | 
| 69 |   | 
| 70 |     public static Source instance(Context context) { | 
| 71 |         Source instance = context.get(sourceKey); | 
| 72 |         if (instance == null) { | 
| 73 |             Options options = Options.instance(context); | 
| 74 |             String sourceString = options.get("-source"); | 
| 75 |             if (sourceString != null) instance = lookup(sourceString); | 
| 76 |             if (instance == null) instance = DEFAULT; | 
| 77 |             context.put(sourceKey, instance); | 
| 78 |         } | 
| 79 |         return instance; | 
| 80 |     } | 
| 81 |   | 
| 82 |     public final String name; | 
| 83 |   | 
| 84 |     private static Map<String,Source> tab = new HashMap<String,Source>(); | 
| 85 |     static { | 
| 86 |         for (Source s : values()) { | 
| 87 |             tab.put(s.name, s); | 
| 88 |         } | 
| 89 |         tab.put("5", JDK1_5); // Make 5 an alias for 1.5 | 
| 90 |         tab.put("6", JDK1_6); // Make 6 an alias for 1.6 | 
| 91 |         tab.put("7", JDK1_7); // Make 7 an alias for 1.7 | 
| 92 |     } | 
| 93 |   | 
| 94 |     private Source(String name) { | 
| 95 |         this.name = name; | 
| 96 |     } | 
| 97 |   | 
| 98 |     public static final Source DEFAULT = JDK1_5; | 
| 99 |   | 
| 100 |     public static Source lookup(String name) { | 
| 101 |         return tab.get(name); | 
| 102 |     } | 
| 103 |   | 
| 104 |     public Target requiredTarget() { | 
| 105 |         if (this.compareTo(JDK1_7) >= 0) return Target.JDK1_7; | 
| 106 |         if (this.compareTo(JDK1_6) >= 0) return Target.JDK1_6; | 
| 107 |         if (this.compareTo(JDK1_5) >= 0) return Target.JDK1_5; | 
| 108 |         if (this.compareTo(JDK1_4) >= 0) return Target.JDK1_4; | 
| 109 |         return Target.JDK1_1; | 
| 110 |     } | 
| 111 |   | 
| 112 |     /** Allow encoding errors, giving only warnings. */ | 
| 113 |     public boolean allowEncodingErrors() { | 
| 114 |         return compareTo(JDK1_6) < 0; | 
| 115 |     } | 
| 116 |     public boolean allowAsserts() { | 
| 117 |         return compareTo(JDK1_4) >= 0; | 
| 118 |     } | 
| 119 |     public boolean allowCovariantReturns() { | 
| 120 |         return compareTo(JDK1_5) >= 0; | 
| 121 |     } | 
| 122 |     public boolean allowGenerics() { | 
| 123 |         return compareTo(JDK1_5) >= 0; | 
| 124 |     } | 
| 125 |     public boolean allowEnums() { | 
| 126 |         return compareTo(JDK1_5) >= 0; | 
| 127 |     } | 
| 128 |     public boolean allowForeach() { | 
| 129 |         return compareTo(JDK1_5) >= 0; | 
| 130 |     } | 
| 131 |     public boolean allowStaticImport() { | 
| 132 |         return compareTo(JDK1_5) >= 0; | 
| 133 |     } | 
| 134 |     public boolean allowBoxing() { | 
| 135 |         return compareTo(JDK1_5) >= 0; | 
| 136 |     } | 
| 137 |     public boolean allowVarargs() { | 
| 138 |         return compareTo(JDK1_5) >= 0; | 
| 139 |     } | 
| 140 |     public boolean allowAnnotations() { | 
| 141 |         return compareTo(JDK1_5) >= 0; | 
| 142 |     } | 
| 143 |     // hex floating-point literals supported? | 
| 144 |     public boolean allowHexFloats() { | 
| 145 |         return compareTo(JDK1_5) >= 0; | 
| 146 |     } | 
| 147 |     public boolean allowAnonOuterThis() { | 
| 148 |         return compareTo(JDK1_5) >= 0; | 
| 149 |     } | 
| 150 |     public boolean addBridges() { | 
| 151 |         return compareTo(JDK1_5) >= 0; | 
| 152 |     } | 
| 153 |     public boolean enforceMandatoryWarnings() { | 
| 154 |         return compareTo(JDK1_5) >= 0; | 
| 155 |     } | 
| 156 |     public static SourceVersion toSourceVersion(Source source) { | 
| 157 |         switch(source) { | 
| 158 |         case JDK1_2: | 
| 159 |             return RELEASE_2; | 
| 160 |         case JDK1_3: | 
| 161 |             return RELEASE_3; | 
| 162 |         case JDK1_4: | 
| 163 |             return RELEASE_4; | 
| 164 |         case JDK1_5: | 
| 165 |             return RELEASE_5; | 
| 166 |         case JDK1_6: | 
| 167 |             return RELEASE_6; | 
| 168 |         case JDK1_7: | 
| 169 |             return RELEASE_7; | 
| 170 |         default: | 
| 171 |             return null; | 
| 172 |         } | 
| 173 |     } | 
| 174 | } |