Added methods to obtain JLS support-level version information from AST/LombokNode. Tests updates to honour these with //version X at the top

of any test file (now also in eclipse, which until now always said it was v6)
This commit is contained in:
Reinier Zwitserloot committed 2013-05-23 22:58:34 +02:00
1 parent 4152eee126
commit 9c1e29842e
6 files changed
+64 -1

No files matched your search

+10
View File
@@ -146,9 +146,19 @@ public abstract class AST<A extends AST<A, L, N>, L extends LombokNode<A, L, N>,
return nodeMap.get(node);
}
/**
* Returns the JLS spec version that the compiler uses to parse and compile this AST.
* For example, if -source 1.6 is on the command line, this will return {@code 6}.
*/
public int getSourceVersion() {
return 6;
}
/**
* Returns the latest version of the java language specification supported by the host compiler.
* For example, if compiling with javac v1.7, this returns {@code 7}.
*
* NB: Even if -source (lower than maximum) is specified, this method still returns the maximum supported number.
*/
public int getLatestJavaSpecSupported() {
return 6;
+9
View File
@@ -189,6 +189,15 @@ public abstract class LombokNode<A extends AST<A, L, N>, L extends LombokNode<A,
return ast.getLatestJavaSpecSupported();
}
/**
* Convenient shortcut to the owning ast object's getSourceVersion method.
*
* @see AST#getSourceVersion()
*/
public int getSourceVersion() {
return ast.getSourceVersion();
}
/**
* Convenient shortcut to the owning ast object's top method.
*
+14
View File
@@ -68,6 +68,20 @@ public class EclipseAST extends AST<EclipseAST, EclipseNode, ASTNode> {
return pkg == null ? null : Eclipse.toQualifiedName(pkg.getImportName());
}
@Override public int getSourceVersion() {
long sl = compilationUnitDeclaration.problemReporter.options.sourceLevel;
long cl = compilationUnitDeclaration.problemReporter.options.complianceLevel;
sl >>= 16;
cl >>= 16;
if (sl == 0) sl = cl;
if (cl == 0) cl = sl;
return Math.min((int)(sl - 44), (int)(cl - 44));
}
@Override public int getLatestJavaSpecSupported() {
return Eclipse.getEcjCompilerVersion();
}
/**
* Runs through the entire AST, starting at the compilation unit, calling the provided visitor's visit methods
* for each node, depth first.
+10
View File
@@ -34,6 +34,7 @@ import javax.tools.JavaFileObject;
import lombok.core.AST;
import com.sun.tools.javac.code.Symtab;
import com.sun.tools.javac.code.Source;
import com.sun.tools.javac.model.JavacElements;
import com.sun.tools.javac.model.JavacTypes;
import com.sun.tools.javac.tree.JCTree;
@@ -113,6 +114,15 @@ public class JavacAST extends AST<JavacAST, JavacNode, JCTree> {
for (JavacNode child : node.down()) child.traverse(visitor);
}
@Override public int getSourceVersion() {
try {
String nm = Source.instance(context).name();
int underscoreIdx = nm.indexOf('_');
if (underscoreIdx > -1) return Integer.parseInt(nm.substring(underscoreIdx + 1));
} catch (Exception ignore) {}
return 6;
}
@Override public int getLatestJavaSpecSupported() {
return Javac.getJavaCompilerVersion();
}
+19
View File
@@ -21,6 +21,7 @@
*/
package lombok.eclipse;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -38,6 +39,7 @@ import org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;
import org.eclipse.jdt.internal.compiler.ast.SingleNameReference;
import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
import org.eclipse.jdt.internal.compiler.ast.TypeReference;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.jdt.internal.compiler.lookup.TypeIds;
public class Eclipse {
@@ -177,4 +179,21 @@ public class Eclipse {
return null;
}
private static int ecjCompilerVersionCached = -1;
public static int getEcjCompilerVersion() {
if (ecjCompilerVersionCached >= 0) return ecjCompilerVersionCached;
for (Field f : CompilerOptions.class.getDeclaredFields()) {
try {
if (f.getName().startsWith("VERSION_1_")) {
ecjCompilerVersionCached = Math.max(ecjCompilerVersionCached, Integer.parseInt(f.getName().substring("VERSION_1_".length())));
}
} catch (Exception ignore) {}
}
if (ecjCompilerVersionCached < 5) ecjCompilerVersionCached = 5;
return ecjCompilerVersionCached;
}
}
+2 -1
View File
@@ -32,6 +32,7 @@ import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import lombok.eclipse.Eclipse;
import lombok.javac.Javac;
import org.junit.runner.Description;
@@ -53,7 +54,7 @@ public class DirectoryRunner extends Runner {
},
ECJ {
@Override public int getVersion() {
return 6;
return Eclipse.getEcjCompilerVersion();
}
};