typescript-to-lua 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/dist/CompilerOptions.d.ts +4 -3
- package/dist/LuaAST.d.ts +1 -0
- package/dist/LuaAST.js +14 -6
- package/dist/LuaLib.d.ts +4 -3
- package/dist/LuaLib.js +5 -4
- package/dist/LuaPrinter.d.ts +15 -4
- package/dist/LuaPrinter.js +79 -27
- package/dist/cli/diagnostics.js +2 -2
- package/dist/cli/parse.d.ts +1 -1
- package/dist/cli/parse.js +14 -0
- package/dist/cli/report.js +1 -1
- package/dist/cli/tsconfig.js +4 -4
- package/dist/lualib/ArrayFlat.lua +1 -1
- package/dist/lualib/ArrayFlatMap.lua +1 -1
- package/dist/lualib/ArrayIsArray.lua +1 -1
- package/dist/lualib/ArrayReduce.lua +7 -1
- package/dist/lualib/ArrayReduceRight.lua +7 -1
- package/dist/lualib/ArraySetLength.lua +1 -1
- package/dist/lualib/ArraySplice.lua +5 -5
- package/dist/lualib/Await.lua +39 -19
- package/dist/lualib/CloneDescriptor.lua +8 -8
- package/dist/lualib/Decorate.lua +1 -1
- package/dist/lualib/DelegatedYield.lua +1 -3
- package/dist/lualib/Delete.lua +6 -6
- package/dist/lualib/Error.lua +47 -44
- package/dist/lualib/Generator.lua +1 -5
- package/dist/lualib/InstanceOf.lua +1 -1
- package/dist/lualib/InstanceOfObject.lua +1 -1
- package/dist/lualib/Map.lua +130 -134
- package/dist/lualib/Number.lua +1 -1
- package/dist/lualib/NumberIsFinite.lua +1 -1
- package/dist/lualib/NumberToString.lua +3 -5
- package/dist/lualib/ObjectDefineProperty.lua +40 -8
- package/dist/lualib/ParseFloat.lua +9 -5
- package/dist/lualib/ParseInt.lua +15 -3
- package/dist/lualib/Promise.lua +36 -26
- package/dist/lualib/Set.lua +119 -123
- package/dist/lualib/SetDescriptor.lua +7 -1
- package/dist/lualib/SourceMapTraceBack.lua +19 -9
- package/dist/lualib/SparseArrayNew.lua +5 -0
- package/dist/lualib/SparseArrayPush.lua +9 -0
- package/dist/lualib/SparseArraySpread.lua +4 -0
- package/dist/lualib/StringAccess.lua +1 -1
- package/dist/lualib/StringCharCodeAt.lua +1 -1
- package/dist/lualib/StringEndsWith.lua +2 -2
- package/dist/lualib/StringPadEnd.lua +2 -2
- package/dist/lualib/StringPadStart.lua +2 -2
- package/dist/lualib/StringReplace.lua +12 -11
- package/dist/lualib/StringReplaceAll.lua +35 -0
- package/dist/lualib/StringSlice.lua +2 -2
- package/dist/lualib/StringSplit.lua +3 -3
- package/dist/lualib/StringStartsWith.lua +1 -1
- package/dist/lualib/StringSubstr.lua +1 -1
- package/dist/lualib/StringSubstring.lua +2 -2
- package/dist/lualib/Symbol.lua +3 -5
- package/dist/lualib/WeakMap.lua +40 -42
- package/dist/lualib/WeakSet.lua +36 -38
- package/dist/lualib/lualib_bundle.lua +705 -586
- package/dist/transformation/builtins/array.js +29 -30
- package/dist/transformation/builtins/console.js +2 -2
- package/dist/transformation/builtins/function.js +9 -10
- package/dist/transformation/builtins/global.js +8 -8
- package/dist/transformation/builtins/index.d.ts +1 -1
- package/dist/transformation/builtins/index.js +69 -36
- package/dist/transformation/builtins/math.js +4 -4
- package/dist/transformation/builtins/number.js +7 -7
- package/dist/transformation/builtins/object.d.ts +2 -1
- package/dist/transformation/builtins/object.js +12 -13
- package/dist/transformation/builtins/promise.js +9 -9
- package/dist/transformation/builtins/string.js +32 -31
- package/dist/transformation/builtins/symbol.js +3 -3
- package/dist/transformation/context/context.d.ts +12 -0
- package/dist/transformation/context/context.js +105 -6
- package/dist/transformation/index.js +1 -1
- package/dist/transformation/utils/annotations.d.ts +1 -3
- package/dist/transformation/utils/annotations.js +0 -2
- package/dist/transformation/utils/assignment-validation.js +8 -7
- package/dist/transformation/utils/diagnostics.d.ts +6 -0
- package/dist/transformation/utils/diagnostics.js +7 -5
- package/dist/transformation/utils/export.d.ts +3 -2
- package/dist/transformation/utils/export.js +14 -7
- package/dist/transformation/utils/function-context.js +8 -8
- package/dist/transformation/utils/lua-ast.d.ts +0 -1
- package/dist/transformation/utils/lua-ast.js +25 -35
- package/dist/transformation/utils/lualib.js +1 -1
- package/dist/transformation/utils/preceding-statements.d.ts +3 -0
- package/dist/transformation/utils/preceding-statements.js +11 -0
- package/dist/transformation/utils/safe-names.js +5 -5
- package/dist/transformation/utils/scope.d.ts +7 -0
- package/dist/transformation/utils/scope.js +77 -40
- package/dist/transformation/utils/symbols.js +6 -6
- package/dist/transformation/utils/typescript/index.d.ts +1 -0
- package/dist/transformation/utils/typescript/index.js +16 -1
- package/dist/transformation/utils/typescript/nodes.d.ts +2 -0
- package/dist/transformation/utils/typescript/nodes.js +21 -1
- package/dist/transformation/visitors/access.d.ts +3 -0
- package/dist/transformation/visitors/access.js +74 -47
- package/dist/transformation/visitors/async-await.js +5 -4
- package/dist/transformation/visitors/binary-expression/assignments.d.ts +3 -2
- package/dist/transformation/visitors/binary-expression/assignments.js +86 -77
- package/dist/transformation/visitors/binary-expression/bit.js +4 -4
- package/dist/transformation/visitors/binary-expression/compound.d.ts +5 -4
- package/dist/transformation/visitors/binary-expression/compound.js +69 -71
- package/dist/transformation/visitors/binary-expression/destructuring-assignments.d.ts +2 -2
- package/dist/transformation/visitors/binary-expression/destructuring-assignments.js +65 -36
- package/dist/transformation/visitors/binary-expression/index.d.ts +3 -1
- package/dist/transformation/visitors/binary-expression/index.js +84 -40
- package/dist/transformation/visitors/block.js +6 -6
- package/dist/transformation/visitors/break-continue.js +4 -9
- package/dist/transformation/visitors/call.d.ts +3 -2
- package/dist/transformation/visitors/call.js +130 -143
- package/dist/transformation/visitors/class/decorators.js +3 -3
- package/dist/transformation/visitors/class/index.js +43 -39
- package/dist/transformation/visitors/class/members/accessors.js +6 -6
- package/dist/transformation/visitors/class/members/constructor.js +7 -7
- package/dist/transformation/visitors/class/members/fields.js +6 -6
- package/dist/transformation/visitors/class/members/method.js +6 -6
- package/dist/transformation/visitors/class/new.js +14 -16
- package/dist/transformation/visitors/class/setup.js +11 -11
- package/dist/transformation/visitors/class/utils.js +2 -2
- package/dist/transformation/visitors/conditional.js +34 -20
- package/dist/transformation/visitors/delete.js +8 -4
- package/dist/transformation/visitors/enum.js +8 -8
- package/dist/transformation/visitors/errors.js +30 -30
- package/dist/transformation/visitors/expression-list.d.ts +7 -0
- package/dist/transformation/visitors/expression-list.js +120 -0
- package/dist/transformation/visitors/expression-statement.js +10 -6
- package/dist/transformation/visitors/function.js +30 -32
- package/dist/transformation/visitors/identifier.js +26 -22
- package/dist/transformation/visitors/index.js +2 -2
- package/dist/transformation/visitors/language-extensions/iterable.js +7 -7
- package/dist/transformation/visitors/language-extensions/multi.d.ts +1 -1
- package/dist/transformation/visitors/language-extensions/multi.js +3 -3
- package/dist/transformation/visitors/language-extensions/operators.js +6 -6
- package/dist/transformation/visitors/language-extensions/range.js +6 -6
- package/dist/transformation/visitors/language-extensions/table.js +5 -5
- package/dist/transformation/visitors/literal.d.ts +1 -2
- package/dist/transformation/visitors/literal.js +87 -57
- package/dist/transformation/visitors/loops/do-while.js +35 -9
- package/dist/transformation/visitors/loops/for-in.js +4 -4
- package/dist/transformation/visitors/loops/for-of.js +13 -13
- package/dist/transformation/visitors/loops/for.js +28 -8
- package/dist/transformation/visitors/loops/utils.d.ts +1 -0
- package/dist/transformation/visitors/loops/utils.js +21 -10
- package/dist/transformation/visitors/modules/export.js +14 -15
- package/dist/transformation/visitors/modules/import.js +10 -10
- package/dist/transformation/visitors/namespace.js +13 -13
- package/dist/transformation/visitors/optional-chaining.d.ts +16 -0
- package/dist/transformation/visitors/optional-chaining.js +172 -0
- package/dist/transformation/visitors/return.d.ts +1 -0
- package/dist/transformation/visitors/return.js +40 -26
- package/dist/transformation/visitors/sourceFile.js +12 -9
- package/dist/transformation/visitors/spread.js +11 -11
- package/dist/transformation/visitors/switch.js +152 -30
- package/dist/transformation/visitors/template.js +10 -7
- package/dist/transformation/visitors/typeof.js +4 -2
- package/dist/transformation/visitors/typescript.js +1 -1
- package/dist/transformation/visitors/unary-expression.js +9 -9
- package/dist/transformation/visitors/variable-declaration.js +46 -32
- package/dist/transformation/visitors/void.d.ts +6 -0
- package/dist/transformation/visitors/void.js +20 -0
- package/dist/transpilation/bundle.d.ts +3 -0
- package/dist/transpilation/bundle.js +56 -13
- package/dist/transpilation/diagnostics.js +3 -3
- package/dist/transpilation/index.js +2 -2
- package/dist/transpilation/output-collector.js +2 -2
- package/dist/transpilation/plugins.js +1 -1
- package/dist/transpilation/resolve.js +26 -14
- package/dist/transpilation/transformers.js +45 -25
- package/dist/transpilation/transpile.js +6 -6
- package/dist/transpilation/transpiler.js +8 -8
- package/dist/transpilation/utils.js +5 -3
- package/dist/tstl.js +8 -8
- package/dist/utils.js +2 -2
- package/package.json +15 -12
- package/dist/lualib/OptionalChainAccess.lua +0 -6
- package/dist/lualib/OptionalFunctionCall.lua +0 -6
- package/dist/lualib/OptionalMethodCall.lua +0 -11
- package/dist/transformation/utils/transform.d.ts +0 -8
- package/dist/transformation/utils/transform.js +0 -14
- package/dist/transformation/visitors/jsx/jsx.d.ts +0 -9
- package/dist/transformation/visitors/jsx/jsx.js +0 -237
- package/dist/transformation/visitors/jsx/xhtml.d.ts +0 -3
- package/dist/transformation/visitors/jsx/xhtml.js +0 -260
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.transformBinaryExpressionStatement = exports.transformBinaryExpression = exports.transformBinaryOperation = void 0;
|
|
3
|
+
exports.transformBinaryExpressionStatement = exports.transformBinaryExpression = exports.transformBinaryOperation = exports.createShortCircuitBinaryExpressionPrecedingStatements = void 0;
|
|
4
4
|
const ts = require("typescript");
|
|
5
5
|
const lua = require("../../../LuaAST");
|
|
6
6
|
const lua_ast_1 = require("../../utils/lua-ast");
|
|
@@ -11,7 +11,11 @@ const assignments_1 = require("./assignments");
|
|
|
11
11
|
const bit_1 = require("./bit");
|
|
12
12
|
const compound_1 = require("./compound");
|
|
13
13
|
const utils_1 = require("../../../utils");
|
|
14
|
-
const
|
|
14
|
+
const expression_list_1 = require("../expression-list");
|
|
15
|
+
const preceding_statements_1 = require("../../utils/preceding-statements");
|
|
16
|
+
const isShortCircuitOperator = (value) => value === ts.SyntaxKind.AmpersandAmpersandToken ||
|
|
17
|
+
value === ts.SyntaxKind.BarBarToken ||
|
|
18
|
+
value === ts.SyntaxKind.QuestionQuestionToken;
|
|
15
19
|
const simpleOperatorsToLua = {
|
|
16
20
|
[ts.SyntaxKind.AmpersandAmpersandToken]: lua.SyntaxKind.AndOperator,
|
|
17
21
|
[ts.SyntaxKind.BarBarToken]: lua.SyntaxKind.OrOperator,
|
|
@@ -30,43 +34,77 @@ const simpleOperatorsToLua = {
|
|
|
30
34
|
[ts.SyntaxKind.ExclamationEqualsToken]: lua.SyntaxKind.InequalityOperator,
|
|
31
35
|
[ts.SyntaxKind.ExclamationEqualsEqualsToken]: lua.SyntaxKind.InequalityOperator,
|
|
32
36
|
};
|
|
33
|
-
function
|
|
34
|
-
if (bit_1.isBitOperator(operator)) {
|
|
35
|
-
return bit_1.transformBinaryBitOperation(context, node, left, right, operator);
|
|
37
|
+
function transformBinaryOperationWithNoPrecedingStatements(context, left, right, operator, node) {
|
|
38
|
+
if ((0, bit_1.isBitOperator)(operator)) {
|
|
39
|
+
return (0, bit_1.transformBinaryBitOperation)(context, node, left, right, operator);
|
|
36
40
|
}
|
|
37
41
|
if (operator === ts.SyntaxKind.QuestionQuestionToken) {
|
|
38
|
-
utils_1.assert(ts.isBinaryExpression(node));
|
|
39
|
-
return
|
|
42
|
+
(0, utils_1.assert)(ts.isBinaryExpression(node));
|
|
43
|
+
return transformNullishCoalescingOperationNoPrecedingStatements(context, node, left, right);
|
|
40
44
|
}
|
|
41
45
|
let luaOperator = simpleOperatorsToLua[operator];
|
|
42
46
|
// Check if we need to use string concat operator
|
|
43
47
|
if (operator === ts.SyntaxKind.PlusToken && ts.isBinaryExpression(node)) {
|
|
44
48
|
const typeLeft = context.checker.getTypeAtLocation(node.left);
|
|
45
49
|
const typeRight = context.checker.getTypeAtLocation(node.right);
|
|
46
|
-
const isLeftString = typescript_1.isStringType(context, typeLeft);
|
|
47
|
-
const isRightString = typescript_1.isStringType(context, typeRight);
|
|
50
|
+
const isLeftString = (0, typescript_1.isStringType)(context, typeLeft);
|
|
51
|
+
const isRightString = (0, typescript_1.isStringType)(context, typeRight);
|
|
48
52
|
if (isLeftString || isRightString) {
|
|
49
|
-
left = isLeftString ? left : lua_ast_1.wrapInToStringForConcat(left);
|
|
50
|
-
right = isRightString ? right : lua_ast_1.wrapInToStringForConcat(right);
|
|
53
|
+
left = isLeftString ? left : (0, lua_ast_1.wrapInToStringForConcat)(left);
|
|
54
|
+
right = isRightString ? right : (0, lua_ast_1.wrapInToStringForConcat)(right);
|
|
51
55
|
luaOperator = lua.SyntaxKind.ConcatOperator;
|
|
52
56
|
}
|
|
53
57
|
}
|
|
54
58
|
return lua.createBinaryExpression(left, right, luaOperator, node);
|
|
55
59
|
}
|
|
60
|
+
function createShortCircuitBinaryExpressionPrecedingStatements(context, lhs, rhs, rightPrecedingStatements, operator, node) {
|
|
61
|
+
const conditionIdentifier = context.createTempNameForLuaExpression(lhs);
|
|
62
|
+
const assignmentStatement = lua.createVariableDeclarationStatement(conditionIdentifier, lhs, node === null || node === void 0 ? void 0 : node.left);
|
|
63
|
+
let condition;
|
|
64
|
+
switch (operator) {
|
|
65
|
+
case ts.SyntaxKind.BarBarToken:
|
|
66
|
+
condition = lua.createUnaryExpression(lua.cloneIdentifier(conditionIdentifier), lua.SyntaxKind.NotOperator, node);
|
|
67
|
+
break;
|
|
68
|
+
case ts.SyntaxKind.AmpersandAmpersandToken:
|
|
69
|
+
condition = lua.cloneIdentifier(conditionIdentifier);
|
|
70
|
+
break;
|
|
71
|
+
case ts.SyntaxKind.QuestionQuestionToken:
|
|
72
|
+
condition = lua.createBinaryExpression(lua.cloneIdentifier(conditionIdentifier), lua.createNilLiteral(), lua.SyntaxKind.EqualityOperator, node);
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
const ifStatement = lua.createIfStatement(condition, lua.createBlock([...rightPrecedingStatements, lua.createAssignmentStatement(conditionIdentifier, rhs)]), undefined, node === null || node === void 0 ? void 0 : node.left);
|
|
76
|
+
return [[assignmentStatement, ifStatement], conditionIdentifier];
|
|
77
|
+
}
|
|
78
|
+
exports.createShortCircuitBinaryExpressionPrecedingStatements = createShortCircuitBinaryExpressionPrecedingStatements;
|
|
79
|
+
function transformShortCircuitBinaryExpression(context, node, operator) {
|
|
80
|
+
const lhs = context.transformExpression(node.left);
|
|
81
|
+
const [rightPrecedingStatements, rhs] = (0, preceding_statements_1.transformInPrecedingStatementScope)(context, () => context.transformExpression(node.right));
|
|
82
|
+
return transformBinaryOperation(context, lhs, rhs, rightPrecedingStatements, operator, node);
|
|
83
|
+
}
|
|
84
|
+
function transformBinaryOperation(context, left, right, rightPrecedingStatements, operator, node) {
|
|
85
|
+
if (rightPrecedingStatements.length > 0 && isShortCircuitOperator(operator)) {
|
|
86
|
+
(0, utils_1.assert)(ts.isBinaryExpression(node));
|
|
87
|
+
return createShortCircuitBinaryExpressionPrecedingStatements(context, left, right, rightPrecedingStatements, operator, node);
|
|
88
|
+
}
|
|
89
|
+
return [
|
|
90
|
+
rightPrecedingStatements,
|
|
91
|
+
transformBinaryOperationWithNoPrecedingStatements(context, left, right, operator, node),
|
|
92
|
+
];
|
|
93
|
+
}
|
|
56
94
|
exports.transformBinaryOperation = transformBinaryOperation;
|
|
57
95
|
const transformBinaryExpression = (node, context) => {
|
|
58
96
|
const operator = node.operatorToken.kind;
|
|
59
|
-
const typeOfResult = typeof_1.transformTypeOfBinaryExpression(context, node);
|
|
97
|
+
const typeOfResult = (0, typeof_1.transformTypeOfBinaryExpression)(context, node);
|
|
60
98
|
if (typeOfResult) {
|
|
61
99
|
return typeOfResult;
|
|
62
100
|
}
|
|
63
|
-
if (compound_1.isCompoundAssignmentToken(operator)) {
|
|
64
|
-
const token = compound_1.unwrapCompoundAssignmentToken(operator);
|
|
65
|
-
return compound_1.transformCompoundAssignmentExpression(context, node, node.left, node.right, token, false);
|
|
101
|
+
if ((0, compound_1.isCompoundAssignmentToken)(operator)) {
|
|
102
|
+
const token = (0, compound_1.unwrapCompoundAssignmentToken)(operator);
|
|
103
|
+
return (0, compound_1.transformCompoundAssignmentExpression)(context, node, node.left, node.right, token, false);
|
|
66
104
|
}
|
|
67
105
|
switch (operator) {
|
|
68
106
|
case ts.SyntaxKind.EqualsToken:
|
|
69
|
-
return assignments_1.transformAssignmentExpression(context, node);
|
|
107
|
+
return (0, assignments_1.transformAssignmentExpression)(context, node);
|
|
70
108
|
case ts.SyntaxKind.InKeyword: {
|
|
71
109
|
const lhs = context.transformExpression(node.left);
|
|
72
110
|
const rhs = context.transformExpression(node.right);
|
|
@@ -77,20 +115,31 @@ const transformBinaryExpression = (node, context) => {
|
|
|
77
115
|
const lhs = context.transformExpression(node.left);
|
|
78
116
|
const rhs = context.transformExpression(node.right);
|
|
79
117
|
const rhsType = context.checker.getTypeAtLocation(node.right);
|
|
80
|
-
if (typescript_1.isStandardLibraryType(context, rhsType, "ObjectConstructor")) {
|
|
81
|
-
return lualib_1.transformLuaLibFunction(context, lualib_1.LuaLibFeature.InstanceOfObject, node, lhs);
|
|
118
|
+
if ((0, typescript_1.isStandardLibraryType)(context, rhsType, "ObjectConstructor")) {
|
|
119
|
+
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.InstanceOfObject, node, lhs);
|
|
82
120
|
}
|
|
83
|
-
return lualib_1.transformLuaLibFunction(context, lualib_1.LuaLibFeature.InstanceOf, node, lhs, rhs);
|
|
121
|
+
return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.InstanceOf, node, lhs, rhs);
|
|
84
122
|
}
|
|
85
123
|
case ts.SyntaxKind.CommaToken: {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
124
|
+
const statements = context.transformStatements(ts.factory.createExpressionStatement(node.left));
|
|
125
|
+
const [precedingStatements, result] = (0, preceding_statements_1.transformInPrecedingStatementScope)(context, () => context.transformExpression(node.right));
|
|
126
|
+
statements.push(...precedingStatements);
|
|
127
|
+
context.addPrecedingStatements(statements);
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
case ts.SyntaxKind.QuestionQuestionToken:
|
|
131
|
+
case ts.SyntaxKind.AmpersandAmpersandToken:
|
|
132
|
+
case ts.SyntaxKind.BarBarToken: {
|
|
133
|
+
const [precedingStatements, result] = transformShortCircuitBinaryExpression(context, node, operator);
|
|
134
|
+
context.addPrecedingStatements(precedingStatements);
|
|
135
|
+
return result;
|
|
90
136
|
}
|
|
91
|
-
default:
|
|
92
|
-
return transformBinaryOperation(context, context.transformExpression(node.left), context.transformExpression(node.right), operator, node);
|
|
93
137
|
}
|
|
138
|
+
let [precedingStatements, [lhs, rhs]] = (0, preceding_statements_1.transformInPrecedingStatementScope)(context, () => (0, expression_list_1.transformOrderedExpressions)(context, [node.left, node.right]));
|
|
139
|
+
let result;
|
|
140
|
+
[precedingStatements, result] = transformBinaryOperation(context, lhs, rhs, precedingStatements, operator, node);
|
|
141
|
+
context.addPrecedingStatements(precedingStatements);
|
|
142
|
+
return result;
|
|
94
143
|
};
|
|
95
144
|
exports.transformBinaryExpression = transformBinaryExpression;
|
|
96
145
|
function transformBinaryExpressionStatement(context, node) {
|
|
@@ -98,13 +147,13 @@ function transformBinaryExpressionStatement(context, node) {
|
|
|
98
147
|
if (!ts.isBinaryExpression(expression))
|
|
99
148
|
return;
|
|
100
149
|
const operator = expression.operatorToken.kind;
|
|
101
|
-
if (compound_1.isCompoundAssignmentToken(operator)) {
|
|
150
|
+
if ((0, compound_1.isCompoundAssignmentToken)(operator)) {
|
|
102
151
|
// +=, -=, etc...
|
|
103
|
-
const token = compound_1.unwrapCompoundAssignmentToken(operator);
|
|
104
|
-
return compound_1.transformCompoundAssignmentStatement(context, expression, expression.left, expression.right, token);
|
|
152
|
+
const token = (0, compound_1.unwrapCompoundAssignmentToken)(operator);
|
|
153
|
+
return (0, compound_1.transformCompoundAssignmentStatement)(context, expression, expression.left, expression.right, token);
|
|
105
154
|
}
|
|
106
155
|
else if (operator === ts.SyntaxKind.EqualsToken) {
|
|
107
|
-
return assignments_1.transformAssignmentStatement(context, expression);
|
|
156
|
+
return (0, assignments_1.transformAssignmentStatement)(context, expression);
|
|
108
157
|
}
|
|
109
158
|
else if (operator === ts.SyntaxKind.CommaToken) {
|
|
110
159
|
const statements = [
|
|
@@ -115,21 +164,16 @@ function transformBinaryExpressionStatement(context, node) {
|
|
|
115
164
|
}
|
|
116
165
|
}
|
|
117
166
|
exports.transformBinaryExpressionStatement = transformBinaryExpressionStatement;
|
|
118
|
-
function
|
|
167
|
+
function transformNullishCoalescingOperationNoPrecedingStatements(context, node, transformedLeft, transformedRight) {
|
|
119
168
|
const lhsType = context.checker.getTypeAtLocation(node.left);
|
|
120
169
|
// Check if we can take a shortcut to 'lhs or rhs' if the left-hand side cannot be 'false'.
|
|
121
170
|
const typeCanBeFalse = (type) => (type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown | ts.TypeFlags.Boolean)) !== 0 ||
|
|
122
171
|
(type.flags & ts.TypeFlags.BooleanLiteral & ts.TypeFlags.PossiblyFalsy) !== 0;
|
|
123
|
-
if (typescript_1.typeCanSatisfy(context, lhsType, typeCanBeFalse)) {
|
|
124
|
-
//
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
const ifStatement = lua.createIfStatement(nilComparison, lua.createBlock([lua.createReturnStatement([transformedRight])]), lua.createBlock([lua.createReturnStatement([lua.cloneIdentifier(lhsIdentifier)])]));
|
|
129
|
-
// (function(lhs') if lhs' == nil then return rhs else return lhs' end)(lhs)
|
|
130
|
-
return lua.createCallExpression(lua.createFunctionExpression(lua.createBlock([ifStatement]), [lhsIdentifier]), [
|
|
131
|
-
transformedLeft,
|
|
132
|
-
]);
|
|
172
|
+
if ((0, typescript_1.typeCanSatisfy)(context, lhsType, typeCanBeFalse)) {
|
|
173
|
+
// reuse logic from case with preceding statements
|
|
174
|
+
const [precedingStatements, result] = createShortCircuitBinaryExpressionPrecedingStatements(context, transformedLeft, transformedRight, [], ts.SyntaxKind.QuestionQuestionToken, node);
|
|
175
|
+
context.addPrecedingStatements(precedingStatements);
|
|
176
|
+
return result;
|
|
133
177
|
}
|
|
134
178
|
else {
|
|
135
179
|
// lhs or rhs
|
|
@@ -9,16 +9,16 @@ function transformBlockOrStatement(context, statement) {
|
|
|
9
9
|
}
|
|
10
10
|
exports.transformBlockOrStatement = transformBlockOrStatement;
|
|
11
11
|
function transformScopeBlock(context, node, scopeType) {
|
|
12
|
-
scope_1.pushScope(context, scopeType);
|
|
13
|
-
const statements = scope_1.performHoisting(context, context.transformStatements(node.statements));
|
|
14
|
-
const scope = scope_1.popScope(context);
|
|
12
|
+
(0, scope_1.pushScope)(context, scopeType);
|
|
13
|
+
const statements = (0, scope_1.performHoisting)(context, context.transformStatements(node.statements));
|
|
14
|
+
const scope = (0, scope_1.popScope)(context);
|
|
15
15
|
return [lua.createBlock(statements, node), scope];
|
|
16
16
|
}
|
|
17
17
|
exports.transformScopeBlock = transformScopeBlock;
|
|
18
18
|
const transformBlock = (node, context) => {
|
|
19
|
-
scope_1.pushScope(context, scope_1.ScopeType.Block);
|
|
20
|
-
const statements = scope_1.performHoisting(context, context.transformStatements(node.statements));
|
|
21
|
-
scope_1.popScope(context);
|
|
19
|
+
(0, scope_1.pushScope)(context, scope_1.ScopeType.Block);
|
|
20
|
+
const statements = (0, scope_1.performHoisting)(context, context.transformStatements(node.statements));
|
|
21
|
+
(0, scope_1.popScope)(context);
|
|
22
22
|
return lua.createDoStatement(statements, node);
|
|
23
23
|
};
|
|
24
24
|
exports.transformBlock = transformBlock;
|
|
@@ -6,21 +6,16 @@ const lua = require("../../LuaAST");
|
|
|
6
6
|
const diagnostics_1 = require("../utils/diagnostics");
|
|
7
7
|
const scope_1 = require("../utils/scope");
|
|
8
8
|
const transformBreakStatement = (breakStatement, context) => {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return lua.createGotoStatement(`____switch${breakableScope.id}_end`);
|
|
12
|
-
}
|
|
13
|
-
else {
|
|
14
|
-
return lua.createBreakStatement(breakStatement);
|
|
15
|
-
}
|
|
9
|
+
void context;
|
|
10
|
+
return lua.createBreakStatement(breakStatement);
|
|
16
11
|
};
|
|
17
12
|
exports.transformBreakStatement = transformBreakStatement;
|
|
18
13
|
const transformContinueStatement = (statement, context) => {
|
|
19
14
|
var _a;
|
|
20
15
|
if (context.luaTarget === CompilerOptions_1.LuaTarget.Universal || context.luaTarget === CompilerOptions_1.LuaTarget.Lua51) {
|
|
21
|
-
context.diagnostics.push(diagnostics_1.unsupportedForTarget(statement, "Continue statement", CompilerOptions_1.LuaTarget.Lua51));
|
|
16
|
+
context.diagnostics.push((0, diagnostics_1.unsupportedForTarget)(statement, "Continue statement", CompilerOptions_1.LuaTarget.Lua51));
|
|
22
17
|
}
|
|
23
|
-
const scope = scope_1.findScope(context, scope_1.ScopeType.Loop);
|
|
18
|
+
const scope = (0, scope_1.findScope)(context, scope_1.ScopeType.Loop);
|
|
24
19
|
if (scope) {
|
|
25
20
|
scope.loopContinued = true;
|
|
26
21
|
}
|
|
@@ -4,7 +4,8 @@ import { FunctionVisitor, TransformationContext } from "../context";
|
|
|
4
4
|
export declare type PropertyCallExpression = ts.CallExpression & {
|
|
5
5
|
expression: ts.PropertyAccessExpression;
|
|
6
6
|
};
|
|
7
|
-
export declare function
|
|
7
|
+
export declare function validateArguments(context: TransformationContext, params: readonly ts.Expression[], signature?: ts.Signature): void;
|
|
8
8
|
export declare function transformArguments(context: TransformationContext, params: readonly ts.Expression[], signature?: ts.Signature, callContext?: ts.Expression): lua.Expression[];
|
|
9
|
-
export declare function
|
|
9
|
+
export declare function transformCallAndArguments(context: TransformationContext, callExpression: ts.Expression, params: readonly ts.Expression[], signature?: ts.Signature, callContext?: ts.Expression): [lua.Expression, lua.Expression[]];
|
|
10
|
+
export declare function transformContextualCallExpression(context: TransformationContext, node: ts.CallExpression | ts.TaggedTemplateExpression, args: ts.Expression[] | ts.NodeArray<ts.Expression>, signature?: ts.Signature): lua.Expression;
|
|
10
11
|
export declare const transformCallExpression: FunctionVisitor<ts.CallExpression>;
|