This commit is contained in:
ex61wi
2026-04-04 16:31:39 +02:00
parent 954d7d5a62
commit 8cf3b6640a
+29 -19
View File
@@ -57,7 +57,7 @@ export class ScriptCompiler {
} }
private parseFile(filePath: string, content: string, fullPath: string): ParsedFile { private parseFile(filePath: string, content: string, fullPath: string): ParsedFile {
const dependencies: string[] = []; const dependencies: Dependency[] = [];
const newLines: string[] = [`do --${filePath}`]; const newLines: string[] = [`do --${filePath}`];
content = stripLuaMultilineComments(content); content = stripLuaMultilineComments(content);
@@ -113,7 +113,7 @@ export class ScriptCompiler {
const requireMatch = line.match(/require\(['"](.+?)['"]\)/); const requireMatch = line.match(/require\(['"](.+?)['"]\)/);
if (requireMatch) { if (requireMatch) {
const requiredModule = fileReferenceToLuaVariable(requireMatch[1]); const requiredModule = fileReferenceToLuaVariable(requireMatch[1]);
dependencies.push(requiredModule); dependencies.push(new Dependency(requiredModule, fullPath, i + 1));
line = line.replace(requireMatch[0], requiredModule); line = line.replace(requireMatch[0], requiredModule);
} }
@@ -241,6 +241,15 @@ function stripLuaMultilineComments(content: string): string {
return content.replace(/--\[(=*)\[[\s\S]*?\]\1\]/g, ''); return content.replace(/--\[(=*)\[[\s\S]*?\]\1\]/g, '');
} }
class Dependency {
constructor(
public readonly name: string,
public readonly filePath: string,
public readonly requiredAtLine: number
){}
}
class ParsedFile { class ParsedFile {
public readonly fileKey: string; public readonly fileKey: string;
@@ -248,7 +257,7 @@ class ParsedFile {
public readonly filePath: string, public readonly filePath: string,
public readonly fullPath: string, public readonly fullPath: string,
public readonly lines: string[], public readonly lines: string[],
public readonly dependencies: string[] public readonly dependencies: Dependency[]
) { ) {
this.fileKey = fileReferenceToLuaVariable(filePath); this.fileKey = fileReferenceToLuaVariable(filePath);
} }
@@ -302,23 +311,24 @@ class Writer {
outputLines.push(...this.getStartLines()); outputLines.push(...this.getStartLines());
const writeFileRecursive = (fileKey: string) => { const writeFileRecursive = (parsedFile: ParsedFile) => {
if (writtenFiles.has(fileKey)) {
return;
}
const file = this.files.get(fileKey);
if (!file) {
throw new Error(`File not found in compiler: ${fileKey}`);
}
// Write dependencies first // Write dependencies first
for (const dep of file.dependencies) { for (const dep of parsedFile.dependencies) {
writeFileRecursive(dep); const depFile = this.files.get(dep.name);
if (depFile) {
writeFileRecursive(depFile);
} else {
this.onError?.({
filePath: parsedFile.fullPath,
line: 0,
message: `Missing dependency: ${dep}`
});
}
} }
outputLines.push(...file.lines); outputLines.push(...parsedFile.lines);
writtenFiles.add(fileKey); writtenFiles.add(parsedFile.fileKey);
}; };
//Check for circular dependencies before writing //Check for circular dependencies before writing
@@ -347,7 +357,7 @@ class Writer {
const file = this.files.get(key); const file = this.files.get(key);
if (file) { if (file) {
for (const dep of file.dependencies) { for (const dep of file.dependencies) {
if (checkCircular(dep)) { if (checkCircular(dep.name)) {
return true; return true;
} }
} }
@@ -362,8 +372,8 @@ class Writer {
} }
// Write all files in dependency order // Write all files in dependency order
for (const fileKey of this.files.keys()) { for (const parsedFile of this.files.values()) {
writeFileRecursive(fileKey); writeFileRecursive(parsedFile);
} }
fs.mkdirSync(path.dirname(this.location), { recursive: true }); fs.mkdirSync(path.dirname(this.location), { recursive: true });