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