Skip to content
Merged
Changes from 4 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
1ceb02a
Added initial ES7 transformer
rbuckton Feb 17, 2016
dd2dc78
Enables source maps for exceptions thrown in the compiler (when avail…
rbuckton Feb 20, 2016
c759b63
Adds ES6 transformer
rbuckton Feb 20, 2016
39628d7
Added CommonJS/AMD/UMD module transformer
rbuckton Feb 20, 2016
5564537
Added initial SystemJS transformer.
rbuckton Feb 22, 2016
0145009
Merge branch 'transforms-transformer-jsx' into transforms-transformer…
rbuckton Feb 23, 2016
dc0b043
Merge branch 'transforms-transformer-es7' into transforms-transformer…
rbuckton Feb 23, 2016
0b64048
Merge branch 'transforms-transformer-es6' into transforms-transformer…
rbuckton Feb 23, 2016
5b7bd63
Merge branch 'transforms-transformer-jsx' into transforms-transformer…
rbuckton Feb 23, 2016
6d111e3
Merge branch 'transforms-transformer-es7' into transforms-transformer…
rbuckton Feb 23, 2016
5a9b131
Merge branch 'transforms-transformer-jsx' into transforms-transformer…
rbuckton Feb 24, 2016
78dfab8
Merge branch 'transforms-transformer-es7' into transforms-transformer…
rbuckton Feb 24, 2016
0d8e152
Merge branch 'transforms-transformer-es6' into transforms-transformer…
rbuckton Feb 24, 2016
72bfd2f
Fixed linter warnings.
rbuckton Feb 24, 2016
2c9cd2e
Merge branch 'transforms-transformer-jsx' into transforms-transformer…
rbuckton Mar 1, 2016
88e1772
Merge branch 'transforms-transformer-es7' into transforms-transformer…
rbuckton Mar 1, 2016
30433c2
ES6 cleanup
rbuckton Mar 2, 2016
2d2709f
Fixed typo in visitCallExpression
rbuckton Mar 2, 2016
70cbb9b
Merge branch 'transforms-transformer-es6' into transforms-transformer…
rbuckton Mar 2, 2016
593fbd4
Merge branch 'transforms-transformer-jsx' into transforms-transformer…
rbuckton Mar 2, 2016
7b28b48
Merge branch 'transforms-transformer-es7' into transforms-transformer…
rbuckton Mar 2, 2016
1c73818
Switched to onEmitNode
rbuckton Mar 2, 2016
c4a75ba
Merge branch 'transforms-transformer-es6' into transforms-transformer…
rbuckton Mar 2, 2016
72eebdb
Switched to onEmitNode
rbuckton Mar 2, 2016
1cf183b
Fixed invalid assertion in ts transformer
rbuckton Mar 4, 2016
d89e21a
General fixes and cleanup
rbuckton Mar 8, 2016
5b8cf96
Moved modifier related flags to separate enum
rbuckton Mar 10, 2016
99e6ad8
Removed ModifiersArray
rbuckton Mar 10, 2016
47cdfbe
Add support for array return values from visitors
rbuckton Mar 10, 2016
2699bf9
Removed NodeArrayNode in favor of arrays
rbuckton Mar 10, 2016
94018a1
cleaned up assertions and removed flattenNodes.
rbuckton Mar 10, 2016
ad0dd4e
Fixed perf issue in binder, plus PR feedback
rbuckton Mar 18, 2016
44ca7d4
Updated baselines
rbuckton Mar 18, 2016
ae7843d
PR Feedback
rbuckton Mar 18, 2016
3c5f170
Merge pull request #7206 from Microsoft/transforms-transformer-module
rbuckton Mar 18, 2016
07a3d18
Merge pull request #7194 from Microsoft/transforms-transformer-es6
rbuckton Mar 18, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 10 additions & 92 deletions src/compiler/transformers/es6.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,8 @@ namespace ts {
const resolver = context.getEmitResolver();
const previousIdentifierSubstitution = context.identifierSubstitution;
const previousExpressionSubstitution = context.expressionSubstitution;
const previousOnBeforeEmitNode = context.onBeforeEmitNode;
const previousOnAfterEmitNode = context.onAfterEmitNode;
context.onBeforeEmitNode = onBeforeEmitNode;
context.onAfterEmitNode = onAfterEmitNode;
const previousOnEmitNode = context.onEmitNode;
context.onEmitNode = onEmitNode;
context.identifierSubstitution = substituteIdentifier;
context.expressionSubstitution = substituteExpression;

Expand All @@ -44,23 +42,9 @@ namespace ts {
let enabledSubstitutions: ES6SubstitutionFlags;

/**
* Keeps track of how deeply nested we are within function-likes when printing
* nodes. This is used to determine whether we need to emit `_this` instead of
* `this`.
* This is used to determine whether we need to emit `_this` instead of `this`.
*/
let containingFunctionDepth: number;

/**
* The first 31 bits are used to determine whether a containing function is an
* arrow function.
*/
let containingFunctionState: number;

/**
* If the containingFunctionDepth grows beyond 31 nested function-likes, this
* array is used as a stack to track deeper levels of nesting.
*/
let containingFunctionStack: number[];
let useCapturedThis: boolean;

return transformSourceFile;

Expand Down Expand Up @@ -1715,28 +1699,18 @@ namespace ts {
*
* @param node The node to be printed.
*/
function onBeforeEmitNode(node: Node) {
previousOnBeforeEmitNode(node);
function onEmitNode(node: Node, emit: (node: Node) => void) {
const savedUseCapturedThis = useCapturedThis;

if (enabledSubstitutions & ES6SubstitutionFlags.CapturedThis && isFunctionLike(node)) {
// If we are tracking a captured `this`, push a bit that indicates whether the
// containing function is an arrow function.
pushContainingFunction(node.kind === SyntaxKind.ArrowFunction);
useCapturedThis = node.kind === SyntaxKind.ArrowFunction;
}
}

/**
* Called by the printer just after a node is printed.
*
* @param node The node that was printed.
*/
function onAfterEmitNode(node: Node) {
previousOnAfterEmitNode(node);
previousOnEmitNode(node, emit);

if (enabledSubstitutions & ES6SubstitutionFlags.CapturedThis && isFunctionLike(node)) {
// If we are tracking a captured `this`, pop the last containing function bit.
popContainingFunction();
}
useCapturedThis = savedUseCapturedThis;
}

/**
Expand All @@ -1757,7 +1731,6 @@ namespace ts {
function enableSubstitutionsForCapturedThis() {
if ((enabledSubstitutions & ES6SubstitutionFlags.CapturedThis) === 0) {
enabledSubstitutions |= ES6SubstitutionFlags.CapturedThis;
containingFunctionDepth = 0;
context.enableExpressionSubstitution(SyntaxKind.ThisKeyword);
context.enableEmitNotification(SyntaxKind.Constructor);
context.enableEmitNotification(SyntaxKind.MethodDeclaration);
Expand Down Expand Up @@ -1850,68 +1823,13 @@ namespace ts {
* @param node The ThisKeyword node.
*/
function substituteThisKeyword(node: PrimaryExpression): PrimaryExpression {
if (enabledSubstitutions & ES6SubstitutionFlags.CapturedThis && isContainedInArrowFunction()) {
if (enabledSubstitutions & ES6SubstitutionFlags.CapturedThis && useCapturedThis) {
return createIdentifier("_this", /*location*/ node);
}

return node;
}

/**
* Pushes a value onto a stack that indicates whether we are currently printing a node
* within an arrow function. This is used to determine whether we need to capture `this`.
*
* @param isArrowFunction A value indicating whether the current function container is
* an arrow function.
*/
function pushContainingFunction(isArrowFunction: boolean) {
// Encode whether the containing function is an arrow function in the first 31 bits of
// an integer. If the stack grows beyond a depth of 31 functions, use an array.
if (containingFunctionDepth > 0 && containingFunctionDepth % 31 === 0) {
if (!containingFunctionStack) {
containingFunctionStack = [containingFunctionState];
}
else {
containingFunctionStack.push(containingFunctionState);
}

containingFunctionState = 0;
}

if (isArrowFunction) {
containingFunctionState |= 1 << (containingFunctionDepth % 31);
}

containingFunctionDepth++;
}

/**
* Pops a value off of the containing function stack.
*/
function popContainingFunction() {
if (containingFunctionDepth > 0) {
containingFunctionDepth--;
if (containingFunctionDepth === 0) {
containingFunctionState = 0;
}
else if (containingFunctionDepth % 31 === 0) {
containingFunctionState = containingFunctionStack.pop();
}
else {
containingFunctionState &= ~(1 << containingFunctionDepth % 31);
}
}
}

/**
* Gets a value indicating whether we are currently printing a node inside of an arrow
* function.
*/
function isContainedInArrowFunction() {
return containingFunctionDepth > 0
&& containingFunctionState & (1 << (containingFunctionDepth - 1) % 31);
}

function getDeclarationName(node: ClassExpression | ClassDeclaration | FunctionDeclaration) {
return node.name ? getSynthesizedClone(node.name) : getGeneratedNameForNode(node);
}
Expand Down