View | Details | Raw Unified | Return to bug 195346 | Differences between
and this patch

Collapse All | Expand All

(-)codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java (-1 / +30 lines)
Lines 522-527 Link Here
522
	boolean assistNodeIsExtendedType;
522
	boolean assistNodeIsExtendedType;
523
	int  assistNodeInJavadoc = 0;
523
	int  assistNodeInJavadoc = 0;
524
	boolean assistNodeCanBeSingleMemberAnnotation = false;
524
	boolean assistNodeCanBeSingleMemberAnnotation = false;
525
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=195346
526
	boolean assistNodeIsInsideCase = false;
525
	
527
	
526
	long targetedElement;
528
	long targetedElement;
527
	
529
	
Lines 1625-1630 Link Here
1625
		}
1627
		}
1626
1628
1627
		buildContext(astNode, astNodeParent, compilationUnitDeclaration, qualifiedBinding, scope);
1629
		buildContext(astNode, astNodeParent, compilationUnitDeclaration, qualifiedBinding, scope);
1630
		
1631
		// To find whether we're completing inside the case expression in a 
1632
		// switch case construct (https://bugs.eclipse.org/bugs/show_bug.cgi?id=195346)
1633
		if (astNodeParent instanceof SwitchStatement) {
1634
			CaseStatement[] cases = ((SwitchStatement) astNodeParent).cases;
1635
			for (int i = 0; i < ((SwitchStatement) astNodeParent).caseCount; i++) {
1636
				CompletionNodeDetector detector = new CompletionNodeDetector(astNode, cases[i]);
1637
				if (detector.containsCompletionNode()) {
1638
					this.assistNodeIsInsideCase = true;
1639
					break;
1640
				}
1641
			}
1642
		}
1628
1643
1629
		if (astNode instanceof CompletionOnFieldType) {
1644
		if (astNode instanceof CompletionOnFieldType) {
1630
			completionOnFieldType(astNode, scope);
1645
			completionOnFieldType(astNode, scope);
Lines 4086-4091 Link Here
4086
		return 0;
4101
		return 0;
4087
	}
4102
	}
4088
4103
4104
	private int computeRelevanceForFinal(boolean onlyFinal, boolean isFinal) {
4105
		if (onlyFinal && isFinal) {
4106
			return R_FINAL;
4107
		}
4108
		return 0;
4109
	}
4110
	
