Bug 569756 - Revisit field initialization in roles - discriminate final
/ non-final
- fix field initialization for unbound->bound implicit inheritance
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java
index 9fd2f08..727128f 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ConstructorDeclaration.java
@@ -728,14 +728,19 @@
|| ( typeBinding.enclosingType() != null // also accept roles of o.o.Team
&& typeBinding.enclosingType().id == IOTConstants.T_OrgObjectTeamsTeam))
return false;
- if (typeDecl.fields == null)
- return false;
boolean hasInitialization = false;
- for (FieldDeclaration fieldDeclaration : typeDecl.fields) {
- if (fieldDeclaration.initialization != null) {
- if (fieldDeclaration.isFinal())
- return false; // needs to be set inside a proper constructor!
- hasInitialization = true;
+ if (typeDecl.fields != null) {
+ for (FieldDeclaration fieldDeclaration : typeDecl.fields) {
+ if (fieldDeclaration.initialization != null) {
+ if (fieldDeclaration.isFinal())
+ return false; // needs to be set inside a proper constructor!
+ hasInitialization = true;
+ }
+ }
+ }
+ for (ReferenceBinding tsuperRole : typeDecl.getRoleModel().getTSuperRoleBindings()) {
+ if (tsuperRole.fields() != Binding.NO_FIELDS && !tsuperRole.roleModel.hasFinalFieldInit()) {
+ hasInitialization = true; // conservative, would need another flag to test if tsuper has field init
}
}
return hasInitialization;
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/otjld/org/eclipse/objectteams/otdt/tests/otjld/rolesandteams/ImplicitInheritance.java b/testplugins/org.eclipse.objectteams.otdt.tests/otjld/org/eclipse/objectteams/otdt/tests/otjld/rolesandteams/ImplicitInheritance.java
index c5339af..9dcb6bb 100644
--- a/testplugins/org.eclipse.objectteams.otdt.tests/otjld/org/eclipse/objectteams/otdt/tests/otjld/rolesandteams/ImplicitInheritance.java
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/otjld/org/eclipse/objectteams/otdt/tests/otjld/rolesandteams/ImplicitInheritance.java
@@ -2010,4 +2010,41 @@
"Need to invoke a tsuper constructor because tsuper role \'SuperTeamFI5.R2\' has initializations for final fields.\n" +
"----------\n");
}
+
+ public void testFieldInitialization6_bound_tsuperUnbound_OK() throws Exception {
+ // variants with implicit lifting constructors
+ runConformTest(
+ new String[] {
+ "SubTeamFI6btU.java",
+ "public team class SubTeamFI6btU extends SuperTeamFI6btU {\n" +
+ " @Override\n" +
+ " protected class R1 playedBy Base1 {\n" +
+ " }\n" +
+ " @Override\n" +
+ " protected class R2 {\n" +
+ " }\n" +
+ " public static void main(String... args) {\n" +
+ " new SubTeamFI6btU().test();\n" +
+ " }\n" +
+ " @SuppressWarnings(\"roleinstantiation\")\n" +
+ " void test() {\n" +
+ " System.out.print(new R1(new Base1()).s1);\n" +
+ " System.out.print(new R2(new Base1()).s1);\n" +
+ " System.out.print(new R2(new Base1()).s2);\n" +
+ " }\n" +
+ "}\n",
+ "SuperTeamFI6btU.java",
+ "public team class SuperTeamFI6btU {\n" +
+ " protected class R1 {\n" +
+ " public String s1 = \"s1\";\n" +
+ " }\n" +
+ " protected class R2 extends R1 {\n" +
+ " public String s2 = \"s2\";\n" +
+ " }\n" +
+ "}\n",
+ "Base1.java",
+ "public class Base1 {}\n",
+ },
+ "s1s1s2");
+ }
}