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);
}