Preparating for java 1.5-ification. All stuff that isn't specific to javac should run in java 1.5, so that an eclipse started on a 1.5 JVM will still run lombok.

This commit is contained in:
Reinier Zwitserloot committed 2009-06-28 05:58:18 +02:00
1 parent 19f1b26593
commit 69844725fb
12 files changed
+81 -85

No files matched your search

+1 -1
View File
@@ -87,7 +87,7 @@ public class AnnotationValues<A extends Annotation> {
public A getInstance() throws AnnotationValueDecodeFail {
if ( cachedInstance != null ) return cachedInstance;
InvocationHandler invocations = new InvocationHandler() {
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
AnnotationValue v = values.get(method.getName());
if ( v == null ) {
Object defaultValue = method.getDefaultValue();
+3 -2
View File
@@ -1,6 +1,5 @@
package lombok.core;
import java.awt.Desktop;
import java.net.URI;
/**
@@ -13,7 +12,9 @@ public class ShowUserHelp {
public static void main(String[] args) {
boolean browserOpened = false;
try {
Desktop.getDesktop().browse(ABOUT_LOMBOK_URL);
//java.awt.Desktop doesn't exist in 1.5, and for IDE's sakes, we may want to work in java1.5 someday, so...
Object desktop = Class.forName("java.awt.Desktop").getMethod("getDesktop").invoke(null);
Class.forName("java.awt.Desktop").getMethod("browse", URI.class).invoke(desktop, ABOUT_LOMBOK_URL);
browserOpened = true;
} catch ( Exception ignore ) {}
-19
View File
@@ -14,7 +14,6 @@ import org.eclipse.jdt.internal.compiler.ast.ASTNode;
import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
import org.eclipse.jdt.internal.compiler.ast.Annotation;
import org.eclipse.jdt.internal.compiler.ast.Argument;
import org.eclipse.jdt.internal.compiler.ast.Block;
import org.eclipse.jdt.internal.compiler.ast.Clinit;
import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;
@@ -22,7 +21,6 @@ import org.eclipse.jdt.internal.compiler.ast.ImportReference;
import org.eclipse.jdt.internal.compiler.ast.Initializer;
import org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;
import org.eclipse.jdt.internal.compiler.ast.Statement;
import org.eclipse.jdt.internal.compiler.ast.TryStatement;
import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
import org.eclipse.jdt.internal.compiler.problem.DefaultProblem;
import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;
@@ -149,23 +147,6 @@ public class EclipseAST extends AST<ASTNode> {
super(node, children, kind);
}
public void rebuild() {
super.rebuild();
System.out.println("REBUILD COMPLETE");
AbstractMethodDeclaration me = (AbstractMethodDeclaration) get();
for ( Statement outer : me.statements ) {
System.out.println("OUTER: "+ outer);
if ( outer instanceof TryStatement ) {
TryStatement ts = (TryStatement)outer;
Block tb = ((TryStatement) outer).tryBlock;
for ( Statement inner : tb.statements ) {
System.out.println("INNER: " + inner);
}
}
}
System.out.println("/REBUILD COMPLETE");
}
public void traverse(EclipseASTVisitor visitor) {
switch ( getKind() ) {
case COMPILATION_UNIT:
+21 -21
View File
@@ -13,25 +13,25 @@ import org.eclipse.jdt.internal.compiler.ast.Statement;
import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
public abstract class EclipseASTAdapter implements EclipseASTVisitor {
@Override public void visitCompilationUnit(Node top, CompilationUnitDeclaration unit) {}
@Override public void endVisitCompilationUnit(Node top, CompilationUnitDeclaration unit) {}
@Override public void visitType(Node typeNode, TypeDeclaration type) {}
@Override public void visitAnnotationOnType(TypeDeclaration type, Node annotationNode, Annotation annotation) {}
@Override public void endVisitType(Node typeNode, TypeDeclaration type) {}
@Override public void visitInitializer(Node initializerNode, Initializer initializer) {}
@Override public void endVisitInitializer(Node initializerNode, Initializer initializer) {}
@Override public void visitField(Node fieldNode, FieldDeclaration field) {}
@Override public void visitAnnotationOnField(FieldDeclaration field, Node annotationNode, Annotation annotation) {}
@Override public void endVisitField(Node fieldNode, FieldDeclaration field) {}
@Override public void visitMethod(Node methodNode, AbstractMethodDeclaration method) {}
@Override public void visitAnnotationOnMethod(AbstractMethodDeclaration method, Node annotationNode, Annotation annotation) {}
@Override public void endVisitMethod(Node methodNode, AbstractMethodDeclaration method) {}
@Override public void visitMethodArgument(Node argNode, Argument arg, AbstractMethodDeclaration method) {}
@Override public void visitAnnotationOnMethodArgument(Argument arg, AbstractMethodDeclaration method, Node annotationNode, Annotation annotation) {}
@Override public void endVisitMethodArgument(Node argNode, Argument arg, AbstractMethodDeclaration method) {}
@Override public void visitLocal(Node localNode, LocalDeclaration local) {}
@Override public void visitAnnotationOnLocal(LocalDeclaration local, Node annotationNode, Annotation annotation) {}
@Override public void endVisitLocal(Node localNode, LocalDeclaration local) {}
@Override public void visitStatement(Node statementNode, Statement statement) {}
@Override public void endVisitStatement(Node statementNode, Statement statement) {}
public void visitCompilationUnit(Node top, CompilationUnitDeclaration unit) {}
public void endVisitCompilationUnit(Node top, CompilationUnitDeclaration unit) {}
public void visitType(Node typeNode, TypeDeclaration type) {}
public void visitAnnotationOnType(TypeDeclaration type, Node annotationNode, Annotation annotation) {}
public void endVisitType(Node typeNode, TypeDeclaration type) {}
public void visitInitializer(Node initializerNode, Initializer initializer) {}
public void endVisitInitializer(Node initializerNode, Initializer initializer) {}
public void visitField(Node fieldNode, FieldDeclaration field) {}
public void visitAnnotationOnField(FieldDeclaration field, Node annotationNode, Annotation annotation) {}
public void endVisitField(Node fieldNode, FieldDeclaration field) {}
public void visitMethod(Node methodNode, AbstractMethodDeclaration method) {}
public void visitAnnotationOnMethod(AbstractMethodDeclaration method, Node annotationNode, Annotation annotation) {}
public void endVisitMethod(Node methodNode, AbstractMethodDeclaration method) {}
public void visitMethodArgument(Node argNode, Argument arg, AbstractMethodDeclaration method) {}
public void visitAnnotationOnMethodArgument(Argument arg, AbstractMethodDeclaration method, Node annotationNode, Annotation annotation) {}
public void endVisitMethodArgument(Node argNode, Argument arg, AbstractMethodDeclaration method) {}
public void visitLocal(Node localNode, LocalDeclaration local) {}
public void visitAnnotationOnLocal(LocalDeclaration local, Node annotationNode, Annotation annotation) {}
public void endVisitLocal(Node localNode, LocalDeclaration local) {}
public void visitStatement(Node statementNode, Statement statement) {}
public void endVisitStatement(Node statementNode, Statement statement) {}
}
+21 -21
View File
@@ -129,7 +129,7 @@ public interface EclipseASTVisitor {
return sb.toString();
}
@Override public void visitCompilationUnit(Node node, CompilationUnitDeclaration unit) {
public void visitCompilationUnit(Node node, CompilationUnitDeclaration unit) {
out.println("---------------------------------------------------------");
out.println(node.isCompleteParse() ? "COMPLETE" : "incomplete");
@@ -137,26 +137,26 @@ public interface EclipseASTVisitor {
indent++;
}
@Override public void endVisitCompilationUnit(Node node, CompilationUnitDeclaration unit) {
public void endVisitCompilationUnit(Node node, CompilationUnitDeclaration unit) {
indent--;
print("</CUD>");
}
@Override public void visitType(Node node, TypeDeclaration type) {
public void visitType(Node node, TypeDeclaration type) {
print("<TYPE %s>", str(type.name));
indent++;
}
@Override public void visitAnnotationOnType(TypeDeclaration type, Node node, Annotation annotation) {
public void visitAnnotationOnType(TypeDeclaration type, Node node, Annotation annotation) {
forcePrint("<ANNOTATION: %s />", annotation);
}
@Override public void endVisitType(Node node, TypeDeclaration type) {
public void endVisitType(Node node, TypeDeclaration type) {
indent--;
print("</TYPE %s>", str(type.name));
}
@Override public void visitInitializer(Node node, Initializer initializer) {
public void visitInitializer(Node node, Initializer initializer) {
Block block = initializer.block;
boolean s = (block != null && block.statements != null);
print("<%s INITIALIZER: %s>",
@@ -169,13 +169,13 @@ public interface EclipseASTVisitor {
}
}
@Override public void endVisitInitializer(Node node, Initializer initializer) {
public void endVisitInitializer(Node node, Initializer initializer) {
if ( printContent ) disablePrinting--;
indent--;
print("</%s INITIALIZER>", (initializer.modifiers & Modifier.STATIC) != 0 ? "static" : "instance");
}
@Override public void visitField(Node node, FieldDeclaration field) {
public void visitField(Node node, FieldDeclaration field) {
print("<FIELD %s %s = %s>", str(field.type), str(field.name), field.initialization);
indent++;
if ( printContent ) {
@@ -184,17 +184,17 @@ public interface EclipseASTVisitor {
}
}
@Override public void visitAnnotationOnField(FieldDeclaration field, Node node, Annotation annotation) {
public void visitAnnotationOnField(FieldDeclaration field, Node node, Annotation annotation) {
forcePrint("<ANNOTATION: %s />", annotation);
}
@Override public void endVisitField(Node node, FieldDeclaration field) {
public void endVisitField(Node node, FieldDeclaration field) {
if ( printContent ) disablePrinting--;
indent--;
print("</FIELD %s %s>", str(field.type), str(field.name));
}
@Override public void visitMethod(Node node, AbstractMethodDeclaration method) {
public void visitMethod(Node node, AbstractMethodDeclaration method) {
String type = method instanceof ConstructorDeclaration ? "CONSTRUCTOR" : "METHOD";
print("<%s %s: %s>", type, str(method.selector), method.statements != null ? "filled" : "blank");
indent++;
@@ -204,52 +204,52 @@ public interface EclipseASTVisitor {
}
}
@Override public void visitAnnotationOnMethod(AbstractMethodDeclaration method, Node node, Annotation annotation) {
public void visitAnnotationOnMethod(AbstractMethodDeclaration method, Node node, Annotation annotation) {
forcePrint("<ANNOTATION: %s />", annotation);
}
@Override public void endVisitMethod(Node node, AbstractMethodDeclaration method) {
public void endVisitMethod(Node node, AbstractMethodDeclaration method) {
if ( printContent ) disablePrinting--;
String type = method instanceof ConstructorDeclaration ? "CONSTRUCTOR" : "METHOD";
indent--;
print("</%s %s>", type, str(method.selector));
}
@Override public void visitMethodArgument(Node node, Argument arg, AbstractMethodDeclaration method) {
public void visitMethodArgument(Node node, Argument arg, AbstractMethodDeclaration method) {
print("<METHODARG %s %s = %s>", str(arg.type), str(arg.name), arg.initialization);
indent++;
}
@Override public void visitAnnotationOnMethodArgument(Argument arg, AbstractMethodDeclaration method, Node node, Annotation annotation) {
public void visitAnnotationOnMethodArgument(Argument arg, AbstractMethodDeclaration method, Node node, Annotation annotation) {
print("<ANNOTATION: %s />", annotation);
}
@Override public void endVisitMethodArgument(Node node, Argument arg, AbstractMethodDeclaration method) {
public void endVisitMethodArgument(Node node, Argument arg, AbstractMethodDeclaration method) {
indent--;
print("</METHODARG %s %s>", str(arg.type), str(arg.name));
}
@Override public void visitLocal(Node node, LocalDeclaration local) {
public void visitLocal(Node node, LocalDeclaration local) {
print("<LOCAL %s %s = %s>", str(local.type), str(local.name), local.initialization);
indent++;
}
@Override public void visitAnnotationOnLocal(LocalDeclaration local, Node node, Annotation annotation) {
public void visitAnnotationOnLocal(LocalDeclaration local, Node node, Annotation annotation) {
print("<ANNOTATION: %s />", annotation);
}
@Override public void endVisitLocal(Node node, LocalDeclaration local) {
public void endVisitLocal(Node node, LocalDeclaration local) {
indent--;
print("</LOCAL %s %s>", str(local.type), str(local.name));
}
@Override public void visitStatement(Node node, Statement statement) {
public void visitStatement(Node node, Statement statement) {
print("<%s>", statement.getClass());
indent++;
print("%s", statement);
}
@Override public void endVisitStatement(Node node, Statement statement) {
public void endVisitStatement(Node node, Statement statement) {
indent--;
print("</%s>", statement.getClass());
}
@@ -35,9 +35,9 @@ import org.mangosdk.spi.ProviderFor;
@ProviderFor(EclipseAnnotationHandler.class)
public class HandleCleanup implements EclipseAnnotationHandler<Cleanup> {
@Override public boolean handle(AnnotationValues<Cleanup> annotation, Annotation ast, Node annotationNode) {
public boolean handle(AnnotationValues<Cleanup> annotation, Annotation ast, Node annotationNode) {
String cleanupName = annotation.getInstance().cleanupMethod();
if ( cleanupName.isEmpty() ) {
if ( cleanupName.length() == 0 ) {
annotationNode.addError("cleanupName cannot be the empty string.");
return true;
}
@@ -49,6 +49,7 @@ public class HandleCleanup implements EclipseAnnotationHandler<Cleanup> {
LocalDeclaration decl = (LocalDeclaration)annotationNode.up().get();
Node ancestor = annotationNode.up().directUp();
ASTNode blockNode = annotationNode.up().directUp().get();
final boolean isSwitch;
@@ -124,7 +125,7 @@ public class HandleCleanup implements EclipseAnnotationHandler<Cleanup> {
//Remove the stuff we just dumped into the tryBlock, AND the close() call, and then leave room for the try node and the unique name.
Statement[] newStatements = new Statement[statements.length - (end-start) +1];
System.arraycopy(statements, 0, newStatements, 0, start);
if ( statements.length - end > 0 ) System.arraycopy(statements, end+1, newStatements, start+2, statements.length - end -1);
System.arraycopy(statements, end+1, newStatements, start+2, statements.length - end -1);
TryStatement tryStatement = new TryStatement();
newStatements[start+1] = tryStatement;
LocalDeclaration tempVar = new LocalDeclaration(("$lombok$cleanup$" + new String(decl.name)).toCharArray(), 0, 0);
@@ -200,6 +201,8 @@ public class HandleCleanup implements EclipseAnnotationHandler<Cleanup> {
((SwitchStatement)blockNode).statements = newStatements;
}
ancestor.rebuild();
return true;
}
}
+3 -3
View File
@@ -69,7 +69,7 @@ import org.mangosdk.spi.ProviderFor;
@ProviderFor(EclipseAnnotationHandler.class)
public class HandleData implements EclipseAnnotationHandler<Data> {
@Override public boolean handle(AnnotationValues<Data> annotation, Annotation ast, Node annotationNode) {
public boolean handle(AnnotationValues<Data> annotation, Annotation ast, Node annotationNode) {
Data ann = annotation.getInstance();
Node typeNode = annotationNode.up();
@@ -105,11 +105,11 @@ public class HandleData implements EclipseAnnotationHandler<Data> {
if ( constructorExists(typeNode) == MethodExistsResult.NOT_EXISTS ) {
ConstructorDeclaration constructor = createConstructor(
ann.staticConstructor().isEmpty(), typeNode, nodesForConstructorAndToString, ast);
ann.staticConstructor().length() == 0, typeNode, nodesForConstructorAndToString, ast);
injectMethod(typeNode, constructor);
}
if ( !ann.staticConstructor().isEmpty() ) {
if ( ann.staticConstructor().length() > 0 ) {
if ( methodExists("of", typeNode) == MethodExistsResult.NOT_EXISTS ) {
MethodDeclaration staticConstructor = createStaticConstructor(
ann.staticConstructor(), typeNode, nodesForConstructorAndToString, ast);
@@ -45,7 +45,7 @@ public class HandleGetter implements EclipseAnnotationHandler<Getter> {
createGetterForField(level, fieldNode, errorNode, pos, whineIfExists);
}
@Override public boolean handle(AnnotationValues<Getter> annotation, Annotation ast, Node annotationNode) {
public boolean handle(AnnotationValues<Getter> annotation, Annotation ast, Node annotationNode) {
Node fieldNode = annotationNode.up();
AccessLevel level = annotation.getInstance().value();
return createGetterForField(level, fieldNode, annotationNode, annotationNode.get(), true);
@@ -16,7 +16,7 @@ import lombok.eclipse.EclipseAST.Node;
@ProviderFor(EclipseAnnotationHandler.class)
public class HandlePrintAST implements EclipseAnnotationHandler<PrintAST> {
@Override public boolean handle(AnnotationValues<PrintAST> annotation, Annotation ast, Node annotationNode) {
public boolean handle(AnnotationValues<PrintAST> annotation, Annotation ast, Node annotationNode) {
if ( !annotationNode.isCompleteParse() ) return false;
PrintStream stream = System.out;
@@ -49,7 +49,7 @@ public class HandleSetter implements EclipseAnnotationHandler<Setter> {
createSetterForField(level, fieldNode, errorNode, pos, whineIfExists);
}
@Override public boolean handle(AnnotationValues<Setter> annotation, Annotation ast, Node annotationNode) {
public boolean handle(AnnotationValues<Setter> annotation, Annotation ast, Node annotationNode) {
Node fieldNode = annotationNode.up();
if ( fieldNode.getKind() != Kind.FIELD ) return false;
AccessLevel level = annotation.getInstance().value();
-4
View File
@@ -423,8 +423,4 @@ public class JavacAST extends AST<JCTree> {
//Very unfortunate, but in most cases it still works fine, so we'll silently swallow it.
}
}
@Override protected Node buildStatement(Object statement) {
return buildStatementOrExpression((JCTree) statement);
}
}
@@ -5,8 +5,8 @@ import java.io.IOException;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.lang.instrument.UnmodifiableClassException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URLDecoder;
@@ -20,7 +20,7 @@ public class EclipsePatcher {
private EclipsePatcher() {}
private static class Patcher implements ClassFileTransformer {
@Override public byte[] transform(ClassLoader loader, String className,
public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer)
throws IllegalClassFormatException {
@@ -67,9 +67,17 @@ public class EclipsePatcher {
private static void addLombokToSearchPaths(Instrumentation instrumentation) throws Exception {
String path = findPathOfOurClassloader();
instrumentation.appendToSystemClassLoaderSearch(new JarFile(path + "/lombok.jar"));
instrumentation.appendToBootstrapClassLoaderSearch(new JarFile(path + "/lombok.eclipse.agent.jar"));
//On java 1.5, you don't have these methods, so you'll be forced to manually -Xbootclasspath/a them in.
// instrumentation.appendToSystemClassLoaderSearch(new JarFile(path + "/lombok.jar"));
// instrumentation.appendToBootstrapClassLoaderSearch(new JarFile(path + "/lombok.eclipse.agent.jar"));
tryCallMethod(instrumentation, "appendToSystemClassLoaderSearch", path + "/lombok.jar");
tryCallMethod(instrumentation, "appendToBootstrapClassLoaderSearch", path + "/lombok.eclipse.agent.jar");
}
private static void tryCallMethod(Object o, String methodName, String path) {
try {
Instrumentation.class.getMethod(methodName, JarFile.class).invoke(o, new JarFile(path));
} catch ( Throwable ignore ) {}
}
private static String findPathOfOurClassloader() throws Exception {
@@ -85,21 +93,28 @@ public class EclipsePatcher {
}
public static void premain(String agentArgs, Instrumentation instrumentation) throws Exception {
System.out.println("JAVA.VERSION: " + System.getProperty("java.version", "unknown"));
registerPatcher(instrumentation, false);
addLombokToSearchPaths(instrumentation);
}
private static void registerPatcher(Instrumentation instrumentation, boolean transformExisting) throws IOException {
instrumentation.addTransformer(new Patcher(), true);
instrumentation.addTransformer(new Patcher()/*, true*/);
if ( transformExisting ) for ( Class<?> c : instrumentation.getAllLoadedClasses() ) {
if ( c.getName().equals(ECLIPSE_PARSER_CLASS_NAME) || c.getName().equals(ECLIPSE_CUD_CLASS_NAME) ) {
try {
instrumentation.retransformClasses(c);
} catch ( UnmodifiableClassException ex ) {
//instrumentation.retransformClasses(c); - //not in java 1.5.
Instrumentation.class.getMethod("retransformClasses", Class[].class).invoke(instrumentation,
new Object[] { new Class[] {c }});
} catch ( InvocationTargetException e ) {
throw new UnsupportedOperationException(
"The eclipse parser class is already loaded and cannot be modified. " +
"You'll have to restart eclipse in order to use Lombok in eclipse.");
} catch ( Throwable t ) {
throw new UnsupportedOperationException(
"This appears to be a java 1.5 instance, which cannot reload already loaded classes. " +
"You'll have to restart eclipse in order to use Lombok in eclipse.");
}
}
}