diff options
-rw-r--r-- | src/core/lombok/eclipse/handlers/HandleVal.java | 4 | ||||
-rw-r--r-- | src/eclipseAgent/lombok/eclipse/agent/PatchVal.java | 27 |
2 files changed, 28 insertions, 3 deletions
diff --git a/src/core/lombok/eclipse/handlers/HandleVal.java b/src/core/lombok/eclipse/handlers/HandleVal.java index e7849952..c8339f35 100644 --- a/src/core/lombok/eclipse/handlers/HandleVal.java +++ b/src/core/lombok/eclipse/handlers/HandleVal.java @@ -64,5 +64,9 @@ public class HandleVal extends EclipseASTAdapter { localNode.addError("'val' is not allowed in old-style for loops"); return; } + + if (local.initialization != null && local.initialization.getClass().getName().equals("org.eclipse.jdt.internal.compiler.ast.LambdaExpression")) { + localNode.addError("'val' is not allowed with lambda expressions."); + } } } diff --git a/src/eclipseAgent/lombok/eclipse/agent/PatchVal.java b/src/eclipseAgent/lombok/eclipse/agent/PatchVal.java index 16f11769..59fbe9d0 100644 --- a/src/eclipseAgent/lombok/eclipse/agent/PatchVal.java +++ b/src/eclipseAgent/lombok/eclipse/agent/PatchVal.java @@ -53,12 +53,20 @@ public class PatchVal { public static TypeBinding skipResolveInitializerIfAlreadyCalled(Expression expr, BlockScope scope) { if (expr.resolvedType != null) return expr.resolvedType; - return expr.resolveType(scope); + try { + return expr.resolveType(scope); + } catch (NullPointerException e) { + return null; + } } public static TypeBinding skipResolveInitializerIfAlreadyCalled2(Expression expr, BlockScope scope, LocalDeclaration decl) { if (decl != null && LocalDeclaration.class.equals(decl.getClass()) && expr.resolvedType != null) return expr.resolvedType; - return expr.resolveType(scope); + try { + return expr.resolveType(scope); + } catch (NullPointerException e) { + return null; + } } public static boolean matches(String key, char[] array) { @@ -143,7 +151,20 @@ public class PatchVal { TypeReference replacement = null; if (init != null) { - TypeBinding resolved = decomponent ? getForEachComponentType(init, scope) : init.resolveType(scope); + if (init.getClass().getName().equals("org.eclipse.jdt.internal.compiler.ast.LambdaExpression")) { + return false; + } + + TypeBinding resolved = null; + try { + resolved = decomponent ? getForEachComponentType(init, scope) : init.resolveType(scope); + } catch (NullPointerException e) { + // This definitely occurs if as part of resolving the initializer expression, a + // lambda expression in it must also be resolved (such as when lambdas are part of + // a ternary expression). This can't result in a viable 'val' matching, so, we + // just go with 'Object' and let the IDE print the appropriate errors. + resolved = null; + } if (resolved != null) { replacement = makeType(resolved, local.type, false); } |