typescript-to-lua 1.0.1 → 1.3.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.
Files changed (194) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/dist/CompilerOptions.d.ts +4 -3
  3. package/dist/LuaAST.d.ts +1 -0
  4. package/dist/LuaAST.js +14 -6
  5. package/dist/LuaLib.d.ts +4 -3
  6. package/dist/LuaLib.js +6 -5
  7. package/dist/LuaPrinter.d.ts +15 -4
  8. package/dist/LuaPrinter.js +81 -29
  9. package/dist/cli/diagnostics.js +2 -2
  10. package/dist/cli/parse.d.ts +1 -1
  11. package/dist/cli/parse.js +14 -0
  12. package/dist/cli/report.js +1 -1
  13. package/dist/cli/tsconfig.js +4 -4
  14. package/dist/lualib/ArrayFlat.lua +1 -1
  15. package/dist/lualib/ArrayFlatMap.lua +1 -1
  16. package/dist/lualib/ArrayIsArray.lua +1 -1
  17. package/dist/lualib/ArrayReduce.lua +7 -1
  18. package/dist/lualib/ArrayReduceRight.lua +7 -1
  19. package/dist/lualib/ArraySetLength.lua +1 -1
  20. package/dist/lualib/ArraySplice.lua +5 -5
  21. package/dist/lualib/Await.lua +43 -19
  22. package/dist/lualib/CloneDescriptor.lua +7 -7
  23. package/dist/lualib/Decorate.lua +1 -1
  24. package/dist/lualib/DelegatedYield.lua +1 -3
  25. package/dist/lualib/Delete.lua +6 -6
  26. package/dist/lualib/Error.lua +47 -44
  27. package/dist/lualib/Generator.lua +1 -5
  28. package/dist/lualib/InstanceOf.lua +1 -1
  29. package/dist/lualib/InstanceOfObject.lua +1 -1
  30. package/dist/lualib/Map.lua +130 -134
  31. package/dist/lualib/Number.lua +1 -1
  32. package/dist/lualib/NumberIsFinite.lua +1 -1
  33. package/dist/lualib/NumberToString.lua +3 -5
  34. package/dist/lualib/ObjectDefineProperty.lua +40 -8
  35. package/dist/lualib/ParseFloat.lua +9 -5
  36. package/dist/lualib/ParseInt.lua +15 -3
  37. package/dist/lualib/Promise.lua +44 -26
  38. package/dist/lualib/Set.lua +119 -123
  39. package/dist/lualib/SetDescriptor.lua +7 -1
  40. package/dist/lualib/SourceMapTraceBack.lua +19 -9
  41. package/dist/lualib/SparseArrayNew.lua +5 -0
  42. package/dist/lualib/SparseArrayPush.lua +9 -0
  43. package/dist/lualib/SparseArraySpread.lua +4 -0
  44. package/dist/lualib/StringAccess.lua +1 -1
  45. package/dist/lualib/StringCharCodeAt.lua +1 -1
  46. package/dist/lualib/StringEndsWith.lua +2 -2
  47. package/dist/lualib/StringPadEnd.lua +2 -2
  48. package/dist/lualib/StringPadStart.lua +2 -2
  49. package/dist/lualib/StringReplace.lua +12 -11
  50. package/dist/lualib/StringReplaceAll.lua +35 -0
  51. package/dist/lualib/StringSlice.lua +2 -2
  52. package/dist/lualib/StringSplit.lua +3 -3
  53. package/dist/lualib/StringStartsWith.lua +1 -1
  54. package/dist/lualib/StringSubstr.lua +1 -1
  55. package/dist/lualib/StringSubstring.lua +2 -2
  56. package/dist/lualib/Symbol.lua +3 -5
  57. package/dist/lualib/WeakMap.lua +40 -42
  58. package/dist/lualib/WeakSet.lua +36 -38
  59. package/dist/lualib/lualib_bundle.lua +876 -745
  60. package/dist/transformation/builtins/array.js +29 -30
  61. package/dist/transformation/builtins/console.js +2 -2
  62. package/dist/transformation/builtins/function.js +14 -12
  63. package/dist/transformation/builtins/global.js +8 -8
  64. package/dist/transformation/builtins/index.d.ts +1 -1
  65. package/dist/transformation/builtins/index.js +69 -36
  66. package/dist/transformation/builtins/math.js +4 -4
  67. package/dist/transformation/builtins/number.js +7 -7
  68. package/dist/transformation/builtins/object.d.ts +2 -1
  69. package/dist/transformation/builtins/object.js +12 -13
  70. package/dist/transformation/builtins/promise.js +9 -9
  71. package/dist/transformation/builtins/string.js +32 -31
  72. package/dist/transformation/builtins/symbol.js +3 -3
  73. package/dist/transformation/context/context.d.ts +12 -0
  74. package/dist/transformation/context/context.js +105 -6
  75. package/dist/transformation/index.js +1 -1
  76. package/dist/transformation/utils/annotations.d.ts +1 -3
  77. package/dist/transformation/utils/annotations.js +0 -2
  78. package/dist/transformation/utils/assignment-validation.js +8 -7
  79. package/dist/transformation/utils/diagnostics.d.ts +9 -0
  80. package/dist/transformation/utils/diagnostics.js +8 -5
  81. package/dist/transformation/utils/export.d.ts +3 -2
  82. package/dist/transformation/utils/export.js +14 -7
  83. package/dist/transformation/utils/function-context.js +8 -8
  84. package/dist/transformation/utils/language-extensions.d.ts +2 -0
  85. package/dist/transformation/utils/language-extensions.js +7 -1
  86. package/dist/transformation/utils/lua-ast.d.ts +0 -1
  87. package/dist/transformation/utils/lua-ast.js +25 -35
  88. package/dist/transformation/utils/lualib.js +1 -1
  89. package/dist/transformation/utils/preceding-statements.d.ts +3 -0
  90. package/dist/transformation/utils/preceding-statements.js +11 -0
  91. package/dist/transformation/utils/safe-names.d.ts +4 -2
  92. package/dist/transformation/utils/safe-names.js +13 -7
  93. package/dist/transformation/utils/scope.d.ts +9 -1
  94. package/dist/transformation/utils/scope.js +78 -40
  95. package/dist/transformation/utils/symbols.js +6 -6
  96. package/dist/transformation/utils/typescript/index.d.ts +1 -0
  97. package/dist/transformation/utils/typescript/index.js +16 -1
  98. package/dist/transformation/utils/typescript/nodes.d.ts +2 -0
  99. package/dist/transformation/utils/typescript/nodes.js +21 -1
  100. package/dist/transformation/utils/typescript/types.d.ts +3 -1
  101. package/dist/transformation/utils/typescript/types.js +40 -13
  102. package/dist/transformation/visitors/access.d.ts +3 -0
  103. package/dist/transformation/visitors/access.js +74 -47
  104. package/dist/transformation/visitors/async-await.js +5 -4
  105. package/dist/transformation/visitors/binary-expression/assignments.d.ts +3 -2
  106. package/dist/transformation/visitors/binary-expression/assignments.js +86 -77
  107. package/dist/transformation/visitors/binary-expression/bit.js +4 -4
  108. package/dist/transformation/visitors/binary-expression/compound.d.ts +5 -4
  109. package/dist/transformation/visitors/binary-expression/compound.js +69 -71
  110. package/dist/transformation/visitors/binary-expression/destructuring-assignments.d.ts +2 -2
  111. package/dist/transformation/visitors/binary-expression/destructuring-assignments.js +65 -36
  112. package/dist/transformation/visitors/binary-expression/index.d.ts +3 -1
  113. package/dist/transformation/visitors/binary-expression/index.js +84 -42
  114. package/dist/transformation/visitors/block.js +6 -6
  115. package/dist/transformation/visitors/break-continue.js +2 -2
  116. package/dist/transformation/visitors/call.d.ts +3 -2
  117. package/dist/transformation/visitors/call.js +130 -143
  118. package/dist/transformation/visitors/class/decorators.js +3 -3
  119. package/dist/transformation/visitors/class/index.js +43 -39
  120. package/dist/transformation/visitors/class/members/accessors.js +6 -6
  121. package/dist/transformation/visitors/class/members/constructor.js +7 -7
  122. package/dist/transformation/visitors/class/members/fields.js +6 -6
  123. package/dist/transformation/visitors/class/members/method.js +6 -6
  124. package/dist/transformation/visitors/class/new.js +14 -16
  125. package/dist/transformation/visitors/class/setup.js +11 -11
  126. package/dist/transformation/visitors/class/utils.js +2 -2
  127. package/dist/transformation/visitors/conditional.js +36 -43
  128. package/dist/transformation/visitors/delete.js +8 -4
  129. package/dist/transformation/visitors/enum.js +8 -8
  130. package/dist/transformation/visitors/errors.js +35 -33
  131. package/dist/transformation/visitors/expression-list.d.ts +7 -0
  132. package/dist/transformation/visitors/expression-list.js +120 -0
  133. package/dist/transformation/visitors/expression-statement.js +10 -6
  134. package/dist/transformation/visitors/function.d.ts +2 -0
  135. package/dist/transformation/visitors/function.js +80 -33
  136. package/dist/transformation/visitors/identifier.js +26 -22
  137. package/dist/transformation/visitors/index.js +2 -2
  138. package/dist/transformation/visitors/language-extensions/iterable.js +7 -7
  139. package/dist/transformation/visitors/language-extensions/multi.d.ts +1 -1
  140. package/dist/transformation/visitors/language-extensions/multi.js +3 -3
  141. package/dist/transformation/visitors/language-extensions/operators.js +6 -6
  142. package/dist/transformation/visitors/language-extensions/pairsIterable.d.ts +5 -0
  143. package/dist/transformation/visitors/language-extensions/pairsIterable.js +53 -0
  144. package/dist/transformation/visitors/language-extensions/range.js +6 -6
  145. package/dist/transformation/visitors/language-extensions/table.js +5 -5
  146. package/dist/transformation/visitors/literal.d.ts +1 -2
  147. package/dist/transformation/visitors/literal.js +87 -57
  148. package/dist/transformation/visitors/loops/do-while.js +35 -9
  149. package/dist/transformation/visitors/loops/for-in.js +4 -4
  150. package/dist/transformation/visitors/loops/for-of.js +17 -13
  151. package/dist/transformation/visitors/loops/for.js +28 -8
  152. package/dist/transformation/visitors/loops/utils.d.ts +1 -0
  153. package/dist/transformation/visitors/loops/utils.js +26 -10
  154. package/dist/transformation/visitors/modules/export.js +14 -15
  155. package/dist/transformation/visitors/modules/import.js +10 -10
  156. package/dist/transformation/visitors/namespace.js +13 -13
  157. package/dist/transformation/visitors/optional-chaining.d.ts +16 -0
  158. package/dist/transformation/visitors/optional-chaining.js +172 -0
  159. package/dist/transformation/visitors/return.d.ts +1 -0
  160. package/dist/transformation/visitors/return.js +40 -26
  161. package/dist/transformation/visitors/sourceFile.js +12 -9
  162. package/dist/transformation/visitors/spread.js +23 -16
  163. package/dist/transformation/visitors/switch.js +63 -20
  164. package/dist/transformation/visitors/template.js +10 -7
  165. package/dist/transformation/visitors/typeof.js +4 -2
  166. package/dist/transformation/visitors/typescript.js +1 -1
  167. package/dist/transformation/visitors/unary-expression.js +9 -9
  168. package/dist/transformation/visitors/variable-declaration.js +55 -32
  169. package/dist/transformation/visitors/void.d.ts +6 -0
  170. package/dist/transformation/visitors/void.js +20 -0
  171. package/dist/transpilation/bundle.d.ts +3 -0
  172. package/dist/transpilation/bundle.js +52 -10
  173. package/dist/transpilation/diagnostics.js +3 -3
  174. package/dist/transpilation/index.js +2 -2
  175. package/dist/transpilation/output-collector.js +2 -2
  176. package/dist/transpilation/plugins.js +1 -1
  177. package/dist/transpilation/resolve.js +20 -13
  178. package/dist/transpilation/transformers.js +45 -25
  179. package/dist/transpilation/transpile.js +6 -6
  180. package/dist/transpilation/transpiler.js +8 -8
  181. package/dist/transpilation/utils.js +5 -3
  182. package/dist/tstl.js +8 -8
  183. package/dist/utils.js +2 -2
  184. package/language-extensions/index.d.ts +11 -1
  185. package/package.json +15 -12
  186. package/dist/lualib/OptionalChainAccess.lua +0 -6
  187. package/dist/lualib/OptionalFunctionCall.lua +0 -6
  188. package/dist/lualib/OptionalMethodCall.lua +0 -11
  189. package/dist/transformation/utils/transform.d.ts +0 -8
  190. package/dist/transformation/utils/transform.js +0 -14
  191. package/dist/transformation/visitors/jsx/jsx.d.ts +0 -9
  192. package/dist/transformation/visitors/jsx/jsx.js +0 -237
  193. package/dist/transformation/visitors/jsx/xhtml.d.ts +0 -3
  194. package/dist/transformation/visitors/jsx/xhtml.js +0 -260
