diff options
author | Reinier Zwitserloot <reinier@zwitserloot.com> | 2010-11-08 16:39:25 +0100 |
---|---|---|
committer | Reinier Zwitserloot <reinier@zwitserloot.com> | 2010-11-08 16:39:55 +0100 |
commit | 46feeaab85916c8b6de5edee1c67a995331ae97f (patch) | |
tree | 9978ac406bfbbb199358c80e1448f0b3c52f0d29 | |
parent | 3855a2171bbcb1c256f67ddd815526797364219c (diff) | |
download | lombok-46feeaab85916c8b6de5edee1c67a995331ae97f.tar.gz lombok-46feeaab85916c8b6de5edee1c67a995331ae97f.tar.bz2 lombok-46feeaab85916c8b6de5edee1c67a995331ae97f.zip |
'val' with an array on the initializer didn't work in eclipse.
-rw-r--r-- | src/core/lombok/eclipse/Eclipse.java | 44 | ||||
-rw-r--r-- | src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java | 36 |
2 files changed, 51 insertions, 29 deletions
diff --git a/src/core/lombok/eclipse/Eclipse.java b/src/core/lombok/eclipse/Eclipse.java index c4632fba..4a1a6c7a 100644 --- a/src/core/lombok/eclipse/Eclipse.java +++ b/src/core/lombok/eclipse/Eclipse.java @@ -311,30 +311,52 @@ public class Eclipse { } public static TypeReference makeType(TypeBinding binding, ASTNode pos, boolean allowCompound) { + int dims = binding.dimensions(); + binding = binding.leafComponentType(); + // Primitives + + char[] base = null; + switch (binding.id) { case TypeIds.T_int: - return new SingleTypeReference(TypeConstants.INT, pos(pos)); + base = TypeConstants.INT; + break; case TypeIds.T_long: - return new SingleTypeReference(TypeConstants.LONG, pos(pos)); + base = TypeConstants.LONG; + break; case TypeIds.T_short: - return new SingleTypeReference(TypeConstants.SHORT, pos(pos)); + base = TypeConstants.SHORT; + break; case TypeIds.T_byte: - return new SingleTypeReference(TypeConstants.BYTE, pos(pos)); + base = TypeConstants.BYTE; + break; case TypeIds.T_double: - return new SingleTypeReference(TypeConstants.DOUBLE, pos(pos)); + base = TypeConstants.DOUBLE; + break; case TypeIds.T_float: - return new SingleTypeReference(TypeConstants.FLOAT, pos(pos)); + base = TypeConstants.FLOAT; + break; case TypeIds.T_boolean: - return new SingleTypeReference(TypeConstants.BOOLEAN, pos(pos)); - case TypeIds.T_void: - return new SingleTypeReference(TypeConstants.VOID, pos(pos)); + base = TypeConstants.BOOLEAN; + break; case TypeIds.T_char: - return new SingleTypeReference(TypeConstants.CHAR, pos(pos)); + base = TypeConstants.CHAR; + break; + case TypeIds.T_void: + base = TypeConstants.VOID; + break; case TypeIds.T_null: return null; } + if (base != null) { + if (dims > 0) { + return new ArrayTypeReference(base, dims, pos(pos)); + } + return new SingleTypeReference(base, pos(pos)); + } + if (binding.isAnonymousType()) { ReferenceBinding ref = (ReferenceBinding)binding; ReferenceBinding[] supers = ref.superInterfaces(); @@ -406,8 +428,6 @@ public class Eclipse { } } - int dims = binding.dimensions(); - if (params.length > 0) { if (parts.length > 1) { TypeReference[][] typeArguments = new TypeReference[parts.length][]; diff --git a/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java b/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java index e962ecbf..0c9f1ccc 100644 --- a/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java +++ b/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java @@ -69,7 +69,7 @@ public class EclipsePatcher extends Agent { patchPostCompileHookEcj(sm); } - patchEcjTransformers(sm); + patchEcjTransformers(sm, ecjOnly); if (reloadExistingClasses) sm.reloadClasses(instrumentation); } @@ -256,8 +256,8 @@ public class EclipsePatcher extends Agent { .request(StackRequest.THIS, StackRequest.RETURN_VALUE).build()); } - private static void patchEcjTransformers(ScriptManager sm) { - patchHandleVal(sm); + private static void patchEcjTransformers(ScriptManager sm, boolean ecj) { + patchHandleVal(sm, ecj); } // Creates a copy of the 'initialization' field on a LocalDeclaration if the type of the LocalDeclaration is 'val', because the completion parser will null this out, @@ -265,7 +265,7 @@ public class EclipsePatcher extends Agent { // Also patches local declaration to not call .resolveType() on the initializer expression if we've already done so (calling it twice causes weird errors), // and patches .resolve() on LocalDeclaration itself to just-in-time replace the 'val' vartype with the right one. - private static void patchHandleVal(ScriptManager sm) { + private static void patchHandleVal(ScriptManager sm, boolean ecj) { final String LOCALDECLARATION_SIG = "org.eclipse.jdt.internal.compiler.ast.LocalDeclaration"; final String EXPRESSION_SIG = "org.eclipse.jdt.internal.compiler.ast.Expression"; final String BLOCKSCOPE_SIG = "org.eclipse.jdt.internal.compiler.lookup.BlockScope"; @@ -278,19 +278,21 @@ public class EclipsePatcher extends Agent { .decisionMethod(new Hook("lombok.eclipse.agent.PatchFixes", "handleValForLocalDeclaration", "boolean", LOCALDECLARATION_SIG, BLOCKSCOPE_SIG)) .build()); - sm.addScript(ScriptBuilder.addField() - .fieldName("$initCopy") - .fieldType("Lorg/eclipse/jdt/internal/compiler/ast/ASTNode;") - .setPublic() - .setTransient() - .targetClass("org.eclipse.jdt.internal.compiler.ast.LocalDeclaration") - .build()); - - sm.addScript(ScriptBuilder.wrapReturnValue() - .target(new MethodTarget(PARSER_SIG, "consumeExitVariableWithInitialization", "void")) - .request(StackRequest.THIS) - .wrapMethod(new Hook("lombok.eclipse.agent.PatchFixes", "copyInitializationOfLocalDeclarationForVal", "void", PARSER_SIG)) - .build()); + if (!ecj) { + sm.addScript(ScriptBuilder.addField() + .fieldName("$initCopy") + .fieldType("Lorg/eclipse/jdt/internal/compiler/ast/ASTNode;") + .setPublic() + .setTransient() + .targetClass("org.eclipse.jdt.internal.compiler.ast.LocalDeclaration") + .build()); + + sm.addScript(ScriptBuilder.wrapReturnValue() + .target(new MethodTarget(PARSER_SIG, "consumeExitVariableWithInitialization", "void")) + .request(StackRequest.THIS) + .wrapMethod(new Hook("lombok.eclipse.agent.PatchFixes", "copyInitializationOfLocalDeclarationForVal", "void", PARSER_SIG)) + .build()); + } sm.addScript(ScriptBuilder.replaceMethodCall() .target(new MethodTarget(LOCALDECLARATION_SIG, "resolve", "void", BLOCKSCOPE_SIG)) |