summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-02 11:45:21 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-02 11:45:21 +0100
commit264d74517334d2dfea1d2d893394f67b0a6ed0ad (patch)
tree32042c535bf8a8500254c50bc6fb0a75ced69329 /src/main/java
parentbbd84bea3e34e503ccd49c59fe7d7a3727c6adfa (diff)
Support custom configs for native types in Rust types output
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/config/ProjectConfig.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGeneratorConfig.java47
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java16
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