Skip to content

TS Server API proposal: Commit Characters #27623

Closed
@mjbvz

Description

@mjbvz

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:

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:

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:

 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.

Metadata

Metadata

Assignees

Labels

CommittedThe team has roadmapped this issueDomain: TSServerIssues related to the TSServerFix AvailableA PR has been opened for this issueIn DiscussionNot yet reached consensusRescheduledThis issue was previously scheduled to an earlier milestoneSuggestionAn idea for TypeScript

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions