### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java,v retrieving revision 1.427 diff -u -r1.427 CompletionEngine.java --- codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java 28 Feb 2011 18:27:48 -0000 1.427 +++ codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java 20 Apr 2011 14:21:42 -0000 @@ -6045,10 +6045,17 @@ if (this.options.checkVisibility && !field.canBeSeenBy(receiverType, invocationSite, scope)) continue next; - // don't propose array types in case expression + // don't propose non constant fields or strings (1.6 or below) in case expression // https://bugs.eclipse.org/bugs/show_bug.cgi?id=195346 - if (this.assistNodeIsInsideCase && field.type instanceof ArrayBinding) - continue next; + // https://bugs.eclipse.org/bugs/show_bug.cgi?id=343342 + if (this.assistNodeIsInsideCase) { + if (field.isFinal() && field.isStatic()) { + if (!(field.type instanceof BaseTypeBinding)) + continue next; + } else { + continue next; // non-constants not allowed in case. + } + } boolean prefixRequired = false; @@ -11426,10 +11433,17 @@ continue next; } - // don't propose array types in case expression + // don't propose non constant variables or strings (1.6 or below) in case expression // https://bugs.eclipse.org/bugs/show_bug.cgi?id=195346 - if (this.assistNodeIsInsideCase && local.type instanceof ArrayBinding) - continue next; + // https://bugs.eclipse.org/bugs/show_bug.cgi?id=343342 + if (this.assistNodeIsInsideCase) { + if (local.isFinal()) { + if (!(local.type instanceof BaseTypeBinding)) + continue next; + } else { + continue next; // non-constants not allowed in case. + } + } int ptr = this.uninterestingBindingsPtr; // Cases where the binding is uninteresting eg. for completion occurring inside a local var @@ -11541,7 +11555,7 @@ -1, -1); } - if(proposeMethod && !insideAnnotationAttribute) { + if(proposeMethod && !insideAnnotationAttribute && !this.assistNodeIsInsideCase) { findMethods( token, null, #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/model/CompletionTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests.java,v retrieving revision 1.238 diff -u -r1.238 CompletionTests.java --- src/org/eclipse/jdt/core/tests/model/CompletionTests.java 24 Feb 2011 02:48:03 -0000 1.238 +++ src/org/eclipse/jdt/core/tests/model/CompletionTests.java 20 Apr 2011 14:21:46 -0000 @@ -984,6 +984,9 @@ suite.addTest(new CompletionTests("test325481b")); suite.addTest(new CompletionTests("testBug332268a")); suite.addTest(new CompletionTests("testBug332268b")); + suite.addTest(new CompletionTests("testBug343342")); + suite.addTest(new CompletionTests("testBug343342a")); + suite.addTest(new CompletionTests("testBug343342b")); return suite; } public CompletionTests(String name) { @@ -2898,7 +2901,6 @@ assertResults( "ZZZ2[FIELD_REF]{ZZZ2, Ltest.CompletionAfterCase2;, J, ZZZ2, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_UNQUALIFIED + R_NON_RESTRICTED + R_FINAL) + "}\n" + "ZZZ3[FIELD_REF]{ZZZ3, Ltest.CompletionAfterCase2;, D, ZZZ3, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_UNQUALIFIED + R_NON_RESTRICTED + R_FINAL) + "}\n" + - "ZZZ4[FIELD_REF]{ZZZ4, Ltest.CompletionAfterCase2;, Ljava.lang.Object;, ZZZ4, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_UNQUALIFIED + R_NON_RESTRICTED + R_FINAL) + "}\n" + "ZZZ7[FIELD_REF]{ZZZ7, Ltest.CompletionAfterCase2;, S, ZZZ7, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_EXPECTED_TYPE + R_CASE + R_UNQUALIFIED + R_NON_RESTRICTED + R_FINAL) + "}\n" + "ZZZ1[FIELD_REF]{ZZZ1, Ltest.CompletionAfterCase2;, I, ZZZ1, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_EXACT_EXPECTED_TYPE + R_CASE + R_UNQUALIFIED + R_NON_RESTRICTED + R_FINAL) + "}", requestor.getResults()); @@ -2939,7 +2941,6 @@ assertResults( "ZZZ2[FIELD_REF]{ZZZ2, Ltest.TestConstants;, J, ZZZ2, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_QUALIFIED + R_NON_RESTRICTED + R_FINAL) + "}\n" + "ZZZ3[FIELD_REF]{ZZZ3, Ltest.TestConstants;, D, ZZZ3, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_QUALIFIED + R_NON_RESTRICTED + R_FINAL) + "}\n" + - "ZZZ4[FIELD_REF]{ZZZ4, Ltest.TestConstants;, Ljava.lang.Object;, ZZZ4, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_QUALIFIED + R_NON_RESTRICTED + R_FINAL) + "}\n" + "ZZZ7[FIELD_REF]{ZZZ7, Ltest.TestConstants;, S, ZZZ7, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_EXPECTED_TYPE + R_CASE + R_QUALIFIED + R_NON_RESTRICTED + R_FINAL) + "}\n" + "ZZZ1[FIELD_REF]{ZZZ1, Ltest.TestConstants;, I, ZZZ1, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_EXACT_EXPECTED_TYPE + R_CASE + R_QUALIFIED + R_NON_RESTRICTED + R_FINAL) + "}", requestor.getResults()); @@ -22465,8 +22466,6 @@ this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner); assertResults( - "AN_INT_VALUE[FIELD_REF]{AN_INT_VALUE, Ltest.CompletionAfterCase2;, I, AN_INT_VALUE, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_UNQUALIFIED + R_NON_RESTRICTED + R_EXACT_EXPECTED_TYPE) + "}\n" + - "AN_INT_VAR2[LOCAL_VARIABLE_REF]{AN_INT_VAR2, null, I, AN_INT_VAR2, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_UNQUALIFIED + R_NON_RESTRICTED + R_EXACT_EXPECTED_TYPE) + "}\n" + "AN_INT_VALUE2[FIELD_REF]{AN_INT_VALUE2, Ltest.CompletionAfterCase2;, I, AN_INT_VALUE2, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_UNQUALIFIED + R_NON_RESTRICTED + R_EXACT_EXPECTED_TYPE + R_FINAL) + "}\n" + "AN_INT_VAR[LOCAL_VARIABLE_REF]{AN_INT_VAR, null, I, AN_INT_VAR, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_UNQUALIFIED + R_NON_RESTRICTED + R_EXACT_EXPECTED_TYPE + R_FINAL) + "}", requestor.getResults()); @@ -22508,7 +22507,6 @@ assertResults( "CompletionAfterCase2.AN_INNER_CLASS[TYPE_REF]{AN_INNER_CLASS, test, Ltest.CompletionAfterCase2$AN_INNER_CLASS;, null, null, " + (R_DEFAULT + R_INTERESTING + R_CASE + R_UNQUALIFIED + R_NON_RESTRICTED) + "}\n" + - "AN_INT_VALUE[FIELD_REF]{AN_INT_VALUE, Ltest.CompletionAfterCase2;, I, AN_INT_VALUE, null, " + (R_DEFAULT + R_INTERESTING + R_CASE + R_UNQUALIFIED + R_NON_RESTRICTED + R_EXACT_EXPECTED_TYPE) + "}\n" + "AN_INT_VALUE2[FIELD_REF]{AN_INT_VALUE2, Ltest.CompletionAfterCase2;, I, AN_INT_VALUE2, null, " + (R_DEFAULT + R_INTERESTING + R_CASE + R_UNQUALIFIED + R_NON_RESTRICTED + R_EXACT_EXPECTED_TYPE + R_FINAL) + "}", requestor.getResults()); } @@ -22947,4 +22945,110 @@ "myVar1[FIELD_REF]{myVar1, Ltest.Test;, I, myVar1, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_UNQUALIFIED + R_NON_RESTRICTED + R_EXACT_EXPECTED_TYPE) + "}", requestor.getResults()); } +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=343342 +public void testBug343342() throws JavaModelException { + this.workingCopies = new ICompilationUnit[1]; + this.workingCopies[0] = getWorkingCopy( + "/Completion/src/test/Try.java", + "package test;\n" + + "public class Try {\n" + + " void f(int a){\n" + + " String xyz = null;\n" + + " final String xyzz = null;\n" + + " switch (a){\n" + + " case xy : break;\n" + + " }\n" + + " }\n" + + "}\n"); + + CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true); + requestor.allowAllRequiredProposals(); + String str = this.workingCopies[0].getSource(); + String completeBehind = "case xy*/"; + int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length(); + this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner); + assertResults( + "", + requestor.getResults()); +} +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=343342 +public void testBug343342a() throws JavaModelException { + this.workingCopies = new ICompilationUnit[2]; + this.workingCopies[0] = getWorkingCopy( + "/Completion/src/test/CompletionAfterCase2.java", + "package test;\n" + + "public class CompletionAfterCase2 {\n" + + " public static final int ZZZ1 = 5;\n" + + " public static final long ZZZ2 = 5;\n" + + " public static final double ZZZ3 = 0;\n" + + " public static final Object ZZZ4 = null;\n" + + " public static final int[] ZZZ5 = null;\n" + + " public static final Object[] ZZZ6 = null;\n" + + " public static final short ZZZ7 = 0;\n" + + " int ZZZ8(){return 1;}\n" + + " void foo(int i){\n" + + " final int ZZZ01 = 1;\n" + + " int ZZZ02 = 1;\n" + + " final char ZZZ03;\n" + + " final String ZZZ04;\n" + + " switch(i) {\n" + + " case ZZ\n" + + " }\n" + + " }\n" + + "}\n"); + + CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true); + String str = this.workingCopies[0].getSource(); + String completeBehind = "ZZ"; + int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length(); + this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner); + + assertResults( + "ZZZ2[FIELD_REF]{ZZZ2, Ltest.CompletionAfterCase2;, J, ZZZ2, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED + R_FINAL + R_UNQUALIFIED) + "}\n" + + "ZZZ3[FIELD_REF]{ZZZ3, Ltest.CompletionAfterCase2;, D, ZZZ3, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED + R_FINAL + R_UNQUALIFIED) + "}\n" + + "ZZZ03[LOCAL_VARIABLE_REF]{ZZZ03, null, C, ZZZ03, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_EXACT_EXPECTED_TYPE + R_NON_RESTRICTED + R_FINAL + R_UNQUALIFIED) + "}\n" + + "ZZZ7[FIELD_REF]{ZZZ7, Ltest.CompletionAfterCase2;, S, ZZZ7, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_EXACT_EXPECTED_TYPE + R_NON_RESTRICTED + R_FINAL + R_UNQUALIFIED) + "}\n" + + "ZZZ01[LOCAL_VARIABLE_REF]{ZZZ01, null, I, ZZZ01, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_EXACT_EXPECTED_TYPE + R_CASE + R_NON_RESTRICTED + R_FINAL + R_UNQUALIFIED) + "}\n" + + "ZZZ1[FIELD_REF]{ZZZ1, Ltest.CompletionAfterCase2;, I, ZZZ1, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_EXACT_EXPECTED_TYPE + R_CASE + R_NON_RESTRICTED + R_FINAL + R_UNQUALIFIED) + "}", + requestor.getResults()); +} +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=343342 +public void testBug343342b() throws JavaModelException { + this.workingCopies = new ICompilationUnit[2]; + this.workingCopies[0] = getWorkingCopy( + "/Completion/src/test/CompletionAfterCase2.java", + "package test;\n" + + "public class CompletionAfterCase2 {\n" + + " public static final int ZZZ1 = 5;\n" + + " public static final long ZZZ2 = 5;\n" + + " public static final double ZZZ3 = 0;\n" + + " public static final Object ZZZ4 = null;\n" + + " public static final int[] ZZZ5 = null;\n" + + " public static final Object[] ZZZ6 = null;\n" + + " public static final short ZZZ7 = 0;\n" + + " int ZZZ8(){return 1;}\n" + + " void foo(int i){\n" + + " final int ZZZ01 = 1;\n" + + " int ZZZ02 = 1;\n" + + " final char ZZZ03;\n" + + " final String ZZZ04;\n" + + " switch(i) {\n" + + " case CompletionAfterCase2.ZZ\n" + + " }\n" + + " }\n" + + "}\n"); + + CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true); + String str = this.workingCopies[0].getSource(); + String completeBehind = "CompletionAfterCase2.ZZ"; + int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length(); + this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner); + + assertResults( + "ZZZ2[FIELD_REF]{ZZZ2, Ltest.CompletionAfterCase2;, J, ZZZ2, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED + R_FINAL + R_QUALIFIED) + "}\n" + + "ZZZ3[FIELD_REF]{ZZZ3, Ltest.CompletionAfterCase2;, D, ZZZ3, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED + R_FINAL + R_QUALIFIED) + "}\n" + + "ZZZ7[FIELD_REF]{ZZZ7, Ltest.CompletionAfterCase2;, S, ZZZ7, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_EXACT_EXPECTED_TYPE + R_NON_RESTRICTED + R_FINAL + R_QUALIFIED) + "}\n" + + "ZZZ1[FIELD_REF]{ZZZ1, Ltest.CompletionAfterCase2;, I, ZZZ1, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_EXACT_EXPECTED_TYPE + R_CASE + R_NON_RESTRICTED + R_FINAL + R_QUALIFIED) + "}", + requestor.getResults()); +} }