mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-14 02:15:12 -06:00
Factor out the behaviour and handles x++ and ++x
This commit is contained in:
parent
ec60ac94ab
commit
ebd4ce6e7a
@ -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) {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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))
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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 };
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user