devkit: don't highlight language extensions which use common classes as errors in plugin.xml (IDEA-210145)

This commit is contained in:
nik
2019-04-02 10:00:52 +03:00
parent 3c98d6cceb
commit 2d6fe7b7f4
8 changed files with 42 additions and 1 deletions
@@ -20,6 +20,7 @@ import com.intellij.psi.*
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.PsiSearchHelper
import com.intellij.psi.search.UsageSearchContext
import com.intellij.psi.util.InheritanceUtil
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.psi.xml.XmlFile
import com.intellij.psi.xml.XmlTag
@@ -86,6 +87,13 @@ class ComponentModuleRegistrationChecker(private val moduleToModuleSet: AtomicCl
}
fun checkProperXmlFileForExtension(element: Extension) {
if (!element.xmlTag.getAttributeValue("language").isNullOrEmpty()) {
val beanClass = element.extensionPoint?.beanClass?.value
if (beanClass != null && InheritanceUtil.isInheritor(beanClass, "com.intellij.lang.LanguageExtensionPoint")) {
return
}
}
for (attributeDescription in element.genericInfo.attributeChildrenDescriptions) {
val attributeName = attributeDescription.name
if (attributeName == "forClass") continue
@@ -1,2 +1,10 @@
<idea-plugin>
<extensionPoints>
<extensionPoint qualifiedName="com.intellij.myPlugin.lang.myExtPoint" beanClass="com.intellij.lang.LanguageExtensionPoint">
<with attribute="implementationClass" implements="MyLanguageExtension"/>
</extensionPoint>
<extensionPoint qualifiedName="com.intellij.myPlugin.lang.myOwnExtPoint" beanClass="MyLanguageExtensionPoint">
<with attribute="implementationClass" implements="MyLanguageExtension"/>
</extensionPoint>
</extensionPoints>
</idea-plugin>
@@ -1,8 +1,16 @@
<idea-plugin>
<extensionPoints>
<extensionPoint qualifiedName="com.intellij.myPlugin.lang.myExtPoint" beanClass="com.intellij.lang.LanguageExtensionPoint">
<with attribute="implementationClass" implements="MyLanguageExtension"/>
</extensionPoint>
<extensionPoint qualifiedName="com.intellij.myPlugin.lang.myOwnExtPoint" beanClass="MyLanguageExtensionPoint">
<with attribute="implementationClass" implements="MyLanguageExtension"/>
</extensionPoint>
<extensionPoint name="myDependencyModuleClassWithEpNameEp" interface="DependencyModuleClassWithEpName"/>
</extensionPoints>
<extensions defaultExtensionNs="com.intellij">
<myPlugin.lang.myExtPoint language="" implementationClass="MyLanguageExtension"/>
<myPlugin.lang.myOwnExtPoint language="" implementationClass="MyLanguageExtension"/>
<myPlugin.myDependencyModuleClassEp implementation="DependencyModuleClass"/>
</extensions>
<actions>
@@ -0,0 +1 @@
public class MyLanguageExtension {}
@@ -0,0 +1,2 @@
public class MyLanguageExtensionPoint extends com.intellij.lang.LanguageExtensionPoint {
}
@@ -14,6 +14,10 @@
<extensions defaultExtensionNs="com.intellij">
<myPlugin.myMainModuleClassEp implementation="MainModuleClass"/>
<myPlugin.lang.myExtPoint language="MyLanguageID" implementationClass="MyLanguageExtension"/>
<myPlugin.lang.myOwnExtPoint language="MyLanguageID" implementationClass="MyLanguageExtension"/>
<<error descr="Element should be registered in 'anotherModule' module where its class 'MyLanguageExtension' is defined">myPlugin.lang.myExtPoint</error> language="" implementationClass="MyLanguageExtension"/>
<<error descr="Element should be registered in 'anotherModule' module where its class 'MyLanguageExtension' is defined">myPlugin.lang.myOwnExtPoint</error> language="" implementationClass="MyLanguageExtension"/>
<<error descr="Element should be registered in 'anotherModule' module where its class 'DependencyModuleClass' is defined">myPlugin.myDependencyModuleClassEp</error> implementation="DependencyModuleClass"/>
</extensions>
@@ -13,6 +13,8 @@
<extensions defaultExtensionNs="com.intellij">
<myPlugin.myMainModuleClassEp implementation="MainModuleClass"/>
<myPlugin.lang.myExtPoint language="MyLanguageID" implementationClass="MyLanguageExtension"/>
<myPlugin.lang.myOwnExtPoint language="MyLanguageID" implementationClass="MyLanguageExtension"/>
</extensions>
<actions>
@@ -545,11 +545,13 @@ public class MyErrorHandler extends ErrorReportSubmitter {}
}
void testRegistrationCheck() {
configureLanguageAttributeTest()
Module anotherModule = PsiTestUtil.addModule(getProject(), StdModuleTypes.JAVA, "anotherModule",
myTempDirFixture.findOrCreateDir("../anotherModuleDir"))
ModuleRootModificationUtil.addModuleLibrary(anotherModule, VfsUtil.getUrlForLibraryRoot(new File(PathUtil.getJarPathForClass(AnAction.class))))
Module additionalModule = PsiTestUtil.addModule(getProject(), StdModuleTypes.JAVA, "additionalModule",
myTempDirFixture.findOrCreateDir("../additionalModuleDir"))
ModuleRootModificationUtil.addModuleLibrary(anotherModule, VfsUtil.getUrlForLibraryRoot(new File(PathUtil.getJarPathForClass(LanguageExtensionPoint.class))))
ModuleRootModificationUtil.addDependency(myModule, anotherModule)
ModuleRootModificationUtil.addDependency(myModule, additionalModule)
def moduleSet = new PluginXmlDomInspection.PluginModuleSet()
@@ -559,6 +561,10 @@ public class MyErrorHandler extends ErrorReportSubmitter {}
def dependencyModuleClass = myFixture.copyFileToProject("registrationCheck/dependencyModule/DependencyModuleClass.java",
"../anotherModuleDir/DependencyModuleClass.java")
def dependencyModuleLanguageExtensionClass = myFixture.copyFileToProject("registrationCheck/dependencyModule/MyLanguageExtension.java",
"../anotherModuleDir/MyLanguageExtension.java")
def dependencyModuleLanguageExtensionPointClass = myFixture.copyFileToProject("registrationCheck/dependencyModule/MyLanguageExtensionPoint.java",
"../anotherModuleDir/MyLanguageExtensionPoint.java")
def dependencyModuleActionClass = myFixture.copyFileToProject("registrationCheck/dependencyModule/DependencyModuleAction.java",
"../anotherModuleDir/DependencyModuleAction.java")
def dependencyModuleClassWithEp = myFixture.copyFileToProject("registrationCheck/dependencyModule/DependencyModuleClassWithEpName.java",
@@ -573,6 +579,8 @@ public class MyErrorHandler extends ErrorReportSubmitter {}
"META-INF/MainModulePlugin.xml")
myFixture.configureFromExistingVirtualFile(dependencyModuleClass)
myFixture.configureFromExistingVirtualFile(dependencyModuleLanguageExtensionClass)
myFixture.configureFromExistingVirtualFile(dependencyModuleLanguageExtensionPointClass)
myFixture.configureFromExistingVirtualFile(dependencyModuleActionClass)
myFixture.configureFromExistingVirtualFile(dependencyModuleClassWithEp)
myFixture.configureFromExistingVirtualFile(dependencyModulePlugin)
@@ -583,7 +591,7 @@ public class MyErrorHandler extends ErrorReportSubmitter {}
myFixture.testHighlighting(true, false, false, dependencyModulePlugin)
myFixture.testHighlighting(true, false, false, mainModulePlugin)
def highlightInfos = myFixture.doHighlighting(HighlightSeverity.WARNING)
assertSize(3, highlightInfos)
assertSize(5, highlightInfos)
for (info in highlightInfos) {
def ranges = info.quickFixActionRanges