diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-07-24 17:59:45 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-07-24 17:59:45 +0100 |
| commit | 2bc23bdc7fe01fc5921be8e09f405a8a1fd7bd65 (patch) | |
| tree | 9df07f8aeba21f4fb91e23fcc8d1c7a4a57a42eb | |
| parent | c8baf035c5a1705b957931f56f9162125803e554 (diff) | |
Add Shared type
| -rw-r--r-- | examples/08-shared/hobgoblin.json5 | 19 | ||||
| -rw-r--r-- | examples/08-shared/output/java/.gitignore (renamed from examples/08-custom-code/output/java/.gitignore) | 0 | ||||
| l--------- | examples/08-shared/output/java/pom.xml (renamed from examples/08-custom-code/output/java/pom.xml) | 0 | ||||
| -rw-r--r-- | examples/08-shared/output/java/src/test/java/org/zwobble/example/PointTests.java | 16 | ||||
| -rw-r--r-- | examples/08-shared/src/point.hob | 11 | ||||
| -rw-r--r-- | examples/09-custom-code/hobgoblin.json5 (renamed from examples/08-custom-code/hobgoblin.json5) | 0 | ||||
| -rw-r--r-- | examples/09-custom-code/output/java/.gitignore (renamed from examples/09-imports/output/java/.gitignore) | 0 | ||||
| l--------- | examples/09-custom-code/output/java/pom.xml (renamed from examples/09-imports/output/java/pom.xml) | 0 | ||||
| -rw-r--r-- | examples/09-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java (renamed from examples/08-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java) | 0 | ||||
| -rw-r--r-- | examples/09-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java (renamed from examples/08-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java) | 0 | ||||
| -rw-r--r-- | examples/09-custom-code/output/rust/.gitignore (renamed from examples/08-custom-code/output/rust/.gitignore) | 0 | ||||
| -rw-r--r-- | examples/09-custom-code/output/rust/Cargo.lock (renamed from examples/08-custom-code/output/rust/Cargo.lock) | 0 | ||||
| -rw-r--r-- | examples/09-custom-code/output/rust/Cargo.toml (renamed from examples/08-custom-code/output/rust/Cargo.toml) | 0 | ||||
| -rw-r--r-- | examples/09-custom-code/output/rust/rust-toolchain.toml (renamed from examples/08-custom-code/output/rust/rust-toolchain.toml) | 0 | ||||
| -rw-r--r-- | examples/09-custom-code/output/rust/src/gen/shapes.rs (renamed from examples/08-custom-code/output/rust/src/gen/shapes.rs) | 0 | ||||
| -rw-r--r-- | examples/09-custom-code/output/rust/src/lib.rs (renamed from examples/08-custom-code/output/rust/src/lib.rs) | 0 | ||||
| -rw-r--r-- | examples/09-custom-code/output/rust/src/shapes.rs (renamed from examples/08-custom-code/output/rust/src/shapes.rs) | 0 | ||||
| -rw-r--r-- | examples/09-custom-code/src/shapes.hob (renamed from examples/08-custom-code/src/shapes.hob) | 0 | ||||
| -rw-r--r-- | examples/10-imports/hobgoblin.json5 (renamed from examples/09-imports/hobgoblin.json5) | 0 | ||||
| -rw-r--r-- | examples/10-imports/output/java/.gitignore (renamed from examples/10-transient-0/output/java/.gitignore) | 0 | ||||
| l--------- | examples/10-imports/output/java/pom.xml (renamed from examples/10-transient-0/output/java/pom.xml) | 0 | ||||
| -rw-r--r-- | examples/10-imports/output/java/src/test/java/org/zwobble/example/LineTests.java (renamed from examples/09-imports/output/java/src/test/java/org/zwobble/example/LineTests.java) | 0 | ||||
| -rw-r--r-- | examples/10-imports/output/rust/.gitignore (renamed from examples/09-imports/output/rust/.gitignore) | 0 | ||||
| -rw-r--r-- | examples/10-imports/output/rust/Cargo.lock (renamed from examples/09-imports/output/rust/Cargo.lock) | 0 | ||||
| -rw-r--r-- | examples/10-imports/output/rust/Cargo.toml (renamed from examples/09-imports/output/rust/Cargo.toml) | 0 | ||||
| -rw-r--r-- | examples/10-imports/output/rust/rust-toolchain.toml (renamed from examples/09-imports/output/rust/rust-toolchain.toml) | 0 | ||||
| -rw-r--r-- | examples/10-imports/output/rust/src/lib.rs (renamed from examples/09-imports/output/rust/src/lib.rs) | 0 | ||||
| -rw-r--r-- | examples/10-imports/output/rust/src/line.rs (renamed from examples/09-imports/output/rust/src/line.rs) | 0 | ||||
| -rw-r--r-- | examples/10-imports/output/rust/src/point.rs (renamed from examples/09-imports/output/rust/src/point.rs) | 0 | ||||
| -rw-r--r-- | examples/10-imports/src/line.hob (renamed from examples/09-imports/src/line.hob) | 0 | ||||
| -rw-r--r-- | examples/10-imports/src/point.hob (renamed from examples/09-imports/src/point.hob) | 0 | ||||
| -rw-r--r-- | examples/11-transient-0/hobgoblin.json5 (renamed from examples/10-transient-0/hobgoblin.json5) | 0 | ||||
| -rw-r--r-- | examples/11-transient-0/output/java/.gitignore | 2 | ||||
| l--------- | examples/11-transient-0/output/java/pom.xml | 1 | ||||
| -rw-r--r-- | examples/11-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java (renamed from examples/10-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java) | 0 | ||||
| -rw-r--r-- | examples/11-transient-0/output/rust/.gitignore (renamed from examples/10-transient-0/output/rust/.gitignore) | 0 | ||||
| -rw-r--r-- | examples/11-transient-0/output/rust/Cargo.lock (renamed from examples/10-transient-0/output/rust/Cargo.lock) | 0 | ||||
| -rw-r--r-- | examples/11-transient-0/output/rust/Cargo.toml (renamed from examples/10-transient-0/output/rust/Cargo.toml) | 0 | ||||
| -rw-r--r-- | examples/11-transient-0/output/rust/rust-toolchain.toml (renamed from examples/10-transient-0/output/rust/rust-toolchain.toml) | 0 | ||||
| -rw-r--r-- | examples/11-transient-0/output/rust/src/data.rs (renamed from examples/10-transient-0/output/rust/src/data.rs) | 0 | ||||
| -rw-r--r-- | examples/11-transient-0/output/rust/src/gen/data.rs (renamed from examples/10-transient-0/output/rust/src/gen/data.rs) | 0 | ||||
| -rw-r--r-- | examples/11-transient-0/output/rust/src/gen/data/transient_0.rs (renamed from examples/10-transient-0/output/rust/src/gen/data/transient_0.rs) | 0 | ||||
| -rw-r--r-- | examples/11-transient-0/output/rust/src/gen/transient_0.rs (renamed from examples/10-transient-0/output/rust/src/gen/transient_0.rs) | 0 | ||||
| -rw-r--r-- | examples/11-transient-0/output/rust/src/lib.rs (renamed from examples/10-transient-0/output/rust/src/lib.rs) | 0 | ||||
| -rw-r--r-- | examples/11-transient-0/output/rust/src/transient_0.rs (renamed from examples/10-transient-0/output/rust/src/transient_0.rs) | 0 | ||||
| -rw-r--r-- | examples/11-transient-0/src/data.hob (renamed from examples/10-transient-0/src/data.hob) | 0 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java | 1 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java | 7 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGenerator.java | 15 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java | 12 |
50 files changed, 78 insertions, 6 deletions
diff --git a/examples/08-shared/hobgoblin.json5 b/examples/08-shared/hobgoblin.json5 new file mode 100644 index 0000000..f9f6597 --- /dev/null +++ b/examples/08-shared/hobgoblin.json5 @@ -0,0 +1,19 @@ +{ + outputs: { + langs: { + java: { + packageName: "org.zwobble.example.types", + }, + }, + generators: [ + { + generator: "java-types", + path: "output/java/src/gen/java", + }, + { + generator: "java-precisely-matchers", + path: "output/java/src/gen/java", + }, + ], + } +} diff --git a/examples/08-custom-code/output/java/.gitignore b/examples/08-shared/output/java/.gitignore index ff511d4..ff511d4 100644 --- a/examples/08-custom-code/output/java/.gitignore +++ b/examples/08-shared/output/java/.gitignore diff --git a/examples/08-custom-code/output/java/pom.xml b/examples/08-shared/output/java/pom.xml index 445fa65..445fa65 120000 --- a/examples/08-custom-code/output/java/pom.xml +++ b/examples/08-shared/output/java/pom.xml diff --git a/examples/08-shared/output/java/src/test/java/org/zwobble/example/PointTests.java b/examples/08-shared/output/java/src/test/java/org/zwobble/example/PointTests.java new file mode 100644 index 0000000..18a1961 --- /dev/null +++ b/examples/08-shared/output/java/src/test/java/org/zwobble/example/PointTests.java @@ -0,0 +1,16 @@ +package org.zwobble.example; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; +import org.zwobble.example.types.point.Point; + +public class PointTests { + @Test + public void pointFields() { + Point point = new Point(10, 25); + int x = point.x(); + int y = point.y(); + assertEquals(x, 10); + assertEquals(y, 25); + } +} diff --git a/examples/08-shared/src/point.hob b/examples/08-shared/src/point.hob new file mode 100644 index 0000000..7b9a8e6 --- /dev/null +++ b/examples/08-shared/src/point.hob @@ -0,0 +1,11 @@ +/// A straight line from one point to another. +struct Line { + field start: Shared[Point]; + field end: Shared[Point]; +} + +/// A 2D point. +struct Point { + field x: Int32; + field y: Int32; +} diff --git a/examples/08-custom-code/hobgoblin.json5 b/examples/09-custom-code/hobgoblin.json5 index 1d08a40..1d08a40 100644 --- a/examples/08-custom-code/hobgoblin.json5 +++ b/examples/09-custom-code/hobgoblin.json5 diff --git a/examples/09-imports/output/java/.gitignore b/examples/09-custom-code/output/java/.gitignore index ff511d4..ff511d4 100644 --- a/examples/09-imports/output/java/.gitignore +++ b/examples/09-custom-code/output/java/.gitignore diff --git a/examples/09-imports/output/java/pom.xml b/examples/09-custom-code/output/java/pom.xml index 445fa65..445fa65 120000 --- a/examples/09-imports/output/java/pom.xml +++ b/examples/09-custom-code/output/java/pom.xml diff --git a/examples/08-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java b/examples/09-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java index 169d729..169d729 100644 --- a/examples/08-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java +++ b/examples/09-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java diff --git a/examples/08-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java b/examples/09-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java index fba8e6c..fba8e6c 100644 --- a/examples/08-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java +++ b/examples/09-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java diff --git a/examples/08-custom-code/output/rust/.gitignore b/examples/09-custom-code/output/rust/.gitignore index ea8c4bf..ea8c4bf 100644 --- a/examples/08-custom-code/output/rust/.gitignore +++ b/examples/09-custom-code/output/rust/.gitignore diff --git a/examples/08-custom-code/output/rust/Cargo.lock b/examples/09-custom-code/output/rust/Cargo.lock index 9dc6e3e..9dc6e3e 100644 --- a/examples/08-custom-code/output/rust/Cargo.lock +++ b/examples/09-custom-code/output/rust/Cargo.lock diff --git a/examples/08-custom-code/output/rust/Cargo.toml b/examples/09-custom-code/output/rust/Cargo.toml index 5d4c622..5d4c622 100644 --- a/examples/08-custom-code/output/rust/Cargo.toml +++ b/examples/09-custom-code/output/rust/Cargo.toml diff --git a/examples/08-custom-code/output/rust/rust-toolchain.toml b/examples/09-custom-code/output/rust/rust-toolchain.toml index 4fedb95..4fedb95 100644 --- a/examples/08-custom-code/output/rust/rust-toolchain.toml +++ b/examples/09-custom-code/output/rust/rust-toolchain.toml diff --git a/examples/08-custom-code/output/rust/src/gen/shapes.rs b/examples/09-custom-code/output/rust/src/gen/shapes.rs index c5f8af5..c5f8af5 100644 --- a/examples/08-custom-code/output/rust/src/gen/shapes.rs +++ b/examples/09-custom-code/output/rust/src/gen/shapes.rs diff --git a/examples/08-custom-code/output/rust/src/lib.rs b/examples/09-custom-code/output/rust/src/lib.rs index 1825d72..1825d72 100644 --- a/examples/08-custom-code/output/rust/src/lib.rs +++ b/examples/09-custom-code/output/rust/src/lib.rs diff --git a/examples/08-custom-code/output/rust/src/shapes.rs b/examples/09-custom-code/output/rust/src/shapes.rs index f806bbb..f806bbb 100644 --- a/examples/08-custom-code/output/rust/src/shapes.rs +++ b/examples/09-custom-code/output/rust/src/shapes.rs diff --git a/examples/08-custom-code/src/shapes.hob b/examples/09-custom-code/src/shapes.hob index 5dfe833..5dfe833 100644 --- a/examples/08-custom-code/src/shapes.hob +++ b/examples/09-custom-code/src/shapes.hob diff --git a/examples/09-imports/hobgoblin.json5 b/examples/10-imports/hobgoblin.json5 index 12713d4..12713d4 100644 --- a/examples/09-imports/hobgoblin.json5 +++ b/examples/10-imports/hobgoblin.json5 diff --git a/examples/10-transient-0/output/java/.gitignore b/examples/10-imports/output/java/.gitignore index ff511d4..ff511d4 100644 --- a/examples/10-transient-0/output/java/.gitignore +++ b/examples/10-imports/output/java/.gitignore diff --git a/examples/10-transient-0/output/java/pom.xml b/examples/10-imports/output/java/pom.xml index 445fa65..445fa65 120000 --- a/examples/10-transient-0/output/java/pom.xml +++ b/examples/10-imports/output/java/pom.xml diff --git a/examples/09-imports/output/java/src/test/java/org/zwobble/example/LineTests.java b/examples/10-imports/output/java/src/test/java/org/zwobble/example/LineTests.java index c376b19..c376b19 100644 --- a/examples/09-imports/output/java/src/test/java/org/zwobble/example/LineTests.java +++ b/examples/10-imports/output/java/src/test/java/org/zwobble/example/LineTests.java diff --git a/examples/09-imports/output/rust/.gitignore b/examples/10-imports/output/rust/.gitignore index ea8c4bf..ea8c4bf 100644 --- a/examples/09-imports/output/rust/.gitignore +++ b/examples/10-imports/output/rust/.gitignore diff --git a/examples/09-imports/output/rust/Cargo.lock b/examples/10-imports/output/rust/Cargo.lock index 9dc6e3e..9dc6e3e 100644 --- a/examples/09-imports/output/rust/Cargo.lock +++ b/examples/10-imports/output/rust/Cargo.lock diff --git a/examples/09-imports/output/rust/Cargo.toml b/examples/10-imports/output/rust/Cargo.toml index 5d4c622..5d4c622 100644 --- a/examples/09-imports/output/rust/Cargo.toml +++ b/examples/10-imports/output/rust/Cargo.toml diff --git a/examples/09-imports/output/rust/rust-toolchain.toml b/examples/10-imports/output/rust/rust-toolchain.toml index 4fedb95..4fedb95 100644 --- a/examples/09-imports/output/rust/rust-toolchain.toml +++ b/examples/10-imports/output/rust/rust-toolchain.toml diff --git a/examples/09-imports/output/rust/src/lib.rs b/examples/10-imports/output/rust/src/lib.rs index ffbcbf4..ffbcbf4 100644 --- a/examples/09-imports/output/rust/src/lib.rs +++ b/examples/10-imports/output/rust/src/lib.rs diff --git a/examples/09-imports/output/rust/src/line.rs b/examples/10-imports/output/rust/src/line.rs index e29c94b..e29c94b 100644 --- a/examples/09-imports/output/rust/src/line.rs +++ b/examples/10-imports/output/rust/src/line.rs diff --git a/examples/09-imports/output/rust/src/point.rs b/examples/10-imports/output/rust/src/point.rs index a0ca4c7..a0ca4c7 100644 --- a/examples/09-imports/output/rust/src/point.rs +++ b/examples/10-imports/output/rust/src/point.rs diff --git a/examples/09-imports/src/line.hob b/examples/10-imports/src/line.hob index 562d77f..562d77f 100644 --- a/examples/09-imports/src/line.hob +++ b/examples/10-imports/src/line.hob diff --git a/examples/09-imports/src/point.hob b/examples/10-imports/src/point.hob index 87f9953..87f9953 100644 --- a/examples/09-imports/src/point.hob +++ b/examples/10-imports/src/point.hob diff --git a/examples/10-transient-0/hobgoblin.json5 b/examples/11-transient-0/hobgoblin.json5 index 2160c60..2160c60 100644 --- a/examples/10-transient-0/hobgoblin.json5 +++ b/examples/11-transient-0/hobgoblin.json5 diff --git a/examples/11-transient-0/output/java/.gitignore b/examples/11-transient-0/output/java/.gitignore new file mode 100644 index 0000000..ff511d4 --- /dev/null +++ b/examples/11-transient-0/output/java/.gitignore @@ -0,0 +1,2 @@ +/src/gen/ +/target/ diff --git a/examples/11-transient-0/output/java/pom.xml b/examples/11-transient-0/output/java/pom.xml new file mode 120000 index 0000000..445fa65 --- /dev/null +++ b/examples/11-transient-0/output/java/pom.xml @@ -0,0 +1 @@ +../../../templates/java-junit/pom.xml
\ No newline at end of file diff --git a/examples/10-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java b/examples/11-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java index 6369f93..6369f93 100644 --- a/examples/10-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java +++ b/examples/11-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java diff --git a/examples/10-transient-0/output/rust/.gitignore b/examples/11-transient-0/output/rust/.gitignore index ea8c4bf..ea8c4bf 100644 --- a/examples/10-transient-0/output/rust/.gitignore +++ b/examples/11-transient-0/output/rust/.gitignore diff --git a/examples/10-transient-0/output/rust/Cargo.lock b/examples/11-transient-0/output/rust/Cargo.lock index 9dc6e3e..9dc6e3e 100644 --- a/examples/10-transient-0/output/rust/Cargo.lock +++ b/examples/11-transient-0/output/rust/Cargo.lock diff --git a/examples/10-transient-0/output/rust/Cargo.toml b/examples/11-transient-0/output/rust/Cargo.toml index 5d4c622..5d4c622 100644 --- a/examples/10-transient-0/output/rust/Cargo.toml +++ b/examples/11-transient-0/output/rust/Cargo.toml diff --git a/examples/10-transient-0/output/rust/rust-toolchain.toml b/examples/11-transient-0/output/rust/rust-toolchain.toml index 4fedb95..4fedb95 100644 --- a/examples/10-transient-0/output/rust/rust-toolchain.toml +++ b/examples/11-transient-0/output/rust/rust-toolchain.toml diff --git a/examples/10-transient-0/output/rust/src/data.rs b/examples/11-transient-0/output/rust/src/data.rs index 7a0c4fa..7a0c4fa 100644 --- a/examples/10-transient-0/output/rust/src/data.rs +++ b/examples/11-transient-0/output/rust/src/data.rs diff --git a/examples/10-transient-0/output/rust/src/gen/data.rs b/examples/11-transient-0/output/rust/src/gen/data.rs index 0ea6c0f..0ea6c0f 100644 --- a/examples/10-transient-0/output/rust/src/gen/data.rs +++ b/examples/11-transient-0/output/rust/src/gen/data.rs diff --git a/examples/10-transient-0/output/rust/src/gen/data/transient_0.rs b/examples/11-transient-0/output/rust/src/gen/data/transient_0.rs index 82fb5f7..82fb5f7 100644 --- a/examples/10-transient-0/output/rust/src/gen/data/transient_0.rs +++ b/examples/11-transient-0/output/rust/src/gen/data/transient_0.rs diff --git a/examples/10-transient-0/output/rust/src/gen/transient_0.rs b/examples/11-transient-0/output/rust/src/gen/transient_0.rs index 560fe51..560fe51 100644 --- a/examples/10-transient-0/output/rust/src/gen/transient_0.rs +++ b/examples/11-transient-0/output/rust/src/gen/transient_0.rs diff --git a/examples/10-transient-0/output/rust/src/lib.rs b/examples/11-transient-0/output/rust/src/lib.rs index e31e1fb..e31e1fb 100644 --- a/examples/10-transient-0/output/rust/src/lib.rs +++ b/examples/11-transient-0/output/rust/src/lib.rs diff --git a/examples/10-transient-0/output/rust/src/transient_0.rs b/examples/11-transient-0/output/rust/src/transient_0.rs index 8b2b800..8b2b800 100644 --- a/examples/10-transient-0/output/rust/src/transient_0.rs +++ b/examples/11-transient-0/output/rust/src/transient_0.rs diff --git a/examples/10-transient-0/src/data.hob b/examples/11-transient-0/src/data.hob index bbfd882..bbfd882 100644 --- a/examples/10-transient-0/src/data.hob +++ b/examples/11-transient-0/src/data.hob diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java index 89da3ac..d5bbf56 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java @@ -55,6 +55,7 @@ public class HobgoblinCompiler { typeCheckerContext.addNativeType(NativeTypes.STRING); typeCheckerContext.addNativeTypeConstructor(NativeTypes.LIST); typeCheckerContext.addNativeTypeConstructor(NativeTypes.OPTION); + typeCheckerContext.addNativeTypeConstructor(NativeTypes.SHARED); for (var untypedNamespaceNode : sortUntypedNamespaceNodes(untypedNamespaceNodes)) { var typedNamespaceNode = TypeChecker.typeCheckNamespace(untypedNamespaceNode, typeCheckerContext); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java b/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java index 7d03a91..8f96709 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java @@ -25,4 +25,11 @@ public class NativeTypes { List.of(new TypeParam("T")), OPTION_INNER ); + + public static final SimpleNativeType SHARED_INNER = SimpleNativeType.builtin("Shared"); + + public static TypeConstructor<SimpleNativeType> SHARED = new TypeConstructor<>( + List.of(new TypeParam("T")), + SHARED_INNER + ); } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGenerator.java index 46646d5..1325149 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGenerator.java @@ -1,5 +1,6 @@ package org.zwobble.hobgoblin.compiler.output.generators.java; +import org.zwobble.hobgoblin.compiler.builtins.NativeTypes; import org.zwobble.hobgoblin.compiler.output.lang.java.JavaWriter; import org.zwobble.hobgoblin.compiler.output.lang.java.ast.*; import org.zwobble.hobgoblin.compiler.types.*; @@ -143,7 +144,7 @@ public class JavaGenerator { } private JavaTypeRef generateTypeRef(Type type, boolean referenceType) { - return switch (type) { + return switch (collapseType(type)) { case ConstructedNativeType constructedNativeType -> { var innerTypeRef = generateTypeRef( constructedNativeType.constructor().genericType(), @@ -199,4 +200,16 @@ public class JavaGenerator { throw new UnsupportedOperationException("TODO"); }; } + + public Type collapseType(Type type) { + if (!(type instanceof ConstructedNativeType constructedNativeType)) { + return type; + } + + if (!constructedNativeType.constructor().equals(NativeTypes.SHARED)) { + return type; + } + + return constructedNativeType.args().getFirst(); + } } 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 2a2c7ca..62c73ff 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 @@ -215,13 +215,15 @@ public class JavaTypesGenerator implements Generator { var javaFieldName = generateFieldName(field.name()); var withMethodName = generateFieldName("with" + lowerCamelCaseToUpperCamelCase(field.name())); + var fieldType = this.javaGenerator.collapseType(field.type().value()); + methods.add(new JavaMethodDeclaration( withMethodName, JavaVisibility.PUBLIC, JavaMemberKind.INSTANCE, builderJavaTypeRef, List.of( - new JavaParam(generateTypeRef(field.type(), context), javaFieldName) + new JavaParam(generateTypeRef(fieldType, context), javaFieldName) ), List.of(), new JavaBlock(List.of( @@ -232,7 +234,7 @@ public class JavaTypesGenerator implements Generator { )) )); - var fieldBuilderTypeRef = generateBuilderTypeRef(field.type().value()); + var fieldBuilderTypeRef = generateBuilderTypeRef(fieldType); if (fieldBuilderTypeRef.isPresent()) { methods.add(new JavaMethodDeclaration( @@ -260,7 +262,7 @@ public class JavaTypesGenerator implements Generator { } if ( - field.type().value() instanceof ConstructedNativeType fieldConstructedNativeType && + fieldType instanceof ConstructedNativeType fieldConstructedNativeType && fieldConstructedNativeType.constructor().equals(NativeTypes.LIST) ) { var elementType = fieldConstructedNativeType.args().getFirst(); @@ -340,7 +342,7 @@ public class JavaTypesGenerator implements Generator { } if ( - field.type().value() instanceof ConstructedNativeType fieldConstructedNativeType && + fieldType instanceof ConstructedNativeType fieldConstructedNativeType && fieldConstructedNativeType.constructor().equals(NativeTypes.OPTION) ) { var elementType = fieldConstructedNativeType.args().getFirst(); @@ -506,7 +508,7 @@ public class JavaTypesGenerator implements Generator { } private JavaExpression arbitraryValue(Type type, Context context) { - return switch (type) { + return switch (this.javaGenerator.collapseType(type)) { case ConstructedNativeType constructedNativeType -> { yield arbitraryValue(constructedNativeType.constructor().genericType(), context); } |
