Test & fix for Bug 336420 - [compiler] NPE during reporting "abstract relevant role"
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
index b999120..331be1c 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
@@ -9480,37 +9480,39 @@
 			expression.sourceEnd);
 }
 // -- 2.5 --
-public void abstractPotentiallyRelevantRole(TypeDeclaration roleDeclaration, ReferenceBinding teamBinding) {
-    this.referenceContext = roleDeclaration;
-    teamBinding.tagBits |= TagBits.HasAbstractRelevantRole;
+public void abstractPotentiallyRelevantRole(RoleModel role, TeamModel teamModel) {
+	TypeDeclaration typeDecl = role.getAst();
+	if (typeDecl == null)
+		typeDecl = teamModel.getAst();
+    this.referenceContext = typeDecl;    
+    teamModel.getBinding().tagBits |= TagBits.HasAbstractRelevantRole;
     String[] args = new String[] {
-        new String(teamBinding.sourceName()),
-        roleDeclaration.binding == null
-	    ? new String(roleDeclaration.name)
-	    : new String(roleDeclaration.binding.sourceName())
+        new String(teamModel.getBinding().sourceName()),
+        new String(role.getName())
     };
     this.handle(
         IProblem.AbstractPotentiallyRelevantRole,
         args,
         args,
-        roleDeclaration.sourceStart,
-        roleDeclaration.sourceEnd);
+        typeDecl.sourceStart,
+        typeDecl.sourceEnd);
 }
-public void abstractRelevantRole(TypeDeclaration roleDecl, ReferenceBinding teamBinding) {
-	roleDecl.binding.tagBits |= TagBits.HasLiftingProblem;
-    this.referenceContext = roleDecl;
+public void abstractRelevantRole(RoleModel role, TeamModel teamModel) {
+	role.getBinding().tagBits |= TagBits.HasLiftingProblem;
+	TypeDeclaration typeDecl = role.getAst();
+	if (typeDecl == null)
+		typeDecl = teamModel.getAst();
+    this.referenceContext = typeDecl;    
     String[] args = new String[] {
-        new String(teamBinding.sourceName()),
-        roleDecl.binding == null
-		    ? new String(roleDecl.name)
-		    : new String(roleDecl.binding.sourceName())
+        new String(teamModel.getBinding().sourceName()),
+		    new String(role.getBinding().sourceName())
     };
     this.handle(
         IProblem.AbstractRelevantRole,
         args,
         args,
-        roleDecl.sourceStart,
-        roleDecl.sourceEnd);
+        typeDecl.sourceStart,
+        typeDecl.sourceEnd);
 }
 public void abstractRoleIsRelevant(Expression creation, TypeBinding roleBinding) {
 	roleBinding.tagBits |= TagBits.HasLiftingProblem;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lifting/RoleHierarchieAnalyzer.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lifting/RoleHierarchieAnalyzer.java
index 6a1e540..98fb637 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lifting/RoleHierarchieAnalyzer.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lifting/RoleHierarchieAnalyzer.java
@@ -114,15 +114,12 @@
                         && !role.getBinding().isInterface())
                 		// public role classes could be instantiated from any part of the program,
                 		// Force the team to be abstract, too:
-                        this._problemReporter.abstractRelevantRole(
-                                role.getAst(), teamModel.getBinding());
+                        this._problemReporter.abstractRelevantRole(role, teamModel);
                     else if (role.getBaseTypeBinding().isAbstract())
                     	// if base is abstract, too, we could be lucky, just warn:
-                        this._problemReporter.abstractPotentiallyRelevantRole(
-                                role.getAst(), teamModel.getBinding());
+                        this._problemReporter.abstractPotentiallyRelevantRole(role, teamModel);
                     else
-                        this._problemReporter.abstractRelevantRole(
-                                role.getAst(), teamModel.getBinding());
+                        this._problemReporter.abstractRelevantRole(role, teamModel);
                 }
                 irrelevant.add(role);
             }