### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/model/CompletionWithMissingTypesTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionWithMissingTypesTests.java,v retrieving revision 1.7 diff -u -r1.7 CompletionWithMissingTypesTests.java --- src/org/eclipse/jdt/core/tests/model/CompletionWithMissingTypesTests.java 5 Dec 2007 10:03:21 -0000 1.7 +++ src/org/eclipse/jdt/core/tests/model/CompletionWithMissingTypesTests.java 21 Mar 2008 11:35:00 -0000 @@ -1632,4 +1632,38 @@ " MissingType[TYPE_REF]{missing.MissingType, missing, Lmissing.MissingType;, null, null, ["+start2+", "+end2+"], " + (relevance1) + "}", requestor.getResults()); } +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=223479 +public void test0040() throws JavaModelException { + this.workingCopies = new ICompilationUnit[3]; + this.workingCopies[0] = getWorkingCopy( + "/Completion/src/test/Test.java", + "package test;"+ + "public class Test {\n" + + " MissingType.Mem\n" + + "}\n"); + + this.workingCopies[1] = getWorkingCopy( + "/Completion/src/missing/MissingType.java", + "package missing;"+ + "public class MissingType {\n" + + " public class Member {}\n" + + "}\n"); + + CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true, false, true, false, true); + requestor.allowAllRequiredProposals(); + String str = this.workingCopies[0].getSource(); + String completeBehind = "MissingType.Mem"; + int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length(); + this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner); + + int relevance1 = R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED + R_NO_PROBLEMS; + int start1 = str.lastIndexOf("Mem") + "".length(); + int end1 = start1 + "Mem".length(); + int start2 = str.indexOf("MissingType"); + int end2 = start2 + "MissingType".length(); + assertResults( + "MissingType.Member[TYPE_REF]{Member, missing, Lmissing.MissingType$Member;, null, null, ["+start1+", "+end1+"], " + (relevance1) + "}\n" + + " MissingType[TYPE_REF]{missing.MissingType, missing, Lmissing.MissingType;, null, null, ["+start2+", "+end2+"], " + (relevance1) + "}", + requestor.getResults()); +} } Index: src/org/eclipse/jdt/core/tests/model/CompletionContextTests.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionContextTests.java,v retrieving revision 1.8 diff -u -r1.8 CompletionContextTests.java --- src/org/eclipse/jdt/core/tests/model/CompletionContextTests.java 6 Mar 2008 15:31:41 -0000 1.8 +++ src/org/eclipse/jdt/core/tests/model/CompletionContextTests.java 21 Mar 2008 11:35:00 -0000 @@ -3610,8 +3610,8 @@ "}"); String str = this.workingCopies[0].getSource(); - int tokenStart = -1; - int tokenEnd = -1; + int tokenStart = str.lastIndexOf("ZZZZ"); + int tokenEnd = tokenStart + "ZZZZ".length() - 1; int cursorLocation = str.lastIndexOf("ZZZZ") + "ZZZZ".length(); CompletionResult result = contextComplete(this.workingCopies[0], cursorLocation); @@ -3619,8 +3619,8 @@ assertResults( "completion offset="+(cursorLocation)+"\n" + "completion range=["+(tokenStart)+", "+(tokenEnd)+"]\n" + - "completion token=null\n" + - "completion token kind=TOKEN_KIND_UNKNOWN\n" + + "completion token=\"ZZZZ\"\n" + + "completion token kind=TOKEN_KIND_NAME\n" + "expectedTypesSignatures=null\n" + "expectedTypesKeys=null\n"+ "completion token location=UNKNOWN", #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.355 diff -u -r1.355 CompletionEngine.java --- codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java 13 Mar 2008 09:48:44 -0000 1.355 +++ codeassist/org/eclipse/jdt/internal/codeassist/CompletionEngine.java 21 Mar 2008 11:35:03 -0000 @@ -1269,7 +1269,8 @@ } else if (this.assistNodeInJavadoc == 0 && (this.requestor.isAllowingRequiredProposals(CompletionProposal.FIELD_REF, CompletionProposal.TYPE_REF) || - this.requestor.isAllowingRequiredProposals(CompletionProposal.METHOD_REF, CompletionProposal.TYPE_REF))) { + this.requestor.isAllowingRequiredProposals(CompletionProposal.METHOD_REF, CompletionProposal.TYPE_REF) || + this.requestor.isAllowingRequiredProposals(CompletionProposal.TYPE_REF, CompletionProposal.TYPE_REF))) { boolean proposeField = !this.requestor.isIgnored(CompletionProposal.FIELD_REF); boolean proposeMethod = !this.requestor.isIgnored(CompletionProposal.METHOD_REF); if (proposeField || proposeMethod) { @@ -1344,7 +1345,18 @@ long completionPosition = ref.sourcePositions[ref.tokens.length]; // get the source positions of the completion identifier - if (qualifiedBinding instanceof ReferenceBinding && !(qualifiedBinding instanceof TypeVariableBinding)) { + if (qualifiedBinding.problemId() == ProblemReasons.NotFound) { + setSourceAndTokenRange((int) (completionPosition >>> 32), (int) completionPosition); + if (this.assistNodeInJavadoc == 0 && + (this.requestor.isAllowingRequiredProposals(CompletionProposal.TYPE_REF, CompletionProposal.TYPE_REF))) { + if(ref.tokens.length == 1) { + findMemberTypesFromMissingType( + ref.tokens[0], + ref.sourcePositions[0], + scope); + } + } + } else if (qualifiedBinding instanceof ReferenceBinding && !(qualifiedBinding instanceof TypeVariableBinding)) { if (!this.requestor.isIgnored(CompletionProposal.TYPE_REF)) { setSourceAndTokenRange((int) (completionPosition >>> 32), (int) completionPosition); @@ -5255,7 +5267,7 @@ } } - private void findMemberTypes( + protected void findMemberTypes( char[] typeName, ReferenceBinding receiverType, Scope scope, @@ -5418,6 +5430,40 @@ } } } + + private void findMemberTypesFromMissingType( + char[] typeName, + final long pos, + final Scope scope) { + MissingTypesGuesser missingTypesConverter = new MissingTypesGuesser(this); + MissingTypesGuesser.GuessedTypeRequestor substitutionRequestor = + new MissingTypesGuesser.GuessedTypeRequestor() { + public void accept( + TypeBinding guessedType, + Binding[] missingElements, + int[] missingElementsStarts, + int[] missingElementsEnds, + boolean hasProblems) { + if (guessedType instanceof ReferenceBinding) { + findMemberTypes( + CompletionEngine.this.completionToken, + (ReferenceBinding)guessedType, + scope, + scope.enclosingSourceType(), + false, + false, + new ObjectVector(), + missingElements, + missingElementsStarts, + missingElementsEnds, + hasProblems); + } + } + }; + SingleTypeReference typeRef = new SingleTypeReference(typeName, pos); + typeRef.resolvedType = new ProblemReferenceBinding(new char[][]{ typeName }, null, ProblemReasons.NotFound); + missingTypesConverter.guess(typeRef, scope, substitutionRequestor); + } /* * Find javadoc parameter names. Index: codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedTypeReference.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedTypeReference.java,v retrieving revision 1.24 diff -u -r1.24 CompletionOnQualifiedTypeReference.java --- codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedTypeReference.java 6 Mar 2007 02:38:48 -0000 1.24 +++ codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionOnQualifiedTypeReference.java 21 Mar 2008 11:35:03 -0000 @@ -57,6 +57,11 @@ Binding binding = scope.parent.getTypeOrPackage(tokens); // step up from the ClassScope if (!binding.isValidBinding()) { scope.problemReporter().invalidType(this, (TypeBinding) binding); + + if (binding.problemId() == ProblemReasons.NotFound) { + throw new CompletionNodeFound(this, binding, scope); + } + throw new CompletionNodeFound(); }