Skip to content

Commit 8d5283c

Browse files
committed
Move checkForLualibType to identifier
1 parent db0e257 commit 8d5283c

File tree

6 files changed

+58
-75
lines changed

6 files changed

+58
-75
lines changed

src/transformation/builtins/error.ts

Lines changed: 0 additions & 18 deletions
This file was deleted.

src/transformation/builtins/index.ts

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import {
1414
isStringType,
1515
} from "../utils/typescript";
1616
import { PropertyCallExpression } from "../visitors/call";
17-
import { checkForLuaLibType } from "../visitors/class/new";
1817
import { transformArrayConstructorCall, transformArrayProperty, transformArrayPrototypeCall } from "./array";
1918
import { transformConsoleCall } from "./console";
2019
import { transformFunctionPrototypeCall, transformFunctionProperty } from "./function";
@@ -67,7 +66,6 @@ export function transformBuiltinCallExpression(
6766
const expressionType = context.checker.getTypeAtLocation(node.expression);
6867
if (ts.isIdentifier(node.expression) && isStandardLibraryType(context, expressionType, undefined)) {
6968
// TODO:
70-
checkForLuaLibType(context, expressionType);
7169
const result = transformGlobalCall(context, node);
7270
if (result) {
7371
if (isOptionalCall) return unsupportedOptionalCall();
@@ -159,3 +157,46 @@ export function transformBuiltinIdentifierExpression(
159157
return lua.createIdentifier("_G", node, getIdentifierSymbolId(context, node), "globalThis");
160158
}
161159
}
160+
161+
const builtinErrorTypeNames = new Set([
162+
"Error",
163+
"ErrorConstructor",
164+
"RangeError",
165+
"RangeErrorConstructor",
166+
"ReferenceError",
167+
"ReferenceErrorConstructor",
168+
"SyntaxError",
169+
"SyntaxErrorConstructor",
170+
"TypeError",
171+
"TypeErrorConstructor",
172+
"URIError",
173+
"URIErrorConstructor",
174+
]);
175+
176+
export function checkForLuaLibType(context: TransformationContext, type: ts.Type): void {
177+
if (!type.symbol) return;
178+
179+
const name = context.checker.getFullyQualifiedName(type.symbol);
180+
switch (name) {
181+
case "Map":
182+
case "MapConstructor":
183+
importLuaLibFeature(context, LuaLibFeature.Map);
184+
return;
185+
case "Set":
186+
case "SetConstructor":
187+
importLuaLibFeature(context, LuaLibFeature.Set);
188+
return;
189+
case "WeakMap":
190+
case "WeakMapConstructor":
191+
importLuaLibFeature(context, LuaLibFeature.WeakMap);
192+
return;
193+
case "WeakSet":
194+
case "WeakSetConstructor":
195+
importLuaLibFeature(context, LuaLibFeature.WeakSet);
196+
return;
197+
}
198+
199+
if (builtinErrorTypeNames.has(name)) {
200+
importLuaLibFeature(context, LuaLibFeature.Error);
201+
}
202+
}

src/transformation/visitors/class/index.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,8 @@ import {
2323
transformStaticPropertyDeclaration,
2424
} from "./members/fields";
2525
import { createMethodDecoratingExpression, transformMethodDeclaration } from "./members/method";
26-
import { checkForLuaLibType } from "./new";
27-
import { createClassSetup } from "./setup";
2826
import { getExtendedNode, getExtendedType, isStaticNode } from "./utils";
27+
import { createClassSetup } from "./setup";
2928

3029
export const transformClassDeclaration: FunctionVisitor<ts.ClassLikeDeclaration> = (declaration, context) => {
3130
// If declaration is a default export, transform to export variable assignment instead
@@ -86,10 +85,6 @@ function transformClassLikeDeclaration(
8685
const superInfo = getOrUpdate(classSuperInfos, context, () => []);
8786
superInfo.push({ className, extendedTypeNode });
8887

89-
if (extendedType) {
90-
checkForLuaLibType(context, extendedType);
91-
}
92-
9388
// Get all properties with value
9489
const properties = classDeclaration.members.filter(ts.isPropertyDeclaration).filter(member => member.initializer);
9590

src/transformation/visitors/class/new.ts

Lines changed: 2 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,12 @@
11
import * as ts from "typescript";
22
import * as lua from "../../../LuaAST";
3-
import { FunctionVisitor, TransformationContext } from "../../context";
3+
import { FunctionVisitor } from "../../context";
44
import { AnnotationKind, getTypeAnnotations } from "../../utils/annotations";
55
import { annotationInvalidArgumentCount, annotationRemoved } from "../../utils/diagnostics";
6-
import { importLuaLibFeature, LuaLibFeature, transformLuaLibFunction } from "../../utils/lualib";
6+
import { LuaLibFeature, transformLuaLibFunction } from "../../utils/lualib";
77
import { transformArguments, transformCallAndArguments } from "../call";
88
import { isTableNewCall } from "../language-extensions/table";
99

10-
const builtinErrorTypeNames = new Set([
11-
"Error",
12-
"ErrorConstructor",
13-
"RangeError",
14-
"RangeErrorConstructor",
15-
"ReferenceError",
16-
"ReferenceErrorConstructor",
17-
"SyntaxError",
18-
"SyntaxErrorConstructor",
19-
"TypeError",
20-
"TypeErrorConstructor",
21-
"URIError",
22-
"URIErrorConstructor",
23-
]);
24-
25-
// TODO: Do it in identifier?
26-
export function checkForLuaLibType(context: TransformationContext, type: ts.Type): void {
27-
if (!type.symbol) return;
28-
29-
const name = context.checker.getFullyQualifiedName(type.symbol);
30-
switch (name) {
31-
case "Map":
32-
importLuaLibFeature(context, LuaLibFeature.Map);
33-
return;
34-
case "Set":
35-
importLuaLibFeature(context, LuaLibFeature.Set);
36-
return;
37-
case "WeakMap":
38-
importLuaLibFeature(context, LuaLibFeature.WeakMap);
39-
return;
40-
case "WeakSet":
41-
importLuaLibFeature(context, LuaLibFeature.WeakSet);
42-
return;
43-
}
44-
45-
if (builtinErrorTypeNames.has(name)) {
46-
importLuaLibFeature(context, LuaLibFeature.Error);
47-
}
48-
}
49-
5010
export const transformNewExpression: FunctionVisitor<ts.NewExpression> = (node, context) => {
5111
const type = context.checker.getTypeAtLocation(node);
5212

@@ -68,8 +28,6 @@ export const transformNewExpression: FunctionVisitor<ts.NewExpression> = (node,
6828
signature
6929
);
7030

71-
checkForLuaLibType(context, type);
72-
7331
const customConstructorAnnotation = annotations.get(AnnotationKind.CustomConstructor);
7432
if (customConstructorAnnotation) {
7533
if (customConstructorAnnotation.args.length === 1) {

src/transformation/visitors/identifier.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as ts from "typescript";
22
import * as lua from "../../LuaAST";
3-
import { transformBuiltinIdentifierExpression } from "../builtins";
3+
import { transformBuiltinIdentifierExpression, checkForLuaLibType } from "../builtins";
44
import { isPromiseClass } from "../builtins/promise";
55
import { FunctionVisitor, tempSymbolId, TransformationContext } from "../context";
66
import { AnnotationKind, isForRangeType } from "../utils/annotations";
@@ -22,7 +22,7 @@ import { isRangeFunctionNode } from "./language-extensions/range";
2222
import { isTableExtensionIdentifier } from "./language-extensions/table";
2323
import { isVarargConstantNode } from "./language-extensions/vararg";
2424
import { isOptionalContinuation } from "./optional-chaining";
25-
import { isErrorClass } from "../builtins/error";
25+
import { isStandardLibraryType } from "../utils/typescript";
2626

2727
export function transformIdentifier(context: TransformationContext, identifier: ts.Identifier): lua.Identifier {
2828
if (isOptionalContinuation(identifier)) {
@@ -60,9 +60,9 @@ export function transformIdentifier(context: TransformationContext, identifier:
6060
importLuaLibFeature(context, LuaLibFeature.Promise);
6161
return lua.createIdentifier("__TS__Promise", identifier);
6262
}
63-
64-
if (isErrorClass(context, identifier)) {
65-
importLuaLibFeature(context, LuaLibFeature.Error);
63+
const type = context.checker.getTypeAtLocation(identifier);
64+
if (isStandardLibraryType(context, type, undefined)) {
65+
checkForLuaLibType(context, type);
6666
}
6767

6868
const text = hasUnsafeIdentifierName(context, identifier) ? createSafeName(identifier.text) : identifier.text;

test/unit/builtins/set.spec.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,3 +194,10 @@ describe.each(iterationMethods)("set.%s() preserves insertion order", iterationM
194194
`.expectToMatchJsResult();
195195
});
196196
});
197+
198+
test("instanceof Set without creating set", () => {
199+
util.testFunction`
200+
const myset = 3 as any;
201+
return myset instanceof Set;
202+
`.expectToMatchJsResult();
203+
});

0 commit comments

Comments
 (0)