diff --git a/plugins/devkit/resources/org/jetbrains/idea/devkit/DevKitBundle.properties b/plugins/devkit/resources/org/jetbrains/idea/devkit/DevKitBundle.properties index d916b40fb9d3..81e7405c5c79 100644 --- a/plugins/devkit/resources/org/jetbrains/idea/devkit/DevKitBundle.properties +++ b/plugins/devkit/resources/org/jetbrains/idea/devkit/DevKitBundle.properties @@ -159,6 +159,6 @@ no.idea.sdk.version.found=Failed to detect JDK version required for IntelliJ Pla group.PluginDeployActions.text=Plugin Deployment Actions error.cannot.resolve.plugin=Cannot resolve plugin {0} -create.description.file=Create Description File +create.description.file=Create description file {0} select.target.location.of.description=Select target location of {0} serialization.only.member.used.explicitly=Serialization-only member used explicitly diff --git a/plugins/devkit/src/inspections/InspectionDescriptionInfo.java b/plugins/devkit/src/inspections/InspectionDescriptionInfo.java index 9720322fed1b..33ba64d5bb0e 100644 --- a/plugins/devkit/src/inspections/InspectionDescriptionInfo.java +++ b/plugins/devkit/src/inspections/InspectionDescriptionInfo.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2016 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. @@ -15,13 +15,26 @@ */ package org.jetbrains.idea.devkit.inspections; +import com.intellij.codeInspection.InspectionEP; import com.intellij.codeInspection.InspectionProfileEntry; +import com.intellij.codeInspection.LocalInspectionEP; import com.intellij.openapi.module.Module; +import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.xml.XmlTag; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.xml.DomFileElement; +import com.intellij.util.xml.DomService; import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.devkit.dom.Extensions; +import org.jetbrains.idea.devkit.dom.IdeaPlugin; +import org.jetbrains.idea.devkit.inspections.quickfix.PluginDescriptorChooser; import org.jetbrains.idea.devkit.util.PsiUtil; +import java.util.List; + public class InspectionDescriptionInfo { private final String myFilename; @@ -40,14 +53,63 @@ public class InspectionDescriptionInfo { DescriptionType.INSPECTION.getClassName().equals(method.getContainingClass().getQualifiedName())) { method = null; } - final String filename = method == null ? - InspectionProfileEntry.getShortName(psiClass.getName()) : - PsiUtil.getReturnedLiteral(method, psiClass); + String filename = null; + if (method == null) { + String className = psiClass.getQualifiedName(); + if(className != null) { + XmlTag tag = findExtensionTag(module, className); + if(tag != null) { + filename = tag.getAttributeValue("shortName"); + } + } + if(filename == null) { + filename = InspectionProfileEntry.getShortName(psiClass.getName()); + } + } + else { + filename = PsiUtil.getReturnedLiteral(method, psiClass); + } PsiFile descriptionFile = resolveInspectionDescriptionFile(module, filename); return new InspectionDescriptionInfo(filename, method, descriptionFile); } + @Nullable + static XmlTag findExtensionTag(Module module, final String className) { + List> elements = DomService.getInstance().getFileElements(IdeaPlugin.class, module.getProject(), + GlobalSearchScope.projectScope(module.getProject())); + elements = ContainerUtil.filter(elements, element -> { + VirtualFile virtualFile = element.getFile().getVirtualFile(); + return virtualFile != null && ProjectRootManager.getInstance(module.getProject()).getFileIndex().isInContent(virtualFile); + }); + + elements = PluginDescriptorChooser.findAppropriateIntelliJModule(module.getName(), elements); + for (DomFileElement element : elements) { + IdeaPlugin ideaPlugin = element.getRootElement(); + List extensionsList = ideaPlugin.getExtensions(); + for (Extensions extensions : extensionsList) { + String epPrefix = extensions.getEpPrefix(); + if (epPrefix.equals("com.intellij.")) { + XmlTag[] result = {null}; + extensions.getXmlTag().acceptChildren(new XmlElementVisitor() { + @Override + public void visitXmlTag(XmlTag tag) { + if (className.equals(tag.getAttributeValue("implementationClass")) && + ((epPrefix + tag.getName()).equals(InspectionEP.GLOBAL_INSPECTION.getName()) || + (epPrefix + tag.getName()).equals(LocalInspectionEP.LOCAL_INSPECTION.getName()))) { + result[0] = tag; + } + } + }); + if (result[0] != null) { + return result[0]; + } + } + } + } + return null; + } + @Nullable private static PsiFile resolveInspectionDescriptionFile(Module module, @Nullable String filename) { if (filename == null) return null; diff --git a/plugins/devkit/src/inspections/quickfix/CreateHtmlDescriptionFix.java b/plugins/devkit/src/inspections/quickfix/CreateHtmlDescriptionFix.java index e53f975582e5..03520ea2df51 100644 --- a/plugins/devkit/src/inspections/quickfix/CreateHtmlDescriptionFix.java +++ b/plugins/devkit/src/inspections/quickfix/CreateHtmlDescriptionFix.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2016 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. @@ -100,7 +100,7 @@ public class CreateHtmlDescriptionFix implements LocalQuickFix, Iconable { @NotNull public String getName() { - return DevKitBundle.message("create.description.file"); + return DevKitBundle.message("create.description.file", myFilename); } @NotNull diff --git a/plugins/devkit/src/inspections/quickfix/PluginDescriptorChooser.java b/plugins/devkit/src/inspections/quickfix/PluginDescriptorChooser.java index 287f04deae19..32346be41e5c 100644 --- a/plugins/devkit/src/inspections/quickfix/PluginDescriptorChooser.java +++ b/plugins/devkit/src/inspections/quickfix/PluginDescriptorChooser.java @@ -61,6 +61,7 @@ public class PluginDescriptorChooser { .put("vcs-impl", "VcsExtensions.xml") .put("openapi", "IdeaPlugin.xml") .put("java-impl", "IdeaPlugin.xml") + .put("java-analysis-impl", "IdeaPlugin.xml") .build(); public static void show(final Project project, @@ -152,14 +153,14 @@ public class PluginDescriptorChooser { ModuleManager moduleManager = ModuleManager.getInstance(currentModule.getProject()); final String[] groupPath = moduleManager.getModuleGroupPath(currentModule); - Collections.sort(elements, (o1, o2) -> { + elements.sort((o1, o2) -> { // current module = first group final Module module1 = o1.getModule(); final Module module2 = o2.getModule(); if (currentModule.equals(module1)) return -1; if (currentModule.equals(module2)) return 1; - + if (module1 != null && module2 != null) { int groupComparison = Comparing.compare(groupMatchLevel(groupPath, moduleManager.getModuleGroupPath(module2)), groupMatchLevel(groupPath, moduleManager.getModuleGroupPath(module1))); @@ -169,7 +170,7 @@ public class PluginDescriptorChooser { } return ModulesAlphaComparator.INSTANCE.compare(module1, module2); }); - Collections.sort(elements, (o1, o2) -> { + elements.sort((o1, o2) -> { if (!Comparing.equal(o1.getModule(), o2.getModule())) return 0; String pluginId1 = o1.getRootElement().getPluginId(); String pluginId2 = o2.getRootElement().getPluginId(); @@ -207,7 +208,7 @@ public class PluginDescriptorChooser { return 0; } - private static List> findAppropriateIntelliJModule(String moduleName, + public static List> findAppropriateIntelliJModule(String moduleName, List> elements) { String extensionsFile = INTELLIJ_MODULES.get(moduleName); if (extensionsFile != null) { diff --git a/plugins/devkit/testData/inspections/inspectionDescription/MyRegisteredCorrectlyInspection.java b/plugins/devkit/testData/inspections/inspectionDescription/MyRegisteredCorrectlyInspection.java new file mode 100644 index 000000000000..b05d388b27da --- /dev/null +++ b/plugins/devkit/testData/inspections/inspectionDescription/MyRegisteredCorrectlyInspection.java @@ -0,0 +1,4 @@ +import com.intellij.codeInspection.InspectionProfileEntry; + +public class MyRegisteredCorrectlyInspection extends InspectionProfileEntry { +} \ No newline at end of file diff --git a/plugins/devkit/testData/inspections/inspectionDescription/MyRegisteredInspection.java b/plugins/devkit/testData/inspections/inspectionDescription/MyRegisteredInspection.java new file mode 100644 index 000000000000..0efd5d656d02 --- /dev/null +++ b/plugins/devkit/testData/inspections/inspectionDescription/MyRegisteredInspection.java @@ -0,0 +1,4 @@ +import com.intellij.codeInspection.InspectionProfileEntry; + +public class MyRegisteredInspection extends InspectionProfileEntry { +} \ No newline at end of file diff --git a/plugins/devkit/testData/inspections/inspectionDescription/inspectionDescriptions/MyRegistered.html b/plugins/devkit/testData/inspections/inspectionDescription/inspectionDescriptions/MyRegistered.html new file mode 100644 index 000000000000..69fc3e80085b --- /dev/null +++ b/plugins/devkit/testData/inspections/inspectionDescription/inspectionDescriptions/MyRegistered.html @@ -0,0 +1 @@ +from MyRegisteredInspection \ No newline at end of file diff --git a/plugins/devkit/testData/inspections/inspectionDescription/inspectionDescriptions/MyRegisteredCustomName.html b/plugins/devkit/testData/inspections/inspectionDescription/inspectionDescriptions/MyRegisteredCustomName.html new file mode 100644 index 000000000000..8bcce1b2460b --- /dev/null +++ b/plugins/devkit/testData/inspections/inspectionDescription/inspectionDescriptions/MyRegisteredCustomName.html @@ -0,0 +1 @@ +from MyRegisteredCorrectlyInspection \ No newline at end of file diff --git a/plugins/devkit/testData/inspections/inspectionDescription/resources/META-INF/plugin.xml b/plugins/devkit/testData/inspections/inspectionDescription/resources/META-INF/plugin.xml new file mode 100644 index 000000000000..9325b3115c34 --- /dev/null +++ b/plugins/devkit/testData/inspections/inspectionDescription/resources/META-INF/plugin.xml @@ -0,0 +1,12 @@ + + com.intellij.example + + + + + + diff --git a/plugins/devkit/testSources/inspections/InspectionDescriptionNotFoundInspectionTest.java b/plugins/devkit/testSources/inspections/InspectionDescriptionNotFoundInspectionTest.java index 8ce0799e03b4..8648341bc875 100644 --- a/plugins/devkit/testSources/inspections/InspectionDescriptionNotFoundInspectionTest.java +++ b/plugins/devkit/testSources/inspections/InspectionDescriptionNotFoundInspectionTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2016 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. @@ -66,9 +66,21 @@ public class InspectionDescriptionNotFoundInspectionTest extends JavaCodeInsight myFixture.testHighlighting("MyWithDescriptionCustomShortNameInspection.java"); } + public void testWithDescriptionXmlRegisteredNotFound() { + myFixture.copyDirectoryToProject("inspectionDescriptions", "inspectionDescriptions"); + myFixture.copyDirectoryToProject("resources", "resources"); + myFixture.testHighlighting("MyRegisteredInspection.java"); + } + + public void testWithDescriptionXmlRegisteredOk() { + myFixture.copyDirectoryToProject("inspectionDescriptions", "inspectionDescriptions"); + myFixture.copyDirectoryToProject("resources", "resources"); + myFixture.testHighlighting("MyRegisteredCorrectlyInspection.java"); + } + public void testQuickFix() { myFixture.configureByFile("MyQuickFixInspection.java"); - IntentionAction item = myFixture.findSingleIntention("Create Description File"); + IntentionAction item = myFixture.findSingleIntention("Create description file MyQuickFix.html"); myFixture.launchAction(item); VirtualFile path = myFixture.findFileInTempDir("inspectionDescriptions/MyQuickFix.html");