IDEA-194946 DevKit: verify plugin provides pluginIcon.svg

This commit is contained in:
Yann Cébron
2018-10-29 16:51:11 +01:00
parent 80bc082668
commit fb9d97b4c1
5 changed files with 74 additions and 33 deletions
@@ -176,6 +176,7 @@ inspections.plugin.xml.must.not.contain.template.text=Must not contain template
inspections.plugin.xml.value.exceeds.max.length=Value exceeds maximum length {0}
inspections.plugin.xml.value.must.have.minimum.length=Value must have minimum length of {0}
inspections.plugin.xml.product.descriptor.invalid.date=Date must be in YYYYMMDD format
inspections.plugin.xml.no.plugin.icon.svg.file=<html>Plugin should provide ''{0}'' (<a href="https://www.jetbrains.org/intellij/sdk/docs/basics/plugin_structure/plugin_icon_file.html">Documentation</a>)</html>
inspections.registration.problems.name=Component type mismatch
inspections.registration.problems.option.check.plugin.xml=Check Plugin Descriptor (plugin.xml)
@@ -26,6 +26,8 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.NavigatableAdapter;
import com.intellij.psi.*;
import com.intellij.psi.impl.light.LightMethodBuilder;
import com.intellij.psi.search.FilenameIndex;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiFormatUtil;
import com.intellij.psi.util.PsiFormatUtilBase;
import com.intellij.psi.util.PsiTreeUtil;
@@ -55,16 +57,16 @@ import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
import javax.swing.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PluginXmlDomInspection extends BasicDomElementsInspection<IdeaPlugin> {
private static final Logger LOG = Logger.getInstance(PluginXmlDomInspection.class);
@NonNls
private static final String PLUGIN_ICON_SVG_FILENAME = "pluginIcon.svg";
public List<String> myRegistrationCheckIgnoreClassList = new ExternalizableStringSet();
@@ -96,6 +98,7 @@ public class PluginXmlDomInspection extends BasicDomElementsInspection<IdeaPlugi
if (module != null) {
annotateIdeaPlugin((IdeaPlugin)element, holder, module);
checkJetBrainsPlugin((IdeaPlugin)element, holder, module);
checkPluginIcon((IdeaPlugin)element, holder, module);
}
}
else if (element instanceof Extension) {
@@ -222,6 +225,18 @@ public class PluginXmlDomInspection extends BasicDomElementsInspection<IdeaPlugi
}
}
private static void checkPluginIcon(IdeaPlugin ideaPlugin, DomElementAnnotationHolder holder, Module module) {
if (!hasRealPluginId(ideaPlugin)) return;
Collection<VirtualFile> pluginIconFiles =
FilenameIndex.getVirtualFilesByName(module.getProject(), PLUGIN_ICON_SVG_FILENAME, GlobalSearchScope.moduleScope(module));
if (pluginIconFiles.isEmpty()) {
holder.createProblem(ideaPlugin, ProblemHighlightType.WEAK_WARNING,
DevKitBundle.message("inspections.plugin.xml.no.plugin.icon.svg.file", PLUGIN_ICON_SVG_FILENAME),
null);
}
}
private static boolean hasRealPluginId(IdeaPlugin ideaPlugin) {
String pluginId = ideaPlugin.getPluginId();
return pluginId != null && !pluginId.equals(PluginManagerCore.CORE_PLUGIN_ID);
@@ -0,0 +1,6 @@
<idea-plugin>
<id>plugin.with.icon</id>
<name>Icon was found</name>
<vendor>Icons Inc.</vendor>
<version>1.0</version>
</idea-plugin>
@@ -0,0 +1,6 @@
<<weak_warning descr="Plugin should provide 'pluginIcon.svg' (Documentation)">idea-plugin</weak_warning>>
<id>plugin.without.icon</id>
<name>No Icon</name>
<vendor>Icons Inc.</vendor>
<version>1.0</version>
</idea-plugin>
@@ -229,33 +229,33 @@ class PluginXmlFunctionalTest extends JavaCodeInsightFixtureTestCase {
myFixture.complete(CompletionType.SMART)
assertSameElements(myFixture.lookupElementStrings, ['foo.bar.BarAction', 'foo.goo.GooAction'])
assertNull(toString(myFixture.lookup.advertisements),
myFixture.lookup.advertisements.find { it.contains('to see inheritors of com.intellij.openapi.actionSystem.AnAction') })
myFixture.lookup.advertisements.find { it.contains('to see inheritors of com.intellij.openapi.actionSystem.AnAction') })
}
void testExtensionsSpecifyDefaultExtensionNs() {
myFixture.testHighlighting("extensionsSpecifyDefaultExtensionNs.xml")
doHighlightingTest("extensionsSpecifyDefaultExtensionNs.xml")
}
void testDeprecatedExtensionAttribute() {
myFixture.enableInspections(DeprecatedClassUsageInspection.class)
myFixture.testHighlighting("deprecatedExtensionAttribute.xml", "MyExtBean.java")
doHighlightingTest("deprecatedExtensionAttribute.xml", "MyExtBean.java")
}
void testDeprecatedAttributes() {
myFixture.testHighlighting("deprecatedAttributes.xml")
doHighlightingTest("deprecatedAttributes.xml")
}
void testExtensionAttributeDeclaredUsingAccessors() {
myFixture.testHighlighting("extensionAttributeWithAccessors.xml", "ExtBeanWithAccessors.java")
doHighlightingTest("extensionAttributeWithAccessors.xml", "ExtBeanWithAccessors.java")
}
void testExtensionWithInnerTags() {
myFixture.testHighlighting("extensionWithInnerTags.xml", "ExtBeanWithInnerTags.java")
doHighlightingTest("extensionWithInnerTags.xml", "ExtBeanWithInnerTags.java")
}
void testLanguageAttributeHighlighting() {
configureLanguageAttributeTest()
myFixture.testHighlighting("languageAttribute.xml", "MyLanguageAttributeEPBean.java")
doHighlightingTest("languageAttribute.xml", "MyLanguageAttributeEPBean.java")
}
void testLanguageAttributeCompletion() {
@@ -292,36 +292,36 @@ class PluginXmlFunctionalTest extends JavaCodeInsightFixtureTestCase {
"public class MyIcons {" +
" public static final javax.swing.Icon MyCustomIcon = null; " +
"}")
myFixture.testHighlighting("iconAttribute.xml",
"MyIconAttributeEPBean.java")
doHighlightingTest("iconAttribute.xml",
"MyIconAttributeEPBean.java")
}
void testPluginWithModules() {
myFixture.testHighlighting("pluginWithModules.xml")
doHighlightingTest("pluginWithModules.xml")
}
void testPluginWith99InUntilBuild() {
myFixture.testHighlighting("pluginWith99InUntilBuild.xml")
doHighlightingTest("pluginWith99InUntilBuild.xml")
}
void testPluginWith9999InUntilBuild() {
myFixture.testHighlighting("pluginWith9999InUntilBuild.xml")
doHighlightingTest("pluginWith9999InUntilBuild.xml")
}
void testPluginForOldIdeWith9999InUntilBuild() {
myFixture.testHighlighting("pluginForOldIdeWith9999InUntilBuild.xml")
doHighlightingTest("pluginForOldIdeWith9999InUntilBuild.xml")
}
void testPluginWith10000InUntilBuild() {
myFixture.testHighlighting("pluginWith10000InUntilBuild.xml")
doHighlightingTest("pluginWith10000InUntilBuild.xml")
}
void testPluginWithStarInUntilBuild() {
myFixture.testHighlighting("pluginWithStarInUntilBuild.xml")
doHighlightingTest("pluginWithStarInUntilBuild.xml")
}
void testPluginWithBranchNumberInUntilBuild() {
myFixture.testHighlighting("pluginWithBranchNumberInUntilBuild.xml")
doHighlightingTest("pluginWithBranchNumberInUntilBuild.xml")
}
void testReplaceBigNumberInUntilBuildWithStarQuickFix() {
@@ -331,7 +331,7 @@ class PluginXmlFunctionalTest extends JavaCodeInsightFixtureTestCase {
}
void testPluginWithXInclude() {
myFixture.testHighlighting("pluginWithXInclude.xml", "pluginWithXInclude-extensionPoints.xml")
doHighlightingTest("pluginWithXInclude.xml", "pluginWithXInclude-extensionPoints.xml")
}
void testPluginXmlInIdeaProjectWithoutVendor() {
@@ -364,7 +364,7 @@ class PluginXmlFunctionalTest extends JavaCodeInsightFixtureTestCase {
}
void testOrderAttributeHighlighting() {
myFixture.testHighlighting("orderAttributeHighlighting.xml")
doHighlightingTest("orderAttributeHighlighting.xml")
}
// separate tests for 'order' attribute completion because cannot test all cases with completeBasicAllCarets
@@ -409,7 +409,7 @@ class PluginXmlFunctionalTest extends JavaCodeInsightFixtureTestCase {
private void testHighlightingInIdeaProject(String path) {
PsiUtil.markAsIdeaProject(project, true)
try {
myFixture.testHighlighting(path)
doHighlightingTest(path)
}
finally {
PsiUtil.markAsIdeaProject(project, false)
@@ -421,7 +421,7 @@ class PluginXmlFunctionalTest extends JavaCodeInsightFixtureTestCase {
import com.intellij.openapi.diagnostic.ErrorReportSubmitter;
public class MyErrorHandler extends ErrorReportSubmitter {}
""")
myFixture.testHighlighting("errorHandlerExtensionInJetBrainsPlugin.xml")
doHighlightingTest("errorHandlerExtensionInJetBrainsPlugin.xml")
}
void testErrorHandlerExtensionInNonJetBrainsPlugin() {
@@ -429,7 +429,7 @@ public class MyErrorHandler extends ErrorReportSubmitter {}
import com.intellij.openapi.diagnostic.ErrorReportSubmitter;
public class MyErrorHandler extends ErrorReportSubmitter {}
""")
myFixture.testHighlighting("errorHandlerExtensionInNonJetBrainsPlugin.xml")
doHighlightingTest("errorHandlerExtensionInNonJetBrainsPlugin.xml")
}
void testExtensionPointPresentation() {
@@ -471,11 +471,11 @@ public class MyErrorHandler extends ErrorReportSubmitter {}
}
void testExtensionPointNameValidity() {
myFixture.testHighlighting(getTestName(true) + ".xml")
doHighlightingTest(getTestName(true) + ".xml")
}
void testExtensionPointValidity() {
myFixture.testHighlighting(getTestName(true) + ".xml")
doHighlightingTest(getTestName(true) + ".xml")
}
void testRegistrationCheck() {
@@ -522,26 +522,39 @@ public class MyErrorHandler extends ErrorReportSubmitter {}
}
void testValuesMaxLengths() {
myFixture.testHighlighting("ValuesMaxLengths.xml")
doHighlightingTest("ValuesMaxLengths.xml")
}
void testValuesRequired() {
myFixture.testHighlighting("ValuesRequired.xml")
doHighlightingTest("ValuesRequired.xml")
}
void testValuesTemplateTexts() {
myFixture.testHighlighting("ValuesTemplateTexts.xml")
doHighlightingTest("ValuesTemplateTexts.xml")
}
void testPluginWithSinceBuildGreaterThanUntilBuild() {
myFixture.testHighlighting("pluginWithSinceBuildGreaterThanUntilBuild.xml")
doHighlightingTest("pluginWithSinceBuildGreaterThanUntilBuild.xml")
}
private void doHighlightingTest(String... filePaths) {
myFixture.testHighlighting(true, false, false, filePaths)
}
void testProductDescriptor() {
myFixture.testHighlighting("productDescriptorInvalid.xml")
doHighlightingTest("productDescriptorInvalid.xml")
}
void testProductDescriptorInvalid() {
myFixture.testHighlighting("productDescriptorInvalid.xml")
doHighlightingTest("productDescriptorInvalid.xml")
}
void testPluginIconFound() {
myFixture.addFileToProject("pluginIcon.svg", "fake SVG")
myFixture.testHighlighting(true, true, true, "pluginIconFound.xml")
}
void testPluginIconNotFound() {
myFixture.testHighlighting(true, true, true, "pluginIconNotFound.xml")
}
}