[devkit] IJPL-163797 Highlight implementation-detail plugins as deprecated in plugin.xml

GitOrigin-RevId: 5cb732c2f0d802e9b85840474b5d70ad16acae15
This commit is contained in:
Yuriy Artamonov
2024-12-06 21:05:04 +00:00
committed by intellij-monorepo-bot
parent a52e828b61
commit bd5b2fc3f1
14 changed files with 49 additions and 28 deletions
@@ -205,7 +205,8 @@ inspections.plugin.xml.do.not.use.template.text=Do not use template text ''{0}''
inspections.plugin.xml.must.not.contain.template.text=Must not contain template text ''{0}''
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.value.must.be.https.or.http.link.to.website=Must be valid link to website using https:// or http:// scheme
# suppress inspection "HttpUrlsUsage"
inspections.plugin.xml.value.must.be.https.or.http.link.to.website=Must be a valid link to the website using https:// or http:// scheme
inspections.plugin.xml.product.descriptor.invalid.date=Date must be a YYYYMMDD integer, or a placeholder (e.g. __DATE__)
inspections.plugin.xml.product.descriptor.invalid.version=Version must be an integer, or a placeholder (e.g. __VERSION__)
inspections.plugin.xml.no.plugin.icon.svg.file=<html>Plugin should provide ''{0}'' (<a href="https://plugins.jetbrains.com/docs/intellij/plugin-icon-file.html?from=PluginXmlPluginLogoInspection">Documentation</a>)</html>
@@ -217,9 +218,9 @@ inspections.plugin.xml.ComponentModuleRegistrationChecker.fix.move.registration.
inspections.plugin.xml.ComponentModuleRegistrationChecker.fix.move.registration.family.name=Move registration to correct module
inspections.plugin.xml.fix.extension.point.add.with.tag=Add <with> tag
inspections.plugin.xml.listener.does.not.inherit=''{0}'' does not inherit from ''{1}''
inspections.plugin.xml.since.build.could.not.locate.main.descriptor=Could not locate main plugin.xml file to determine required <idea-version> 'since-build'
inspections.plugin.xml.since.build.could.not.locate.main.descriptor=Could not locate the main plugin.xml file to determine required <idea-version> 'since-build'
inspections.plugin.xml.since.build.must.be.specified=Must specify <idea-version> 'since-build'
inspections.plugin.xml.since.build.could.not.determine.platform.version=Could not determine target platform version, please check project setup
inspections.plugin.xml.since.build.could.not.determine.platform.version=Could not determine a target platform version, please check project setup
inspections.plugin.xml.since.build.listeners.os.attribute=Attribute ''os'' available in platform version {0} or later only, but specified ''since-build'' platform is ''{1}''
inspections.plugin.xml.since.build.listeners.not.available=Feature available in platform version {0} or later only, but specified ''since-build'' platform is ''{1}''
inspections.plugin.xml.action.group.id.required='id' should be specified
@@ -233,6 +234,7 @@ inspections.plugin.xml.vendor.specify.jetbrains=Specify JetBrains as vendor
inspections.plugin.xml.change.until.build.name=Change ''until-build'' to ''{0}''
inspections.plugin.xml.change.until.build.family.name=Correct 'until-build' attribute
inspections.plugin.xml.deprecated=Deprecated
inspections.plugin.xml.deprecated.implementation.detail=Implementation plugins are no longer supported: use either a regular plugin or implement a product module
inspections.plugin.xml.add.version.tag=Add <version>
inspections.plugin.xml.add.vendor.tag=Add <vendor>
inspections.plugin.xml.module.descriptor.at.least.one.dependency=At least one <module> entry must be defined
@@ -289,7 +291,6 @@ inspections.psi.element.concat.psi.type=Suspicious conversion of PsiType to stri
inspections.psi.element.concat.add.get.text.family.name=Call text representation retrieval method
inspections.psi.element.concat.add.get.text.name=Use ''{0}'' call
inspections.plugin.xml.dynamic.plugin.component.usage=Non-dynamic plugin due to using components.
inspections.plugin.xml.dynamic.plugin.component.usage.docs.link.title=Migration Guide
inspections.plugin.xml.dynamic.plugin.option.highlight.usages.ep=Highlight usage of non-dynamic extension points
@@ -297,7 +298,6 @@ inspections.plugin.xml.dynamic.plugin.extension.point=Non-dynamic extension poin
inspections.plugin.xml.dynamic.plugin.explicit.non.dynamic.extension.point=Explicit non-dynamic extension point ''{0}''
inspections.plugin.xml.dynamic.plugin.id.required.for.group='id' must be specified for <group>
inspections.plugin.xml.dynamic.plugin.usage.of.non.dynamic.extension.point=Usage of non-dynamic extension point ''{0}''
inspections.plugin.xml.dynamic.plugin.analyze.extension.point={0} for ''{1}''
inspections.stateful.extension.point.leak.psi.element=Potential memory leak: don't hold PsiElement, use SmartPsiElementPointer instead
inspections.stateful.extension.point.leak.psi.element.quick.fix=See also LocalQuickFixOnPsiElement.
@@ -600,7 +600,7 @@ inspection.light.service.must.be.concrete.class.message=\
Light service must be a concrete class and cannot be abstract or an interface.\n\
The IntelliJ Platform relies on the concrete implementation class to create and \
manage the service instance. Without a concrete implementation, the platform \
would not be able to create an instance of the service, and the service would \
would not be able to create an instance of the service. The service would \
not be available for use by the plugin.\n\
To solve this problem, you should define a concrete implementation class for the \
service and annotate it with '@Service'.
@@ -679,6 +679,7 @@ inspections.meta.information.unknown.inspection.id=Unknown inspection id ''{0}''
inspections.meta.information.json.schema.display.name=IntelliJ Inspections Metainformation
inlay.threading.name=IJ Platform threading
# suppress inspection "GrazieInspection"
inlay.threading.description=IntelliJ Platform threading and read/write lock related annotations, e.g., <code>@RequiresEdt</code>, <code>@RequiresReadLock</code>.<br><br>Experimental, enabled in IDEA project only.
inspections.static.initialization.in.extensions.name=Static initialization in extension point implementations
@@ -709,7 +710,7 @@ inspections.jcomponent.data.provider.display.name=JComponent must use UiDataProv
inspections.jcomponent.data.provider.use.uidataprovider.instead.of.dataprovider=Use UiDataProvider instead of DataProvider
inspection.can.be.dumb.aware.name=Can be DumbAware
inspection.can.be.dumb.aware.settings.ignore.classes.title=Ignore class list:
inspection.can.be.dumb.aware.settings.ignore.classes.title=Ignore classes list:
inspection.can.be.dumb.aware.settings.ignore.classes.dialog.title=Specify Class to Ignore
inspection.can.be.dumb.aware.message=Can be made DumbAware if it does not access indexes
inspection.can.be.dumb.aware.quickfix.add.to.ignore=Ignore ''{0}''
@@ -6,7 +6,6 @@ import com.intellij.ide.presentation.Presentation;
import com.intellij.openapi.util.NlsSafe;
import com.intellij.psi.PsiPackage;
import com.intellij.util.xml.*;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -67,7 +66,12 @@ public interface IdeaPlugin extends DomElement {
@NotNull GenericAttributeValue<Boolean> getAllowBundledUpdate();
/**
* @deprecated Will be dropped without a replacement: use either a regular plugin or implement a product module.
*/
@SuppressWarnings("DeprecatedIsStillUsed")
@Stubbed
@Deprecated
@NotNull GenericAttributeValue<Boolean> getImplementationDetail();
@NotNull GenericAttributeValue<Boolean> getRequireRestart();
@@ -157,8 +161,9 @@ public interface IdeaPlugin extends DomElement {
@NotNull List<? extends Listeners> getProjectListeners();
/**
* @deprecated the corresponding tag in plugin.xml is not supported anymore, this method is used to highlight occurrences of such tag
* @deprecated the corresponding tag in plugin.xml is not supported anymore, this method is used to highlight occurrences of such a tag
*/
@SuppressWarnings("SpellCheckingInspection")
@Deprecated
@NotNull List<? extends Helpset> getHelpsets();
}
@@ -327,8 +327,14 @@ public final class PluginXmlDomInspection extends DevKitPluginXmlInspectionBase
//noinspection deprecation
if (DomUtil.hasXml(ideaPlugin.getUseIdeaClassloader())) {
//noinspection deprecation
highlightDeprecated(ideaPlugin.getUseIdeaClassloader(), DevKitBundle.message("inspections.plugin.xml.deprecated"), holder, true,
true);
highlightDeprecated(ideaPlugin.getUseIdeaClassloader(), DevKitBundle.message("inspections.plugin.xml.deprecated"), holder, true, true);
}
//noinspection deprecation
if (DomUtil.hasXml(ideaPlugin.getImplementationDetail())) {
//noinspection deprecation
highlightDeprecated(ideaPlugin.getImplementationDetail(), DevKitBundle.message("inspections.plugin.xml.deprecated.implementation.detail"),
holder, true, true);
}
checkMaxLength(ideaPlugin.getUrl(), 255, holder);
@@ -545,7 +551,7 @@ public final class PluginXmlDomInspection extends DevKitPluginXmlInspectionBase
}
@NonNls String name = nameAttrValue.getValue();
// skip some known offenders in IJ project
// skip some known offenders in the IJ project
if (name != null
&& (StringUtil.startsWith(name, "Pythonid.") ||
StringUtil.startsWith(name, "DevKit.") ||
@@ -569,9 +575,9 @@ public final class PluginXmlDomInspection extends DevKitPluginXmlInspectionBase
}
String epName = fragments.get(fragments.size() - 1);
List<String> butlast = fragments.subList(0, fragments.size() - 1);
List<String> butLast = fragments.subList(0, fragments.size() - 1);
List<String> words = StringUtil.getWordsIn(epName);
return !ContainerUtil.exists(words, w -> ContainerUtil.exists(butlast, f -> StringUtil.equalsIgnoreCase(w, f)));
return !ContainerUtil.exists(words, w -> ContainerUtil.exists(butLast, f -> StringUtil.equalsIgnoreCase(w, f)));
}
private static void annotateExtensions(Extensions extensions, DomElementAnnotationHolder holder) {
@@ -617,7 +623,6 @@ public final class PluginXmlDomInspection extends DevKitPluginXmlInspectionBase
return;
}
final IdeaPlugin ideaPlugin = extensionPoint.getParentOfType(IdeaPlugin.class, true);
assert ideaPlugin != null;
String dependencyId = ideaPlugin.getPluginId();
@@ -1,11 +1,11 @@
<idea-plugin>
<error descr="Could not locate main plugin.xml file to determine required <idea-version> 'since-build'"><applicationListeners>
<error descr="Could not locate the main plugin.xml file to determine required <idea-version> 'since-build'"><applicationListeners>
<listener class="java.util.ArrayList" topic="java.util.Collection"
activeInHeadlessMode="true" activeInTestMode="true"/>
</applicationListeners></error>
<error descr="Could not locate main plugin.xml file to determine required <idea-version> 'since-build'"><projectListeners>
<error descr="Could not locate the main plugin.xml file to determine required <idea-version> 'since-build'"><projectListeners>
<listener class="java.util.ArrayList" topic="java.util.Collection"
activeInHeadlessMode="true" activeInTestMode="true"/>
</projectListeners></error>
@@ -3,12 +3,12 @@
<vendor>JetBrains</vendor>
<version>1.0</version>
<error descr="Could not determine target platform version, please check project setup"><applicationListeners>
<error descr="Could not determine a target platform version, please check project setup"><applicationListeners>
</applicationListeners></error>
<error descr="Could not determine target platform version, please check project setup"><projectListeners>
<error descr="Could not determine a target platform version, please check project setup"><projectListeners>
</projectListeners></error>
</idea-plugin>
@@ -1,12 +1,12 @@
<idea-plugin
url="<error descr="Must be valid link to website using https:// or http:// scheme"><error descr="Value exceeds maximum length 255">0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345</error></error>">
url="<error descr="Must be a valid link to the website using https:// or http:// scheme"><error descr="Value exceeds maximum length 255">0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345</error></error>">
<id><error descr="Value exceeds maximum length 255">0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345</error></id>
<name><error descr="Value exceeds maximum length 255">0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345</error></name>
<vendor
url="<error descr="Must be valid link to website using https:// or http:// scheme"><error descr="Value exceeds maximum length 255">0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345</error></error>"
url="<error descr="Must be a valid link to the website using https:// or http:// scheme"><error descr="Value exceeds maximum length 255">0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345</error></error>"
email="<error descr="Value exceeds maximum length 255">0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345</error>"
><error descr="Value exceeds maximum length 255">0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345</error></vendor>
@@ -1,6 +1,6 @@
<idea-plugin url="<error descr="Must be valid link to website using https:// or http:// scheme">mywebsite.com</error>">
<idea-plugin url="<error descr="Must be a valid link to the website using https:// or http:// scheme">mywebsite.com</error>">
<id>test</id>
<vendor url="<error descr="Must be valid link to website using https:// or http:// scheme">mywebsite.com</error>">JetBrains</vendor>
<vendor url="<error descr="Must be a valid link to the website using https:// or http:// scheme">mywebsite.com</error>">JetBrains</vendor>
<version>1.0</version>
<<error descr="Value must not be empty">name</error>></name>
@@ -0,0 +1,6 @@
<idea-plugin <error descr="Implementation plugins are no longer supported: use either a regular plugin or implement a product module">implementation-detail="true"</error>>
<id>com.intellij.myPlugin</id>
<vendor>JetBrains</vendor>
<version>1.0</version>
</idea-plugin>
@@ -1,5 +1,5 @@
<idea-plugin package="com.intellij"
implementation-detail="false"
<error descr="Implementation plugins are no longer supported: use either a regular plugin or implement a product module">implementation-detail="false"</error>
allow-bundled-update="false"
require-restart="false"
url="https://www.jetbrains.com">
@@ -1,7 +1,7 @@
import com.intellij.openapi.components.Service;
@<error descr="Light service must be a concrete class and cannot be abstract or an interface.
The IntelliJ Platform relies on the concrete implementation class to create and manage the service instance. Without a concrete implementation, the platform would not be able to create an instance of the service, and the service would not be available for use by the plugin.
The IntelliJ Platform relies on the concrete implementation class to create and manage the service instance. Without a concrete implementation, the platform would not be able to create an instance of the service. The service would not be available for use by the plugin.
To solve this problem, you should define a concrete implementation class for the service and annotate it with '@Service'.">Service<caret></error>
abstract class MyService {
}
@@ -1,7 +1,7 @@
import com.intellij.openapi.components.Service;
@<error descr="Light service must be a concrete class and cannot be abstract or an interface.
The IntelliJ Platform relies on the concrete implementation class to create and manage the service instance. Without a concrete implementation, the platform would not be able to create an instance of the service, and the service would not be available for use by the plugin.
The IntelliJ Platform relies on the concrete implementation class to create and manage the service instance. Without a concrete implementation, the platform would not be able to create an instance of the service. The service would not be available for use by the plugin.
To solve this problem, you should define a concrete implementation class for the service and annotate it with '@Service'.">Service<caret></error>
interface MyService {
}
@@ -809,6 +809,10 @@ public class PluginXmlFunctionalTest extends JavaCodeInsightFixtureTestCase {
doHighlightingTest("redundantComponentInterfaceClass.xml");
}
public void testDeprecatedImplementationDetailAttribute() {
doHighlightingTest("deprecatedImplementationDetail.xml");
}
private void doHighlightingTest(String... filePaths) {
myFixture.testHighlighting(true, false, false, filePaths);
}
@@ -1,6 +1,6 @@
import com.intellij.openapi.components.Service
<error descr="Light service must be a concrete class and cannot be abstract or an interface.
The IntelliJ Platform relies on the concrete implementation class to create and manage the service instance. Without a concrete implementation, the platform would not be able to create an instance of the service, and the service would not be available for use by the plugin.
The IntelliJ Platform relies on the concrete implementation class to create and manage the service instance. Without a concrete implementation, the platform would not be able to create an instance of the service. The service would not be available for use by the plugin.
To solve this problem, you should define a concrete implementation class for the service and annotate it with '@Service'.">@Service<caret></error>
abstract class MyService
@@ -1,6 +1,6 @@
import com.intellij.openapi.components.Service
<error descr="Light service must be a concrete class and cannot be abstract or an interface.
The IntelliJ Platform relies on the concrete implementation class to create and manage the service instance. Without a concrete implementation, the platform would not be able to create an instance of the service, and the service would not be available for use by the plugin.
The IntelliJ Platform relies on the concrete implementation class to create and manage the service instance. Without a concrete implementation, the platform would not be able to create an instance of the service. The service would not be available for use by the plugin.
To solve this problem, you should define a concrete implementation class for the service and annotate it with '@Service'.">@Service<caret></error>
interface MyService