Files
openide/plugins/devkit/README.md
Yann Cébron 4ec220cca7 [devkit] add DevKitInspectionUtil.isAllowedIncludingTestSources()
GitOrigin-RevId: 79aa1d443b859c91060b005ff48b05daeb3e4353
2024-09-16 15:37:31 +00:00

68 lines
3.0 KiB
Markdown

# Plugin DevKit Implementation Notes
## Inspections
See `org.jetbrains.idea.devkit.inspections.DevKitInspectionUtil` for common utility methods.
By default, files located in _test sources_ are not checked,
use `DevKitInspectionUtil.isAllowedIncludingTestSources()` to include them.
Consider marking inspections with _safe-only_ fixes ready for _Code | Code Cleanup..._
(`com.intellij.codeInspection.CleanupLocalInspectionTool`).
Inspections should avoid running whenever they are not applicable in the current context.
Add `projectType="INTELLIJ_PLUGIN"` in `plugin.xml` registration to avoid loading inspection in non-plugin projects.
Additional contexts include:
- requires minimum platform version (`org.jetbrains.idea.devkit.util.PluginPlatformInfo`)
- requires present platform API class (only available in newer platform versions).
It is safe to assume most plugins do **not** target the latest platform.
- requires present plugin API class (e.g., checks specific to Java PSI)
- checked class is not a suitable candidate (e.g., a class without FQN cannot be registered in `plugin.xml`)
- only applicable to IDEA project (`com.intellij.openapi.project.IntelliJProjectUtil.isIntelliJPlatformProject()`)
### Code: JVM Languages
Use `org.jetbrains.idea.devkit.inspections.DevKitUastInspectionBase` or `org.jetbrains.idea.devkit.inspections.DevKitJvmInspection`.
See their docs for important considerations.
Implement and register in `intellij.devkit.core` module.
See [Testing Code: JVM Languages](#testing-code-jvm-languages).
### Code: Kotlin Only
Use regular `LocalInspectionTool` with immediate `DevKitInspectionUtil.isAllowed(holder.file)` check to skip running in non-plugin context.
Implement and register in `intellij.kotlin.devkit` module.
### Plugin Descriptor
Extend `org.jetbrains.idea.devkit.inspections.DevKitPluginXmlInspectionBase` and override `checkDomElement()` to check specific DOM
elements.
See [Testing: Plugin Descriptor](#testing-plugin-descriptor)
## Tests
Use _light_ tests only ideally.
See existing base classes like `org.jetbrains.idea.devkit.inspections.PluginModuleTestCase`
or `org.jetbrains.idea.devkit.inspections.quickfix.LightDevKitInspectionFixTestBase`.
Add required classes in the test as "mock" containing the minimum set of required signatures.
Same for declaring platform extension points, declare them as "fake" directly in the testdata `plugin.xml`.
### Testing Code: JVM Languages
Always write explicit tests for both Java and Kotlin sources.
Tests and test data go to `intellij.devkit.java.tests` and `intellij.devkit.kotlin.tests`, respectively.
Related `plugin.xml` can be put on same level as code test data files.
Test data path constants: `org.jetbrains.idea.devkit.DevkitJavaTestsUtil` & `org.jetbrains.idea.devkit.kotlin.DevkitKtTestsUtil`.
Kotlin test data: add `@file:Suppress("MISSING_DEPENDENCY_SUPERCLASS")` to mute errors from missing Mock SDK classes.
### Testing: Plugin Descriptor
Extend from `org.jetbrains.idea.devkit.inspections.PluginXmlDomInspectionTestBase`.