Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions src/BundlerTransformer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { TranspiledFile } from "./Transpile";
import { LuaProjectTransformer } from "./CustomLuaTransformers";
import { createBlock, Statement } from "./LuaAST";

type BundlerTransformerFactory = (outFile: string) => LuaProjectTransformer;

function notUndefined<T>(value: T | undefined): value is T {
return value !== undefined;
}

// TODO: Implement correctly, this is just a PoC!
export const bundlerTransformer: BundlerTransformerFactory = (outFile: string) => (projectFiles: TranspiledFile[]) => {
const bundledFile: TranspiledFile = {
fileName: outFile,
declaration: projectFiles
.map(f => f.declaration)
.filter(notUndefined)
.join("\n"),
luaAst: createBlock(
([] as Statement[]).concat(
...projectFiles
.map(f => f.luaAst)
.filter(notUndefined)
.map(ast => ast.statements)
)
),

};
return [bundledFile];
};
31 changes: 31 additions & 0 deletions src/CustomLuaTransformers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { Diagnostic } from "typescript";
import { CompilerOptions } from "./CompilerOptions";
import { TranspiledFile } from "./Transpile";
import { bundlerTransformer } from "./BundlerTransformer";

export interface CustomLuaTransformers {
/** Custom transformers to evaluate before printing */
before: LuaProjectTransformer[];
/** Custom transformers to evaluate after printing */
after: LuaProjectTransformer[];
}

export type LuaProjectTransformer = (projectFiles: TranspiledFile[]) => TranspiledFile[];

export function getCustomLuaTransformers(
options: CompilerOptions,
diagnostics: Diagnostic[]
//customTransformers: ts.CustomTransformers,
): CustomLuaTransformers {
const beforePrinting: LuaProjectTransformer[] = [];
if (options.outFile) {
beforePrinting.push(bundlerTransformer(options.outFile));
}

const afterPrinting: LuaProjectTransformer[] = [];

return {
before: beforePrinting,
after: afterPrinting,
};
}
2 changes: 1 addition & 1 deletion src/TSTransformers.ts → src/CustomTSTransformers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { CompilerOptions, TransformerImport } from "./CompilerOptions";
import * as diagnosticFactories from "./diagnostics";
import { noImplicitSelfTransformer } from "./NoImplicitSelfTransformer";

export function getCustomTransformers(
export function getCustomTSTransformers(
program: ts.Program,
diagnostics: ts.Diagnostic[],
customTransformers: ts.CustomTransformers,
Expand Down
17 changes: 15 additions & 2 deletions src/Transpile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import { Block } from "./LuaAST";
import { LuaPrinter } from "./LuaPrinter";
import { LuaTransformer } from "./LuaTransformer";
import { TranspileError } from "./TranspileError";
import { getCustomTransformers } from "./TSTransformers";
import { getCustomTSTransformers } from "./CustomTSTransformers";
import { getCustomLuaTransformers } from "./CustomLuaTransformers";

export interface TranspiledFile {
fileName: string;
Expand Down Expand Up @@ -97,7 +98,7 @@ export function transpile({
}
};

const transformers = getCustomTransformers(program, diagnostics, customTransformers, processSourceFile);
const transformers = getCustomTSTransformers(program, diagnostics, customTransformers, processSourceFile);

const writeFile: ts.WriteFileCallback = (fileName, data, _bom, _onError, sourceFiles = []) => {
for (const sourceFile of sourceFiles) {
Expand All @@ -120,6 +121,13 @@ export function transpile({
const oldNoEmit = options.noEmit;
options.noEmit = false;

const luaTransformers = getCustomLuaTransformers(options, diagnostics);

// TODO: Make sure source files have been transformed at this point, but not printed
for (const luaTransformer of luaTransformers.before) {
transpiledFiles = luaTransformer(transpiledFiles);
}

if (targetSourceFiles) {
for (const file of targetSourceFiles) {
if (isEmittableJsonFile(file)) {
Expand All @@ -144,5 +152,10 @@ export function transpile({
transpiledFiles = [];
}

// TODO: Make sure source files have been transformed AND printed at this point
for (const luaTransformer of luaTransformers.after) {
transpiledFiles = luaTransformer(transpiledFiles);
}

return { diagnostics, transpiledFiles };
}