Skip to content

Commit e97368b

Browse files
committed
Adds ES5 to ES3 transformer for reserved words
1 parent 65b1cf6 commit e97368b

File tree

50 files changed

+267
-206
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+267
-206
lines changed

Jakefile.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,15 @@ var compilerSources = [
7070
"visitor.ts",
7171
"transformers/destructuring.ts",
7272
"transformers/ts.ts",
73-
"transformers/module/es2015.ts",
74-
"transformers/module/system.ts",
75-
"transformers/module/module.ts",
7673
"transformers/jsx.ts",
7774
"transformers/es2017.ts",
7875
"transformers/es2016.ts",
7976
"transformers/es2015.ts",
77+
"transformers/es5.ts",
8078
"transformers/generators.ts",
79+
"transformers/module/es2015.ts",
80+
"transformers/module/system.ts",
81+
"transformers/module/module.ts",
8182
"transformer.ts",
8283
"sourcemap.ts",
8384
"comments.ts",
@@ -105,14 +106,14 @@ var servicesSources = [
105106
"visitor.ts",
106107
"transformers/destructuring.ts",
107108
"transformers/ts.ts",
108-
"transformers/module/es2015.ts",
109-
"transformers/module/system.ts",
110-
"transformers/module/module.ts",
111109
"transformers/jsx.ts",
112110
"transformers/es2017.ts",
113111
"transformers/es2016.ts",
114112
"transformers/es2015.ts",
115113
"transformers/generators.ts",
114+
"transformers/module/es2015.ts",
115+
"transformers/module/system.ts",
116+
"transformers/module/module.ts",
116117
"transformer.ts",
117118
"sourcemap.ts",
118119
"comments.ts",

src/compiler/transformer.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
/// <reference path="transformers/es2017.ts" />
55
/// <reference path="transformers/es2016.ts" />
66
/// <reference path="transformers/es2015.ts" />
7+
/// <reference path="transformers/es5.ts" />
78
/// <reference path="transformers/generators.ts" />
89
/// <reference path="transformers/module/module.ts" />
910
/// <reference path="transformers/module/system.ts" />
@@ -129,6 +130,10 @@ namespace ts {
129130
transformers.push(transformGenerators);
130131
}
131132

133+
if (languageVersion < ScriptTarget.ES5) {
134+
transformers.push(transformES5);
135+
}
136+
132137
return transformers;
133138
}
134139

src/compiler/transformers/es5.ts

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/// <reference path="../factory.ts" />
2+
/// <reference path="../visitor.ts" />
3+
4+
/*@internal*/
5+
namespace ts {
6+
/**
7+
* Transforms ES5 syntax into ES3 syntax.
8+
*
9+
* @param context Context and state information for the transformation.
10+
*/
11+
export function transformES5(context: TransformationContext) {
12+
const previousOnSubstituteNode = context.onSubstituteNode;
13+
context.onSubstituteNode = onSubstituteNode;
14+
context.enableSubstitution(SyntaxKind.PropertyAccessExpression);
15+
context.enableSubstitution(SyntaxKind.PropertyAssignment);
16+
return transformSourceFile;
17+
18+
/**
19+
* Transforms an ES5 source file to ES3.
20+
*
21+
* @param node A SourceFile
22+
*/
23+
function transformSourceFile(node: SourceFile) {
24+
return node;
25+
}
26+
27+
/**
28+
* Hooks node substitutions.
29+
*
30+
* @param emitContext The context for the emitter.
31+
* @param node The node to substitute.
32+
*/
33+
function onSubstituteNode(emitContext: EmitContext, node: Node) {
34+
node = previousOnSubstituteNode(emitContext, node);
35+
if (isPropertyAccessExpression(node)) {
36+
return substitutePropertyAccessExpression(node);
37+
}
38+
else if (isPropertyAssignment(node)) {
39+
return substitutePropertyAssignment(node);
40+
}
41+
return node;
42+
}
43+
44+
/**
45+
* Substitutes a PropertyAccessExpression whose name is a reserved word.
46+
*
47+
* @param node A PropertyAccessExpression
48+
*/
49+
function substitutePropertyAccessExpression(node: PropertyAccessExpression): Expression {
50+
const literalName = trySubstituteReservedName(node.name);
51+
if (literalName) {
52+
return createElementAccess(node.expression, literalName, /*location*/ node);
53+
}
54+
return node;
55+
}
56+
57+
/**
58+
* Substitutes a PropertyAssignment whose name is a reserved word.
59+
*
60+
* @param node A PropertyAssignment
61+
*/
62+
function substitutePropertyAssignment(node: PropertyAssignment): PropertyAssignment {
63+
const literalName = isIdentifier(node.name) && trySubstituteReservedName(node.name);
64+
if (literalName) {
65+
return updatePropertyAssignment(node, literalName, node.initializer);
66+
}
67+
return node;
68+
}
69+
70+
/**
71+
* If an identifier name is a reserved word, returns a string literal for the name.
72+
*
73+
* @param name An Identifier
74+
*/
75+
function trySubstituteReservedName(name: Identifier) {
76+
const token = name.originalKeywordKind || (nodeIsSynthesized(name) ? stringToToken(name.text) : undefined);
77+
if (token >= SyntaxKind.FirstReservedWord && token <= SyntaxKind.LastReservedWord) {
78+
return createLiteral(name, /*location*/ name);
79+
}
80+
return undefined;
81+
}
82+
}
83+
}

src/compiler/transformers/module/module.ts

Lines changed: 14 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -958,39 +958,19 @@ namespace ts {
958958
const declaration = resolver.getReferencedImportDeclaration(node);
959959
if (declaration) {
960960
if (isImportClause(declaration)) {
961-
if (languageVersion >= ScriptTarget.ES5) {
962-
return createPropertyAccess(
963-
getGeneratedNameForNode(declaration.parent),
964-
createIdentifier("default"),
965-
/*location*/ node
966-
);
967-
}
968-
else {
969-
// TODO: ES3 transform to handle x.default -> x["default"]
970-
return createElementAccess(
971-
getGeneratedNameForNode(declaration.parent),
972-
createLiteral("default"),
973-
/*location*/ node
974-
);
975-
}
961+
return createPropertyAccess(
962+
getGeneratedNameForNode(declaration.parent),
963+
createIdentifier("default"),
964+
/*location*/ node
965+
);
976966
}
977967
else if (isImportSpecifier(declaration)) {
978968
const name = declaration.propertyName || declaration.name;
979-
if (name.originalKeywordKind === SyntaxKind.DefaultKeyword && languageVersion <= ScriptTarget.ES3) {
980-
// TODO: ES3 transform to handle x.default -> x["default"]
981-
return createElementAccess(
982-
getGeneratedNameForNode(declaration.parent.parent.parent),
983-
createLiteral(name.text),
984-
/*location*/ node
985-
);
986-
}
987-
else {
988-
return createPropertyAccess(
989-
getGeneratedNameForNode(declaration.parent.parent.parent),
990-
getSynthesizedClone(name),
991-
/*location*/ node
992-
);
993-
}
969+
return createPropertyAccess(
970+
getGeneratedNameForNode(declaration.parent.parent.parent),
971+
getSynthesizedClone(name),
972+
/*location*/ node
973+
);
994974
}
995975
}
996976
}
@@ -1027,15 +1007,10 @@ namespace ts {
10271007

10281008
function createExportAssignment(name: Identifier, value: Expression) {
10291009
return createAssignment(
1030-
name.originalKeywordKind === SyntaxKind.DefaultKeyword && languageVersion === ScriptTarget.ES3
1031-
? createElementAccess(
1032-
createIdentifier("exports"),
1033-
createLiteral(name.text)
1034-
)
1035-
: createPropertyAccess(
1036-
createIdentifier("exports"),
1037-
getSynthesizedClone(name)
1038-
),
1010+
createPropertyAccess(
1011+
createIdentifier("exports"),
1012+
getSynthesizedClone(name)
1013+
),
10391014
value
10401015
);
10411016
}

src/compiler/transformers/module/system.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ namespace ts {
1919
const compilerOptions = context.getCompilerOptions();
2020
const resolver = context.getEmitResolver();
2121
const host = context.getEmitHost();
22-
const languageVersion = getEmitScriptTarget(compilerOptions);
2322
const previousOnSubstituteNode = context.onSubstituteNode;
2423
const previousOnEmitNode = context.onEmitNode;
2524
context.onSubstituteNode = onSubstituteNode;
@@ -1317,12 +1316,7 @@ namespace ts {
13171316
return undefined;
13181317
}
13191318

1320-
if (name.originalKeywordKind && languageVersion === ScriptTarget.ES3) {
1321-
return createElementAccess(importAlias, createLiteral(name.text));
1322-
}
1323-
else {
1324-
return createPropertyAccess(importAlias, getSynthesizedClone(name));
1325-
}
1319+
return createPropertyAccess(importAlias, getSynthesizedClone(name));
13261320
}
13271321

13281322
function collectDependencyGroups(externalImports: (ImportDeclaration | ImportEqualsDeclaration | ExportDeclaration)[]) {

src/compiler/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"transformers/es2017.ts",
2828
"transformers/es2016.ts",
2929
"transformers/es2015.ts",
30+
"transformers/es5.ts",
3031
"transformers/generators.ts",
3132
"transformers/destructuring.ts",
3233
"transformers/module/module.ts",

src/harness/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
"../compiler/transformers/es2017.ts",
3030
"../compiler/transformers/es2016.ts",
3131
"../compiler/transformers/es2015.ts",
32+
"../compiler/transformers/es5.ts",
3233
"../compiler/transformers/generators.ts",
3334
"../compiler/transformers/destructuring.ts",
3435
"../compiler/transformers/module/module.ts",

src/services/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"../compiler/transformers/es2017.ts",
2929
"../compiler/transformers/es2016.ts",
3030
"../compiler/transformers/es2015.ts",
31+
"../compiler/transformers/es5.ts",
3132
"../compiler/transformers/generators.ts",
3233
"../compiler/transformers/destructuring.ts",
3334
"../compiler/transformers/module/module.ts",

tests/baselines/reference/allowSyntheticDefaultImports10.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ Foo.default.default.foo();
1313
//// [a.js]
1414
"use strict";
1515
var Foo = require("./b");
16-
Foo.default.bar();
17-
Foo.default.default.foo();
16+
Foo["default"].bar();
17+
Foo["default"]["default"].foo();

tests/baselines/reference/bluebirdStaticThis.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,12 +146,12 @@ var x;
146146
var arr;
147147
var foo;
148148
var fooProm;
149-
fooProm = Promise.try(Promise, function () {
149+
fooProm = Promise["try"](Promise, function () {
150150
return foo;
151151
});
152-
fooProm = Promise.try(Promise, function () {
152+
fooProm = Promise["try"](Promise, function () {
153153
return foo;
154154
}, arr);
155-
fooProm = Promise.try(Promise, function () {
155+
fooProm = Promise["try"](Promise, function () {
156156
return foo;
157157
}, arr, x);

0 commit comments

Comments
 (0)