From e308909def27a6940792cb04c1a9ec618c5df3cc Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Mon, 29 Nov 2010 22:28:32 +0100 Subject: @Delegate in eclipse now uses more of the standard infrastructure to inject methods. --- .../lombok/eclipse/agent/PatchDelegate.java | 63 +++++++++++++--------- 1 file changed, 38 insertions(+), 25 deletions(-) (limited to 'src/eclipseAgent/lombok') diff --git a/src/eclipseAgent/lombok/eclipse/agent/PatchDelegate.java b/src/eclipseAgent/lombok/eclipse/agent/PatchDelegate.java index 6198335c..37374f27 100644 --- a/src/eclipseAgent/lombok/eclipse/agent/PatchDelegate.java +++ b/src/eclipseAgent/lombok/eclipse/agent/PatchDelegate.java @@ -33,6 +33,9 @@ import java.util.List; import java.util.Set; import lombok.eclipse.Eclipse; +import lombok.eclipse.EclipseAST; +import lombok.eclipse.EclipseNode; +import lombok.eclipse.TransformEclipseAST; import lombok.eclipse.handlers.EclipseHandlerUtil; import lombok.patcher.Hook; import lombok.patcher.MethodTarget; @@ -47,7 +50,7 @@ import org.eclipse.jdt.internal.compiler.ast.Annotation; import org.eclipse.jdt.internal.compiler.ast.Argument; import org.eclipse.jdt.internal.compiler.ast.ArrayInitializer; import org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess; -import org.eclipse.jdt.internal.compiler.ast.Clinit; +import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; import org.eclipse.jdt.internal.compiler.ast.Expression; import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; import org.eclipse.jdt.internal.compiler.ast.FieldReference; @@ -87,6 +90,9 @@ public class PatchDelegate { TypeDeclaration decl = scope.referenceContext; if (decl == null) return false; + CompilationUnitDeclaration cud = null; + EclipseAST astNode = null; + if (decl.fields != null) for (FieldDeclaration field : decl.fields) { if (field.annotations == null) continue; for (Annotation ann : field.annotations) { @@ -95,6 +101,11 @@ public class PatchDelegate { if (!charArrayEquals("lombok", tb.qualifiedPackageName())) continue; if (!charArrayEquals("Delegate", tb.qualifiedSourceName())) continue; + if (cud == null) { + cud = scope.compilationUnitScope().referenceContext; + astNode = TransformEclipseAST.getAST(cud); + } + List rawTypes = new ArrayList(); for (MemberValuePair pair : ann.memberValuePairs()) { if (pair.name == null || charArrayEquals("value", pair.name)) { @@ -121,7 +132,7 @@ public class PatchDelegate { removeExistingMethods(methodsToDelegate, decl, scope); - generateDelegateMethods(decl, methodsToDelegate, field.name, ann); + generateDelegateMethods(astNode.get(decl), methodsToDelegate, field.name, ann); } } @@ -154,29 +165,31 @@ public class PatchDelegate { } } - private static void generateDelegateMethods(TypeDeclaration type, List methods, char[] delegate, ASTNode source) { + private static void generateDelegateMethods(EclipseNode typeNode, List methods, char[] delegate, ASTNode source) { + CompilationUnitDeclaration top = (CompilationUnitDeclaration) typeNode.top().get(); for (MethodBinding binding : methods) { - MethodDeclaration method = generateDelegateMethod(delegate, binding, type.compilationResult, source); - if (type.methods == null) { - type.methods = new AbstractMethodDeclaration[1]; - type.methods[0] = method; - } else { - int insertionPoint; - for (insertionPoint = 0; insertionPoint < type.methods.length; insertionPoint++) { - AbstractMethodDeclaration current = type.methods[insertionPoint]; - if (current instanceof Clinit) continue; - if (Eclipse.isGenerated(current)) continue; - break; - } - AbstractMethodDeclaration[] newArray = new AbstractMethodDeclaration[type.methods.length + 1]; - System.arraycopy(type.methods, 0, newArray, 0, insertionPoint); - if (insertionPoint <= type.methods.length) { - System.arraycopy(type.methods, insertionPoint, newArray, insertionPoint + 1, type.methods.length - insertionPoint); - } - - newArray[insertionPoint] = method; - type.methods = newArray; - } + MethodDeclaration method = generateDelegateMethod(delegate, binding, top.compilationResult, source); + EclipseHandlerUtil.injectMethod(typeNode, method); +// if (type.methods == null) { +// type.methods = new AbstractMethodDeclaration[1]; +// type.methods[0] = method; +// } else { +// int insertionPoint; +// for (insertionPoint = 0; insertionPoint < type.methods.length; insertionPoint++) { +// AbstractMethodDeclaration current = type.methods[insertionPoint]; +// if (current instanceof Clinit) continue; +// if (Eclipse.isGenerated(current)) continue; +// break; +// } +// AbstractMethodDeclaration[] newArray = new AbstractMethodDeclaration[type.methods.length + 1]; +// System.arraycopy(type.methods, 0, newArray, 0, insertionPoint); +// if (insertionPoint <= type.methods.length) { +// System.arraycopy(type.methods, insertionPoint, newArray, insertionPoint + 1, type.methods.length - insertionPoint); +// } +// +// newArray[insertionPoint] = method; +// type.methods = newArray; +// } } } @@ -188,7 +201,7 @@ public class PatchDelegate { method.sourceStart = pS; method.sourceEnd = pE; method.modifiers = ClassFileConstants.AccPublic; method.returnType = Eclipse.makeType(binding.returnType, source, false); - method.annotations = EclipseHandlerUtil.createSuppressWarningsAll(source, null); + method.annotations = null; if (binding.parameters != null && binding.parameters.length > 0) { method.arguments = new Argument[binding.parameters.length]; for (int i = 0; i < method.arguments.length; i++) { -- cgit