diff options
Diffstat (limited to 'src/main/java/org')
4 files changed, 94 insertions, 3 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java index 698d68f..873ecfd 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java @@ -2,7 +2,7 @@ package org.zwobble.hobgoblin.compiler; import org.zwobble.hobgoblin.compiler.ast.typed.TypedNamespaceNode; import org.zwobble.hobgoblin.compiler.builtins.BuiltinTypes; -import org.zwobble.hobgoblin.compiler.output.generators.Generator; +import org.zwobble.hobgoblin.compiler.config.ProjectConfig; import org.zwobble.hobgoblin.compiler.parser.Parser; import org.zwobble.hobgoblin.compiler.typechecker.TypeChecker; import org.zwobble.hobgoblin.compiler.typechecker.TypeCheckerGlobalContext; @@ -14,7 +14,6 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; -import java.util.List; public class HobgoblinCompiler { public static final String FILE_NAME_EXTENSION = ".hob"; @@ -22,7 +21,10 @@ public class HobgoblinCompiler { private HobgoblinCompiler() { } - public static void compile(Path projectRoot, List<? extends Generator> generators) throws IOException { + public static void compile(Path projectRoot) throws IOException { + var config = ProjectConfig.read(projectRoot); + var generators = config.createGenerators(); + var sourceDirectory = projectRoot.resolve("src"); var sourceFiles = sourceDirectory.toFile() .listFiles(file -> file.toPath().toString().endsWith(FILE_NAME_EXTENSION)); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/config/OutputConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/config/OutputConfig.java new file mode 100644 index 0000000..ae31bdd --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/config/OutputConfig.java @@ -0,0 +1,7 @@ +package org.zwobble.hobgoblin.compiler.config; + +import org.zwobble.hobgoblin.compiler.output.generators.Generator; + +public interface OutputConfig { + Generator createGenerator(); +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/config/ProjectConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/config/ProjectConfig.java new file mode 100644 index 0000000..ee70dba --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/config/ProjectConfig.java @@ -0,0 +1,68 @@ +package org.zwobble.hobgoblin.compiler.config; + +import org.zwobble.hobgoblin.compiler.output.generators.Generator; +import org.zwobble.hobgoblin.compiler.output.generators.javatypes.JavaTypesGenerator; +import org.zwobble.json5.parser.Json5Parser; +import org.zwobble.json5.values.Json5Array; +import org.zwobble.json5.values.Json5Object; +import org.zwobble.json5.values.Json5String; +import org.zwobble.json5.values.Json5Value; +import org.zwobble.sourcetext.SourceText; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +public record ProjectConfig( + List<OutputConfig> output +) { + public static ProjectConfig read(Path projectRoot) throws IOException { + var configPath = projectRoot.resolve("hobgoblin.json5"); + var contents = Files.readString(configPath); + var sourceText = SourceText.fromString(configPath.toString(), contents); + return fromSourceText(projectRoot, sourceText); + } + + private static ProjectConfig fromSourceText(Path projectRoot, SourceText sourceText) { + return fromJson5(projectRoot, Json5Parser.parse(sourceText)); + } + + private static ProjectConfig fromJson5(Path projectRoot, Json5Value document) { + if (!(document instanceof Json5Object documentObject)) { + throw new UnsupportedOperationException("TODO"); + } + + var outputsValue = documentObject.getValue("outputs").orElseThrow(); + if (!(outputsValue instanceof Json5Array outputsArray)) { + throw new UnsupportedOperationException("TODO"); + } + + var outputs = new ArrayList<OutputConfig>(); + for (var outputValue : outputsArray.elements()) { + if (!(outputValue instanceof Json5Object outputObject)) { + throw new UnsupportedOperationException("TODO"); + } + var generatorName = (Json5String) outputObject.getValue("generator").orElseThrow(); + + var output = switch (generatorName.value()) { + case JavaTypesGenerator.NAME -> + JavaTypesGenerator.parseOutputConfig(projectRoot, outputObject); + + default -> + throw new UnsupportedOperationException("TODO"); + }; + + outputs.add(output); + } + + return new ProjectConfig(outputs); + } + + public List<Generator> createGenerators() { + return this.output.stream() + .map(output -> output.createGenerator()) + .toList(); + } +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java index 98d4c12..4c06e8e 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java @@ -5,11 +5,14 @@ import org.zwobble.hobgoblin.compiler.ast.typed.TypedStructDefinitionNode; import org.zwobble.hobgoblin.compiler.ast.typed.TypedSumDefinitionNode; import org.zwobble.hobgoblin.compiler.ast.typed.TypedTypeLevelExpressionNode; import org.zwobble.hobgoblin.compiler.builtins.BuiltinTypes; +import org.zwobble.hobgoblin.compiler.config.OutputConfig; import org.zwobble.hobgoblin.compiler.output.CodeWriter; import org.zwobble.hobgoblin.compiler.output.generators.Generator; import org.zwobble.hobgoblin.compiler.output.java.JavaWriter; import org.zwobble.hobgoblin.compiler.output.java.ast.*; import org.zwobble.hobgoblin.compiler.types.*; +import org.zwobble.json5.values.Json5Object; +import org.zwobble.json5.values.Json5String; import java.io.File; import java.io.IOException; @@ -19,6 +22,17 @@ import java.util.HashMap; import java.util.List; public class JavaTypesGenerator implements Generator { + public static final String NAME = "java-types"; + + public static OutputConfig parseOutputConfig(Path projectRoot, Json5Object output) { + return () -> { + var relativeOutputPath = ((Json5String) output.getValue("path").orElseThrow()).value(); + var outputPath = projectRoot.resolve(relativeOutputPath); + var packageName = ((Json5String) output.getValue("package-name").orElseThrow()).value(); + return new JavaTypesGenerator(outputPath, packageName); + }; + } + private final Path sourceRootDirectory; private final List<String> packageName; |
