Skip to content

Commit 53ba64e

Browse files
committed
Pass Transpilation instance as a context
1 parent f90befb commit 53ba64e

5 files changed

Lines changed: 50 additions & 55 deletions

File tree

src/transpilation/transpilation.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { Transpiler, TranspilerHost } from "./transpiler";
1212

1313
export class Transpilation {
1414
public readonly diagnostics: ts.Diagnostic[] = [];
15-
private modules: Module[] = [];
15+
public modules: Module[] = [];
1616

1717
public options = this.program.getCompilerOptions() as CompilerOptions;
1818
public rootDir: string;
@@ -42,9 +42,8 @@ export class Transpilation {
4242
});
4343
}
4444

45-
public emit(programModules: Module[]): Chunk[] {
46-
programModules.forEach(module => this.modules.push(module));
47-
programModules.forEach(module => this.buildModule(module));
45+
public emit(): Chunk[] {
46+
this.modules.forEach(module => this.buildModule(module));
4847

4948
const lualibRequired = this.modules.some(m => m.code.toString().includes('require("lualib_bundle")'));
5049
if (lualibRequired) {

src/transpilation/transpile/index.ts

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ import { CompilerOptions, validateOptions } from "../../CompilerOptions";
44
import { createPrinter } from "../../LuaPrinter";
55
import { createVisitorMap, transformSourceFile } from "../../transformation";
66
import { assert, isNonNull } from "../../utils";
7-
import { Module } from "../module";
8-
import { TranspilerHost } from "../transpiler";
7+
import { Transpilation } from "../transpilation";
98
import { getPlugins, Plugin } from "./plugins";
109
import { getTransformers } from "./transformers";
1110

@@ -19,21 +18,16 @@ export interface TranspileOptions {
1918
}
2019

2120
export function emitProgramModules(
22-
host: TranspilerHost,
21+
transpilation: Transpilation,
2322
writeFileResult: ts.WriteFileCallback,
2423
{ program, sourceFiles: targetSourceFiles, customTransformers = {}, plugins: customPlugins = [] }: TranspileOptions
2524
) {
2625
const options = program.getCompilerOptions() as CompilerOptions;
2726

28-
const diagnostics = validateOptions(options);
29-
let modules: Module[] = [];
27+
transpilation.diagnostics.push(...validateOptions(options));
3028

3129
if (options.noEmitOnError) {
32-
const preEmitDiagnostics = [
33-
...diagnostics,
34-
...program.getOptionsDiagnostics(),
35-
...program.getGlobalDiagnostics(),
36-
];
30+
const preEmitDiagnostics = [...program.getOptionsDiagnostics(), ...program.getGlobalDiagnostics()];
3731

3832
if (targetSourceFiles) {
3933
for (const sourceFile of targetSourceFiles) {
@@ -50,11 +44,12 @@ export function emitProgramModules(
5044
}
5145

5246
if (preEmitDiagnostics.length > 0) {
53-
return { diagnostics: preEmitDiagnostics, modules };
47+
transpilation.diagnostics.push(...preEmitDiagnostics);
48+
return;
5449
}
5550
}
5651

57-
const plugins = getPlugins(program, diagnostics, customPlugins);
52+
const plugins = getPlugins(transpilation, customPlugins);
5853
const visitorMap = createVisitorMap(plugins.map(p => p.visitors).filter(isNonNull));
5954
const printer = createPrinter(plugins.map(p => p.printer).filter(isNonNull));
6055
const processSourceFile = (sourceFile: ts.SourceFile) => {
@@ -64,21 +59,21 @@ export function emitProgramModules(
6459
visitorMap
6560
);
6661

67-
diagnostics.push(...transformDiagnostics);
62+
transpilation.diagnostics.push(...transformDiagnostics);
6863
if (!options.noEmit && !options.emitDeclarationOnly) {
69-
const printResult = printer(program, host, sourceFile.fileName, luaAst, luaLibFeatures);
64+
const printResult = printer(program, transpilation.host, sourceFile.fileName, luaAst, luaLibFeatures);
7065

7166
let fileName: string;
7267
if (path.isAbsolute(sourceFile.fileName)) {
7368
fileName = sourceFile.fileName;
7469
} else {
75-
const currentDirectory = host.getCurrentDirectory();
70+
const currentDirectory = transpilation.host.getCurrentDirectory();
7671
// Having no absolute path in path.resolve would make it fallback to real cwd
7772
assert(path.isAbsolute(currentDirectory), `Invalid path: ${currentDirectory}`);
7873
fileName = path.resolve(currentDirectory, sourceFile.fileName);
7974
}
8075

81-
modules.push({
76+
transpilation.modules.push({
8277
sourceFiles: [sourceFile],
8378
request: fileName,
8479
isBuilt: false,
@@ -87,7 +82,7 @@ export function emitProgramModules(
8782
}
8883
};
8984

90-
const transformers = getTransformers(program, diagnostics, customTransformers, processSourceFile);
85+
const transformers = getTransformers(transpilation, customTransformers, processSourceFile);
9186

9287
const isEmittableJsonFile = (sourceFile: ts.SourceFile) =>
9388
sourceFile.flags & ts.NodeFlags.JsonFile &&
@@ -109,21 +104,17 @@ export function emitProgramModules(
109104
if (isEmittableJsonFile(file)) {
110105
processSourceFile(file);
111106
} else {
112-
diagnostics.push(...program.emit(file, writeFile, undefined, false, transformers).diagnostics);
107+
const { diagnostics } = program.emit(file, writeFile, undefined, false, transformers);
108+
transpilation.diagnostics.push(...diagnostics);
113109
}
114110
}
115111
} else {
116-
diagnostics.push(...program.emit(undefined, writeFile, undefined, false, transformers).diagnostics);
112+
const { diagnostics } = program.emit(undefined, writeFile, undefined, false, transformers);
113+
transpilation.diagnostics.push(...diagnostics);
117114

118115
// JSON files don't get through transformers and aren't written when outDir is the same as rootDir
119116
program.getSourceFiles().filter(isEmittableJsonFile).forEach(processSourceFile);
120117
}
121118

122119
options.noEmit = oldNoEmit;
123-
124-
if (options.noEmit || (options.noEmitOnError && diagnostics.length > 0)) {
125-
modules = [];
126-
}
127-
128-
return { diagnostics, modules };
129120
}

src/transpilation/transpile/plugins.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import * as ts from "typescript";
2-
import { CompilerOptions } from "../../CompilerOptions";
31
import { Printer } from "../../LuaPrinter";
42
import { Visitors } from "../../transformation/context";
3+
import { Transpilation } from "../transpilation";
54
import { getConfigDirectory, resolvePlugin } from "../utils";
65

76
export interface Plugin {
@@ -20,22 +19,21 @@ export interface Plugin {
2019
printer?: Printer;
2120
}
2221

23-
export function getPlugins(program: ts.Program, diagnostics: ts.Diagnostic[], customPlugins: Plugin[]): Plugin[] {
22+
export function getPlugins(transpilation: Transpilation, customPlugins: Plugin[]): Plugin[] {
2423
const pluginsFromOptions: Plugin[] = [];
25-
const options = program.getCompilerOptions() as CompilerOptions;
2624

27-
for (const [index, pluginOption] of (options.luaPlugins ?? []).entries()) {
25+
for (const [index, pluginOption] of (transpilation.options.luaPlugins ?? []).entries()) {
2826
const optionName = `tstl.luaPlugins[${index}]`;
2927

3028
const { error: resolveError, result: factory } = resolvePlugin(
3129
"plugin",
3230
`${optionName}.name`,
33-
getConfigDirectory(options),
31+
getConfigDirectory(transpilation.options),
3432
pluginOption.name,
3533
pluginOption.import
3634
);
3735

38-
if (resolveError) diagnostics.push(resolveError);
36+
if (resolveError) transpilation.diagnostics.push(resolveError);
3937
if (factory === undefined) continue;
4038

4139
const plugin = typeof factory === "function" ? factory(pluginOption) : factory;

src/transpilation/transpile/transformers.ts

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import * as ts from "typescript";
33
import * as cliDiagnostics from "../../cli/diagnostics";
44
import { CompilerOptions, TransformerImport } from "../../CompilerOptions";
55
import * as diagnosticFactories from "../diagnostics";
6+
import { Transpilation } from "../transpilation";
67
import { getConfigDirectory, resolvePlugin } from "../utils";
78

89
export function getTransformers(
9-
program: ts.Program,
10-
diagnostics: ts.Diagnostic[],
10+
transpilation: Transpilation,
1111
customTransformers: ts.CustomTransformers,
1212
onSourceFile: (sourceFile: ts.SourceFile) => void
1313
): ts.CustomTransformers {
@@ -16,15 +16,14 @@ export function getTransformers(
1616
return ts.createSourceFile(sourceFile.fileName, "", ts.ScriptTarget.ESNext);
1717
};
1818

19-
const transformersFromOptions = loadTransformersFromOptions(program, diagnostics);
19+
const transformersFromOptions = loadTransformersFromOptions(transpilation);
2020

2121
const afterDeclarations = [
2222
...(transformersFromOptions.afterDeclarations ?? []),
2323
...(customTransformers.afterDeclarations ?? []),
2424
];
2525

26-
const options = program.getCompilerOptions() as CompilerOptions;
27-
if (options.noImplicitSelf) {
26+
if (transpilation.options.noImplicitSelf) {
2827
afterDeclarations.unshift(noImplicitSelfTransformer);
2928
}
3029

@@ -53,33 +52,37 @@ export const noImplicitSelfTransformer: ts.TransformerFactory<ts.SourceFile | ts
5352
: transformSourceFile(node);
5453
};
5554

56-
function loadTransformersFromOptions(program: ts.Program, diagnostics: ts.Diagnostic[]): ts.CustomTransformers {
55+
function loadTransformersFromOptions(transpilation: Transpilation): ts.CustomTransformers {
5756
const customTransformers: Required<ts.CustomTransformers> = {
5857
before: [],
5958
after: [],
6059
afterDeclarations: [],
6160
};
6261

63-
const options = program.getCompilerOptions() as CompilerOptions;
64-
if (!options.plugins) return customTransformers;
62+
if (!transpilation.options.plugins) return customTransformers;
6563

66-
for (const [index, transformerImport] of options.plugins.entries()) {
64+
for (const [index, transformerImport] of transpilation.options.plugins.entries()) {
6765
if (!("transform" in transformerImport)) continue;
6866
const optionName = `compilerOptions.plugins[${index}]`;
6967

7068
const { error: resolveError, result: factory } = resolvePlugin(
7169
"transformer",
7270
`${optionName}.transform`,
73-
getConfigDirectory(options),
71+
getConfigDirectory(transpilation.options),
7472
transformerImport.transform,
7573
transformerImport.import
7674
);
7775

78-
if (resolveError) diagnostics.push(resolveError);
76+
if (resolveError) transpilation.diagnostics.push(resolveError);
7977
if (factory === undefined) continue;
8078

81-
const { error: loadError, transformer } = loadTransformer(optionName, program, factory, transformerImport);
82-
if (loadError) diagnostics.push(loadError);
79+
const { error: loadError, transformer } = loadTransformer(
80+
optionName,
81+
transpilation.program,
82+
factory,
83+
transformerImport
84+
);
85+
if (loadError) transpilation.diagnostics.push(loadError);
8386
if (transformer === undefined) continue;
8487

8588
if (transformer.before) {

src/transpilation/transpiler.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,24 @@ export class Transpiler {
2828

2929
public emit(emitOptions: EmitOptions): EmitResult {
3030
const { program, writeFile = this.host.writeFile } = emitOptions;
31+
const options = program.getCompilerOptions();
32+
3133
const transpilation = new Transpilation(this, program);
32-
const { diagnostics, modules } = emitProgramModules(this.host, writeFile, emitOptions);
33-
const emitPlan = transpilation.emit(modules);
34-
diagnostics.push(...transpilation.diagnostics);
34+
emitProgramModules(transpilation, writeFile, emitOptions);
35+
if (options.noEmit || (options.noEmitOnError && transpilation.diagnostics.length > 0)) {
36+
return { diagnostics: transpilation.diagnostics, emitSkipped: true };
37+
}
38+
39+
const chunks = transpilation.emit();
3540

36-
const options = program.getCompilerOptions();
3741
const emitBOM = options.emitBOM ?? false;
38-
for (const { outputPath, code, sourceMap, sourceFiles } of emitPlan) {
42+
for (const { outputPath, code, sourceMap, sourceFiles } of chunks) {
3943
writeFile(outputPath, code, emitBOM, undefined, sourceFiles);
4044
if (options.sourceMap && sourceMap !== undefined) {
4145
writeFile(outputPath + ".map", sourceMap, emitBOM, undefined, sourceFiles);
4246
}
4347
}
4448

45-
return { diagnostics, emitSkipped: emitPlan.length === 0 };
49+
return { diagnostics: transpilation.diagnostics, emitSkipped: chunks.length === 0 };
4650
}
4751
}

0 commit comments

Comments
 (0)