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")