## Problem VS Code (and Visual Studio) have the concept of commit characters for suggestions. This is a set of characters that, when typed, accept the current suggestion. For example, a suggestion for a function may treat `(` as a commit character. VS Code currently computes these commit characters itself using the metadata that typescript returns for each completion entry. This has two problems: - This logic is VS Code specific and may be out of sync with how VS and other editors handle commit characters. - There are some cases where it is difficult to determine what the commit characters should be. A classic example is: ```js const a = { b: 1, .| } ``` Where the user has just typed `.`. Currently we show a suggestion for `b` when the user types the `.`. If the user then types another `.` as part of a spread, we incorrectly end up accepting that completion, which leaves the code as: ```js const a = { b: 1, .b. } ``` TypeScript, with its access to the ast, should be able to determine that `.` should not be a commit character in this case ## Proposal Introduce the concept of a commit characters to the TypeScript server aAPI. This would be an optional set of characters returned on each `CompletionEntry`: ```ts interface CompletionEntry { ... commitCharacters?: ReadonlyArray<string>; } ``` Return these commit characters on completions. Here's an approximation of how VS Code computes commit characters: * `.` and `;` are commit characters for most completion types except for keywords and a few others. * Additionally, `(` and `,` are commit characters for variables. * There are no commit characters if `isNewIdentifierLocation` is set.