Skip to content

Commit b183f8d

Browse files
committed
added 'nodeIsSynthesized' function, use createSynthesizedNode in emitter to build synthetic nodes
1 parent 32aef1a commit b183f8d

3 files changed

Lines changed: 37 additions & 24 deletions

File tree

src/compiler/checker.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10718,7 +10718,7 @@ module ts {
1071810718
}
1071910719

1072010720
function getBlockScopedVariableId(n: Identifier): number {
10721-
Debug.assert(n.parent !== undefined);
10721+
Debug.assert(!nodeIsSynthesized(n));
1072210722

1072310723
// ignore name parts of property access expressions
1072410724
if (n.parent.kind === SyntaxKind.PropertyAccessExpression &&
@@ -10736,8 +10736,14 @@ module ts {
1073610736
var symbol = declarationSymbol ||
1073710737
getNodeLinks(n).resolvedSymbol ||
1073810738
resolveName(n, n.text, SymbolFlags.BlockScopedVariable | SymbolFlags.Import, /*nodeNotFoundMessage*/ undefined, /*nameArg*/ undefined);
10739-
10740-
return symbol && symbol.flags & SymbolFlags.BlockScopedVariable ? symbol.id : undefined;
10739+
10740+
if (symbol && (symbol.flags & SymbolFlags.BlockScopedVariable)) {
10741+
// side-effect of calling this method:
10742+
// assign id to symbol if it was not yet set
10743+
getSymbolLinks(symbol);
10744+
return symbol.id;
10745+
}
10746+
return undefined;
1074110747
}
1074210748

1074310749
function createResolver(): EmitResolver {

src/compiler/emitter.ts

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ module ts {
3232
leadingCommentRanges?: CommentRange[];
3333
trailingCommentRanges?: CommentRange[];
3434
}
35-
35+
3636
interface ScopeFrame {
3737
names: Map<string>;
3838
previous: ScopeFrame;
@@ -2100,7 +2100,7 @@ module ts {
21002100
name = "_" + (tempCount < 25 ? String.fromCharCode(tempCount + (tempCount < 8 ? 0 : 1) + CharacterCodes.a) : tempCount - 25);
21012101
tempCount++;
21022102
}
2103-
var result = <Identifier>createNode(SyntaxKind.Identifier);
2103+
var result = <Identifier>createSynthesizedNode(SyntaxKind.Identifier);
21042104
result.text = name;
21052105
return result;
21062106
}
@@ -2647,14 +2647,6 @@ module ts {
26472647
}
26482648
}
26492649

2650-
function createSynthesizedNode(kind: SyntaxKind): Node {
2651-
var node = createNode(kind);
2652-
node.pos = -1;
2653-
node.end = -1;
2654-
2655-
return node;
2656-
}
2657-
26582650
function emitDownlevelObjectLiteralWithComputedProperties(node: ObjectLiteralExpression, firstComputedPropertyIndex: number): void {
26592651
var parenthesizedObjectLiteral = createDownlevelObjectLiteralWithComputedProperties(node, firstComputedPropertyIndex);
26602652
return emit(parenthesizedObjectLiteral);
@@ -3551,9 +3543,9 @@ module ts {
35513543
}
35523544

35533545
function createVoidZero(): Expression {
3554-
var zero = <LiteralExpression>createNode(SyntaxKind.NumericLiteral);
3546+
var zero = <LiteralExpression>createSynthesizedNode(SyntaxKind.NumericLiteral);
35553547
zero.text = "0";
3556-
var result = <VoidExpression>createNode(SyntaxKind.VoidExpression);
3548+
var result = <VoidExpression>createSynthesizedNode(SyntaxKind.VoidExpression);
35573549
result.expression = zero;
35583550
return result;
35593551
}
@@ -3619,19 +3611,19 @@ module ts {
36193611
// we need to generate a temporary variable
36203612
value = ensureIdentifier(value);
36213613
// Return the expression 'value === void 0 ? defaultValue : value'
3622-
var equals = <BinaryExpression>createNode(SyntaxKind.BinaryExpression);
3614+
var equals = <BinaryExpression>createSynthesizedNode(SyntaxKind.BinaryExpression);
36233615
equals.left = value;
3624-
equals.operatorToken = createNode(SyntaxKind.EqualsEqualsEqualsToken);
3616+
equals.operatorToken = createSynthesizedNode(SyntaxKind.EqualsEqualsEqualsToken);
36253617
equals.right = createVoidZero();
3626-
var cond = <ConditionalExpression>createNode(SyntaxKind.ConditionalExpression);
3618+
var cond = <ConditionalExpression>createSynthesizedNode(SyntaxKind.ConditionalExpression);
36273619
cond.condition = equals;
36283620
cond.whenTrue = defaultValue;
36293621
cond.whenFalse = value;
36303622
return cond;
36313623
}
36323624

36333625
function createNumericLiteral(value: number) {
3634-
var node = <LiteralExpression>createNode(SyntaxKind.NumericLiteral);
3626+
var node = <LiteralExpression>createSynthesizedNode(SyntaxKind.NumericLiteral);
36353627
node.text = "" + value;
36363628
return node;
36373629
}
@@ -3640,7 +3632,7 @@ module ts {
36403632
if (expr.kind === SyntaxKind.Identifier || expr.kind === SyntaxKind.PropertyAccessExpression || expr.kind === SyntaxKind.ElementAccessExpression) {
36413633
return <LeftHandSideExpression>expr;
36423634
}
3643-
var node = <ParenthesizedExpression>createNode(SyntaxKind.ParenthesizedExpression);
3635+
var node = <ParenthesizedExpression>createSynthesizedNode(SyntaxKind.ParenthesizedExpression);
36443636
node.expression = expr;
36453637
return node;
36463638
}
@@ -3649,14 +3641,14 @@ module ts {
36493641
if (propName.kind !== SyntaxKind.Identifier) {
36503642
return createElementAccess(object, propName);
36513643
}
3652-
var node = <PropertyAccessExpression>createNode(SyntaxKind.PropertyAccessExpression);
3644+
var node = <PropertyAccessExpression>createSynthesizedNode(SyntaxKind.PropertyAccessExpression);
36533645
node.expression = parenthesizeForAccess(object);
36543646
node.name = propName;
36553647
return node;
36563648
}
36573649

36583650
function createElementAccess(object: Expression, index: Expression): Expression {
3659-
var node = <ElementAccessExpression>createNode(SyntaxKind.ElementAccessExpression);
3651+
var node = <ElementAccessExpression>createSynthesizedNode(SyntaxKind.ElementAccessExpression);
36603652
node.expression = parenthesizeForAccess(object);
36613653
node.argumentExpression = index;
36623654
return node;
@@ -3843,6 +3835,7 @@ module ts {
38433835
case SyntaxKind.CatchClause:
38443836
case SyntaxKind.ForStatement:
38453837
case SyntaxKind.ForInStatement:
3838+
case SyntaxKind.ForOfStatement:
38463839
case SyntaxKind.SwitchKeyword:
38473840
return current;
38483841
case SyntaxKind.Block:
@@ -3872,12 +3865,12 @@ module ts {
38723865
function renameNonTopLevelLetAndConst(node: Node): void {
38733866
// do not rename if
38743867
// - language version is ES6+
3875-
// - node is synthesized (does not have a parent)
3868+
// - node is synthesized
38763869
// - node is not identifier (can happen when tree is malformed)
38773870
// - node is definitely not name of variable declaration.
38783871
// it still can be part of parameter declaration, this check will be done next
38793872
if (languageVersion >= ScriptTarget.ES6 ||
3880-
!node.parent ||
3873+
nodeIsSynthesized(node) ||
38813874
node.kind !== SyntaxKind.Identifier ||
38823875
(node.parent.kind !== SyntaxKind.VariableDeclaration && node.parent.kind !== SyntaxKind.BindingElement)) {
38833876
return;

src/compiler/utilities.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1117,6 +1117,20 @@ module ts {
11171117
return createTextChangeRange(createTextSpanFromBounds(oldStartN, oldEndN), /*newLength: */newEndN - oldStartN);
11181118
}
11191119

1120+
// @internal
1121+
export function nodeIsSynthesized(node: Node): boolean {
1122+
return node.pos === -1 && node.end === -1;
1123+
}
1124+
1125+
// @internal
1126+
export function createSynthesizedNode(kind: SyntaxKind): Node {
1127+
var node = createNode(kind);
1128+
node.pos = -1;
1129+
node.end = -1;
1130+
1131+
return node;
1132+
}
1133+
11201134
// @internal
11211135
export function generateUniqueName(baseName: string, isExistingName: (name: string) => boolean): string {
11221136
// First try '_name'

0 commit comments

Comments
 (0)