Skip to content

Commit 3100b92

Browse files
committed
Fixed bug with array and tuple types
1 parent 4fe2266 commit 3100b92

File tree

4 files changed

+22
-14
lines changed

4 files changed

+22
-14
lines changed

src/TSHelper.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,14 @@ export class TSHelper {
5858
|| (type.flags & ts.TypeFlags.StringLiteral) !== 0;
5959
}
6060

61-
public static isArrayType(type: ts.Type): boolean {
62-
return (type.flags & ts.TypeFlags.Object) !== 0
63-
&& (type as ts.ObjectType).symbol
64-
&& (type as ts.ObjectType).symbol.escapedName === "Array";
61+
public static isArrayType(type: ts.Type, checker: ts.TypeChecker): boolean {
62+
const typeNode = checker.typeToTypeNode(type);
63+
return typeNode && typeNode.kind === ts.SyntaxKind.ArrayType;
6564
}
6665

67-
public static isTupleType(type: ts.Type): boolean {
68-
return (type.flags & ts.TypeFlags.Object) !== 0
69-
&& (type as ts.TypeReference).typeArguments !== undefined;
66+
public static isTupleType(type: ts.Type, checker: ts.TypeChecker): boolean {
67+
const typeNode = checker.typeToTypeNode(type);
68+
return typeNode && typeNode.kind === ts.SyntaxKind.TupleType;
7069
}
7170

7271
public static isCompileMembersOnlyEnum(type: ts.Type, checker: ts.TypeChecker): boolean {

src/Transpiler.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ export class LuaTranspiler {
388388
const expression = this.transpileExpression(node.expression);
389389

390390
// Use ipairs for array types, pairs otherwise
391-
const isArray = tsEx.isArrayType(this.checker.getTypeAtLocation(node.expression));
391+
const isArray = tsEx.isArrayType(this.checker.getTypeAtLocation(node.expression), this.checker);
392392
const pairs = isArray ? "ipairs" : "pairs";
393393

394394
// Make header
@@ -410,7 +410,7 @@ export class LuaTranspiler {
410410
// Transpile expression
411411
const expression = this.transpileExpression(node.expression);
412412

413-
if (tsEx.isArrayType(this.checker.getTypeAtLocation(node.expression))) {
413+
if (tsEx.isArrayType(this.checker.getTypeAtLocation(node.expression), this.checker)) {
414414
throw new TranspileError("Iterating over arrays with 'for in' is not allowed.", node);
415415
}
416416

@@ -861,7 +861,7 @@ export class LuaTranspiler {
861861
return this.transpileStringCallExpression(node);
862862

863863
}
864-
if (tsEx.isArrayType(expType)) {
864+
if (tsEx.isArrayType(expType, this.checker)) {
865865
return this.transpileArrayCallExpression(node);
866866
}
867867

@@ -1007,7 +1007,7 @@ export class LuaTranspiler {
10071007
case ts.TypeFlags.StringLiteral:
10081008
return this.transpileStringProperty(node);
10091009
case ts.TypeFlags.Object:
1010-
if (tsEx.isArrayType(type)) {
1010+
if (tsEx.isArrayType(type, this.checker)) {
10111011
return this.transpileArrayProperty(node);
10121012
}
10131013
}
@@ -1083,7 +1083,7 @@ export class LuaTranspiler {
10831083
const index = this.transpileExpression(node.argumentExpression);
10841084

10851085
const type = this.checker.getTypeAtLocation(node.expression);
1086-
if (tsEx.isArrayType(type) || tsEx.isTupleType(type)) {
1086+
if (tsEx.isArrayType(type, this.checker) || tsEx.isTupleType(type, this.checker)) {
10871087
return `${element}[${index}+1]`;
10881088
} else if (tsEx.isStringType(type)) {
10891089
return `string.sub(${element},${index}+1,${index}+1)`;
@@ -1130,9 +1130,9 @@ export class LuaTranspiler {
11301130
if (ts.isCallExpression(node.initializer)
11311131
&& tsEx.isTupleReturnFunction(this.checker.getTypeAtLocation(node.initializer.expression), this.checker)
11321132
) {
1133-
return `local ${vars}=${value}`;
1133+
return `local ${vars}=${value}\n`;
11341134
} else {
1135-
return `local ${vars}=unpack(${value})`;
1135+
return `local ${vars}=unpack(${value})\n`;
11361136
}
11371137
} else {
11381138
throw new TranspileError(
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
local a = {}
2+
3+
a["abc"]="def"
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
declare interface Dictionary<T> {
2+
[index: number]: T;
3+
}
4+
5+
let a: Dictionary<string> = {};
6+
a["abc"] = "def";

0 commit comments

Comments
 (0)