IDEA-89015 Java class names are presented in autopopup or "basic" completion list inside any XML literal

This commit is contained in:
peter
2012-07-20 11:07:11 +02:00
parent 4047cd03e8
commit 3d0512e303
5 changed files with 86 additions and 61 deletions
@@ -1,59 +1,62 @@
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.lookup.AutoCompletionPolicy;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.lang.StdLanguages;
import com.intellij.psi.PsiElement;
import com.intellij.util.Consumer;
/**
* @author peter
*/
public class XmlBasicToClassNameDelegator extends CompletionContributor {
@Override
public void fillCompletionVariants(CompletionParameters parameters, final CompletionResultSet result) {
PsiElement position = parameters.getPosition();
if (parameters.getCompletionType() != CompletionType.BASIC ||
!JavaCompletionContributor.mayStartClassName(result) ||
!position.getContainingFile().getLanguage().isKindOf(StdLanguages.XML)) {
return;
}
final boolean empty = result.runRemainingContributors(parameters, true).isEmpty();
if (!empty && parameters.getInvocationCount() == 0) {
result.restartCompletionWhenNothingMatches();
}
if (empty || parameters.isExtendedCompletion()) {
CompletionService.getCompletionService().getVariantsFromContributors(parameters.delegateToClassName(), null, new Consumer<CompletionResult>() {
public void consume(final CompletionResult completionResult) {
LookupElement lookupElement = completionResult.getLookupElement();
JavaPsiClassReferenceElement classElement = lookupElement.as(JavaPsiClassReferenceElement.CLASS_CONDITION_KEY);
if (classElement != null) {
classElement.setAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE);
}
lookupElement.putUserData(XmlCompletionContributor.WORD_COMPLETION_COMPATIBLE, Boolean.TRUE); //todo think of a less dirty interaction
result.passResult(completionResult);
}
});
}
}
}
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.lookup.AutoCompletionPolicy;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.lang.StdLanguages;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.util.Consumer;
/**
* @author peter
*/
public class XmlBasicToClassNameDelegator extends CompletionContributor {
@Override
public void fillCompletionVariants(CompletionParameters parameters, final CompletionResultSet result) {
PsiElement position = parameters.getPosition();
PsiFile file = position.getContainingFile();
if (parameters.getCompletionType() != CompletionType.BASIC ||
!JavaCompletionContributor.mayStartClassName(result) ||
!file.getLanguage().isKindOf(StdLanguages.XML)) {
return;
}
final boolean empty = result.runRemainingContributors(parameters, true).isEmpty();
if (!empty && parameters.getInvocationCount() == 0) {
result.restartCompletionWhenNothingMatches();
}
if (empty && JavaClassReferenceCompletionContributor.findJavaClassReference(file, parameters.getOffset()) != null ||
parameters.isExtendedCompletion()) {
CompletionService.getCompletionService().getVariantsFromContributors(parameters.delegateToClassName(), null, new Consumer<CompletionResult>() {
public void consume(final CompletionResult completionResult) {
LookupElement lookupElement = completionResult.getLookupElement();
JavaPsiClassReferenceElement classElement = lookupElement.as(JavaPsiClassReferenceElement.CLASS_CONDITION_KEY);
if (classElement != null) {
classElement.setAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE);
}
lookupElement.putUserData(XmlCompletionContributor.WORD_COMPLETION_COMPATIBLE, Boolean.TRUE); //todo think of a less dirty interaction
result.passResult(completionResult);
}
});
}
}
}
@@ -0,0 +1,6 @@
<idea-plugin>
<extensionPoints>
<extensionPoint name="ext" interface="foo.FooFooFooFooFoo"/>
<extensionPoint name="FFFFoo<caret>"/>
</extensionPoints>
</idea-plugin>
@@ -0,0 +1,6 @@
<idea-plugin>
<extensionPoints>
<extensionPoint name="ext" interface="foo.FooFooFooFooFoo"/>
<extensionPoint name="FooFooFooFooFoo<caret>"/>
</extensionPoints>
</idea-plugin>
@@ -136,6 +136,14 @@ public class PluginXmlFunctionalTest extends JavaCodeInsightFixtureTestCase {
myFixture.checkResultByFile(getTestName(false) + "_after.xml");
}
public void testNoClassCompletionOutsideJavaReferences() throws Throwable {
myFixture.addClass("package foo; public class FooFooFooFooFoo { }");
myFixture.configureByFile(getTestName(false) + ".xml");
myFixture.completeBasic();
myFixture.checkResultByFile(getTestName(false) + "_after.xml");
}
public void testDeprecatedExtensionAttribute() {
myFixture.enableInspections(DeprecatedClassUsageInspection.class);
myFixture.testHighlighting("deprecatedExtensionAttribute.xml", "MyExtBean.java");
@@ -547,7 +547,8 @@ public class XmlCompletionTest extends LightCodeInsightFixtureTestCase {
myFixture.addClass("public class ABxxZ {}");
final String testName = getTestName(false);
configureByFile(testName + ".xml");
myFixture.configureByFile(testName + ".xml");
myFixture.complete(CompletionType.BASIC, 2);
assertEquals("ABxxZ", myFixture.getLookupElements()[0].getLookupString());
assertEquals("ABxxCDEF", myFixture.getLookupElements()[1].getLookupString());
selectItem(myFixture.getLookupElements()[1], Lookup.NORMAL_SELECT_CHAR);
@@ -558,7 +559,8 @@ public class XmlCompletionTest extends LightCodeInsightFixtureTestCase {
myFixture.addClass("package foo; public class SomeClass {}");
final String testName = getTestName(false);
configureByFile(testName + ".xml");
myFixture.configureByFile(testName + ".xml");
myFixture.complete(CompletionType.BASIC, 2);
selectItem(assertOneElement(myFixture.getLookupElements()), Lookup.NORMAL_SELECT_CHAR);
checkResultByFile(testName + "_after.xml");
}