|
| 1 | +# Code completion |
| 2 | + |
| 3 | +This document describes how code completion is implemented and how to fix bugs |
| 4 | +and extend it. |
| 5 | + |
| 6 | +## Basic operation |
| 7 | + |
| 8 | +Code completion begins with the receipt of either a `completion.getSuggestions2` |
| 9 | +request (from the legacy protocol) or a `textDocument/completion` request (from |
| 10 | +LSP). When the request is received the appropriate handler is invoked. The |
| 11 | +handler will compute a list of completion suggestions and will then translate |
| 12 | +the suggestions into the form required by the protocol. |
| 13 | + |
| 14 | +Code completion is supported in `.dart` files as well as in the `pubspec.yaml`, |
| 15 | +`analysis_options.yaml`, and `fix_data.yaml` files. |
| 16 | + |
| 17 | +Dart completion suggestions are computed using the `DartCompletionManager` by |
| 18 | +invoking either the method `computeSuggestions` (for the legacy protocol) or |
| 19 | +`computeFinalizedCandidateSuggestions`. (The legacy protocol will be changed to |
| 20 | +use `computeFinalizedCandidateSuggestions` in the near future.) |
| 21 | + |
| 22 | +The completion manager computes suggestions in two "passes". |
| 23 | + |
| 24 | +- The `InScopeCompletionPass` computes suggestions for every appropriate element |
| 25 | + whose name is visible in the name scope surrounding the completion location. |
| 26 | + |
| 27 | +- The `NotImportedCompletionPass` computes suggestions for elements that are not |
| 28 | + yet visible in the name scope surrounding the completion location. This pass |
| 29 | + is skipped if there isn't time left in the `budget` or if there are already |
| 30 | + enough suggestions that the not-yet-imported elements wouldn't be sent anyway. |
| 31 | + |
| 32 | +## Maintaining and improving |
| 33 | + |
| 34 | +The easiest way to fix bugs or add support for new features is to start by |
| 35 | +writing a test in the directory `test/services/completion/dart/location`. These |
| 36 | +tests are grouped based on the location in the grammar at which completion is |
| 37 | +being requested. |
| 38 | + |
| 39 | +When you have a test that's failing, add a breakpoint to |
| 40 | +`InScopeCompletionPass.computeSuggestions`. When the debugger stops at the |
| 41 | +breakpoint, hover over `_completionNode` to see what kind of node will be |
| 42 | +visited. Add a breakpoint in the corresponding visit method and resume |
| 43 | +execution. (If the visit method if it doesn't already exist, then add it and |
| 44 | +restart the debugger). |
| 45 | + |
| 46 | +## New language features |
| 47 | + |
| 48 | +If a new language feature is being introduced that adds new syntax, then code |
| 49 | +completion support will need to be updated. If the changes are limited to |
| 50 | +updating an existing node then you should be able to use the method above to |
| 51 | +update the corresponding visit method. If the changes required the addition of |
| 52 | +some new subclasses of `AstNode`, then you'll likely need to add a new visit |
| 53 | +method for the added nodes. |
0 commit comments