🤖 Pick PR #59542 (Fixing delay caused in vscode due t...) into release-5.6 by typescript-bot · Pull Request #59695 · microsoft/TypeScript
Expand Up
@@ -3,12 +3,17 @@ import {
codefix,
Debug,
fileShouldUseJavaScriptRequire,
findAncestor,
findIndex,
forEachChild,
formatting,
getNewLineOrDefaultFromHost,
getQuotePreference,
getTokenAtPosition,
isIdentifier,
Program,
rangeContainsPosition,
rangeContainsRange,
SourceFile,
Statement,
SymbolFlags,
Expand Down
Expand Up
@@ -56,17 +61,16 @@ function pasteEdits(
cancellationToken: CancellationToken,
changes: textChanges.ChangeTracker,
) {
let actualPastedText: string[] | undefined;
let actualPastedText: string | undefined;
if (pastedText.length !== pasteLocations.length) {
actualPastedText = pastedText.length === 1 ? pastedText : [pastedText.join("\n")];
actualPastedText = pastedText.length === 1 ? pastedText[0] : pastedText.join(getNewLineOrDefaultFromHost(formatContext.host, formatContext.options));
}
const statements: Statement[] = [];
let newText = targetFile.text; for (let i = pasteLocations.length - 1; i >= 0; i--) { const { pos, end } = pasteLocations[i]; newText = actualPastedText ? newText.slice(0, pos) + actualPastedText[0] + newText.slice(end) : newText.slice(0, pos) + pastedText[i] + newText.slice(end); newText = actualPastedText ? newText.slice(0, pos) + actualPastedText + newText.slice(end) : newText.slice(0, pos) + pastedText[i] + newText.slice(end); }
let importAdder: codefix.ImportAdder; Expand Down Expand Up @@ -104,12 +108,46 @@ function pasteEdits( preferences, formatContext, }; forEachChild(updatedFile, function cb(node) { if (isIdentifier(node) && !originalProgram?.getTypeChecker().resolveName(node.text, node, SymbolFlags.All, /*excludeGlobals*/ false)) { // generate imports importAdder.addImportForUnresolvedIdentifier(context, node, /*useAutoImportProvider*/ true); } node.forEachChild(cb);
// `updatedRanges` represent the new ranges that account for the offset changes caused by pasting new text and // `offset` represents by how much the starting position of `pasteLocations` needs to be changed. // // We iterate over each updated range to get the node that wholly encloses the updated range. // For each child of that node, we checked for unresolved identifiers // within the updated range and try importing it. let offset = 0; pasteLocations.forEach((location, i) => { const oldTextLength = location.end - location.pos; const textToBePasted = actualPastedText ?? pastedText[i]; const startPos = location.pos + offset; const endPos = startPos + textToBePasted.length; const range: TextRange = { pos: startPos, end: endPos }; offset += textToBePasted.length - oldTextLength;
const enclosingNode = findAncestor( getTokenAtPosition(context.sourceFile, range.pos), ancestorNode => rangeContainsRange(ancestorNode, range), ); if (!enclosingNode) return;
forEachChild(enclosingNode, function importUnresolvedIdentifiers(node) { const isImportCandidate = isIdentifier(node) && rangeContainsPosition(range, node.getStart(updatedFile)) && !updatedProgram?.getTypeChecker().resolveName( node.text, node, SymbolFlags.All, /*excludeGlobals*/ false, ); if (isImportCandidate) { return importAdder.addImportForUnresolvedIdentifier( context, node, /*useAutoImportProvider*/ true, ); } node.forEachChild(importUnresolvedIdentifiers); }); }); } importAdder.writeFixes(changes, getQuotePreference(copiedFrom ? copiedFrom.file : targetFile, preferences)); Expand All @@ -125,8 +163,7 @@ function pasteEdits( changes.replaceRangeWithText( targetFile, { pos: paste.pos, end: paste.end }, actualPastedText ? actualPastedText[0] : pastedText[i], actualPastedText ?? pastedText[i], ); }); }
const statements: Statement[] = [];
let newText = targetFile.text; for (let i = pasteLocations.length - 1; i >= 0; i--) { const { pos, end } = pasteLocations[i]; newText = actualPastedText ? newText.slice(0, pos) + actualPastedText[0] + newText.slice(end) : newText.slice(0, pos) + pastedText[i] + newText.slice(end); newText = actualPastedText ? newText.slice(0, pos) + actualPastedText + newText.slice(end) : newText.slice(0, pos) + pastedText[i] + newText.slice(end); }
let importAdder: codefix.ImportAdder; Expand Down Expand Up @@ -104,12 +108,46 @@ function pasteEdits( preferences, formatContext, }; forEachChild(updatedFile, function cb(node) { if (isIdentifier(node) && !originalProgram?.getTypeChecker().resolveName(node.text, node, SymbolFlags.All, /*excludeGlobals*/ false)) { // generate imports importAdder.addImportForUnresolvedIdentifier(context, node, /*useAutoImportProvider*/ true); } node.forEachChild(cb);
// `updatedRanges` represent the new ranges that account for the offset changes caused by pasting new text and // `offset` represents by how much the starting position of `pasteLocations` needs to be changed. // // We iterate over each updated range to get the node that wholly encloses the updated range. // For each child of that node, we checked for unresolved identifiers // within the updated range and try importing it. let offset = 0; pasteLocations.forEach((location, i) => { const oldTextLength = location.end - location.pos; const textToBePasted = actualPastedText ?? pastedText[i]; const startPos = location.pos + offset; const endPos = startPos + textToBePasted.length; const range: TextRange = { pos: startPos, end: endPos }; offset += textToBePasted.length - oldTextLength;
const enclosingNode = findAncestor( getTokenAtPosition(context.sourceFile, range.pos), ancestorNode => rangeContainsRange(ancestorNode, range), ); if (!enclosingNode) return;
forEachChild(enclosingNode, function importUnresolvedIdentifiers(node) { const isImportCandidate = isIdentifier(node) && rangeContainsPosition(range, node.getStart(updatedFile)) && !updatedProgram?.getTypeChecker().resolveName( node.text, node, SymbolFlags.All, /*excludeGlobals*/ false, ); if (isImportCandidate) { return importAdder.addImportForUnresolvedIdentifier( context, node, /*useAutoImportProvider*/ true, ); } node.forEachChild(importUnresolvedIdentifiers); }); }); } importAdder.writeFixes(changes, getQuotePreference(copiedFrom ? copiedFrom.file : targetFile, preferences)); Expand All @@ -125,8 +163,7 @@ function pasteEdits( changes.replaceRangeWithText( targetFile, { pos: paste.pos, end: paste.end }, actualPastedText ? actualPastedText[0] : pastedText[i], actualPastedText ?? pastedText[i], ); }); }