Chromium Code Reviews| Index: pkg/analysis_server/lib/src/services/completion/statement/design_notes.md |
| diff --git a/pkg/analysis_server/lib/src/services/completion/statement/design_notes.md b/pkg/analysis_server/lib/src/services/completion/statement/design_notes.md |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..cebc2414663f3736322dae766d62a9587019e0d9 |
| --- /dev/null |
| +++ b/pkg/analysis_server/lib/src/services/completion/statement/design_notes.md |
| @@ -0,0 +1,144 @@ |
| +# Statement Completion |
| + |
| +### Mission Statement |
| + |
| +The purpose of this feature is to add required syntax to the current |
| +statement. The goal is to make the statement syntactically complete. |
| +That is not possible to do in all cases. A best-effort attempt is made |
| +when it cannot be done. |
| + |
| +### Current Statement |
| + |
| +The term _statement completion_ comes from IntelliJ. It is also called |
| +_smart enter_ there, which is a more general term. See the IntelliJ |
| +[documentatopn.](https://www.jetbrains.com/help/idea/2017.1/auto-completing-code.html#statements_completion) |
|
devoncarew
2017/05/09 13:15:06
sp
messick
2017/05/09 13:26:03
Done.
|
| + |
| +Rather than restricting the functionality to statements, in the sense of the grammar construct |
| +called _statement_, it is best to think of code constructs. Statement completion |
| +can be used to add syntax to declarations, statements, and some expressions. |
| +Generally, the syntax additions are punctuation marks, such as semicolons, |
| +parentheses, and braces. |
| + |
| +The _current statement_ then, is the code construct being written in the |
| +editor, as identified by the position of the editing cursor. The _cursor_ is the |
| +primary editing cursor of the active editor in IntelliJ. We ignore multiple |
| +secondary cursors. |
| + |
| +If the _current statement_ is already syntactically complete then the feature |
| +just adds a newline. This will be the case when the cursor follows the closing |
| +brace of the body of a for-statement or while-statement, for example. The model |
| +used is that the user is creating code going forward, and when the |
| +_smart enter_ keystroke is typed the user expects to see forward progress. |
| +The cursor should end up at the most likely place to continue editing, regardless |
| +of what errors may exist in previous code. It is as if the user said "I'm done |
| +with this line. Finish it up and move me to the next line." |
| + |
| +## Code Constructs |
| + |
| +There are a number of cases where a matching right parenthesis could be added |
| +if it is missing. This feature has not been considered a priority since the |
| +editor by default adds parenthesis in pairs. |
| + |
| +Generics are not currently handled. |
| + |
| +#### Declarations |
| + |
| +There is limited work to be done. |
| + |
| +- [x] Functions, methods, and classes can have a pair of braces added if they do not already have a body defined. |
| +- [x] Functions and methods can have a closing parenthesis added to the parameter list. |
| +- [x] Variables can have a semicolon added to terminate them. |
| + |
| +#### Expressions |
| + |
| +Also limited. |
| + |
| +- [x] Unterminated strings can have appropriate string |
| +terminators added. |
| +- [x] Lists that have not been properly terminated can |
| +have closing brackets added (potentially with trailing commas). |
| +- [x] Maps are not currently handled. The parser error recovery |
| +gets confused by braces of code blocks too easily. |
| + |
| +#### Statements |
| + |
| +With actual statements, there are many more possibilities. |
| +Statements that start with a keyword must have at least the |
| +keyword in the partial statement in order for completion to |
| +happen. |
| + |
| +###### Do Statement |
| + |
| +This is one of the few cases where an actual word may be included. |
| +If the `while` keyword is missing it will be added. |
| +As long as the `do` keyword is present the braces for the body |
| +will be added. If the `while` keyword is present or can be added |
| +then the parentheses for the condition will be added, too. Finally, |
| +the terminating semicolon will be added. |
| + |
| +###### For Statement |
| + |
| +The parser cannot distinguish a for-statement from a for-each unless |
| +either at least one semicolon or the `in` keyword is present in the |
| +control parts. If neither is present then completion cannot do any |
| +more than possibly add braces for the body. |
| + |
| +Given that the statement is actually a for-statement then the control |
| +parts will be adjusted to ensure there are two semicolons. If the braces |
| +for the body are missing then they will be added. |
| + |
| +###### For-each Statement |
| + |
| +Braces for the body can be added if missing. |
| + |
| +###### If Statement |
| + |
| +The if-else-etc construct could get arbitrarily complex, so |
| +for simplicity the `else` keyword is ignored. Starting with nothing |
| +but the `if` keyword, the parentheses for the condition will be added |
| +and the braces for the body will be added. |
| + |
| +###### Switch Statement |
| + |
| +Given the `switch` keyword, parentheses for the selector will be added |
| +if absent and the braces for the body will be added. Also, for an |
| +individual case or default clause the terminating colon will be added |
| +if needed. To be clear, only the colon for the clause containing |
| +the cursor will be added. |
| + |
| +###### Try Statement |
| + |
| +If the statement is nothing more than the `try` keyword then the braces |
| +for the body will be added. No clauses (n, catch, or finally) will be added. |
| + |
| +An on-clause will be completed by adding braces for its body, if absent. |
| + |
| +A catch-clause will be completed by adding parentheses for its |
| +parameter list and braces for the body. |
| + |
| +A finally-clause will be completed by adding braces for its body. |
| + |
| +###### While Statement |
| + |
| +This is structurally identical to the if-statement and the implementation |
| +for both is shared. |
| + |
| +###### Expression Statements |
| + |
| +These include method and function invocations. |
| +- [x] Add closing parenthesis, if the expression is an invocation. |
| +- [x] Add terminating semicolon. |
| + |
| +###### Control-flow Blocks |
| + |
| +After finishing a `return` or `throw` in a block that is the |
| +body of a control-flow statement (do, for, for-each, if, while) |
| +then the cursor will be moved outside the block, ready to begin |
| +the next statement following the control-flow statement. |
| +```dart |
| + if (isFinished()) { |
| + releaseResources(); |
| + return; // invoke 'smart enter' here |
| + } |
| + // continue typing here |
| +``` |