4089
	private long computeTargetedElement(CompletionOnAnnotationOfType fakeNode) {
4111
	private long computeTargetedElement(CompletionOnAnnotationOfType fakeNode) {
4090
		ASTNode annotatedElement = fakeNode.potentialAnnotatedNode;
4112
		ASTNode annotatedElement = fakeNode.potentialAnnotatedNode;
4091
4113
Lines 5947-5953 Link Here
5947
5969
5948
			if (this.options.checkVisibility
5970
			if (this.options.checkVisibility
5949
				&& !field.canBeSeenBy(receiverType, invocationSite, scope))	continue next;
5971
				&& !field.canBeSeenBy(receiverType, invocationSite, scope))	continue next;
5950
5972
			
5973
			// dont propose array types in case expression
5974
			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=195346
5975
			if (this.assistNodeIsInsideCase && field.type instanceof ArrayBinding)
5976
				continue next;
5977
			
5951
			boolean prefixRequired = false;
5978
			boolean prefixRequired = false;
5952
5979
5953
			for (int i = fieldsFound.size; --i >= 0;) {
5980
			for (int i = fieldsFound.size; --i >= 0;) {
Lines 6034-6039 Link Here
6034
			relevance += computeRelevanceForExpectingType(field.type);
6061
			relevance += computeRelevanceForExpectingType(field.type);
6035
			relevance += computeRelevanceForEnumConstant(field.type);
6062
			relevance += computeRelevanceForEnumConstant(field.type);
6036
			relevance += computeRelevanceForStatic(onlyStaticFields, field.isStatic());
6063
			relevance += computeRelevanceForStatic(onlyStaticFields, field.isStatic());
6064
			relevance += computeRelevanceForFinal(this.assistNodeIsInsideCase, field.isFinal());
6037
			relevance += computeRelevanceForQualification(prefixRequired);
6065
			relevance += computeRelevanceForQualification(prefixRequired);
6038
			relevance += computeRelevanceForRestrictions(IAccessRule.K_ACCESSIBLE);
6066
			relevance += computeRelevanceForRestrictions(IAccessRule.K_ACCESSIBLE);
6039
			if (onlyStaticFields && this.insideQualifiedReference) {
6067
			if (onlyStaticFields && this.insideQualifiedReference) {
Lines 11329-11334 Link Here
11329
							relevance += computeRelevanceForEnumConstant(local.type);
11357
							relevance += computeRelevanceForEnumConstant(local.type);
11330
							relevance += computeRelevanceForQualification(false);
11358
							relevance += computeRelevanceForQualification(false);
11331
							relevance += computeRelevanceForRestrictions(IAccessRule.K_ACCESSIBLE); // no access restriction for local variable
11359
							relevance += computeRelevanceForRestrictions(IAccessRule.K_ACCESSIBLE); // no access restriction for local variable
11360
							relevance += computeRelevanceForFinal(this.assistNodeIsInsideCase, local.isFinal());
11332
							this.noProposal = false;
11361
							this.noProposal = false;
11333
							if(!this.requestor.isIgnored(CompletionProposal.LOCAL_VARIABLE_REF)) {
11362
							if(!this.requestor.isIgnored(CompletionProposal.LOCAL_VARIABLE_REF)) {
11334
								InternalCompletionProposal proposal =  createProposal(CompletionProposal.LOCAL_VARIABLE_REF, this.actualCompletionPosition);
11363
								InternalCompletionProposal proposal =  createProposal(CompletionProposal.LOCAL_VARIABLE_REF, this.actualCompletionPosition);
(-)codeassist/org/eclipse/jdt/internal/codeassist/RelevanceConstants.java (+2 lines)
Lines 53-56 Link Here
53
	int R_NO_PROBLEMS = 1;
53
	int R_NO_PROBLEMS = 1;
54
	int R_RESOLVED = 1;
54
	int R_RESOLVED = 1;
55
	int R_TARGET = 5;
55
	int R_TARGET = 5;
56
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=195346
57
	int R_FINAL = 1;
56
}
58
}
(-)src/org/eclipse/jdt/core/tests/model/CompletionTests.java (-16 / +50 lines)
Lines 1897-1903 Link Here
1897
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
1897
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
1898
1898
1899
	assertResults(
1899
	assertResults(
1900
			"zzz[FIELD_REF]{zzz, LCompletionAfterCase1;, I, zzz, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_EXACT_EXPECTED_TYPE + R_CASE + R_UNQUALIFIED+ R_NON_RESTRICTED) + "}",
1900
			"zzz[FIELD_REF]{zzz, LCompletionAfterCase1;, I, zzz, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_EXACT_EXPECTED_TYPE + R_CASE + R_UNQUALIFIED + R_NON_RESTRICTED + R_FINAL) + "}",
1901
			requestor.getResults());
1901
			requestor.getResults());
1902
}
1902
}
1903
public void testCompletionAfterCase2() throws JavaModelException {
1903
public void testCompletionAfterCase2() throws JavaModelException {
Lines 1921-1927 Link Here
1921
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
1921
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
1922
1922
1923
	assertResults(
1923
	assertResults(
1924
			"zzz[FIELD_REF]{zzz, LCompletionAfterCase2;, I, zzz, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_EXACT_EXPECTED_TYPE + R_CASE + R_UNQUALIFIED+ R_NON_RESTRICTED) + "}",
1924
			"zzz[FIELD_REF]{zzz, LCompletionAfterCase2;, I, zzz, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_EXACT_EXPECTED_TYPE + R_CASE + R_UNQUALIFIED + R_NON_RESTRICTED + R_FINAL) + "}",
1925
			requestor.getResults());
1925
			requestor.getResults());
1926
}
1926
}
1927
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=111882
1927
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=111882
Lines 1952-1964 Link Here
1952
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
1952
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
1953
1953
1954
	assertResults(
1954
	assertResults(
1955
			"ZZZ2[FIELD_REF]{ZZZ2, Ltest.CompletionAfterCase2;, J, ZZZ2, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_UNQUALIFIED+ R_NON_RESTRICTED) + "}\n" +
1955
			"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" +
1956
			"ZZZ3[FIELD_REF]{ZZZ3, Ltest.CompletionAfterCase2;, D, ZZZ3, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_UNQUALIFIED+ R_NON_RESTRICTED) + "}\n" +
1956
			"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" +
1957
			"ZZZ4[FIELD_REF]{ZZZ4, Ltest.CompletionAfterCase2;, Ljava.lang.Object;, ZZZ4, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_UNQUALIFIED+ R_NON_RESTRICTED) + "}\n" +
1957
			"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" +
