Skip to content

Commit af498eb

Browse files
committed
Clean up synthetic binding name creation and discriminating
1 parent e7fb18e commit af498eb

File tree

1 file changed

+24
-14
lines changed

1 file changed

+24
-14
lines changed

src/services/codefixes/convertToAsyncFunction.ts

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,22 @@ namespace ts.codefix {
1414
getAllCodeActions: context => codeFixAll(context, errorCodes, (changes, err) => convertToAsyncFunction(changes, err.file, err.start, context.program.getTypeChecker(), context)),
1515
});
1616

17+
const enum SynthBindingNameKind {
18+
Identifier,
19+
BindingPattern,
20+
}
21+
1722
type SynthBindingName = SynthBindingPattern | SynthIdentifier;
1823

1924
interface SynthBindingPattern {
25+
readonly kind: SynthBindingNameKind.BindingPattern;
2026
readonly elements: ReadonlyArray<SynthBindingName>;
2127
readonly bindingPattern: BindingPattern;
2228
readonly types: Type[];
2329
}
2430

2531
interface SynthIdentifier {
32+
readonly kind: SynthBindingNameKind.Identifier;
2633
readonly identifier: Identifier;
2734
readonly types: Type[];
2835
numberOfAssignmentsOriginal: number; // number of times the variable should be assigned in the refactor
@@ -212,7 +219,7 @@ namespace ts.codefix {
212219
else {
213220
const identifier = getSynthesizedDeepClone(node);
214221
identsToRenameMap.set(symbolIdString, identifier);
215-
synthNamesMap.set(symbolIdString, { identifier, types: [], numberOfAssignmentsOriginal: allVarNames.filter(elem => elem.identifier.text === node.text).length/*, numberOfAssignmentsSynthesized: 0*/ });
222+
synthNamesMap.set(symbolIdString, createSynthIdentifier(identifier, [], allVarNames.filter(elem => elem.identifier.text === node.text).length/*, numberOfAssignmentsSynthesized: 0*/));
216223
if ((isParameter(node.parent) && isExpressionOrCallOnTypePromise(node.parent.parent)) || isVariableDeclaration(node.parent)) {
217224
allVarNames.push({ identifier, symbol });
218225
addNameToFrequencyMap(collidingSymbolMap, originalName, symbol);
@@ -269,7 +276,7 @@ namespace ts.codefix {
269276
const numVarsSameName = (originalNames.get(name.text) || emptyArray).length;
270277
const numberOfAssignmentsOriginal = 0;
271278
const identifier = numVarsSameName === 0 ? name : createIdentifier(name.text + "_" + numVarsSameName);
272-
return { identifier, types: [], numberOfAssignmentsOriginal };
279+
return createSynthIdentifier(identifier, [], numberOfAssignmentsOriginal);
273280
}
274281

275282
// dispatch function to recursively build the refactoring
@@ -321,11 +328,7 @@ namespace ts.codefix {
321328
});
322329
}
323330
else {
324-
possibleNameForVarDecl = createUniqueSynthName({
325-
identifier: createOptimisticUniqueName("result"),
326-
types: prevArgName.types,
327-
numberOfAssignmentsOriginal: 0
328-
});
331+
possibleNameForVarDecl = createSynthIdentifier(createOptimisticUniqueName("result"), prevArgName.types);
329332
}
330333

331334
possibleNameForVarDecl.numberOfAssignmentsOriginal = 2; // Try block and catch block
@@ -372,8 +375,7 @@ namespace ts.codefix {
372375

373376
function createUniqueSynthName(prevArgName: SynthIdentifier): SynthIdentifier {
374377
const renamedPrevArg = createOptimisticUniqueName(prevArgName.identifier.text);
375-
const newSynthName = { identifier: renamedPrevArg, types: [], numberOfAssignmentsOriginal: 0 };
376-
return newSynthName;
378+
return createSynthIdentifier(renamedPrevArg);
377379
}
378380

379381
function transformThen(node: CallExpression, transformer: Transformer, outermostParent: CallExpression, prevArgName?: SynthBindingName): ReadonlyArray<Statement> {
@@ -618,19 +620,19 @@ namespace ts.codefix {
618620
return [getMappedBindingNameOrDefault(element.name)];
619621
});
620622

621-
return { elements, bindingPattern: bindingName, types: [] };
623+
return createSynthBindingPattern(bindingName, elements);
622624
}
623625

624626
function getMapEntryOrDefault(identifier: Identifier): SynthIdentifier {
625627
const originalNode = getOriginalNode(identifier);
626628
const symbol = getSymbol(originalNode);
627629

628630
if (!symbol) {
629-
return { identifier, types, numberOfAssignmentsOriginal };
631+
return createSynthIdentifier(identifier, types, numberOfAssignmentsOriginal);
630632
}
631633

632634
const mapEntry = transformer.synthNamesMap.get(getSymbolId(symbol).toString());
633-
return mapEntry || { identifier, types, numberOfAssignmentsOriginal };
635+
return mapEntry || createSynthIdentifier(identifier, types, numberOfAssignmentsOriginal);
634636
}
635637

636638
function getSymbol(node: Node): Symbol | undefined {
@@ -656,11 +658,19 @@ namespace ts.codefix {
656658
return isSynthIdentifier(bindingName) ? bindingName.identifier : bindingName.bindingPattern;
657659
}
658660

661+
function createSynthIdentifier(identifier: Identifier, types: Type[] = [], numberOfAssignmentsOriginal = 0): SynthIdentifier {
662+
return { kind: SynthBindingNameKind.Identifier, identifier, types, numberOfAssignmentsOriginal };
663+
}
664+
665+
function createSynthBindingPattern(bindingPattern: BindingPattern, elements: ReadonlyArray<SynthBindingName> = emptyArray, types: Type[] = []): SynthBindingPattern {
666+
return { kind: SynthBindingNameKind.BindingPattern, bindingPattern, elements, types };
667+
}
668+
659669
function isSynthIdentifier(bindingName: SynthBindingName): bindingName is SynthIdentifier {
660-
return "identifier" in bindingName;
670+
return bindingName.kind === SynthBindingNameKind.Identifier;
661671
}
662672

663673
function isSynthBindingPattern(bindingName: SynthBindingName): bindingName is SynthBindingPattern {
664-
return "elements" in bindingName;
674+
return bindingName.kind === SynthBindingNameKind.BindingPattern;
665675
}
666676
}

0 commit comments

Comments
 (0)