wip
This commit is contained in:
@@ -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 });
|
||||||
|
|||||||
Reference in New Issue
Block a user