1958
			"ZZZ5[FIELD_REF]{ZZZ5, Ltest.CompletionAfterCase2;, [I, ZZZ5, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_UNQUALIFIED+ R_NON_RESTRICTED) + "}\n" +
1958
			"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" +
1959
			"ZZZ6[FIELD_REF]{ZZZ6, Ltest.CompletionAfterCase2;, [Ljava.lang.Object;, ZZZ6, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_UNQUALIFIED+ R_NON_RESTRICTED) + "}\n" +
1959
			"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) + "}",
1960
			"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) + "}\n" +
1961
			"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) + "}",
1962
			requestor.getResults());
1960
			requestor.getResults());
1963
}
1961
}
1964
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=111882
1962
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=111882
Lines 1995-2007 Link Here
1995
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
1993
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
1996
1994
1997
	assertResults(
1995
	assertResults(
1998
			"ZZZ2[FIELD_REF]{ZZZ2, Ltest.TestConstants;, J, ZZZ2, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_QUALIFIED+ R_NON_RESTRICTED) + "}\n" +
1996
			"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" +
1999
			"ZZZ3[FIELD_REF]{ZZZ3, Ltest.TestConstants;, D, ZZZ3, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_QUALIFIED+ R_NON_RESTRICTED) + "}\n" +
1997
			"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" +
2000
			"ZZZ4[FIELD_REF]{ZZZ4, Ltest.TestConstants;, Ljava.lang.Object;, ZZZ4, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_QUALIFIED+ R_NON_RESTRICTED) + "}\n" +
1998
			"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" +
2001
			"ZZZ5[FIELD_REF]{ZZZ5, Ltest.TestConstants;, [I, ZZZ5, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_QUALIFIED+ R_NON_RESTRICTED) + "}\n" +
1999
			"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" +
2002
			"ZZZ6[FIELD_REF]{ZZZ6, Ltest.TestConstants;, [Ljava.lang.Object;, ZZZ6, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_QUALIFIED+ R_NON_RESTRICTED) + "}\n" +
2000
			"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) + "}",
2003
			"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) + "}\n" +
2004
			"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) + "}",
2005
			requestor.getResults());
2001
			requestor.getResults());
2006
}
2002
}
2007
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=222080
2003
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=222080
Lines 21333-21336 Link Here
21333
			"toString[METHOD_REF]{toString(), Ljava.lang.Object;, ()Ljava.lang.String;, null, null, toString, null, replace[" + start1 + ", " + end1 + "], token[" + start1 + ", " + end1 +"], " + relevance1 + "}",
21329
			"toString[METHOD_REF]{toString(), Ljava.lang.Object;, ()Ljava.lang.String;, null, null, toString, null, replace[" + start1 + ", " + end1 + "], token[" + start1 + ", " + end1 +"], " + relevance1 + "}",
21334
			requestor.getResults());
21330
			requestor.getResults());
21335
}
21331
}
21332
21333
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=195346
21334
// To verify that array types arent proposed inside case, and also
21335
// that finals have a higher proriority in suggestions inside case expressions.
21336
public void testBug195346() throws JavaModelException {
21337
	this.workingCopies = new ICompilationUnit[1];
21338
	this.workingCopies[0] = getWorkingCopy(
21339
		"/Completion/src/test/CompletionAfterCase2.java",
21340
		"package test;\n" +
21341
		"public class CompletionAfterCase2 {\n" +
21342
		"	static char[] AN_ARRAY = new char[10];\n" +
21343
		"	static int AN_INT_VALUE = 0;\n" +
21344
		"	static final int AN_INT_VALUE2 = 0;\n" +
21345
		"	static final char[] AN_ARRAY2 = {'a','b'};\n" +
21346
		"	static final int[] AN_INT_ARRAY = null;\n" +
21347
		"	static final Object[] ANOTHER_ARRAY = null;\n" +
21348
		"	void foo(int i){\n" +
21349
		"		final int AN_INT_VAR = 1;\n" +
21350
		"		int AN_INT_VAR2 = 1;\n" +
21351
		"		switch(i) {\n" +
21352
		"			case AN\n" +
21353
		"		}\n" +
21354
		"	}\n" +
21355
		"}\n");
21356
21357
	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
21358
	String str = this.workingCopies[0].getSource();
21359
	String completeBehind = "AN";
21360
	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
21361
	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
21362
21363
	assertResults(
21364
			"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" +
21365
			"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" +
21366
			"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" +
21367
			"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) + "}",
21368
			requestor.getResults());
21369
}
21336
}
21370
}

Return to bug 195346