Index: pkg/analyzer_plugin/doc/tutorial/completion.md |
diff --git a/pkg/analyzer_plugin/doc/tutorial/completion.md b/pkg/analyzer_plugin/doc/tutorial/completion.md |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6c33d13e86d652c76b161831476656b7bad33b4e |
--- /dev/null |
+++ b/pkg/analyzer_plugin/doc/tutorial/completion.md |
@@ -0,0 +1,81 @@ |
+# Providing Code Completions |
+ |
+A code completion is used by clients to provide a set of possible completions to |
+partially entered code. Completions are intended to address two use cases: to |
+help users enter code with less effort and to help users discover the behavior |
+of an object. |
+ |
+For example, if the user has typed `o.toSt` and then requested completions, one |
+suggestion might be `toString`. |
+ |
+That said, the completion suggestions that your plugin returns should include |
+all of the options that would be valid if the partial identifier did not exist. |
+The reason is that most clients are implemented such that they send a single |
+request for completions when the dialog with the user begins and cannot send any |
+subsequent requests. If the user presses the backspace key during the dialog the |
+client needs to have already received the expanded list of options that now |
+match the prefix (or all options if the prefix has completely been deleted). |
+Clients will filter the list of suggestions displayed as appropriate. |
+ |
+Hence, in the example above, plugins should return suggestions as if the user |
+had requested completions after typing `o.`; |
+ |
+## Implementation details |
+ |
+When appropriate, the analysis server will send your plugin a |
+`completion.getSuggestions` request. The request includes the `file` and |
+`offset` at which completions are being requested. |
+ |
+When a `completion.getSuggestions` request is received, the method |
+`handleCompletionGetSuggestions` will be invoked. This method is responsible for |
+returning a response that contains the available suggestions. |
+ |
+The easiest way to implement this method is by adding the classes |
+`CompletionMixin` and `DartCompletionMixin` (from |
+`package:analyzer_plugin/plugin/completion_mixin.dart`) to the list of mixins |
+for your subclass of `ServerPlugin`. This will leave you with one abstract |
+method that you need to implement: `getCompletionContributors`. That method is |
+responsible for returning a list of `CompletionContributor`s. It is the |
+completion contributors that produce the actual completion suggestions. (Most |
+plugins will only need a single completion contributor.) |
+ |
+To write a completion contributor, create a class that implements |
+`CompletionContributor`. The interface defines a single method named |
+`computeSuggestions`. The method has two arguments: a `CompletionRequest` that |
+describes the where completions are being requested and a `CompletionCollector` |
+through which suggestions are to be added. |
+ |
+## Example |
+ |
+Start by creating a class that implements `CompletionContributor`, then |
+implement the method `computeSuggestions`. Your contributor should invoke the |
+method `checkAborted`, defined on the `CompletionRequest` object, before |
+starting any slow work. This allows the computation of completion suggestions |
+to be preempted if the client no longer needs the results. |
+ |
+For example, your contributor might look something like the following: |
+ |
+```dart |
+class MyCompletionContributor implements CompletionContributor { |
+ @override |
+ Future<Null> computeSuggestions(covariant DartCompletionRequest request, |
+ CompletionCollector collector) async { |
+ // ... |
+ } |
+} |
+``` |
+ |
+Given a contributor like the one above, you can implement your plugin similar to |
+the following: |
+ |
+```dart |
+class MyPlugin extends ServerPlugin with CompletionMixin, DartCompletionMixin { |
+ // ... |
+ |
+ @override |
+ List<CompletionContributor> getCompletionContributors( |
+ covariant AnalysisDriverGeneric driver) { |
+ return <CompletionContributor>[new MyCompletionContributor()]; |
+ } |
+} |
+``` |