diff options
Diffstat (limited to 'src/main/java/org')
3 files changed, 57 insertions, 8 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/config/ProjectConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/config/ProjectConfig.java index 835b496..2899756 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/config/ProjectConfig.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/config/ProjectConfig.java @@ -46,7 +46,7 @@ public record ProjectConfig( JavaPreciselyMatchersGenerator.parseGeneratorConfig(projectRoot, generatorJson, langsJson); case RustTypesGenerator.NAME -> - RustTypesGenerator.parseGeneratorConfig(projectRoot, generatorJson); + RustTypesGenerator.parseGeneratorConfig(projectRoot, generatorJson, langsJson); default -> throw new UnknownGeneratorError( diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGeneratorConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGeneratorConfig.java index db0b2fe..5d777ea 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGeneratorConfig.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGeneratorConfig.java @@ -1,14 +1,55 @@ package org.zwobble.hobgoblin.compiler.output.generators.rust; import org.zwobble.hobgoblin.compiler.builtins.NativeTypes; -import org.zwobble.hobgoblin.compiler.output.lang.java.ast.*; import org.zwobble.hobgoblin.compiler.output.lang.rust.ast.RustTypePath; +import org.zwobble.hobgoblin.compiler.parser.Parser; import org.zwobble.hobgoblin.compiler.types.SimpleNativeType; +import org.zwobble.json5.reader.Json5ObjectReader; +import java.util.HashMap; import java.util.Map; import java.util.Optional; -public class RustGeneratorConfig { +public record RustGeneratorConfig( + Map<SimpleNativeType, RustNativeTypeConfig> nativeTypeConfigs +) { + public static RustGeneratorConfig parseLangsConfig(Optional<Json5ObjectReader> langsJson) { + var output = langsJson.flatMap(json -> json.getObject("rust")); + + if (output.isEmpty()) { + return new RustGeneratorConfig(DEFAULT_NATIVE_TYPE_CONFIGS); + } + + var nativeTypeConfigs = parseNativeTypeConfigs(output.get()); + + return new RustGeneratorConfig( + nativeTypeConfigs + ); + } + + private static Map<SimpleNativeType, RustNativeTypeConfig> parseNativeTypeConfigs(Json5ObjectReader output) { + // TODO: remove duplication with Java config + var nativeTypeConfigs = new HashMap<SimpleNativeType, RustNativeTypeConfig>(DEFAULT_NATIVE_TYPE_CONFIGS); + output.getArrayOfObjects("nativeTypes").ifPresent(nativeTypesJson -> { + for (var nativeTypeJson : nativeTypesJson) { + var hobgoblinTypeString = nativeTypeJson.getString("hobgoblin").valueAsSourceText(); + var hobgoblinTypeName = Parser.parseQualifiedTypeName(hobgoblinTypeString); + var hobgoblinType = new SimpleNativeType( + hobgoblinTypeName.namespaceName(), + hobgoblinTypeName.name() + ); + + // TODO: less hacky type representation + var rustTypeString = nativeTypeJson.getString("rust").value(); + var rustType = RustTypePath.of(rustTypeString); + + nativeTypeConfigs.put(hobgoblinType, new RustNativeTypeConfig(rustType)); + } + }); + + return nativeTypeConfigs; + } + private static final Map<SimpleNativeType, RustNativeTypeConfig> DEFAULT_NATIVE_TYPE_CONFIGS = Map.ofEntries( Map.entry(NativeTypes.INT_32, new RustNativeTypeConfig(RustTypePath.primitive("i32"))), Map.entry(NativeTypes.INT_64, new RustNativeTypeConfig(RustTypePath.primitive("i64"))), @@ -18,6 +59,6 @@ public class RustGeneratorConfig { ); public Optional<RustNativeTypeConfig> nativeTypeConfig(SimpleNativeType type) { - return Optional.ofNullable(DEFAULT_NATIVE_TYPE_CONFIGS.get(type)); + return Optional.ofNullable(this.nativeTypeConfigs.get(type)); } } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java index 4593d38..9092e16 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java @@ -16,25 +16,33 @@ import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; public class RustTypesGenerator implements Generator { public static final String NAME = "rust-types"; - public static OutputConfig parseGeneratorConfig(Path projectRoot, Json5ObjectReader output) { + public static OutputConfig parseGeneratorConfig( + Path projectRoot, + Json5ObjectReader output, + Optional<Json5ObjectReader> langsJson + ) { return () -> { var relativeOutputPath = output.getString("path").value(); var outputPath = projectRoot.resolve(relativeOutputPath); - return new RustTypesGenerator(outputPath); + var rustConfig = RustGeneratorConfig.parseLangsConfig(langsJson); + + return new RustTypesGenerator(outputPath, rustConfig); }; } private final Path outputPath; - private final RustGeneratorConfig config = new RustGeneratorConfig(); + private final RustGeneratorConfig config; - private RustTypesGenerator(Path outputPath) { + private RustTypesGenerator(Path outputPath, RustGeneratorConfig config) { this.outputPath = outputPath; + this.config = config; } @Override |
