mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-06-15 22:15:05 -05:00
Improve inlining of string variables in template literals (#54849)
This commit is contained in:
@@ -24,6 +24,9 @@ import {
|
||||
isObjectLiteralExpression,
|
||||
isPropertyAccessExpression,
|
||||
isShorthandPropertyAssignment,
|
||||
isStringLiteral,
|
||||
isTaggedTemplateExpression,
|
||||
isTemplateSpan,
|
||||
isTypeQueryNode,
|
||||
isVariableDeclarationInVariableStatement,
|
||||
isVariableStatement,
|
||||
@@ -33,11 +36,14 @@ import {
|
||||
refactor,
|
||||
some,
|
||||
SourceFile,
|
||||
StringLiteral,
|
||||
SymbolFlags,
|
||||
TemplateSpan,
|
||||
textChanges,
|
||||
textRangeContainsPositionInclusive,
|
||||
TypeChecker,
|
||||
VariableDeclaration,
|
||||
walkUpParenthesizedExpressions,
|
||||
} from "../_namespaces/ts.js";
|
||||
import {
|
||||
RefactorErrorInfo,
|
||||
@@ -115,7 +121,13 @@ registerRefactor(refactorName, {
|
||||
const { references, declaration, replacement } = info;
|
||||
const edits = textChanges.ChangeTracker.with(context, tracker => {
|
||||
for (const node of references) {
|
||||
tracker.replaceNode(file, node, getReplacementExpression(node, replacement));
|
||||
const closestStringIdentifierParent = isStringLiteral(replacement) && isIdentifier(node) && walkUpParenthesizedExpressions(node.parent);
|
||||
if (closestStringIdentifierParent && isTemplateSpan(closestStringIdentifierParent) && !isTaggedTemplateExpression(closestStringIdentifierParent.parent.parent)) {
|
||||
replaceTemplateStringVariableWithLiteral(tracker, file, closestStringIdentifierParent, replacement);
|
||||
}
|
||||
else {
|
||||
tracker.replaceNode(file, node, getReplacementExpression(node, replacement));
|
||||
}
|
||||
}
|
||||
tracker.delete(file, declaration);
|
||||
});
|
||||
@@ -255,3 +267,17 @@ function getReplacementExpression(reference: Node, replacement: Expression) {
|
||||
|
||||
return replacement;
|
||||
}
|
||||
|
||||
function replaceTemplateStringVariableWithLiteral(tracker: textChanges.ChangeTracker, sourceFile: SourceFile, reference: TemplateSpan, replacement: StringLiteral) {
|
||||
const templateExpression = reference.parent;
|
||||
const index = templateExpression.templateSpans.indexOf(reference);
|
||||
const prevNode = index === 0 ? templateExpression.head : templateExpression.templateSpans[index - 1];
|
||||
tracker.replaceRangeWithText(
|
||||
sourceFile,
|
||||
{
|
||||
pos: prevNode.getEnd() - 2,
|
||||
end: reference.literal.getStart() + 1,
|
||||
},
|
||||
replacement.text.replace(/\\/g, "\\\\").replace(/`/g, "\\`"),
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user