From decf925549e2406aace78bccb1a71a86ae1dca4f Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 5 Mar 2019 14:52:34 +0300 Subject: [PATCH] devkit: restore references to classes in custom attributes of extensions Class converter wasn't registered for custom attributes of extensions after b301f92a7d625e, breaking highlighting, completion and rename for class references in such attributes (e.g. IDEA-140250). This reverts the problematic commit and adds tests for such cases. --- .../src/dom/impl/ExtensionDomExtender.java | 23 +++++++++---------- .../codeInsight/ExtensionsHighlighting.xml | 3 +++ .../InnerClassCompletionInService.xml | 5 ++++ .../InnerClassCompletionInService_after.xml | 5 ++++ .../PluginXmlFunctionalTest.groovy | 22 ++++++++++++++++++ 5 files changed, 46 insertions(+), 12 deletions(-) create mode 100644 plugins/devkit/devkit-java-tests/testData/codeInsight/InnerClassCompletionInService.xml create mode 100644 plugins/devkit/devkit-java-tests/testData/codeInsight/InnerClassCompletionInService_after.xml diff --git a/plugins/devkit/devkit-core/src/dom/impl/ExtensionDomExtender.java b/plugins/devkit/devkit-core/src/dom/impl/ExtensionDomExtender.java index 25034d2b768b..37635a5a9ea2 100644 --- a/plugins/devkit/devkit-core/src/dom/impl/ExtensionDomExtender.java +++ b/plugins/devkit/devkit-core/src/dom/impl/ExtensionDomExtender.java @@ -153,7 +153,7 @@ public class ExtensionDomExtender extends DomExtender { final String attrName = getStringAttribute(attrAnno, "value", evalHelper, fieldName); if (attrName != null) { Class clazz = String.class; - if (withElement != null && isClassField(fieldName)) { + if (withElement != null || isClassField(fieldName)) { clazz = PsiClass.class; } else if (PsiType.BOOLEAN.equals(field.getType())) { clazz = Boolean.class; @@ -200,17 +200,16 @@ public class ExtensionDomExtender extends DomExtender { } private static void markAsClass(DomExtension extension, String fieldName, @Nullable With withElement) { - if (withElement == null) return; - - final String withClassName = withElement.getImplements().getStringValue(); - extension.addCustomAnnotation(new ExtendClassImpl() { - @Override - public String value() { - return withClassName; - } - }); - - if (isClassField(fieldName)) { + if (withElement != null) { + final String withClassName = withElement.getImplements().getStringValue(); + extension.addCustomAnnotation(new ExtendClassImpl() { + @Override + public String value() { + return withClassName; + } + }); + } + if (withElement != null || isClassField(fieldName)) { extension.setConverter(CLASS_CONVERTER); } } diff --git a/plugins/devkit/devkit-java-tests/testData/codeInsight/ExtensionsHighlighting.xml b/plugins/devkit/devkit-java-tests/testData/codeInsight/ExtensionsHighlighting.xml index 79d7ab616c51..78c7b75877b7 100644 --- a/plugins/devkit/devkit-java-tests/testData/codeInsight/ExtensionsHighlighting.xml +++ b/plugins/devkit/devkit-java-tests/testData/codeInsight/ExtensionsHighlighting.xml @@ -18,6 +18,9 @@ <myPlugin.deprecatedEP implementation="foo.MyDeprecatedEPImpl"/> + MyInvalid"/> + + diff --git a/plugins/devkit/devkit-java-tests/testData/codeInsight/InnerClassCompletionInService.xml b/plugins/devkit/devkit-java-tests/testData/codeInsight/InnerClassCompletionInService.xml new file mode 100644 index 000000000000..35ebc0e1b6b3 --- /dev/null +++ b/plugins/devkit/devkit-java-tests/testData/codeInsight/InnerClassCompletionInService.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/plugins/devkit/devkit-java-tests/testData/codeInsight/InnerClassCompletionInService_after.xml b/plugins/devkit/devkit-java-tests/testData/codeInsight/InnerClassCompletionInService_after.xml new file mode 100644 index 000000000000..42445012686c --- /dev/null +++ b/plugins/devkit/devkit-java-tests/testData/codeInsight/InnerClassCompletionInService_after.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/codeInsight/PluginXmlFunctionalTest.groovy b/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/codeInsight/PluginXmlFunctionalTest.groovy index 37c8fd575e6e..cd6c8cfb6af3 100644 --- a/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/codeInsight/PluginXmlFunctionalTest.groovy +++ b/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/codeInsight/PluginXmlFunctionalTest.groovy @@ -92,6 +92,7 @@ class PluginXmlFunctionalTest extends JavaCodeInsightFixtureTestCase { com.intellij + """) addPluginXml("indirect", """ @@ -110,6 +111,9 @@ class PluginXmlFunctionalTest extends JavaCodeInsightFixtureTestCase { myFixture.addClass("package foo; public class MyRunnable implements java.lang.Runnable {}") myFixture.addClass("package foo; @Deprecated public abstract class MyDeprecatedEP {}") myFixture.addClass("package foo; public class MyDeprecatedEPImpl extends foo.MyDeprecatedEP {}") + myFixture.addClass("package foo;\n" + + "import com.intellij.util.xmlb.annotations.Attribute;\n" + + "public class MyServiceDescriptor { @Attribute public String serviceImplementation; }") configureByFile() myFixture.checkHighlighting(true, false, false) @@ -181,6 +185,24 @@ class PluginXmlFunctionalTest extends JavaCodeInsightFixtureTestCase { myFixture.checkResultByFile(getTestName(false) + "_after.xml") } + void testInnerClassCompletionInService() { + addPluginXml("idea_core", """ + com.intellij + + + + + """) + myFixture.addClass("package foo;\n" + + "import com.intellij.util.xmlb.annotations.Attribute;\n" + + "public class MyServiceDescriptor { @Attribute public String serviceImplementation; }") + myFixture.addClass("package foo; public class Foo { public static class Fubar {} }") + myFixture.configureByFile(getTestName(false) + ".xml") + myFixture.completeBasic() + myFixture.type('\n') + myFixture.checkResultByFile(getTestName(false) + "_after.xml") + } + void testInnerClassSmartCompletion() { myFixture.addClass("package foo; public class Foo { public static class Fubar extends Foo {} }") myFixture.configureByFile(getTestName(false) + ".xml")