aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/lombok/eclipse/handlers/HandleVal.java4
-rw-r--r--src/eclipseAgent/lombok/eclipse/agent/PatchVal.java27
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);
}