Skip to content

Commit e710645

Browse files
author
Andy
authored
Never escape string literals from textChanges (#26971)
* Never escape string literals from textChanges * Use `boolean | undefined`
1 parent a57467a commit e710645

File tree

5 files changed

+13
-12
lines changed

5 files changed

+13
-12
lines changed

src/compiler/emitter.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,7 +1041,7 @@ namespace ts {
10411041
// SyntaxKind.TemplateMiddle
10421042
// SyntaxKind.TemplateTail
10431043
function emitLiteral(node: LiteralLikeNode) {
1044-
const text = getLiteralTextOfNode(node);
1044+
const text = getLiteralTextOfNode(node, printerOptions.neverAsciiEscape);
10451045
if ((printerOptions.sourceMap || printerOptions.inlineSourceMap)
10461046
&& (node.kind === SyntaxKind.StringLiteral || isTemplateLiteralKind(node.kind))) {
10471047
writeLiteral(text);
@@ -1532,7 +1532,7 @@ namespace ts {
15321532
expression = skipPartiallyEmittedExpressions(expression);
15331533
if (isNumericLiteral(expression)) {
15341534
// check if numeric literal is a decimal literal that was originally written with a dot
1535-
const text = getLiteralTextOfNode(<LiteralExpression>expression);
1535+
const text = getLiteralTextOfNode(<LiteralExpression>expression, /*neverAsciiEscape*/ true);
15361536
return !expression.numericLiteralFlags
15371537
&& !stringContains(text, tokenToString(SyntaxKind.DotToken)!);
15381538
}
@@ -3306,20 +3306,20 @@ namespace ts {
33063306
return getSourceTextOfNodeFromSourceFile(currentSourceFile, node, includeTrivia);
33073307
}
33083308

3309-
function getLiteralTextOfNode(node: LiteralLikeNode): string {
3309+
function getLiteralTextOfNode(node: LiteralLikeNode, neverAsciiEscape: boolean | undefined): string {
33103310
if (node.kind === SyntaxKind.StringLiteral && (<StringLiteral>node).textSourceNode) {
33113311
const textSourceNode = (<StringLiteral>node).textSourceNode!;
33123312
if (isIdentifier(textSourceNode)) {
3313-
return getEmitFlags(node) & EmitFlags.NoAsciiEscaping ?
3313+
return neverAsciiEscape || (getEmitFlags(node) & EmitFlags.NoAsciiEscaping) ?
33143314
`"${escapeString(getTextOfNode(textSourceNode))}"` :
33153315
`"${escapeNonAsciiString(getTextOfNode(textSourceNode))}"`;
33163316
}
33173317
else {
3318-
return getLiteralTextOfNode(textSourceNode);
3318+
return getLiteralTextOfNode(textSourceNode, neverAsciiEscape);
33193319
}
33203320
}
33213321

3322-
return getLiteralText(node, currentSourceFile);
3322+
return getLiteralText(node, currentSourceFile, neverAsciiEscape);
33233323
}
33243324

33253325
/**

src/compiler/types.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4967,7 +4967,7 @@ namespace ts {
49674967
/* @internal */
49684968
export interface EmitNode {
49694969
annotatedNodes?: Node[]; // Tracks Parse-tree nodes with EmitNodes for eventual cleanup.
4970-
flags: EmitFlags; // Flags that customize emit
4970+
flags: EmitFlags; // Flags that customize emit
49714971
leadingComments?: SynthesizedComment[]; // Synthesized leading comments
49724972
trailingComments?: SynthesizedComment[]; // Synthesized trailing comments
49734973
commentRange?: TextRange; // The text range to use when emitting leading or trailing comments
@@ -5327,6 +5327,7 @@ namespace ts {
53275327
/*@internal*/ inlineSourceMap?: boolean;
53285328
/*@internal*/ extendedDiagnostics?: boolean;
53295329
/*@internal*/ onlyPrintJsDocStyle?: boolean;
5330+
/*@internal*/ neverAsciiEscape?: boolean;
53305331
}
53315332

53325333
/* @internal */

src/compiler/utilities.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -524,14 +524,14 @@ namespace ts {
524524
return emitNode && emitNode.flags || 0;
525525
}
526526

527-
export function getLiteralText(node: LiteralLikeNode, sourceFile: SourceFile) {
527+
export function getLiteralText(node: LiteralLikeNode, sourceFile: SourceFile, neverAsciiEscape: boolean | undefined) {
528528
// If we don't need to downlevel and we can reach the original source text using
529529
// the node's parent reference, then simply get the text as it was originally written.
530530
if (!nodeIsSynthesized(node) && node.parent && !(isNumericLiteral(node) && node.numericLiteralFlags & TokenFlags.ContainsSeparator)) {
531531
return getSourceTextOfNodeFromSourceFile(sourceFile, node);
532532
}
533533

534-
const escapeText = getEmitFlags(node) & EmitFlags.NoAsciiEscaping ? escapeString : escapeNonAsciiString;
534+
const escapeText = neverAsciiEscape || (getEmitFlags(node) & EmitFlags.NoAsciiEscaping) ? escapeString : escapeNonAsciiString;
535535

536536
// If we can't reach the original source text, use the canonical form if it's a number,
537537
// or a (possibly escaped) quoted form of the original text if it's string-like.

src/services/textChanges.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -781,7 +781,7 @@ namespace ts.textChanges {
781781
function getNonformattedText(node: Node, sourceFile: SourceFile | undefined, newLineCharacter: string): { text: string, node: Node } {
782782
const writer = new Writer(newLineCharacter);
783783
const newLine = newLineCharacter === "\n" ? NewLineKind.LineFeed : NewLineKind.CarriageReturnLineFeed;
784-
createPrinter({ newLine }, writer).writeNode(EmitHint.Unspecified, node, sourceFile, writer);
784+
createPrinter({ newLine, neverAsciiEscape: true }, writer).writeNode(EmitHint.Unspecified, node, sourceFile, writer);
785785
return { text: writer.getText(), node: assignPositionsToNode(node) };
786786
}
787787
}

tests/cases/fourslash/importNameCodeFixNewImportFile0.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
//// [|f1/*0*/();|]
44

5-
// @Filename: module.ts
5+
// @Filename: jalapeño.ts
66
//// export function f1() {}
77
//// export var v1 = 5;
88

99
verify.importFixAtPosition([
10-
`import { f1 } from "./module";
10+
`import { f1 } from "./jalapeño";
1111
1212
f1();`
1313
]);

0 commit comments

Comments
 (0)