[Interactive inlay hints] Get source file from parameter node (#55476)

This commit is contained in:
Maria José Solano 2023-08-23 16:40:49 -07:00 коммит произвёл GitHub
Родитель 12d9f04d33
Коммит 5fe88ea044
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
4 изменённых файлов: 68 добавлений и 15 удалений

Просмотреть файл

@ -1875,14 +1875,24 @@ export class Session<TMessage = string> implements EventSender {
return {
...hint,
position: scriptInfo.positionToLineOffset(position),
displayParts: displayParts?.map(({ text, span, file }) => ({
text,
span: span && {
start: scriptInfo.positionToLineOffset(span.start),
end: scriptInfo.positionToLineOffset(span.start + span.length),
file: file!,
},
})),
displayParts: displayParts?.map(({ text, span, file }) => {
if (span) {
Debug.assertIsDefined(file, "Target file should be defined together with its span.");
const scriptInfo = this.projectService.getScriptInfo(file)!;
return {
text,
span: {
start: scriptInfo.positionToLineOffset(span.start),
end: scriptInfo.positionToLineOffset(span.start + span.length),
file,
},
};
}
else {
return { text };
}
}),
};
});
}

Просмотреть файл

@ -62,7 +62,6 @@ import {
Signature,
skipParentheses,
some,
SourceFile,
Symbol,
SymbolFlags,
SyntaxKind,
@ -157,11 +156,11 @@ export function provideInlayHints(context: InlayHintsContext): InlayHint[] {
return isArrowFunction(node) || isFunctionExpression(node) || isFunctionDeclaration(node) || isMethodDeclaration(node) || isGetAccessorDeclaration(node);
}
function addParameterHints(text: string, parameter: Identifier, position: number, isFirstVariadicArgument: boolean, sourceFile: SourceFile | undefined) {
function addParameterHints(text: string, parameter: Identifier, position: number, isFirstVariadicArgument: boolean) {
let hintText = `${isFirstVariadicArgument ? "..." : ""}${text}`;
let displayParts: InlayHintDisplayPart[] | undefined;
if (shouldUseInteractiveInlayHints(preferences)) {
displayParts = [getNodeDisplayPart(hintText, parameter, sourceFile!), { text: ":" }];
displayParts = [getNodeDisplayPart(hintText, parameter), { text: ":" }];
hintText = "";
}
else {
@ -247,8 +246,6 @@ export function provideInlayHints(context: InlayHintsContext): InlayHint[] {
return;
}
const sourceFile = shouldUseInteractiveInlayHints(preferences) ? expr.getSourceFile() : undefined;
let signatureParamPos = 0;
for (const originalArg of args) {
const arg = skipParentheses(originalArg);
@ -287,7 +284,7 @@ export function provideInlayHints(context: InlayHintsContext): InlayHint[] {
continue;
}
addParameterHints(name, parameter, originalArg.getStart(), isFirstVariadicArgument, sourceFile);
addParameterHints(name, parameter, originalArg.getStart(), isFirstVariadicArgument);
}
}
}
@ -437,7 +434,8 @@ export function provideInlayHints(context: InlayHintsContext): InlayHint[] {
return true;
}
function getNodeDisplayPart(text: string, node: Node, sourceFile: SourceFile): InlayHintDisplayPart {
function getNodeDisplayPart(text: string, node: Node): InlayHintDisplayPart {
const sourceFile = node.getSourceFile();
return {
text,
span: createTextSpanFromNode(node, sourceFile),

Просмотреть файл

@ -0,0 +1,21 @@
helperB("hello, world!");
^
{
"text": "",
"position": 45,
"kind": "Parameter",
"whitespaceAfter": true,
"displayParts": [
{
"text": "bParam",
"span": {
"start": 61,
"length": 6
},
"file": "/tests/cases/fourslash/bbb.mts"
},
{
"text": ":"
}
]
}

Просмотреть файл

@ -0,0 +1,24 @@
/// <reference path="fourslash.ts" />
// @Target: esnext
// @module: nodenext
// @Filename: aaa.mts
////import { helperB } from "./bbb.mjs";
////helperB("hello, world!");
// @Filename: bbb.mts
////import { helperC } from "./ccc.mjs";
////export function helperB(bParam: string) {
//// helperC(bParam);
////}
// @Filename: ccc.mts
////export function helperC(cParam: string) {}
goTo.file("./aaa.mts");
verify.baselineInlayHints(undefined, {
includeInlayParameterNameHints: "all",
interactiveInlayHints: true
});