mirror of
https://github.com/tiennm99/lombok.git
synced 2026-10-03 07:13:15 +00:00
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:
1 parent
4152eee126
commit
9c1e29842e
6 files changed
+64
-1
No files matched your search
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in new issue
Block a user