forked from TypeScriptToLua/TypeScriptToLua
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patharray.ts
More file actions
123 lines (116 loc) · 6.03 KB
/
array.ts
File metadata and controls
123 lines (116 loc) · 6.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import * as ts from "typescript";
import * as lua from "../../LuaAST";
import { TransformationContext } from "../context";
import { unsupportedProperty } from "../utils/diagnostics";
import { LuaLibFeature, transformLuaLibFunction } from "../utils/lualib";
import { PropertyCallExpression, transformArguments } from "../visitors/call";
import { isStringType, isNumberType } from "../utils/typescript";
export function transformArrayConstructorCall(
context: TransformationContext,
node: PropertyCallExpression
): lua.CallExpression | undefined {
const expression = node.expression;
const signature = context.checker.getResolvedSignature(node);
const params = transformArguments(context, node.arguments, signature);
const expressionName = expression.name.text;
switch (expressionName) {
case "isArray":
return transformLuaLibFunction(context, LuaLibFeature.ArrayIsArray, node, ...params);
default:
context.diagnostics.push(unsupportedProperty(expression.name, "Array", expressionName));
}
}
export function transformArrayPrototypeCall(
context: TransformationContext,
node: PropertyCallExpression
): lua.CallExpression | undefined {
const expression = node.expression;
const signature = context.checker.getResolvedSignature(node);
const params = transformArguments(context, node.arguments, signature);
const caller = context.transformExpression(expression.expression);
const expressionName = expression.name.text;
switch (expressionName) {
case "concat":
return transformLuaLibFunction(context, LuaLibFeature.ArrayConcat, node, caller, ...params);
case "entries":
return transformLuaLibFunction(context, LuaLibFeature.ArrayEntries, node, caller);
case "push":
return transformLuaLibFunction(context, LuaLibFeature.ArrayPush, node, caller, ...params);
case "reverse":
return transformLuaLibFunction(context, LuaLibFeature.ArrayReverse, node, caller);
case "shift":
return transformLuaLibFunction(context, LuaLibFeature.ArrayShift, node, caller);
case "unshift":
return transformLuaLibFunction(context, LuaLibFeature.ArrayUnshift, node, caller, ...params);
case "sort":
return transformLuaLibFunction(context, LuaLibFeature.ArraySort, node, caller, ...params);
case "pop":
return lua.createCallExpression(
lua.createTableIndexExpression(lua.createIdentifier("table"), lua.createStringLiteral("remove")),
[caller],
node
);
case "forEach":
return transformLuaLibFunction(context, LuaLibFeature.ArrayForEach, node, caller, ...params);
case "find":
return transformLuaLibFunction(context, LuaLibFeature.ArrayFind, node, caller, ...params);
case "findIndex":
return transformLuaLibFunction(context, LuaLibFeature.ArrayFindIndex, node, caller, ...params);
case "includes":
return transformLuaLibFunction(context, LuaLibFeature.ArrayIncludes, node, caller, ...params);
case "indexOf":
return transformLuaLibFunction(context, LuaLibFeature.ArrayIndexOf, node, caller, ...params);
case "map":
return transformLuaLibFunction(context, LuaLibFeature.ArrayMap, node, caller, ...params);
case "filter":
return transformLuaLibFunction(context, LuaLibFeature.ArrayFilter, node, caller, ...params);
case "reduce":
return transformLuaLibFunction(context, LuaLibFeature.ArrayReduce, node, caller, ...params);
case "reduceRight":
return transformLuaLibFunction(context, LuaLibFeature.ArrayReduceRight, node, caller, ...params);
case "some":
return transformLuaLibFunction(context, LuaLibFeature.ArraySome, node, caller, ...params);
case "every":
return transformLuaLibFunction(context, LuaLibFeature.ArrayEvery, node, caller, ...params);
case "slice":
return transformLuaLibFunction(context, LuaLibFeature.ArraySlice, node, caller, ...params);
case "splice":
return transformLuaLibFunction(context, LuaLibFeature.ArraySplice, node, caller, ...params);
case "join":
const callerType = context.checker.getTypeAtLocation(expression.expression);
const elementType = context.checker.getElementTypeOfArrayType(callerType);
if (elementType && (isStringType(context, elementType) || isNumberType(context, elementType))) {
const defaultSeparatorLiteral = lua.createStringLiteral(",");
const parameters = [
caller,
node.arguments.length === 0
? defaultSeparatorLiteral
: lua.createBinaryExpression(params[0], defaultSeparatorLiteral, lua.SyntaxKind.OrOperator),
];
return lua.createCallExpression(
lua.createTableIndexExpression(lua.createIdentifier("table"), lua.createStringLiteral("concat")),
parameters,
node
);
}
return transformLuaLibFunction(context, LuaLibFeature.ArrayJoin, node, caller, ...params);
case "flat":
return transformLuaLibFunction(context, LuaLibFeature.ArrayFlat, node, caller, ...params);
case "flatMap":
return transformLuaLibFunction(context, LuaLibFeature.ArrayFlatMap, node, caller, ...params);
default:
context.diagnostics.push(unsupportedProperty(expression.name, "array", expressionName));
}
}
export function transformArrayProperty(
context: TransformationContext,
node: ts.PropertyAccessExpression
): lua.UnaryExpression | undefined {
switch (node.name.text) {
case "length":
const expression = context.transformExpression(node.expression);
return lua.createUnaryExpression(expression, lua.SyntaxKind.LengthOperator, node);
default:
return undefined;
}
}