From 2a9820d8ec87e0e5e72eff19b56f1bee5f4e37e7 Mon Sep 17 00:00:00 2001
From: Roel Spilker <r.spilker@gmail.com>
Date: Tue, 28 Jun 2016 00:28:52 +0200
Subject: [i913] Prevent NPE in PatchDelegate when binding.scope is null

---
 .../lombok/eclipse/agent/PatchDelegate.java        | 76 ++++++++++++----------
 1 file changed, 41 insertions(+), 35 deletions(-)

(limited to 'src/eclipseAgent')

diff --git a/src/eclipseAgent/lombok/eclipse/agent/PatchDelegate.java b/src/eclipseAgent/lombok/eclipse/agent/PatchDelegate.java
index b1f5a43a..e4968f81 100644
--- a/src/eclipseAgent/lombok/eclipse/agent/PatchDelegate.java
+++ b/src/eclipseAgent/lombok/eclipse/agent/PatchDelegate.java
@@ -699,7 +699,11 @@ public class PatchDelegate {
 	}
 	
 	private static void addAllMethodBindings0(List<BindingTuple> list, TypeBinding binding, Set<String> banList, char[] fieldName, ASTNode responsible) throws DelegateRecursion {
-		if (binding instanceof SourceTypeBinding) ((SourceTypeBinding) binding).scope.environment().globalOptions.storeAnnotations = true;
+		if (binding instanceof SourceTypeBinding) {
+			ClassScope scope = ((SourceTypeBinding) binding).scope;
+			if (scope == null) return;
+			scope.environment().globalOptions.storeAnnotations = true;
+		}
 		if (binding == null) return;
 		
 		TypeBinding inner;
@@ -721,42 +725,44 @@ public class PatchDelegate {
 			}
 		}
 		
-		if (binding instanceof ReferenceBinding) {
-			ReferenceBinding rb = (ReferenceBinding) binding;
-			MethodBinding[] availableMethods = rb.availableMethods();
-			FieldBinding[] availableFields = rb.availableFields();
-			failIfContainsAnnotation(binding, availableMethods); 
-			failIfContainsAnnotation(binding, availableFields); 
-			
-			MethodBinding[] parameterizedSigs = availableMethods;
-			MethodBinding[] baseSigs = parameterizedSigs;
-			if (binding instanceof ParameterizedTypeBinding) {
-				baseSigs = ((ParameterizedTypeBinding)binding).genericType().availableMethods();
-				if (baseSigs.length != parameterizedSigs.length) {
-					// The last known state of eclipse source says this can't happen, so we rely on it,
-					// but if this invariant is broken, better to go with 'arg0' naming instead of crashing.
-					baseSigs = parameterizedSigs;
-				}
-			}
-			for (int i = 0; i < parameterizedSigs.length; i++) {
-				MethodBinding mb = parameterizedSigs[i];
-				String sig = printSig(mb);
-				if (mb.isStatic()) continue;
-				if (mb.isBridge()) continue;
-				if (mb.isConstructor()) continue;
-				if (mb.isDefaultAbstract()) continue;
-				if (!mb.isPublic()) continue;
-				if (mb.isSynthetic()) continue;
-				if (!banList.add(sig)) continue; // If add returns false, it was already in there.
-				BindingTuple pair = new BindingTuple(mb, baseSigs[i], fieldName, responsible);
-				list.add(pair);
-			}
-			addAllMethodBindings0(list, rb.superclass(), banList, fieldName, responsible);
-			ReferenceBinding[] interfaces = rb.superInterfaces();
-			if (interfaces != null) {
-				for (ReferenceBinding iface : interfaces) addAllMethodBindings0(list, iface, banList, fieldName, responsible);
+		if (!(binding instanceof ReferenceBinding)) {
+			return;
+		}
+		
+		ReferenceBinding rb = (ReferenceBinding) binding;
+		MethodBinding[] availableMethods = rb.availableMethods();
+		FieldBinding[] availableFields = rb.availableFields();
+		failIfContainsAnnotation(binding, availableMethods); 
+		failIfContainsAnnotation(binding, availableFields); 
+		
+		MethodBinding[] parameterizedSigs = availableMethods;
+		MethodBinding[] baseSigs = parameterizedSigs;
+		if (binding instanceof ParameterizedTypeBinding) {
+			baseSigs = ((ParameterizedTypeBinding)binding).genericType().availableMethods();
+			if (baseSigs.length != parameterizedSigs.length) {
+				// The last known state of eclipse source says this can't happen, so we rely on it,
+				// but if this invariant is broken, better to go with 'arg0' naming instead of crashing.
+				baseSigs = parameterizedSigs;
 			}
 		}
+		for (int i = 0; i < parameterizedSigs.length; i++) {
+			MethodBinding mb = parameterizedSigs[i];
+			String sig = printSig(mb);
+			if (mb.isStatic()) continue;
+			if (mb.isBridge()) continue;
+			if (mb.isConstructor()) continue;
+			if (mb.isDefaultAbstract()) continue;
+			if (!mb.isPublic()) continue;
+			if (mb.isSynthetic()) continue;
+			if (!banList.add(sig)) continue; // If add returns false, it was already in there.
+			BindingTuple pair = new BindingTuple(mb, baseSigs[i], fieldName, responsible);
+			list.add(pair);
+		}
+		addAllMethodBindings0(list, rb.superclass(), banList, fieldName, responsible);
+		ReferenceBinding[] interfaces = rb.superInterfaces();
+		if (interfaces != null) {
+			for (ReferenceBinding iface : interfaces) addAllMethodBindings0(list, iface, banList, fieldName, responsible);
+		}
 	}
 	
 	private static final char[] STRING_LOMBOK = new char[] {'l', 'o', 'm', 'b', 'o', 'k'};
-- 
cgit