Skip to content

Commit e802505

Browse files
committed
Move plugin out of transformation pipeline
1 parent c060bcc commit e802505

5 files changed

Lines changed: 70 additions & 72 deletions

File tree

src/Transpile.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ import * as ts from "typescript";
22
import { CompilerOptions } from "./CompilerOptions";
33
import { Block } from "./LuaAST";
44
import { LuaPrinter } from "./LuaPrinter";
5-
import { createVisitorMap, TransformerPlugin, transformSourceFile } from "./transformation";
5+
import { Plugin } from "./plugins";
6+
import { createVisitorMap, transformSourceFile } from "./transformation";
67
import { getCustomTransformers } from "./TSTransformers";
8+
import { isNonNull } from "./utils";
79

810
export interface TranspiledFile {
911
fileName: string;
@@ -23,7 +25,7 @@ export interface TranspileOptions {
2325
program: ts.Program;
2426
sourceFiles?: ts.SourceFile[];
2527
customTransformers?: ts.CustomTransformers;
26-
customPlugins?: TransformerPlugin[];
28+
plugins?: Plugin[];
2729
emitHost?: EmitHost;
2830
printer?: LuaPrinter;
2931
}
@@ -36,7 +38,7 @@ export function transpile({
3638
program,
3739
sourceFiles: targetSourceFiles,
3840
customTransformers = {},
39-
customPlugins = [],
41+
plugins = [],
4042
emitHost = ts.sys,
4143
printer = new LuaPrinter(program.getCompilerOptions(), emitHost),
4244
}: TranspileOptions): TranspileResult {
@@ -76,7 +78,7 @@ export function transpile({
7678
}
7779
}
7880

79-
const visitorMap = createVisitorMap(customPlugins);
81+
const visitorMap = createVisitorMap(plugins.map(p => p.visitors).filter(isNonNull));
8082
const processSourceFile = (sourceFile: ts.SourceFile) => {
8183
const { luaAst, luaLibFeatures, diagnostics: transformDiagnostics } = transformSourceFile(
8284
program,

src/plugins.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { Visitors } from "./transformation/context";
2+
3+
export interface Plugin {
4+
visitors?: Visitors;
5+
}

src/transformation/context/visitors.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,4 @@ export type FunctionVisitor<T extends ts.Node> = (node: T, context: Transformati
149149
export type ObjectVisitor<T extends ts.Node> = { transform: FunctionVisitor<T>; priority?: number };
150150
export type Visitor<T extends ts.Node> = FunctionVisitor<T> | ObjectVisitor<T>;
151151
export type Visitors = { [P in keyof NodesBySyntaxKind]?: Visitor<NodesBySyntaxKind[P]> };
152-
153-
export interface TransformerPlugin {
154-
visitors: Visitors;
155-
}
156-
157152
export type VisitorMap = Map<ts.SyntaxKind, Array<ObjectVisitor<ts.Node>>>;

src/transformation/index.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@ import * as ts from "typescript";
22
import * as lua from "../LuaAST";
33
import { LuaLibFeature } from "../LuaLib";
44
import { getOrUpdate } from "../utils";
5-
import { ObjectVisitor, TransformationContext, TransformerPlugin, VisitorMap } from "./context";
5+
import { ObjectVisitor, TransformationContext, VisitorMap, Visitors } from "./context";
6+
import { standardVisitors } from "./transformers";
67
import { TranspileError } from "./utils/errors";
78
import { getUsedLuaLibFeatures } from "./utils/lualib";
8-
import { standardPlugin } from "./transformers";
9-
10-
export { TransformerPlugin } from "./context";
119

1210
const transpileErrorDiagnostic = (error: TranspileError): ts.Diagnostic => ({
1311
file: error.node.getSourceFile(),
@@ -19,22 +17,22 @@ const transpileErrorDiagnostic = (error: TranspileError): ts.Diagnostic => ({
1917
messageText: error.message,
2018
});
2119

22-
export function createVisitorMap(customPlugins: TransformerPlugin[]): VisitorMap {
20+
export function createVisitorMap(customVisitors: Visitors[]): VisitorMap {
2321
const visitorMap: VisitorMap = new Map();
24-
for (const plugin of [standardPlugin, ...customPlugins]) {
25-
for (const [syntaxKindKey, visitor] of Object.entries(plugin.visitors)) {
22+
for (const visitors of [standardVisitors, ...customVisitors]) {
23+
for (const [syntaxKindKey, visitor] of Object.entries(visitors)) {
2624
if (!visitor) continue;
2725

2826
const syntaxKind = Number(syntaxKindKey) as ts.SyntaxKind;
29-
const visitors = getOrUpdate(visitorMap, syntaxKind, () => []);
27+
const nodeVisitors = getOrUpdate(visitorMap, syntaxKind, () => []);
3028

3129
const objectVisitor: ObjectVisitor<any> = typeof visitor === "function" ? { transform: visitor } : visitor;
32-
visitors.push(objectVisitor);
30+
nodeVisitors.push(objectVisitor);
3331
}
3432
}
3533

36-
for (const visitors of visitorMap.values()) {
37-
visitors.sort((a, b) => (a.priority || 0) - (b.priority || 0));
34+
for (const nodeVisitors of visitorMap.values()) {
35+
nodeVisitors.sort((a, b) => (a.priority || 0) - (b.priority || 0));
3836
}
3937

4038
return visitorMap;
Lines changed: 50 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as ts from "typescript";
2-
import { TransformerPlugin } from "../context";
2+
import { Visitors } from "../context";
33
import { transformElementAccessExpression, transformPropertyAccessExpression, transformQualifiedName } from "./access";
44
import { transformBinaryExpression } from "./binary-expression";
55
import { transformBlock } from "./block";
@@ -41,55 +41,53 @@ import { transformTypeOfExpression } from "./typeof";
4141
import { transformPostfixUnaryExpression, transformPrefixUnaryExpression } from "./unary-expression";
4242
import { transformVariableStatement } from "./variable";
4343

44-
export const standardPlugin: TransformerPlugin = {
45-
visitors: {
46-
...literalVisitors,
47-
...todoMoveSomewhereVisitors,
48-
[ts.SyntaxKind.ArrowFunction]: transformFunctionLikeDeclaration,
49-
[ts.SyntaxKind.BinaryExpression]: transformBinaryExpression,
50-
[ts.SyntaxKind.Block]: transformBlock,
51-
[ts.SyntaxKind.BreakStatement]: transformBreakStatement,
52-
[ts.SyntaxKind.CallExpression]: transformCallExpression,
53-
[ts.SyntaxKind.ClassDeclaration]: transformClassDeclaration,
54-
[ts.SyntaxKind.ClassExpression]: transformClassAsExpression,
55-
[ts.SyntaxKind.ConditionalExpression]: transformConditionalExpression,
56-
[ts.SyntaxKind.ContinueStatement]: transformContinueStatement,
57-
[ts.SyntaxKind.DeleteExpression]: transformDeleteExpression,
58-
[ts.SyntaxKind.DoStatement]: transformDoStatement,
59-
[ts.SyntaxKind.ElementAccessExpression]: transformElementAccessExpression,
60-
[ts.SyntaxKind.EnumDeclaration]: transformEnumDeclaration,
61-
[ts.SyntaxKind.ExportAssignment]: transformExportAssignment,
62-
[ts.SyntaxKind.ExportDeclaration]: transformExportDeclaration,
63-
[ts.SyntaxKind.ExpressionStatement]: transformExpressionStatement,
64-
[ts.SyntaxKind.ExternalModuleReference]: transformExternalModuleReference,
65-
[ts.SyntaxKind.ForInStatement]: transformForInStatement,
66-
[ts.SyntaxKind.ForOfStatement]: transformForOfStatement,
67-
[ts.SyntaxKind.ForStatement]: transformForStatement,
68-
[ts.SyntaxKind.FunctionDeclaration]: transformFunctionDeclaration,
69-
[ts.SyntaxKind.FunctionExpression]: transformFunctionLikeDeclaration,
70-
[ts.SyntaxKind.Identifier]: transformIdentifierExpression,
71-
[ts.SyntaxKind.IfStatement]: transformIfStatement,
72-
[ts.SyntaxKind.ImportDeclaration]: transformImportDeclaration,
73-
[ts.SyntaxKind.ImportEqualsDeclaration]: transformImportEqualsDeclaration,
74-
[ts.SyntaxKind.ModuleDeclaration]: transformModuleDeclaration,
75-
[ts.SyntaxKind.NewExpression]: transformNewExpression,
76-
[ts.SyntaxKind.PostfixUnaryExpression]: transformPostfixUnaryExpression,
77-
[ts.SyntaxKind.PrefixUnaryExpression]: transformPrefixUnaryExpression,
78-
[ts.SyntaxKind.PropertyAccessExpression]: transformPropertyAccessExpression,
79-
[ts.SyntaxKind.QualifiedName]: transformQualifiedName,
80-
[ts.SyntaxKind.ReturnStatement]: transformReturnStatement,
81-
[ts.SyntaxKind.SourceFile]: transformSourceFileNode,
82-
[ts.SyntaxKind.SpreadElement]: transformSpreadElement,
83-
[ts.SyntaxKind.SuperKeyword]: transformSuperExpression,
84-
[ts.SyntaxKind.SwitchStatement]: transformSwitchStatement,
85-
[ts.SyntaxKind.TaggedTemplateExpression]: transformTaggedTemplateExpression,
86-
[ts.SyntaxKind.TemplateExpression]: transformTemplateExpression,
87-
[ts.SyntaxKind.ThisKeyword]: transformThisExpression,
88-
[ts.SyntaxKind.ThrowStatement]: transformThrowStatement,
89-
[ts.SyntaxKind.TryStatement]: transformTryStatement,
90-
[ts.SyntaxKind.TypeOfExpression]: transformTypeOfExpression,
91-
[ts.SyntaxKind.VariableStatement]: transformVariableStatement,
92-
[ts.SyntaxKind.WhileStatement]: transformWhileStatement,
93-
[ts.SyntaxKind.YieldExpression]: transformYieldExpression,
94-
},
44+
export const standardVisitors: Visitors = {
45+
...literalVisitors,
46+
...todoMoveSomewhereVisitors,
47+
[ts.SyntaxKind.ArrowFunction]: transformFunctionLikeDeclaration,
48+
[ts.SyntaxKind.BinaryExpression]: transformBinaryExpression,
49+
[ts.SyntaxKind.Block]: transformBlock,
50+
[ts.SyntaxKind.BreakStatement]: transformBreakStatement,
51+
[ts.SyntaxKind.CallExpression]: transformCallExpression,
52+
[ts.SyntaxKind.ClassDeclaration]: transformClassDeclaration,
53+
[ts.SyntaxKind.ClassExpression]: transformClassAsExpression,
54+
[ts.SyntaxKind.ConditionalExpression]: transformConditionalExpression,
55+
[ts.SyntaxKind.ContinueStatement]: transformContinueStatement,
56+
[ts.SyntaxKind.DeleteExpression]: transformDeleteExpression,
57+
[ts.SyntaxKind.DoStatement]: transformDoStatement,
58+
[ts.SyntaxKind.ElementAccessExpression]: transformElementAccessExpression,
59+
[ts.SyntaxKind.EnumDeclaration]: transformEnumDeclaration,
60+
[ts.SyntaxKind.ExportAssignment]: transformExportAssignment,
61+
[ts.SyntaxKind.ExportDeclaration]: transformExportDeclaration,
62+
[ts.SyntaxKind.ExpressionStatement]: transformExpressionStatement,
63+
[ts.SyntaxKind.ExternalModuleReference]: transformExternalModuleReference,
64+
[ts.SyntaxKind.ForInStatement]: transformForInStatement,
65+
[ts.SyntaxKind.ForOfStatement]: transformForOfStatement,
66+
[ts.SyntaxKind.ForStatement]: transformForStatement,
67+
[ts.SyntaxKind.FunctionDeclaration]: transformFunctionDeclaration,
68+
[ts.SyntaxKind.FunctionExpression]: transformFunctionLikeDeclaration,
69+
[ts.SyntaxKind.Identifier]: transformIdentifierExpression,
70+
[ts.SyntaxKind.IfStatement]: transformIfStatement,
71+
[ts.SyntaxKind.ImportDeclaration]: transformImportDeclaration,
72+
[ts.SyntaxKind.ImportEqualsDeclaration]: transformImportEqualsDeclaration,
73+
[ts.SyntaxKind.ModuleDeclaration]: transformModuleDeclaration,
74+
[ts.SyntaxKind.NewExpression]: transformNewExpression,
75+
[ts.SyntaxKind.PostfixUnaryExpression]: transformPostfixUnaryExpression,
76+
[ts.SyntaxKind.PrefixUnaryExpression]: transformPrefixUnaryExpression,
77+
[ts.SyntaxKind.PropertyAccessExpression]: transformPropertyAccessExpression,
78+
[ts.SyntaxKind.QualifiedName]: transformQualifiedName,
79+
[ts.SyntaxKind.ReturnStatement]: transformReturnStatement,
80+
[ts.SyntaxKind.SourceFile]: transformSourceFileNode,
81+
[ts.SyntaxKind.SpreadElement]: transformSpreadElement,
82+
[ts.SyntaxKind.SuperKeyword]: transformSuperExpression,
83+
[ts.SyntaxKind.SwitchStatement]: transformSwitchStatement,
84+
[ts.SyntaxKind.TaggedTemplateExpression]: transformTaggedTemplateExpression,
85+
[ts.SyntaxKind.TemplateExpression]: transformTemplateExpression,
86+
[ts.SyntaxKind.ThisKeyword]: transformThisExpression,
87+
[ts.SyntaxKind.ThrowStatement]: transformThrowStatement,
88+
[ts.SyntaxKind.TryStatement]: transformTryStatement,
89+
[ts.SyntaxKind.TypeOfExpression]: transformTypeOfExpression,
90+
[ts.SyntaxKind.VariableStatement]: transformVariableStatement,
91+
[ts.SyntaxKind.WhileStatement]: transformWhileStatement,
92+
[ts.SyntaxKind.YieldExpression]: transformYieldExpression,
9593
};

0 commit comments

Comments
 (0)