Test & fix v1 for Bug 336395 - [compiler] enum inside team class may cause NPE
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java
index d779415..550ab57 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java
@@ -1521,7 +1521,7 @@
&& !OTNameUtils.isTSuperMarkerInterface(name))
{
ReferenceBinding tsuperRole = superTeam.getMemberType(name);
- if ( tsuperRole != null && tsuperRole.isValidBinding()
+ if ( tsuperRole != null && tsuperRole.isRole() && tsuperRole.isValidBinding()
&& !tsuperRole.isLocalType())
{
return CopyInheritance.copyLateRole(teamModel.getAst(), tsuperRole);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/model/TeamModel.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/model/TeamModel.java
index dab835b..24ab58f 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/model/TeamModel.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/model/TeamModel.java
@@ -807,13 +807,23 @@
*/
public ReferenceBinding[] getKnownRoles() {
ReferenceBinding[] members = this._binding.memberTypes();
- if (this.knownRoleFiles == null)
- return members;
HashSet<String> roleNames = new HashSet<String>();
for (int i = 0; i < members.length; i++) {
- if (!RoleFileCache.isRoFiCache(members[i]))
+ if (!RoleFileCache.isRoFiCache(members[i]) && !members[i].isEnum())
roleNames.add(new String(members[i].internalName()));
}
+ if (this.knownRoleFiles == null) {
+ if (roleNames.size() == members.length) // nothing filtered?
+ return members;
+ // faster to re-iterate the array than performing the lookup below:
+ ReferenceBinding[] result = new ReferenceBinding[roleNames.size()];
+ int j=0;
+ for (int i = 0; i < members.length; i++) {
+ if (!RoleFileCache.isRoFiCache(members[i]) && !members[i].isEnum())
+ result[j++] = members[i];
+ }
+ return result;
+ }
char[][] roleFileNames = this.knownRoleFiles.getNames();
for (int i = 0; i < roleFileNames.length; i++) {
roleNames.add(new String(roleFileNames[i]));
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/AstConverter.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/AstConverter.java
index 6d1d4f9..18472d6 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/AstConverter.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/util/AstConverter.java
@@ -353,7 +353,7 @@
AstEdit.addMemberTypeDeclaration(enclosingTypeDecl, nestedType);
}
- if (tsuperRole != null && tsuperRole.roleModel.isRoleFile()) {
+ if (tsuperRole != null && tsuperRole.roleModel != null && tsuperRole.roleModel.isRoleFile()) {
// for role copied from a role file create an enclosing CUD to allow for
// late role catch-up of this phantom role.
ProblemReporter reporter = enclosingTypeDecl.scope.problemReporter();