@@ -9,9 +9,9 @@ const lualib_1 = require("../../utils/lualib");
9
9
  function transformDecoratorExpression(context, decorator) {
10
10
  const expression = decorator.expression;
11
11
  const type = context.checker.getTypeAtLocation(expression);
12
- const callContext = function_context_1.getFunctionContextType(context, type);
12
+ const callContext = (0, function_context_1.getFunctionContextType)(context, type);
13
13
  if (callContext === function_context_1.ContextType.Void) {
14
- context.diagnostics.push(diagnostics_1.decoratorInvalidContext(decorator));
14
+ context.diagnostics.push((0, diagnostics_1.decoratorInvalidContext)(decorator));
15
15
  }
16
16
  return context.transformExpression(expression);
17
17
  }
@@ -26,7 +26,7 @@ function createDecoratingExpression(context, kind, decorators, targetTableName,
26
26
  kind === ts.SyntaxKind.SetAccessor;
27
27
  trailingExpressions.push(isMethodOrAccessor ? lua.createBooleanLiteral(true) : lua.createNilLiteral());
28
28
  }
29
- return lualib_1.transformLuaLibFunction(context, lualib_1.LuaLibFeature.Decorate, undefined, ...trailingExpressions);
29
+ return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.Decorate, undefined, ...trailingExpressions);
30
30
  }
