Index: pkg/analyzer_plugin/doc/tutorial/introduction.md |
diff --git a/pkg/analyzer_plugin/doc/tutorial/introduction.md b/pkg/analyzer_plugin/doc/tutorial/introduction.md |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f6b57fcc2983f53810407c11ece281c1b097f346 |
--- /dev/null |
+++ b/pkg/analyzer_plugin/doc/tutorial/introduction.md |
@@ -0,0 +1,218 @@ |
+# Introduction |
+ |
+The purpose of this page is to give you an overview of what an analyzer plugin |
+is and what it can do. |
+ |
+## What is a plugin? |
+ |
+An analyzer plugin is a piece of code that communicates with the analysis server |
+to provide additional analysis support. The additional support is often specific |
+to a package or set of packages. For example, there is a plugin that provides |
+analysis specific to the Angular framework. Plugins are not required to be |
+specific to a package, but if the additional analysis is general enough, we |
+would urge you to consider contributing it back to the Dart project so that |
+everyone can more easily benefit from your work. |
+ |
+Plugins are written in Dart. They are executed by the analysis server by running |
+them in the same VM as the analysis server but each plugin is run in a separate |
devoncarew
2017/08/01 22:19:16
analysis server, but
Brian Wilkerson
2017/08/02 14:45:16
Done
|
+isolate. The analysis server communicates with the plugins using a wire protocol |
+that is specified in the [plugin API][pluginapi] document. This API is similar |
+to the API used by the analysis server to communicate with clients. |
+ |
+The API consists of three kinds of communication. When the analysis server needs |
+information from the plugin, or needs to pass information to the plugin, it |
+sends a *request*. The plugin is required to answer every request with a |
+*response*. If the request was a request for information, then the response will |
+contain the requested information. Otherwise, the response is merely an |
+acknowledgement that the request was received. In addition, the plugin can send |
+a *notification* to the server to provide information to the server. |
+ |
+## What can plugins do? |
+ |
+The scope of what a plugin can do is defined by the [plugin API][pluginapi], but |
+it's useful to start with a high level overview. |
+ |
+### Lifecycle management |
+ |
+The API includes support for managing the lifecycle of a plugin. There is no |
+guarantee about when plugins will be started or stopped relative to either the |
+server or to each other. |
+ |
+When a plugin is first started, the analysis server will send a |
+`plugin.versionCheck` request to the plugin to verify that the plugin is using |
+the same version of the API as the server and therefore can communicate with the |
+server. This exchange also serves to communicate some other information between |
+the two participants. |
+ |
+When the server is asked to shut down, it will send a `plugin.shutdown` request |
+to the plugin to shut it down. This gives the plugin an opportunity to release |
+system resources or perform any other necessary actions. If a plugin encounters |
+an error that causes it to need to shut down, it should send a `plugin.error` |
+notification to the server to indicate that it is doing so. |
+ |
+### Managing analysis |
+ |
+The API includes support for managing which files are analyzed. There is no |
+requirement for when a plugin should perform the analysis, but to optimize the |
+user experience plugins should provide information to the server as quickly as |
+possible. |
+ |
+The analysis server sends an `analysis.setContextRoots` request to plugins to |
+tell them which files to analyze. Each `ContextRoot` indicates the root |
+directory containing the files to be analyzed (included) and any files and |
+directories within the root that should *not* be analyzed (excluded). Plugins |
+can read and use excluded files in the process of analyzing included files, but |
+should not report results for excluded files. |
+ |
+In order to improve the user experience, the analysis server will send an |
+`analysis.setPriorityFiles` request to specify which files should take priority |
+over other files. These are typically the files that are open and visible in the |
+client. |
+ |
+The analysis server will send an `analysis.handleWatchEvents` request to the |
+plugin when one or more files (within a context root) have been modified. The |
+plugin is expected to re-analyze those files in order to update the results for |
+those files. |
+ |
+The analysis server will send an `analysis.updateContent` request when the user |
+has edited a file but the edited content has not yet been written to disk. This |
+allows the plugin to provide analysis results as the user is typing. |
+ |
+### Requesting Analysis Results |
+ |
+In order to accommodate the workflow of clients, there are two ways for the |
+server to request analysis results from a plugin. |
+ |
+First, the server can send a request to request specific results for a specific |
+file. This is typically used for client-side functionality that the user has to |
+explicitly request and that clients will not retain long term. For example, |
+there is a request to get code completion suggestions. These requests are |
+discussed below. |
+ |
+For functionality that is always available, or for results that can change |
+without the client being aware that new data should be requested, there is a |
+subscription model. The server will send an `analysis.setSubscriptions` request |
+to the plugin. This request tells the plugin which results should be sent to the |
+server when the results become available. The plugin does not send any results |
+in the response to the request, but instead is expected to send a notification |
+to the server when the results have been computed. The notifications that can be |
+requested are also discussed below. |
+ |
+If the server has explicitly requested results, either by a request or by a |
+subscription, the plugin should provide those results even if the file is an |
+excluded file. This exception to the general rule does *not* apply to the |
+implicit subscription for diagnostics. |
+ |
+Plugins should *not* send analysis results that duplicate the information |
+computed by the analysis server itself. The expectation is for plugins to |
+extend this information, not replicate it. |
+ |
+### Diagnostics |
+ |
+Plugins can generate diagnostics to make users aware of problems in the code |
+that they have written. Diagnostics are typically displayed in the editor region |
+and might also be displayed in a separate diagnostics view or as decorations on |
+a directory structure view. |
+ |
+Plugins are expected to send any diagnostics that they generate for any of the |
+analyzed files (files that are included in a context root and not excluded). |
+Essentially, there is an implicit subscription for errors for all (non-excluded) |
+files. The plugin should send the errors in an `analysis.errors` notification. |
+ |
+### Semantic highlighting |
+ |
+Highlight information is used to color the content of the editor view. |
+ |
+If the server has subscribed for highlighting information in some set of files, |
+then the plugin should send the information in an `analysis.highlights` |
+notification whenever the information needs to be updated. |
+ |
+### Navigation |
+ |
+Navigation information is used by clients to allow users to navigate to the |
+location at which an identifier is defined. |
+ |
+Navigation information can be requested both by an `analysis.getNavigation` |
+request and by a subscription. If the server has subscribed for navigation |
+information in some set of files, the the plugin should send the information in |
+an `analysis.navigation` notification whenever the information needs to be |
+updated. |
+ |
+There is a tutorial explaining how to implement [navigation][navigation]. |
+ |
+### Mark occurrences |
+ |
+Occurrences information is used by clients to highlight (or mark) all uses |
+within a given file of a single identifier when the user selects one use of that |
+identifier. |
+ |
+If the server has subscribed for occurrences information in some set of files, |
+then the plugin should send the information in an `analysis.occurrences` |
+notification whenever the information needs to be updated. |
+ |
+### Outline |
+ |
+Outline information is typically used by clients to provide a tree indicating |
+the nesting structure of declarations within the code. |
+ |
+If the server has subscribed for outline information in some set of files, then |
+the plugin should send the information in an `analysis.outline` notification |
+whenever the information needs to be updated. |
+ |
+### Folding |
+ |
+Folding information is used to allow users to collapse regions of text. |
+ |
+If the server has subscribed for folding information in some set of files, then |
+the plugin should send the information in an `analysis.folding` notification |
+whenever the information needs to be updated. |
+ |
+### Code completion |
+ |
+Code completion suggestions are used to provide possible completions at some |
+point in the text. |
+ |
+When the client request completion suggestions, the server will send a |
+`completion.getSuggestions` request. The plugin should only send suggestions |
+that would not also be returned by the server. |
+ |
+There is a tutorial explaining how to implement [code completion][completion]. |
+ |
+### Fixes and assists |
+ |
+Fixes and assists are a set of edits that users can choose to have applied to |
+the code. They differ from a refactoring in that they cannot request additional |
+information from the user. For example, a rename refactoring needs to know the |
+new name, which requires prompting the user, and hence could not be implemented |
+as either a fix or an assist. |
+ |
+Fixes are associated with specific diagnostics, and hence should only be |
+generated if the diagnostics with which they are associated have been generated. |
+For example, if a diagnostic has been produced to indicate that a required |
+semicolon is missing, a fix might be generated to insert a semicolon. |
+ |
+The analysis server will request fixes by sending an `edit.getFixes` request. |
+ |
+Plugins should provide fixes for as many of the diagnostics they generate as |
+possible, but only when those fixes provide value to the user. (For example, a |
+fix to insert a semicolon is arguably harder to use than simply typing the |
+semicolon would be, and therefore is of questionable value.) |
+ |
+There is a tutorial explaining how to implement [fixes][fixes]. |
+ |
+Assists are generally context-specific and hence should only be generated if the |
+cursor is in the right context. For example, if there is an assist to convert an |
+expression-style function body (one introduced by `=>`) into a block-style |
+function body, it should only be generated if the cursor is within an |
+expression-style function body. |
+ |
+The analysis server will request assists by sending an `edit.getAssists` |
+request. |
+ |
+There is a tutorial explaining how to implement [assists][assists]. |
+ |
+[assists]: assists.md |
+[completion]: completion.md |
+[fixes]: fixes.md |
+[navigation]: navigation.md |
+[pluginapi]: https://htmlpreview.github.io/?https://github.com/dart-lang/sdk/blob/master/pkg/analyzer_plugin/doc/api.html |