mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Add optionalReplacementSpan to completions response (#40347)
* Add optionalReplacementRange to completions response * Get the name right * Fix unit tests * Fix comment typo * Fix comment typo * Baseline
This commit is contained in:
@@ -209,6 +209,11 @@ namespace ts.Completions {
|
||||
return { isGlobalCompletion: false, isMemberCompletion: false, isNewIdentifierLocation: false, entries };
|
||||
}
|
||||
|
||||
function getOptionalReplacementSpan(location: Node | undefined) {
|
||||
// StringLiteralLike locations are handled separately in stringCompletions.ts
|
||||
return location?.kind === SyntaxKind.Identifier ? createTextSpanFromNode(location) : undefined;
|
||||
}
|
||||
|
||||
function completionInfoFromData(sourceFile: SourceFile, typeChecker: TypeChecker, compilerOptions: CompilerOptions, log: Log, completionData: CompletionData, preferences: UserPreferences): CompletionInfo | undefined {
|
||||
const {
|
||||
symbols,
|
||||
@@ -241,7 +246,7 @@ namespace ts.Completions {
|
||||
kindModifiers: undefined,
|
||||
sortText: SortText.LocationPriority,
|
||||
};
|
||||
return { isGlobalCompletion: false, isMemberCompletion: true, isNewIdentifierLocation: false, entries: [entry] };
|
||||
return { isGlobalCompletion: false, isMemberCompletion: true, isNewIdentifierLocation: false, optionalReplacementSpan: getOptionalReplacementSpan(location), entries: [entry] };
|
||||
}
|
||||
|
||||
const entries: CompletionEntry[] = [];
|
||||
@@ -305,7 +310,13 @@ namespace ts.Completions {
|
||||
entries.push(createCompletionEntryForLiteral(literal, preferences));
|
||||
}
|
||||
|
||||
return { isGlobalCompletion: isInSnippetScope, isMemberCompletion: isMemberCompletionKind(completionKind), isNewIdentifierLocation, entries };
|
||||
return {
|
||||
isGlobalCompletion: isInSnippetScope,
|
||||
isMemberCompletion: isMemberCompletionKind(completionKind),
|
||||
isNewIdentifierLocation,
|
||||
optionalReplacementSpan: getOptionalReplacementSpan(location),
|
||||
entries
|
||||
};
|
||||
}
|
||||
|
||||
function isUncheckedFile(sourceFile: SourceFile, compilerOptions: CompilerOptions): boolean {
|
||||
|
||||
@@ -12,10 +12,12 @@ namespace ts.Completions.StringCompletions {
|
||||
}
|
||||
}
|
||||
|
||||
function convertStringLiteralCompletions(completion: StringLiteralCompletion | undefined, contextToken: Node, sourceFile: SourceFile, checker: TypeChecker, log: Log, preferences: UserPreferences): CompletionInfo | undefined {
|
||||
function convertStringLiteralCompletions(completion: StringLiteralCompletion | undefined, contextToken: StringLiteralLike, sourceFile: SourceFile, checker: TypeChecker, log: Log, preferences: UserPreferences): CompletionInfo | undefined {
|
||||
if (completion === undefined) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const optionalReplacementSpan = createTextSpanFromStringLiteralLikeContent(contextToken);
|
||||
switch (completion.kind) {
|
||||
case StringLiteralCompletionKind.Paths:
|
||||
return convertPathCompletions(completion.paths);
|
||||
@@ -33,7 +35,7 @@ namespace ts.Completions.StringCompletions {
|
||||
CompletionKind.String,
|
||||
preferences
|
||||
); // Target will not be used, so arbitrary
|
||||
return { isGlobalCompletion: false, isMemberCompletion: true, isNewIdentifierLocation: completion.hasIndexSignature, entries };
|
||||
return { isGlobalCompletion: false, isMemberCompletion: true, isNewIdentifierLocation: completion.hasIndexSignature, optionalReplacementSpan, entries };
|
||||
}
|
||||
case StringLiteralCompletionKind.Types: {
|
||||
const entries = completion.types.map(type => ({
|
||||
@@ -43,7 +45,7 @@ namespace ts.Completions.StringCompletions {
|
||||
sortText: "0",
|
||||
replacementSpan: getReplacementSpanForContextToken(contextToken)
|
||||
}));
|
||||
return { isGlobalCompletion: false, isMemberCompletion: false, isNewIdentifierLocation: completion.isNewIdentifier, entries };
|
||||
return { isGlobalCompletion: false, isMemberCompletion: false, isNewIdentifierLocation: completion.isNewIdentifier, optionalReplacementSpan, entries };
|
||||
}
|
||||
default:
|
||||
return Debug.assertNever(completion);
|
||||
|
||||
@@ -1087,6 +1087,12 @@ namespace ts {
|
||||
/** Not true for all global completions. This will be true if the enclosing scope matches a few syntax kinds. See `isSnippetScope`. */
|
||||
isGlobalCompletion: boolean;
|
||||
isMemberCompletion: boolean;
|
||||
/**
|
||||
* In the absence of `CompletionEntry["replacementSpan"], the editor may choose whether to use
|
||||
* this span or its default one. If `CompletionEntry["replacementSpan"]` is defined, that span
|
||||
* must be used to commit that completion entry.
|
||||
*/
|
||||
optionalReplacementSpan?: TextSpan;
|
||||
|
||||
/**
|
||||
* true when the current location also allows for a new identifier
|
||||
|
||||
Reference in New Issue
Block a user