From 3d0512e303d4d49306897842edf310d9897e1da2 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 20 Jul 2012 10:26:38 +0200 Subject: [PATCH] IDEA-89015 Java class names are presented in autopopup or "basic" completion list inside any XML literal --- .../XmlBasicToClassNameDelegator.java | 121 +++++++++--------- ...NoClassCompletionOutsideJavaReferences.xml | 6 + ...sCompletionOutsideJavaReferences_after.xml | 6 + .../codeInsight/PluginXmlFunctionalTest.java | 8 ++ .../completion/XmlCompletionTest.java | 6 +- 5 files changed, 86 insertions(+), 61 deletions(-) create mode 100644 plugins/devkit/testData/codeInsight/NoClassCompletionOutsideJavaReferences.xml create mode 100644 plugins/devkit/testData/codeInsight/NoClassCompletionOutsideJavaReferences_after.xml diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/XmlBasicToClassNameDelegator.java b/java/java-impl/src/com/intellij/codeInsight/completion/XmlBasicToClassNameDelegator.java index 83d679fd78dd..8f52a352a1e8 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/XmlBasicToClassNameDelegator.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/XmlBasicToClassNameDelegator.java @@ -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() { - 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() { + 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); + } + }); + } + } + +} diff --git a/plugins/devkit/testData/codeInsight/NoClassCompletionOutsideJavaReferences.xml b/plugins/devkit/testData/codeInsight/NoClassCompletionOutsideJavaReferences.xml new file mode 100644 index 000000000000..38159d5175d0 --- /dev/null +++ b/plugins/devkit/testData/codeInsight/NoClassCompletionOutsideJavaReferences.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/plugins/devkit/testData/codeInsight/NoClassCompletionOutsideJavaReferences_after.xml b/plugins/devkit/testData/codeInsight/NoClassCompletionOutsideJavaReferences_after.xml new file mode 100644 index 000000000000..daf574b73505 --- /dev/null +++ b/plugins/devkit/testData/codeInsight/NoClassCompletionOutsideJavaReferences_after.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.java b/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.java index dc9e0767b163..c7e435c194f5 100644 --- a/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.java +++ b/plugins/devkit/testSources/codeInsight/PluginXmlFunctionalTest.java @@ -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"); diff --git a/xml/tests/src/com/intellij/codeInsight/completion/XmlCompletionTest.java b/xml/tests/src/com/intellij/codeInsight/completion/XmlCompletionTest.java index b7a5e10215c7..9ed968fa7fb6 100644 --- a/xml/tests/src/com/intellij/codeInsight/completion/XmlCompletionTest.java +++ b/xml/tests/src/com/intellij/codeInsight/completion/XmlCompletionTest.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"); }