31
31
  exports.createDecoratingExpression = createDecoratingExpression;
32
32
  //# sourceMappingURL=decorators.js.map
@@ -9,7 +9,6 @@ const diagnostics_1 = require("../../utils/diagnostics");
9
9
  const export_1 = require("../../utils/export");
10
10
  const lua_ast_1 = require("../../utils/lua-ast");
11
11
  const safe_names_1 = require("../../utils/safe-names");
12
- const transform_1 = require("../../utils/transform");
13
12
  const identifier_1 = require("../identifier");
14
13
  const decorators_1 = require("./decorators");
15
14
  const accessors_1 = require("./members/accessors");
@@ -21,8 +20,8 @@ const setup_1 = require("./setup");
21
20
  const utils_2 = require("./utils");
22
21
  const transformClassDeclaration = (declaration, context) => {
23
22
  // If declaration is a default export, transform to export variable assignment instead
24
- if (export_1.hasDefaultExportModifier(declaration)) {
25
- const left = export_1.createExportedIdentifier(context, export_1.createDefaultExportIdentifier(declaration));
23
+ if ((0, export_1.hasDefaultExportModifier)(declaration)) {
24
+ const left = (0, export_1.createDefaultExportExpression)(declaration);
26
25
  const right = transformClassAsExpression(declaration, context);
27
26
  return [lua.createAssignmentStatement(left, right, declaration)];
28
27
  }
@@ -30,13 +29,12 @@ const transformClassDeclaration = (declaration, context) => {
30
29
  return statements;
31
30
  };
32
31
  exports.transformClassDeclaration = transformClassDeclaration;
33
- const transformThisExpression = node => lua_ast_1.createSelfIdentifier(node);
32
+ const transformThisExpression = node => (0, lua_ast_1.createSelfIdentifier)(node);
34
33
  exports.transformThisExpression = transformThisExpression;
35
34
  function transformClassAsExpression(expression, context) {
36
- return transform_1.transformToImmediatelyInvokedFunctionExpression(context, () => {
37
- const { statements, name } = transformClassLikeDeclaration(expression, context);
38
- return { statements: lua_ast_1.unwrapVisitorResult(statements), result: name };
39
- }, expression);
35
+ const { statements, name } = transformClassLikeDeclaration(expression, context);
36
+ context.addPrecedingStatements(statements);
37
+ return name;
40
38
  }
41
39
  exports.transformClassAsExpression = transformClassAsExpression;
42
40
  const classSuperInfos = new WeakMap();
@@ -46,52 +44,51 @@ function transformClassLikeDeclaration(classDeclaration, context, nameOverride)
46
44
  className = nameOverride;
47
45
  }
48
46
  else if (classDeclaration.name !== undefined) {
49
- className = identifier_1.transformIdentifier(context, classDeclaration.name);
47
+ className = (0, identifier_1.transformIdentifier)(context, classDeclaration.name);
50
48
  }
51
49
  else {
52
- // TypeScript error
53
- className = lua.createAnonymousIdentifier();
50
+ className = lua.createIdentifier(context.createTempName("class"), classDeclaration);
54
51
  }
55
- const annotations = annotations_1.getTypeAnnotations(context.checker.getTypeAtLocation(classDeclaration));
52
+ const annotations = (0, annotations_1.getTypeAnnotations)(context.checker.getTypeAtLocation(classDeclaration));
56
53
  if (annotations.has(annotations_1.AnnotationKind.Extension)) {
57
- context.diagnostics.push(diagnostics_1.annotationRemoved(classDeclaration, annotations_1.AnnotationKind.Extension));
54
+ context.diagnostics.push((0, diagnostics_1.annotationRemoved)(classDeclaration, annotations_1.AnnotationKind.Extension));
58
55
  }
59
56
  if (annotations.has(annotations_1.AnnotationKind.MetaExtension)) {
60
- context.diagnostics.push(diagnostics_1.annotationRemoved(classDeclaration, annotations_1.AnnotationKind.MetaExtension));
57
+ context.diagnostics.push((0, diagnostics_1.annotationRemoved)(classDeclaration, annotations_1.AnnotationKind.MetaExtension));
61
58
  }
62
59
  // Get type that is extended
63
- const extendedTypeNode = utils_2.getExtendedNode(context, classDeclaration);
64
- const extendedType = utils_2.getExtendedType(context, classDeclaration);
65
- const superInfo = utils_1.getOrUpdate(classSuperInfos, context, () => []);
60
+ const extendedTypeNode = (0, utils_2.getExtendedNode)(context, classDeclaration);
61
+ const extendedType = (0, utils_2.getExtendedType)(context, classDeclaration);
62
+ const superInfo = (0, utils_1.getOrUpdate)(classSuperInfos, context, () => []);
66
63
  superInfo.push({ className, extendedTypeNode });
67
64
  if (extendedType) {
68
- new_1.checkForLuaLibType(context, extendedType);
65
+ (0, new_1.checkForLuaLibType)(context, extendedType);
69
66
  }
70
67
  // Get all properties with value
71
68
  const properties = classDeclaration.members.filter(ts.isPropertyDeclaration).filter(member => member.initializer);
72
69
  // Divide properties into static and non-static
73
- const instanceFields = properties.filter(prop => !utils_2.isStaticNode(prop));
70
+ const instanceFields = properties.filter(prop => !(0, utils_2.isStaticNode)(prop));
74
71
  const result = [];
75
72
  let localClassName;
76
- if (safe_names_1.isUnsafeName(className.text)) {
77
- localClassName = lua.createIdentifier(safe_names_1.createSafeName(className.text), undefined, className.symbolId, className.text);
73
+ if ((0, safe_names_1.isUnsafeName)(className.text, context.options)) {
74
+ localClassName = lua.createIdentifier((0, safe_names_1.createSafeName)(className.text), undefined, className.symbolId, className.text);
78
75
  lua.setNodePosition(localClassName, className);
79
76
  }
80
77
  else {
81
78
  localClassName = className;
82
79
  }
83
- result.push(...setup_1.createClassSetup(context, classDeclaration, className, localClassName, extendedType));
80
+ result.push(...(0, setup_1.createClassSetup)(context, classDeclaration, className, localClassName, extendedType));
84
81
  // Find first constructor with body
85
82
  const constructor = classDeclaration.members.find((n) => ts.isConstructorDeclaration(n) && n.body !== undefined);
86
83
  if (constructor) {
87
84
  // Add constructor plus initialization of instance fields
88
- const constructorResult = constructor_1.transformConstructorDeclaration(context, constructor, localClassName, instanceFields, classDeclaration);
85
+ const constructorResult = (0, constructor_1.transformConstructorDeclaration)(context, constructor, localClassName, instanceFields, classDeclaration);
89
86
  if (constructorResult)
90
87
  result.push(constructorResult);
91
88
  }
92
89
  else if (!extendedType) {
93
90
  // Generate a constructor if none was defined in a base class
94
- const constructorResult = constructor_1.transformConstructorDeclaration(context, ts.factory.createConstructorDeclaration([], [], [], ts.factory.createBlock([], true)), localClassName, instanceFields, classDeclaration);
91
+ const constructorResult = (0, constructor_1.transformConstructorDeclaration)(context, ts.factory.createConstructorDeclaration([], [], [], ts.factory.createBlock([], true)), localClassName, instanceFields, classDeclaration);
95
92
  if (constructorResult)
96
93
  result.push(constructorResult);
97
94
  }
@@ -100,11 +97,11 @@ function transformClassLikeDeclaration(classDeclaration, context, nameOverride)
100
97
  // localClassName.prototype.____constructor = function(self, ...)
101
98
  // baseClassName.prototype.____constructor(self, ...)
102
99
  // ...
103
- const constructorBody = fields_1.transformClassInstanceFields(context, instanceFields);
104
- const superCall = lua.createExpressionStatement(lua.createCallExpression(lua.createTableIndexExpression(context.transformExpression(ts.factory.createSuper()), lua.createStringLiteral("____constructor")), [lua_ast_1.createSelfIdentifier(), lua.createDotsLiteral()]));
100
+ const constructorBody = (0, fields_1.transformClassInstanceFields)(context, instanceFields);
101
+ const superCall = lua.createExpressionStatement(lua.createCallExpression(lua.createTableIndexExpression(context.transformExpression(ts.factory.createSuper()), lua.createStringLiteral("____constructor")), [(0, lua_ast_1.createSelfIdentifier)(), lua.createDotsLiteral()]));
105
102
  constructorBody.unshift(superCall);
106
- const constructorFunction = lua.createFunctionExpression(lua.createBlock(constructorBody), [lua_ast_1.createSelfIdentifier()], lua.createDotsLiteral(), lua.FunctionExpressionFlags.Declaration);
107
- result.push(lua.createAssignmentStatement(constructor_1.createConstructorName(localClassName), constructorFunction, classDeclaration));
103
+ const constructorFunction = lua.createFunctionExpression(lua.createBlock(constructorBody), [(0, lua_ast_1.createSelfIdentifier)()], lua.createDotsLiteral(), lua.FunctionExpressionFlags.Declaration);
104
+ result.push(lua.createAssignmentStatement((0, constructor_1.createConstructorName)(localClassName), constructorFunction, classDeclaration));
108
105
  }
109
106
  // Transform accessors
110
107
  for (const member of classDeclaration.members) {
@@ -113,7 +110,7 @@ function transformClassLikeDeclaration(classDeclaration, context, nameOverride)
113
110
  const accessors = context.resolver.getAllAccessorDeclarations(member);
114
111
  if (accessors.firstAccessor !== member)
115
112
  continue;
116
- const accessorsResult = accessors_1.transformAccessorDeclarations(context, accessors, localClassName);
113
+ const accessorsResult = (0, accessors_1.transformAccessorDeclarations)(context, accessors, localClassName);
117
114
  if (accessorsResult) {
118
115
  result.push(accessorsResult);
119
116
  }
@@ -121,27 +118,27 @@ function transformClassLikeDeclaration(classDeclaration, context, nameOverride)
121
118
  const decorationStatements = [];
122
119
  for (const member of classDeclaration.members) {
123
120
  if (ts.isAccessor(member)) {
124
- const expression = fields_1.createPropertyDecoratingExpression(context, member, localClassName);
121
+ const expression = (0, fields_1.createPropertyDecoratingExpression)(context, member, localClassName);
125
122
  if (expression)
126
123
  decorationStatements.push(lua.createExpressionStatement(expression));
127
124
  }
128
125
  else if (ts.isMethodDeclaration(member)) {
129
- const statement = method_1.transformMethodDeclaration(context, member, localClassName);
126
+ const statement = (0, method_1.transformMethodDeclaration)(context, member, localClassName);
130
127
  if (statement)
131
128
  result.push(statement);
132
129
  if (member.body) {
133
- const statement = method_1.createMethodDecoratingExpression(context, member, localClassName);
130
+ const statement = (0, method_1.createMethodDecoratingExpression)(context, member, localClassName);
134
131
  if (statement)
135
132
  decorationStatements.push(statement);
136
133
  }
137
134
  }
138
135
  else if (ts.isPropertyDeclaration(member)) {
139
- if (utils_2.isStaticNode(member)) {
140
- const statement = fields_1.transformStaticPropertyDeclaration(context, member, localClassName);
136
+ if ((0, utils_2.isStaticNode)(member)) {
137
+ const statement = (0, fields_1.transformStaticPropertyDeclaration)(context, member, localClassName);
141
138
  if (statement)
142
139
  decorationStatements.push(statement);
143
140
  }
144
- const expression = fields_1.createPropertyDecoratingExpression(context, member, localClassName);
141
+ const expression = (0, fields_1.createPropertyDecoratingExpression)(context, member, localClassName);
145
142
  if (expression)
146
143
  decorationStatements.push(lua.createExpressionStatement(expression));
147
144
  }
@@ -149,15 +146,22 @@ function transformClassLikeDeclaration(classDeclaration, context, nameOverride)
149
146
  result.push(...decorationStatements);
150
147
  // Decorate the class
151
148
  if (classDeclaration.decorators) {
152
- const decoratingExpression = decorators_1.createDecoratingExpression(context, classDeclaration.kind, classDeclaration.decorators.map(d => decorators_1.transformDecoratorExpression(context, d)), localClassName);
149
+ const decoratingExpression = (0, decorators_1.createDecoratingExpression)(context, classDeclaration.kind, classDeclaration.decorators.map(d => (0, decorators_1.transformDecoratorExpression)(context, d)), localClassName);
153
150
  const decoratingStatement = lua.createAssignmentStatement(localClassName, decoratingExpression);
154
151
  result.push(decoratingStatement);
152
+ if ((0, export_1.hasExportModifier)(classDeclaration)) {
153
+ const exportExpression = (0, export_1.hasDefaultExportModifier)(classDeclaration)
154
+ ? (0, export_1.createDefaultExportExpression)(classDeclaration)
155
+ : (0, export_1.createExportedIdentifier)(context, className);
156
+ const classAssignment = lua.createAssignmentStatement(exportExpression, localClassName);
157
+ result.push(classAssignment);
158
+ }
155
159
  }
156
160
  superInfo.pop();
157
161
  return { statements: result, name: className };
158
162
  }
159
163
  const transformSuperExpression = (expression, context) => {
160
- const superInfos = utils_1.getOrUpdate(classSuperInfos, context, () => []);
164
+ const superInfos = (0, utils_1.getOrUpdate)(classSuperInfos, context, () => []);
161
165
  const superInfo = superInfos[superInfos.length - 1];
162
166
  if (!superInfo)
163
167
  return lua.createAnonymousIdentifier(expression);
@@ -167,9 +171,9 @@ const transformSuperExpression = (expression, context) => {
167
171
  let baseClassName;
168
172
  if (extendsExpression && ts.isIdentifier(extendsExpression)) {
169
173
  const symbol = context.checker.getSymbolAtLocation(extendsExpression);
170
- if (symbol && !export_1.isSymbolExported(context, symbol)) {
174
+ if (symbol && !(0, export_1.isSymbolExported)(context, symbol)) {
171
175
  // Use "baseClassName" if base is a simple identifier
172
- baseClassName = identifier_1.transformIdentifier(context, extendsExpression);
176
+ baseClassName = (0, identifier_1.transformIdentifier)(context, extendsExpression);
173
177
  }
174
178
  }
175
179
  if (!baseClassName) {
@@ -9,12 +9,12 @@ const literal_1 = require("../../literal");
9
9
  const utils_1 = require("../utils");
10
10
  const constructor_1 = require("./constructor");
11
11
  function transformAccessor(context, node) {
12
- const [params, dot, restParam] = function_1.transformParameters(context, node.parameters, lua_ast_1.createSelfIdentifier());
13
- const body = node.body ? function_1.transformFunctionBody(context, node.parameters, node.body, restParam)[0] : [];
12
+ const [params, dot, restParam] = (0, function_1.transformParameters)(context, node.parameters, (0, lua_ast_1.createSelfIdentifier)());
13
+ const body = node.body ? (0, function_1.transformFunctionBody)(context, node.parameters, node.body, restParam)[0] : [];
14
14
  return lua.createFunctionExpression(lua.createBlock(body), params, dot, lua.FunctionExpressionFlags.Declaration);
15
15
  }
16
16
  function transformAccessorDeclarations(context, { firstAccessor, getAccessor, setAccessor }, className) {
17
- const propertyName = literal_1.transformPropertyName(context, firstAccessor.name);
17
+ const propertyName = (0, literal_1.transformPropertyName)(context, firstAccessor.name);
18
18
  const descriptor = lua.createTableExpression([]);
19
19
  if (getAccessor) {
20
20
  const getterFunction = transformAccessor(context, getAccessor);
@@ -24,13 +24,13 @@ function transformAccessorDeclarations(context, { firstAccessor, getAccessor, se
24
24
  const setterFunction = transformAccessor(context, setAccessor);
25
25
  descriptor.fields.push(lua.createTableFieldExpression(setterFunction, lua.createStringLiteral("set")));
26
26
  }
27
- const isStatic = utils_1.isStaticNode(firstAccessor);
28
- const target = isStatic ? lua.cloneIdentifier(className) : constructor_1.createPrototypeName(className);
27
+ const isStatic = (0, utils_1.isStaticNode)(firstAccessor);
28
+ const target = isStatic ? lua.cloneIdentifier(className) : (0, constructor_1.createPrototypeName)(className);
29
29
  const feature = isStatic ? lualib_1.LuaLibFeature.ObjectDefineProperty : lualib_1.LuaLibFeature.SetDescriptor;
30
30
  const parameters = [target, propertyName, descriptor];
31
31
  if (!isStatic)
32
32
  parameters.push(lua.createBooleanLiteral(true));
33
- const call = lualib_1.transformLuaLibFunction(context, feature, undefined, ...parameters);
33
+ const call = (0, lualib_1.transformLuaLibFunction)(context, feature, undefined, ...parameters);
34
34
  return lua.createExpressionStatement(call);
35
35
  }
36
36
  exports.transformAccessorDeclarations = transformAccessorDeclarations;
@@ -22,14 +22,14 @@ function transformConstructorDeclaration(context, statement, className, instance
22
22
  return undefined;
23
23
  }
24
24
  // Transform body
25
- const scope = scope_1.pushScope(context, scope_1.ScopeType.Function);
26
- const body = function_1.transformFunctionBodyContent(context, statement.body);
27
- const [params, dotsLiteral, restParamName] = function_1.transformParameters(context, statement.parameters, lua_ast_1.createSelfIdentifier());
25
+ const scope = (0, scope_1.pushScope)(context, scope_1.ScopeType.Function);
26
+ const body = (0, function_1.transformFunctionBodyContent)(context, statement.body);
27
+ const [params, dotsLiteral, restParamName] = (0, function_1.transformParameters)(context, statement.parameters, (0, lua_ast_1.createSelfIdentifier)());
28
28
  // Make sure default parameters are assigned before fields are initialized
29
- const bodyWithFieldInitializers = function_1.transformFunctionBodyHeader(context, scope, statement.parameters, restParamName);
29
+ const bodyWithFieldInitializers = (0, function_1.transformFunctionBodyHeader)(context, scope, statement.parameters, restParamName);
30
30
  // Check for field declarations in constructor
31
31
  const constructorFieldsDeclarations = statement.parameters.filter(p => p.modifiers !== undefined);
32
- const classInstanceFields = fields_1.transformClassInstanceFields(context, instanceFields);
32
+ const classInstanceFields = (0, fields_1.transformClassInstanceFields)(context, instanceFields);
33
33
  // If there are field initializers and the first statement is a super call,
34
34
  // move super call between default assignments and initializers
35
35
  if ((constructorFieldsDeclarations.length > 0 || classInstanceFields.length > 0) &&
@@ -49,7 +49,7 @@ function transformConstructorDeclaration(context, statement, className, instance
49
49
  for (const declaration of constructorFieldsDeclarations) {
50
50
  if (ts.isIdentifier(declaration.name)) {
51
51
  // self.declarationName = declarationName
52
- const assignment = lua.createAssignmentStatement(lua.createTableIndexExpression(lua_ast_1.createSelfIdentifier(), lua.createStringLiteral(declaration.name.text)), identifier_1.transformIdentifier(context, declaration.name));
52
+ const assignment = lua.createAssignmentStatement(lua.createTableIndexExpression((0, lua_ast_1.createSelfIdentifier)(), lua.createStringLiteral(declaration.name.text)), (0, identifier_1.transformIdentifier)(context, declaration.name));
53
53
  bodyWithFieldInitializers.push(assignment);
54
54
  }
55
55
  // else { TypeScript error: A parameter property may not be declared using a binding pattern }
@@ -58,7 +58,7 @@ function transformConstructorDeclaration(context, statement, className, instance
58
58
  bodyWithFieldInitializers.push(...body);
59
59
  const block = lua.createBlock(bodyWithFieldInitializers);
60
60
  const constructorWasGenerated = statement.pos === -1;
61
- scope_1.popScope(context);
61
+ (0, scope_1.popScope)(context);
62
62
  return lua.createAssignmentStatement(createConstructorName(className), lua.createFunctionExpression(block, params, dotsLiteral, lua.FunctionExpressionFlags.Declaration), constructorWasGenerated ? classDeclaration : statement);
63
63
  }
64
64
  exports.transformConstructorDeclaration = transformConstructorDeclaration;
@@ -9,19 +9,19 @@ const method_1 = require("./method");
9
9
  function createPropertyDecoratingExpression(context, node, className) {
10
10
  if (!node.decorators)
11
11
  return;
12
- const propertyName = literal_1.transformPropertyName(context, node.name);
13
- const propertyOwnerTable = method_1.transformMemberExpressionOwnerName(node, className);
14
- return decorators_1.createDecoratingExpression(context, node.kind, node.decorators.map(d => decorators_1.transformDecoratorExpression(context, d)), propertyOwnerTable, propertyName);
12
+ const propertyName = (0, literal_1.transformPropertyName)(context, node.name);
13
+ const propertyOwnerTable = (0, method_1.transformMemberExpressionOwnerName)(node, className);
14
+ return (0, decorators_1.createDecoratingExpression)(context, node.kind, node.decorators.map(d => (0, decorators_1.transformDecoratorExpression)(context, d)), propertyOwnerTable, propertyName);
15
15
  }
16
16
  exports.createPropertyDecoratingExpression = createPropertyDecoratingExpression;
17
17
  function transformClassInstanceFields(context, instanceFields) {
18
18
  const statements = [];
19
19
  for (const f of instanceFields) {
20
20
  // Get identifier
21
- const fieldName = literal_1.transformPropertyName(context, f.name);
21
+ const fieldName = (0, literal_1.transformPropertyName)(context, f.name);
22
22
  const value = f.initializer ? context.transformExpression(f.initializer) : undefined;
23
23
  // self[fieldName]
24
- const selfIndex = lua.createTableIndexExpression(lua_ast_1.createSelfIdentifier(), fieldName);
24
+ const selfIndex = lua.createTableIndexExpression((0, lua_ast_1.createSelfIdentifier)(), fieldName);
25
25
  // self[fieldName] = value
26
26
  const assignClassField = lua.createAssignmentStatement(selfIndex, value, f);
27
27
  statements.push(assignClassField);
@@ -32,7 +32,7 @@ exports.transformClassInstanceFields = transformClassInstanceFields;
32
32
  function transformStaticPropertyDeclaration(context, field, className) {
33
33
  if (!field.initializer)
34
34
  return;
35
- const fieldName = literal_1.transformPropertyName(context, field.name);
35
+ const fieldName = (0, literal_1.transformPropertyName)(context, field.name);
36
36
  const value = context.transformExpression(field.initializer);
37
37
  const classField = lua.createTableIndexExpression(lua.cloneIdentifier(className), fieldName);
38
38
  return lua.createAssignmentStatement(classField, value);
@@ -10,11 +10,11 @@ const constructor_1 = require("./constructor");
10
10
  const lualib_1 = require("../../../utils/lualib");
11
11
  const utils_2 = require("../../../../utils");
12
12
  function transformMemberExpressionOwnerName(node, className) {
13
- return utils_1.isStaticNode(node) ? lua.cloneIdentifier(className) : constructor_1.createPrototypeName(className);
13
+ return (0, utils_1.isStaticNode)(node) ? lua.cloneIdentifier(className) : (0, constructor_1.createPrototypeName)(className);
14
14
  }
15
15
  exports.transformMemberExpressionOwnerName = transformMemberExpressionOwnerName;
16
16
  function transformMethodName(context, node) {
17
- const methodName = literal_1.transformPropertyName(context, node.name);
17
+ const methodName = (0, literal_1.transformPropertyName)(context, node.name);
18
18
  if (lua.isStringLiteral(methodName) && methodName.value === "toString") {
19
19
  return lua.createStringLiteral("__tostring", node.name);
20
20
  }
@@ -27,7 +27,7 @@ function transformMethodDeclaration(context, node, className) {
27
27
  return;
28
28
  const methodTable = transformMemberExpressionOwnerName(node, className);
29
29
  const methodName = transformMethodName(context, node);
30
- const [functionExpression] = function_1.transformFunctionToExpression(context, node);
30
+ const [functionExpression] = (0, function_1.transformFunctionToExpression)(context, node);
31
31
  return lua.createAssignmentStatement(lua.createTableIndexExpression(methodTable, methodName), functionExpression, node);
32
32
  }
33
33
  exports.transformMethodDeclaration = transformMethodDeclaration;
@@ -38,12 +38,12 @@ function createMethodDecoratingExpression(context, node, className) {
38
38
  const parameterDecorators = node.parameters
39
39
  .flatMap((parameter, index) => {
40
40
  var _a;
41
- return (_a = parameter.decorators) === null || _a === void 0 ? void 0 : _a.map(decorator => lualib_1.transformLuaLibFunction(context, lualib_1.LuaLibFeature.DecorateParam, node, lua.createNumericLiteral(index), decorators_1.transformDecoratorExpression(context, decorator)));
41
+ return (_a = parameter.decorators) === null || _a === void 0 ? void 0 : _a.map(decorator => (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.DecorateParam, node, lua.createNumericLiteral(index), (0, decorators_1.transformDecoratorExpression)(context, decorator)));
42
42
  })
43
43
  .filter(utils_2.isNonNull);
44
- const methodDecorators = (_b = (_a = node.decorators) === null || _a === void 0 ? void 0 : _a.map(d => decorators_1.transformDecoratorExpression(context, d))) !== null && _b !== void 0 ? _b : [];
44
+ const methodDecorators = (_b = (_a = node.decorators) === null || _a === void 0 ? void 0 : _a.map(d => (0, decorators_1.transformDecoratorExpression)(context, d))) !== null && _b !== void 0 ? _b : [];
45
45
  if (methodDecorators.length > 0 || parameterDecorators.length > 0) {
46
- const decorateMethod = decorators_1.createDecoratingExpression(context, node.kind, [...methodDecorators, ...parameterDecorators], methodTable, methodName);
46
+ const decorateMethod = (0, decorators_1.createDecoratingExpression)(context, node.kind, [...methodDecorators, ...parameterDecorators], methodTable, methodName);
47
47
  return lua.createExpressionStatement(decorateMethod);
48
48
  }
49
49
  }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.transformNewExpression = exports.checkForLuaLibType = void 0;
4
+ const ts = require("typescript");
4
5
  const lua = require("../../../LuaAST");
5
6
  const annotations_1 = require("../../utils/annotations");
6
7
  const diagnostics_1 = require("../../utils/diagnostics");
@@ -28,49 +29,46 @@ function checkForLuaLibType(context, type) {
28
29
  const name = context.checker.getFullyQualifiedName(type.symbol);
29
30
  switch (name) {
30
31
  case "Map":
31
- lualib_1.importLuaLibFeature(context, lualib_1.LuaLibFeature.Map);
32
+ (0, lualib_1.importLuaLibFeature)(context, lualib_1.LuaLibFeature.Map);
32
33
  return;
33
34
  case "Set":
34
- lualib_1.importLuaLibFeature(context, lualib_1.LuaLibFeature.Set);
35
+ (0, lualib_1.importLuaLibFeature)(context, lualib_1.LuaLibFeature.Set);
35
36
  return;
36
37
  case "WeakMap":
37
- lualib_1.importLuaLibFeature(context, lualib_1.LuaLibFeature.WeakMap);
38
+ (0, lualib_1.importLuaLibFeature)(context, lualib_1.LuaLibFeature.WeakMap);
38
39
  return;
39
40
  case "WeakSet":
40
- lualib_1.importLuaLibFeature(context, lualib_1.LuaLibFeature.WeakSet);
41
+ (0, lualib_1.importLuaLibFeature)(context, lualib_1.LuaLibFeature.WeakSet);
41
42
  return;
42
43
  }
43
44
  if (builtinErrorTypeNames.has(name)) {
44
- lualib_1.importLuaLibFeature(context, lualib_1.LuaLibFeature.Error);
45
+ (0, lualib_1.importLuaLibFeature)(context, lualib_1.LuaLibFeature.Error);
45
46
  }
46
47
  }
47
48
  exports.checkForLuaLibType = checkForLuaLibType;
48
49
  const transformNewExpression = (node, context) => {
49
- var _a;
50
+ var _a, _b;
50
51
  const type = context.checker.getTypeAtLocation(node);
51
- const annotations = annotations_1.getTypeAnnotations(type);
52
+ const annotations = (0, annotations_1.getTypeAnnotations)(type);
52
53
  if (annotations.has(annotations_1.AnnotationKind.LuaTable)) {
53
- context.diagnostics.push(diagnostics_1.annotationRemoved(node, annotations_1.AnnotationKind.LuaTable));
54
+ context.diagnostics.push((0, diagnostics_1.annotationRemoved)(node, annotations_1.AnnotationKind.LuaTable));
54
55
  }
55
- if (table_1.isTableNewCall(context, node)) {
56
+ if ((0, table_1.isTableNewCall)(context, node)) {
56
57
  return lua.createTableExpression(undefined, node);
57
58
  }
58
59
  const signature = context.checker.getResolvedSignature(node);
59
- const params = node.arguments
60
- ? call_1.transformArguments(context, node.arguments, signature)
61
- : [lua.createBooleanLiteral(true)];
60
+ const [name, params] = (0, call_1.transformCallAndArguments)(context, node.expression, (_a = node.arguments) !== null && _a !== void 0 ? _a : [ts.factory.createTrue()], signature);
62
61
  checkForLuaLibType(context, type);
63
- const name = context.transformExpression(node.expression);
64
62
  const customConstructorAnnotation = annotations.get(annotations_1.AnnotationKind.CustomConstructor);
65
63
  if (customConstructorAnnotation) {
66
64
  if (customConstructorAnnotation.args.length === 1) {
67
- return lua.createCallExpression(lua.createIdentifier(customConstructorAnnotation.args[0]), call_1.transformArguments(context, (_a = node.arguments) !== null && _a !== void 0 ? _a : []), node);
65
+ return lua.createCallExpression(lua.createIdentifier(customConstructorAnnotation.args[0]), (0, call_1.transformArguments)(context, (_b = node.arguments) !== null && _b !== void 0 ? _b : []), node);
68
66
  }
69
67
  else {
70
- context.diagnostics.push(diagnostics_1.annotationInvalidArgumentCount(node, annotations_1.AnnotationKind.CustomConstructor, customConstructorAnnotation.args.length, 1));
68
+ context.diagnostics.push((0, diagnostics_1.annotationInvalidArgumentCount)(node, annotations_1.AnnotationKind.CustomConstructor, customConstructorAnnotation.args.length, 1));
71
69
  }
72
70
  }
73
- return lualib_1.transformLuaLibFunction(context, lualib_1.LuaLibFeature.New, node, name, ...params);
71
+ return (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.New, node, name, ...params);
74
72
  };
75
73
  exports.transformNewExpression = transformNewExpression;
76
74
  //# sourceMappingURL=new.js.map
@@ -11,34 +11,34 @@ const utils_2 = require("./utils");
11
11
  function createClassSetup(context, statement, className, localClassName, extendsType) {
12
12
  const result = [];
13
13
  // __TS__Class()
14
- const classInitializer = lualib_1.transformLuaLibFunction(context, lualib_1.LuaLibFeature.Class, statement);
15
- const defaultExportLeftHandSide = export_1.hasDefaultExportModifier(statement)
16
- ? lua.createTableIndexExpression(lua_ast_1.createExportsIdentifier(), export_1.createDefaultExportStringLiteral(statement))
14
+ const classInitializer = (0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.Class, statement);
15
+ const defaultExportLeftHandSide = (0, export_1.hasDefaultExportModifier)(statement)
16
+ ? lua.createTableIndexExpression((0, lua_ast_1.createExportsIdentifier)(), (0, export_1.createDefaultExportStringLiteral)(statement))
17
17
  : undefined;
18
18
  // [____exports.]className = __TS__Class()
19
19
  if (defaultExportLeftHandSide) {
20
20
  result.push(lua.createAssignmentStatement(defaultExportLeftHandSide, classInitializer, statement));
21
21
  }
22
22
  else {
23
- result.push(...lua_ast_1.createLocalOrExportedOrGlobalDeclaration(context, className, classInitializer, statement));
23
+ result.push(...(0, lua_ast_1.createLocalOrExportedOrGlobalDeclaration)(context, className, classInitializer, statement));
24
24
  }
25
25
  if (defaultExportLeftHandSide) {
26
26
  // local localClassName = ____exports.default
27
27
  result.push(lua.createVariableDeclarationStatement(localClassName, defaultExportLeftHandSide));
28
28
  }
29
29
  else {
30
- const exportScope = export_1.getIdentifierExportScope(context, className);
30
+ const exportScope = (0, export_1.getIdentifierExportScope)(context, className);
31
31
  if (exportScope) {
32
32
  // local localClassName = ____exports.className
33
- result.push(lua.createVariableDeclarationStatement(localClassName, export_1.createExportedIdentifier(context, lua.cloneIdentifier(className), exportScope)));
33
+ result.push(lua.createVariableDeclarationStatement(localClassName, (0, export_1.createExportedIdentifier)(context, lua.cloneIdentifier(className), exportScope)));
34
34
  }
35
35
  }
36
36
  // localClassName.name = className
37
37
  result.push(lua.createAssignmentStatement(lua.createTableIndexExpression(lua.cloneIdentifier(localClassName), lua.createStringLiteral("name")), getReflectionClassName(context, statement, className), statement));
38
38
  if (extendsType) {
39
- const extendedNode = utils_2.getExtendedNode(context, statement);
40
- utils_1.assert(extendedNode);
41
- result.push(lua.createExpressionStatement(lualib_1.transformLuaLibFunction(context, lualib_1.LuaLibFeature.ClassExtends, utils_2.getExtendsClause(statement), lua.cloneIdentifier(localClassName), context.transformExpression(extendedNode.expression))));
39
+ const extendedNode = (0, utils_2.getExtendedNode)(context, statement);
40
+ (0, utils_1.assert)(extendedNode);
41
+ result.push(lua.createExpressionStatement((0, lualib_1.transformLuaLibFunction)(context, lualib_1.LuaLibFeature.ClassExtends, (0, utils_2.getExtendsClause)(statement), lua.cloneIdentifier(localClassName), context.transformExpression(extendedNode.expression))));
42
42
  }
43
43
  return result;
44
44
  }
@@ -50,10 +50,10 @@ function getReflectionClassName(context, declaration, className) {
50
50
  else if (ts.isVariableDeclaration(declaration.parent) && ts.isIdentifier(declaration.parent.name)) {
51
51
  return lua.createStringLiteral(declaration.parent.name.text);
52
52
  }
53
- else if (export_1.hasDefaultExportModifier(declaration)) {
53
+ else if ((0, export_1.hasDefaultExportModifier)(declaration)) {
54
54
  return lua.createStringLiteral("default");
55
55
  }
56
- if (utils_2.getExtendedNode(context, declaration)) {
56
+ if ((0, utils_2.getExtendedNode)(context, declaration)) {
57
57
  return lua.createTableIndexExpression(className, lua.createStringLiteral("name"));
58
58
  }
59
59
  return lua.createStringLiteral("");
@@ -19,9 +19,9 @@ function getExtendedNode(context, node) {
19
19
  if (!extendsClause)
20
20
  return;
21
21
  const superType = context.checker.getTypeAtLocation(extendsClause.types[0]);
22
- const annotations = annotations_1.getTypeAnnotations(superType);
22
+ const annotations = (0, annotations_1.getTypeAnnotations)(superType);
23
23
  if (annotations.has(annotations_1.AnnotationKind.PureAbstract)) {
24
- context.diagnostics.push(diagnostics_1.annotationRemoved(extendsClause, annotations_1.AnnotationKind.PureAbstract));
24
+ context.diagnostics.push((0, diagnostics_1.annotationRemoved)(extendsClause, annotations_1.AnnotationKind.PureAbstract));
25
25
  }
26
26
  return extendsClause.types[0];
27
27
  }
@@ -3,47 +3,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.transformIfStatement = exports.transformConditionalExpression = void 0;
4
4
  const ts = require("typescript");
5
5
  const lua = require("../../LuaAST");
6
+ const preceding_statements_1 = require("../utils/preceding-statements");
6
7
  const scope_1 = require("../utils/scope");
7
8
  const block_1 = require("./block");
8
- function canBeFalsy(context, type) {
9
- const strictNullChecks = context.options.strict === true || context.options.strictNullChecks === true;
10
- const falsyFlags = ts.TypeFlags.Boolean |
11
- ts.TypeFlags.BooleanLiteral |
12
- ts.TypeFlags.Undefined |
13
- ts.TypeFlags.Null |
14
- ts.TypeFlags.Never |
15
- ts.TypeFlags.Void |
16
- ts.TypeFlags.Any;
17
- if (type.flags & falsyFlags) {
18
- return true;
19
- }
20
- else if (!strictNullChecks && !type.isLiteral()) {
21
- return true;
22
- }
23
- else if (type.isUnion()) {
24
- return type.types.some(subType => canBeFalsy(context, subType));
25
- }
26
- else {
27
- return false;
28
- }
29
- }
30
- function wrapInFunctionCall(expression) {
31
- const returnStatement = lua.createReturnStatement([expression]);
32
- return lua.createFunctionExpression(lua.createBlock([returnStatement]), undefined, undefined, lua.FunctionExpressionFlags.Inline);
33
- }
9
+ const typescript_1 = require("../utils/typescript");
34
10
  function transformProtectedConditionalExpression(context, expression) {
11
+ const tempVar = context.createTempNameForNode(expression.condition);
35
12
  const condition = context.transformExpression(expression.condition);
36
- const val1 = context.transformExpression(expression.whenTrue);
37
- const val2 = context.transformExpression(expression.whenFalse);
38
- const val1Function = wrapInFunctionCall(val1);
39
- const val2Function = wrapInFunctionCall(val2);
40
- // (condition and (() => v1) or (() => v2))()
41
- const conditionAnd = lua.createBinaryExpression(condition, val1Function, lua.SyntaxKind.AndOperator);
42
- const orExpression = lua.createBinaryExpression(conditionAnd, val2Function, lua.SyntaxKind.OrOperator);
43
- return lua.createCallExpression(orExpression, [], expression);
13
+ const [trueStatements, val1] = (0, preceding_statements_1.transformInPrecedingStatementScope)(context, () => context.transformExpression(expression.whenTrue));
14
+ trueStatements.push(lua.createAssignmentStatement(lua.cloneIdentifier(tempVar), val1, expression.whenTrue));
15
+ const [falseStatements, val2] = (0, preceding_statements_1.transformInPrecedingStatementScope)(context, () => context.transformExpression(expression.whenFalse));
16
+ falseStatements.push(lua.createAssignmentStatement(lua.cloneIdentifier(tempVar), val2, expression.whenFalse));
17
+ context.addPrecedingStatements([
18
+ lua.createVariableDeclarationStatement(tempVar, undefined, expression.condition),
19
+ lua.createIfStatement(condition, lua.createBlock(trueStatements, expression.whenTrue), lua.createBlock(falseStatements, expression.whenFalse), expression),
20
+ ]);
21
+ return lua.cloneIdentifier(tempVar);
44
22
  }
45
23
  const transformConditionalExpression = (expression, context) => {
46
- if (canBeFalsy(context, context.checker.getTypeAtLocation(expression.whenTrue))) {
24
+ if ((0, typescript_1.canBeFalsy)(context, context.checker.getTypeAtLocation(expression.whenTrue))) {
47
25
  return transformProtectedConditionalExpression(context, expression);
48
26
  }
49
27
  const condition = context.transformExpression(expression.condition);
@@ -55,20 +33,35 @@ const transformConditionalExpression = (expression, context) => {
55
33
  };
56
34
  exports.transformConditionalExpression = transformConditionalExpression;
57
35
  function transformIfStatement(statement, context) {
58
- scope_1.pushScope(context, scope_1.ScopeType.Conditional);
36
+ (0, scope_1.pushScope)(context, scope_1.ScopeType.Conditional);
59
37
  const condition = context.transformExpression(statement.expression);
60
- const statements = scope_1.performHoisting(context, block_1.transformBlockOrStatement(context, statement.thenStatement));
61
- scope_1.popScope(context);
38
+ const statements = (0, scope_1.performHoisting)(context, (0, block_1.transformBlockOrStatement)(context, statement.thenStatement));
39
+ (0, scope_1.popScope)(context);
62
40
  const ifBlock = lua.createBlock(statements);
63
41
  if (statement.elseStatement) {
64
42
  if (ts.isIfStatement(statement.elseStatement)) {
65
- const elseStatement = transformIfStatement(statement.elseStatement, context);
66
- return lua.createIfStatement(condition, ifBlock, elseStatement);
43
+ const tsElseStatement = statement.elseStatement;
44
+ const [precedingStatements, elseStatement] = (0, preceding_statements_1.transformInPrecedingStatementScope)(context, () => transformIfStatement(tsElseStatement, context));
45
+ // If else-if condition generates preceding statements, we can't use elseif, we have to break it down:
46
+ // if conditionA then
47
+ // ...
48
+ // else
49
+ // conditionB's preceding statements
50
+ // if conditionB then
51
+ // end
52
+ // end
53
+ if (precedingStatements.length > 0) {
54
+ const elseBlock = lua.createBlock([...precedingStatements, elseStatement]);
55
+ return lua.createIfStatement(condition, ifBlock, elseBlock);
56
+ }
57
+ else {
58
+ return lua.createIfStatement(condition, ifBlock, elseStatement);
59
+ }
67
60
  }
68
61
  else {
69
- scope_1.pushScope(context, scope_1.ScopeType.Conditional);
70
- const elseStatements = scope_1.performHoisting(context, block_1.transformBlockOrStatement(context, statement.elseStatement));
71
- scope_1.popScope(context);
62
+ (0, scope_1.pushScope)(context, scope_1.ScopeType.Conditional);
63
+ const elseStatements = (0, scope_1.performHoisting)(context, (0, block_1.transformBlockOrStatement)(context, statement.elseStatement));
64
+ (0, scope_1.popScope)(context);
72
65
  const elseBlock = lua.createBlock(elseStatements);
73
66
  return lua.createIfStatement(condition, ifBlock, elseBlock);
74
67
  }