@@ -48,7 +48,7 @@ namespace ts.refactor.convertStringOrTemplateLiteral {
48
48
if ( isParenthesizedExpression ( node . parent ) && isBinaryExpression ( node . parent . parent ) ) node = node . parent . parent ;
49
49
const maybeBinary = getParentBinaryExpression ( node ) ;
50
50
51
- const arrayOfNodes = treeToArray ( maybeBinary ) [ 0 ] ;
51
+ const arrayOfNodes = transformTreeToArray ( maybeBinary ) ;
52
52
const templateLiteral = nodesToTemplate ( arrayOfNodes ) ;
53
53
const edits = textChanges . ChangeTracker . with ( context , t => t . replaceNode ( file , maybeBinary , templateLiteral ) ) ;
54
54
return { edits } ;
@@ -73,7 +73,7 @@ namespace ts.refactor.convertStringOrTemplateLiteral {
73
73
}
74
74
} ) ;
75
75
76
- const binaryExpression = arrayToTree ( nodesArray , /* binaryExpression*/ undefined ) ;
76
+ const binaryExpression = arrayToTree ( nodesArray ) ;
77
77
return { edits : textChanges . ChangeTracker . with ( context , t => t . replaceNode ( file , templateLiteralExpression , binaryExpression ) ) } ;
78
78
}
79
79
@@ -91,10 +91,10 @@ namespace ts.refactor.convertStringOrTemplateLiteral {
91
91
return expr ;
92
92
}
93
93
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 ! ;
96
96
97
- if ( bexpr === undefined ) {
97
+ if ( ! accumulator ) {
98
98
const left = nodes [ 0 ] ;
99
99
const right = nodes [ 1 ] ;
100
100
@@ -103,7 +103,7 @@ namespace ts.refactor.convertStringOrTemplateLiteral {
103
103
}
104
104
105
105
const right = nodes [ 0 ] ;
106
- const binary = createBinary ( bexpr , SyntaxKind . PlusToken , right ) ;
106
+ const binary = createBinary ( accumulator , SyntaxKind . PlusToken , right ) ;
107
107
return arrayToTree ( nodes . slice ( 1 ) , binary ) ;
108
108
}
109
109
@@ -112,20 +112,24 @@ namespace ts.refactor.convertStringOrTemplateLiteral {
112
112
return containsString && areOperatorsValid ;
113
113
}
114
114
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 ] {
116
120
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 ) ;
119
123
120
124
if ( ! leftHasString && ! rightHasString ) return [ [ node ] , false , true ] ;
121
125
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 ;
124
128
125
129
return [ leftNodes . concat ( rightNodes ) , true , isPlus ] ;
126
130
}
127
131
128
- return [ [ node ] , isStringLiteral ( node ) , true ] ;
132
+ return [ [ node as Expression ] , isStringLiteral ( node ) , true ] ;
129
133
}
130
134
131
135
function createHead ( nodes : Node [ ] ) : [ number , TemplateHead ] {
@@ -142,8 +146,8 @@ namespace ts.refactor.convertStringOrTemplateLiteral {
142
146
return [ begin , head ] ;
143
147
}
144
148
145
- function nodesToTemplate ( nodes : Node [ ] ) {
146
- const spans : TemplateSpan [ ] = [ ] ;
149
+ function nodesToTemplate ( nodes : Expression [ ] ) {
150
+ const templateSpans : TemplateSpan [ ] = [ ] ;
147
151
const [ begin , head ] = createHead ( nodes ) ;
148
152
149
153
if ( begin === nodes . length ) {
@@ -152,35 +156,27 @@ namespace ts.refactor.convertStringOrTemplateLiteral {
152
156
153
157
for ( let i = begin ; i < nodes . length ; i ++ ) {
154
158
let current = nodes [ i ] ;
155
- let templatePart : TemplateMiddle | TemplateTail ;
159
+ let text = "" ;
156
160
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 ;
160
164
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 ( "" ) ;
173
165
}
174
166
167
+ text = escapeText ( text ) ;
168
+ const templatePart = i === nodes . length - 1 ? createTemplateTail ( text ) : createTemplateMiddle ( text ) ;
169
+
175
170
if ( isParenthesizedExpression ( current ) ) current = current . expression ;
176
- spans . push ( createTemplateSpan ( current as Expression , templatePart ) ) ;
171
+ templateSpans . push ( createTemplateSpan ( current , templatePart ) ) ;
177
172
}
178
173
179
- return createTemplateExpression ( head , spans ) ;
174
+ return createTemplateExpression ( head , templateSpans ) ;
180
175
}
181
176
182
177
function escapeText ( content : string ) {
183
- return content . replace ( "`" , "\`" ) . replace ( "\${" , `$\\{` ) ;
178
+ return content . replace ( "`" , "\`" )
179
+ . replace ( "\${" , `$\\{` ) ;
184
180
}
185
181
186
182
}
0 commit comments