| # Writing a plugin | |
| This document describes how to write an analyzer plugin, to provide custom | |
| static analysis, or to offer custom quick fixes in an IDE. | |
| ## The pubspec file | |
| An analyzer plugin is a Dart package, so let's start with the `pubspec.yaml` file: | |
| ```yaml | |
| name: test_analyzer_plugin | |
| version: 0.0.1 | |
| environment: | |
| sdk: ^3.7.0 | |
| dependencies: | |
| analysis_server_plugin: ^0.2.2 | |
| analyzer: ^8.0.0 | |
| ``` | |
| There is nothing special about this pubspec; note that we need a dependency on | |
| the `analysis_server_plugin` package, and on the `analyzer` package, supporting | |
| at least 8.0.0. The version of the analyzer package needs to move lockstep with | |
| the Dart SDK. For Dart 3.10.0-75.1.beta, `^8.0.0` is a good version constraint. | |
| ## The main Dart file | |
| One source file is required, at `lib/main.dart`. Here is the basic layout: | |
| ```dart | |
| import 'package:analysis_server_plugin/plugin.dart'; | |
| import 'package:analysis_server_plugin/registry.dart'; | |
| final plugin = SimplePlugin(); | |
| class SimplePlugin extends Plugin { | |
| @override | |
| String get name => 'Simple plugin'; | |
| @override | |
| void register(PluginRegistry registry) { | |
| // Here we register analysis rules, quick fixes, and quick assists. | |
| } | |
| } | |
| ``` | |
| Here we have a class, `SimplePlugin`, which extends the `Plugin` class from the | |
| `analysis_server_plugin` package. This class has one method that we override: | |
| `register`. In the `register` method, we can register analysis rules, quick | |
| fixes, and quick assists (`CorrectionProducer`s). See these other guides for | |
| details: | |
| * [writing rules][] | |
| * [writing fixes][] | |
| * [writing assists][] | |
| * [testing rules][] | |
| Additionally, we provide a top-level variable in this file called `plugin`, | |
| which is an instance of our `SimplePlugin` class. When a running instance of | |
| the Dart Analysis Server needs to use this analyzer plugin, it generates some | |
| code that needs to _import_ this `lib/main.dart` file, and that references this | |
| `plugin` top-level variable. | |
| # Debugging a plugin | |
| If a plugin is not behaving as expected (for example, warnings are not | |
| appearing in the IDE), you can check the [analyzer diagnostics pages][]. If the | |
| plugin isolate has crashed, the "plugins" screen will display the crash. | |
| `print` cannot be used in plugin code to debug. Instead, writing to a log file | |
| can help in debugging plugin code. | |
| [writing rules]: https://github.com/dart-lang/sdk/blob/main/pkg/analysis_server_plugin/doc/writing_rules.md | |
| [writing fixes]: https://github.com/dart-lang/sdk/blob/main/pkg/analysis_server_plugin/doc/writing_fixes.md | |
| [writing assists]: https://github.com/dart-lang/sdk/blob/main/pkg/analysis_server_plugin/doc/writing_assists.md | |
| [testing rules]: https://github.com/dart-lang/sdk/blob/main/pkg/analysis_server_plugin/doc/testing_rules.md | |
| [analyzer diagnostics pages]: https://github.com/dart-lang/sdk/blob/main/pkg/analysis_server/doc/tutorial/instrumentation.md#open-the-analyzer-diagnostics-pages |