Factor out the behaviour and handles x++ and ++x

This commit is contained in:
Evan Sebastian 2016-05-24 04:51:46 +07:00
parent ec60ac94ab
commit ebd4ce6e7a
5 changed files with 96 additions and 24 deletions

View File

@ -2622,10 +2622,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
}
function emitPrefixUnaryExpression(node: PrefixUnaryExpression) {
const exportChanged = (node.operator === SyntaxKind.PlusPlusToken || node.operator === SyntaxKind.MinusMinusToken) &&
const isPlusPlusOrMinusMinus = (node.operator === SyntaxKind.PlusPlusToken
|| node.operator === SyntaxKind.MinusMinusToken);
const externalExportChanged = isPlusPlusOrMinusMinus &&
isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.operand);
if (exportChanged) {
if (externalExportChanged) {
// emit
// ++x
// as
@ -2634,6 +2636,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
emitNodeWithoutSourceMap(node.operand);
write(`", `);
}
const internalExportChanged = isPlusPlusOrMinusMinus &&
isNameOfExportedSourceLevelDeclarationInClauseModule(node.operand);
if (internalExportChanged) {
emitAliasEqual(<Identifier> node.operand);
}
write(tokenToString(node.operator));
// In some cases, we need to emit a space between the operator and the operand. One obvious case
@ -2659,14 +2667,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
}
emit(node.operand);
if (exportChanged) {
if (externalExportChanged) {
write(")");
}
}
function emitPostfixUnaryExpression(node: PostfixUnaryExpression) {
const exportChanged = isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.operand);
if (exportChanged) {
const externalExportChanged = isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.operand);
const internalExportChanged = isNameOfExportedSourceLevelDeclarationInClauseModule(node.operand);
if (externalExportChanged) {
// export function returns the value that was passes as the second argument
// however for postfix unary expressions result value should be the value before modification.
// emit 'x++' as '(export('x', ++x) - 1)' and 'x--' as '(export('x', --x) + 1)'
@ -2684,6 +2694,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
write(") + 1)");
}
}
else if (internalExportChanged) {
emitAliasEqual(<Identifier> node.operand);
emit(node.operand);
if (node.operator === SyntaxKind.PlusPlusToken) {
write(" += 1");
}
else {
write(" -= 1");
}
}
else {
emit(node.operand);
write(tokenToString(node.operator));
@ -2785,6 +2805,18 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
}
}
function emitAliasEqual(name: Identifier): boolean {
for (const specifier of exportSpecifiers[name.text]) {
emitStart(specifier.name);
emitContainingModuleName(specifier);
write(".");
emitNodeWithCommentsAndWithoutSourcemap(specifier.name);
emitEnd(specifier.name);
write(" = ");
}
return true;
}
function emitBinaryExpression(node: BinaryExpression) {
if (languageVersion < ScriptTarget.ES6 && node.operatorToken.kind === SyntaxKind.EqualsToken &&
(node.left.kind === SyntaxKind.ObjectLiteralExpression || node.left.kind === SyntaxKind.ArrayLiteralExpression)) {
@ -2803,18 +2835,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
write(`", `);
}
const internalExportClauseMemberChanged = isAssignment &&
const internalExportChanged = isAssignment &&
isNameOfExportedSourceLevelDeclarationInClauseModule(node.left);
if (internalExportClauseMemberChanged) {
for (const specifier of exportSpecifiers[(<Identifier>node.left).text]) {
emitStart(specifier.name);
emitContainingModuleName(specifier);
write(".");
emitNodeWithCommentsAndWithoutSourcemap(specifier.name);
emitEnd(specifier.name);
write(" = ");
}
if (internalExportChanged) {
// export { foo }
// emit foo = 2 as exports.foo = foo = 2
emitAliasEqual(<Identifier>node.left);
}
if (node.operatorToken.kind === SyntaxKind.AsteriskAsteriskToken || node.operatorToken.kind === SyntaxKind.AsteriskAsteriskEqualsToken) {

View File

@ -9,7 +9,12 @@ baz = 4;
var buzz = 10;
buzz += 3;
export { foo, baz, baz as quux, buzz };
var bizz = 8;
bizz++; // compiles to exports.bizz = bizz += 1
bizz--; // similarly
++bizz; // compiles to exports.bizz = ++bizz
export { foo, baz, baz as quux, buzz, bizz };
//// [server.js]
@ -24,3 +29,8 @@ exports.baz = exports.quux = baz = 4;
var buzz = 10;
exports.buzz = buzz;
exports.buzz = buzz += 3;
var bizz = 8;
exports.bizz = bizz;
exports.bizz = bizz += 1; // compiles to exports.bizz = bizz += 1
exports.bizz = bizz -= 1; // similarly
exports.bizz = ++bizz; // compiles to exports.bizz = ++bizz

View File

@ -18,10 +18,23 @@ var buzz = 10;
buzz += 3;
>buzz : Symbol(buzz, Decl(server.ts, 7, 3))
export { foo, baz, baz as quux, buzz };
>foo : Symbol(foo, Decl(server.ts, 10, 8))
>baz : Symbol(baz, Decl(server.ts, 10, 13))
>baz : Symbol(quux, Decl(server.ts, 10, 18))
>quux : Symbol(quux, Decl(server.ts, 10, 18))
>buzz : Symbol(buzz, Decl(server.ts, 10, 31))
var bizz = 8;
>bizz : Symbol(bizz, Decl(server.ts, 10, 3))
bizz++; // compiles to exports.bizz = bizz += 1
>bizz : Symbol(bizz, Decl(server.ts, 10, 3))
bizz--; // similarly
>bizz : Symbol(bizz, Decl(server.ts, 10, 3))
++bizz; // compiles to exports.bizz = ++bizz
>bizz : Symbol(bizz, Decl(server.ts, 10, 3))
export { foo, baz, baz as quux, buzz, bizz };
>foo : Symbol(foo, Decl(server.ts, 15, 8))
>baz : Symbol(baz, Decl(server.ts, 15, 13))
>baz : Symbol(quux, Decl(server.ts, 15, 18))
>quux : Symbol(quux, Decl(server.ts, 15, 18))
>buzz : Symbol(buzz, Decl(server.ts, 15, 31))
>bizz : Symbol(bizz, Decl(server.ts, 15, 37))

View File

@ -27,10 +27,27 @@ buzz += 3;
>buzz : number
>3 : number
export { foo, baz, baz as quux, buzz };
var bizz = 8;
>bizz : number
>8 : number
bizz++; // compiles to exports.bizz = bizz += 1
>bizz++ : number
>bizz : number
bizz--; // similarly
>bizz-- : number
>bizz : number
++bizz; // compiles to exports.bizz = ++bizz
>++bizz : number
>bizz : number
export { foo, baz, baz as quux, buzz, bizz };
>foo : number
>baz : number
>baz : number
>quux : number
>buzz : number
>bizz : number

View File

@ -11,4 +11,9 @@ baz = 4;
var buzz = 10;
buzz += 3;
export { foo, baz, baz as quux, buzz };
var bizz = 8;
bizz++; // compiles to exports.bizz = bizz += 1
bizz--; // similarly
++bizz; // compiles to exports.bizz = ++bizz
export { foo, baz, baz as quux, buzz, bizz };