Skip to content

Commit 08ed6cf

Browse files
committed
optimize nodesToTemplate
1 parent 6721966 commit 08ed6cf

File tree

1 file changed

+29
-33
lines changed

1 file changed

+29
-33
lines changed

src/services/refactors/convertStringOrTemplateLiteral.ts

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ namespace ts.refactor.convertStringOrTemplateLiteral {
4848
if (isParenthesizedExpression(node.parent) && isBinaryExpression(node.parent.parent)) node = node.parent.parent;
4949
const maybeBinary = getParentBinaryExpression(node);
5050

51-
const arrayOfNodes = treeToArray(maybeBinary)[0];
51+
const arrayOfNodes = transformTreeToArray(maybeBinary);
5252
const templateLiteral = nodesToTemplate(arrayOfNodes);
5353
const edits = textChanges.ChangeTracker.with(context, t => t.replaceNode(file, maybeBinary, templateLiteral));
5454
return { edits };
@@ -73,7 +73,7 @@ namespace ts.refactor.convertStringOrTemplateLiteral {
7373
}
7474
});
7575

76-
const binaryExpression = arrayToTree(nodesArray, /* binaryExpression*/ undefined);
76+
const binaryExpression = arrayToTree(nodesArray);
7777
return { edits: textChanges.ChangeTracker.with(context, t => t.replaceNode(file, templateLiteralExpression, binaryExpression)) };
7878
}
7979

@@ -91,10 +91,10 @@ namespace ts.refactor.convertStringOrTemplateLiteral {
9191
return expr;
9292
}
9393

94-
function arrayToTree(nodes: Expression[], bexpr: BinaryExpression | undefined): BinaryExpression {
95-
if (nodes.length === 0) return bexpr!;
94+
function arrayToTree(nodes: Expression[], accumulator?: BinaryExpression): BinaryExpression {
95+
if (nodes.length === 0) return accumulator!;
9696

97-
if (bexpr === undefined) {
97+
if (!accumulator) {
9898
const left = nodes[0];
9999
const right = nodes[1];
100100

@@ -103,7 +103,7 @@ namespace ts.refactor.convertStringOrTemplateLiteral {
103103
}
104104

105105
const right = nodes[0];
106-
const binary = createBinary (bexpr, SyntaxKind.PlusToken, right);
106+
const binary = createBinary(accumulator, SyntaxKind.PlusToken, right);
107107
return arrayToTree(nodes.slice(1), binary);
108108
}
109109

@@ -112,20 +112,24 @@ namespace ts.refactor.convertStringOrTemplateLiteral {
112112
return containsString && areOperatorsValid;
113113
}
114114

115-
function treeToArray(node: Node): [Node[], /* containsString */ boolean, /* areOperatorsValid */ boolean] {
115+
function transformTreeToArray(node: Node): Expression[] {
116+
return treeToArray(node)[0];
117+
}
118+
119+
function treeToArray(node: Node): [Expression[], /* containsString */ boolean, /* areOperatorsValid */ boolean] {
116120
if (isBinaryExpression(node)) {
117-
const [leftNodes, leftHasString, leftOp] = treeToArray(node.left);
118-
const [rightNodes, rightHasString, rightOp] = treeToArray(node.right);
121+
const [leftNodes, leftHasString, leftOperatorValid] = treeToArray(node.left);
122+
const [rightNodes, rightHasString, rightOperatorValid] = treeToArray(node.right);
119123

120124
if (!leftHasString && !rightHasString) return [[node], false, true];
121125

122-
const currentOp = node.operatorToken.kind === SyntaxKind.PlusToken;
123-
const isPlus = leftOp && currentOp && rightOp;
126+
const nodeOperatorValid = node.operatorToken.kind === SyntaxKind.PlusToken;
127+
const isPlus = leftOperatorValid && nodeOperatorValid && rightOperatorValid;
124128

125129
return [leftNodes.concat(rightNodes), true, isPlus];
126130
}
127131

128-
return [[node], isStringLiteral(node), true];
132+
return [[node as Expression], isStringLiteral(node), true];
129133
}
130134

131135
function createHead(nodes: Node[]): [number, TemplateHead] {
@@ -142,8 +146,8 @@ namespace ts.refactor.convertStringOrTemplateLiteral {
142146
return [begin, head];
143147
}
144148

145-
function nodesToTemplate(nodes: Node[]) {
146-
const spans: TemplateSpan[] = [];
149+
function nodesToTemplate(nodes: Expression[]) {
150+
const templateSpans: TemplateSpan[] = [];
147151
const [begin, head] = createHead(nodes);
148152

149153
if (begin === nodes.length) {
@@ -152,35 +156,27 @@ namespace ts.refactor.convertStringOrTemplateLiteral {
152156

153157
for (let i = begin; i < nodes.length; i++) {
154158
let current = nodes[i];
155-
let templatePart: TemplateMiddle | TemplateTail;
159+
let text = "";
156160

157-
if (i + 1 < nodes.length && isStringLiteral(nodes[i + 1])) {
158-
let next = nodes[i + 1] as StringLiteral;
159-
let text = next.text;
161+
while (i + 1 < nodes.length && isStringLiteral(nodes[i + 1])) {
162+
const next = nodes[i + 1] as StringLiteral;
163+
text = text + next.text;
160164
i++;
161-
162-
while (i + 1 < nodes.length && isStringLiteral(nodes[i + 1])) {
163-
next = nodes[i + 1] as StringLiteral;
164-
text = text + next.text;
165-
i++;
166-
}
167-
168-
text = escapeText(text);
169-
templatePart = i === nodes.length - 1 ? createTemplateTail(text) : createTemplateMiddle(text);
170-
}
171-
else {
172-
templatePart = i === nodes.length - 1 ? createTemplateTail("") : createTemplateMiddle("");
173165
}
174166

167+
text = escapeText(text);
168+
const templatePart = i === nodes.length - 1 ? createTemplateTail(text) : createTemplateMiddle(text);
169+
175170
if (isParenthesizedExpression(current)) current = current.expression;
176-
spans.push(createTemplateSpan(current as Expression, templatePart));
171+
templateSpans.push(createTemplateSpan(current, templatePart));
177172
}
178173

179-
return createTemplateExpression(head, spans);
174+
return createTemplateExpression(head, templateSpans);
180175
}
181176

182177
function escapeText(content: string) {
183-
return content.replace("`", "\`").replace("\${", `$\\{`);
178+
return content.replace("`", "\`")
179+
.replace("\${", `$\\{`);
184180
}
185181

186182
}

0 commit comments

Comments
 (0)