summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-08-05 18:44:26 +0100
committerMichael Williamson <mike@zwobble.org>2026-08-05 18:44:26 +0100
commit8455bb19b7d4235e667cab9112aa276557969dcc (patch)
tree3ad5a7cf2941c4918f9e6de612a711cd8846570f
parent266e826749b62c46e14d9590351f8c3b2de53512 (diff)
Type check generic native types
-rw-r--r--examples/11-native-type-generic/hobgoblin.json533
-rw-r--r--examples/11-native-type-generic/output/java/.gitignore (renamed from examples/11-shared/output/java/.gitignore)0
l---------examples/11-native-type-generic/output/java/pom.xml (renamed from examples/11-shared/output/java/pom.xml)0
-rw-r--r--examples/11-native-type-generic/output/java/src/main/java/org/zwobble/example/types/map/HobgoblinNativeMap.java9
-rw-r--r--examples/11-native-type-generic/output/java/src/test/java/org/zwobble/example/MapTests.java13
-rw-r--r--examples/11-native-type-generic/output/rust/.gitignore (renamed from examples/11-shared/output/rust/.gitignore)0
-rw-r--r--examples/11-native-type-generic/output/rust/Cargo.lock (renamed from examples/11-shared/output/rust/Cargo.lock)0
-rw-r--r--examples/11-native-type-generic/output/rust/Cargo.toml (renamed from examples/11-shared/output/rust/Cargo.toml)0
-rw-r--r--examples/11-native-type-generic/output/rust/rust-toolchain.toml (renamed from examples/11-shared/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/11-native-type-generic/output/rust/src/gen/map.rs6
-rw-r--r--examples/11-native-type-generic/output/rust/src/lib.rs12
-rw-r--r--examples/11-native-type-generic/output/rust/src/map.rs1
-rw-r--r--examples/11-native-type-generic/src/map.hob6
-rw-r--r--examples/12-shared/hobgoblin.json5 (renamed from examples/11-shared/hobgoblin.json5)0
-rw-r--r--examples/12-shared/output/java/.gitignore (renamed from examples/12-custom-code/output/java/.gitignore)0
l---------examples/12-shared/output/java/pom.xml (renamed from examples/12-custom-code/output/java/pom.xml)0
-rw-r--r--examples/12-shared/output/java/src/test/java/org/zwobble/example/PointTests.java (renamed from examples/11-shared/output/java/src/test/java/org/zwobble/example/PointTests.java)0
-rw-r--r--examples/12-shared/output/rust/.gitignore (renamed from examples/12-custom-code/output/rust/.gitignore)0
-rw-r--r--examples/12-shared/output/rust/Cargo.lock (renamed from examples/12-custom-code/output/rust/Cargo.lock)0
-rw-r--r--examples/12-shared/output/rust/Cargo.toml (renamed from examples/12-custom-code/output/rust/Cargo.toml)0
-rw-r--r--examples/12-shared/output/rust/rust-toolchain.toml (renamed from examples/12-custom-code/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/12-shared/output/rust/src/lib.rs (renamed from examples/11-shared/output/rust/src/lib.rs)0
-rw-r--r--examples/12-shared/output/rust/src/point.rs (renamed from examples/11-shared/output/rust/src/point.rs)0
-rw-r--r--examples/12-shared/src/point.hob (renamed from examples/11-shared/src/point.hob)0
-rw-r--r--examples/13-custom-code/hobgoblin.json5 (renamed from examples/12-custom-code/hobgoblin.json5)0
-rw-r--r--examples/13-custom-code/output/java/.gitignore (renamed from examples/13-imports/output/java/.gitignore)0
l---------examples/13-custom-code/output/java/pom.xml (renamed from examples/13-imports/output/java/pom.xml)0
-rw-r--r--examples/13-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java (renamed from examples/12-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java)0
-rw-r--r--examples/13-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java (renamed from examples/12-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java)0
-rw-r--r--examples/13-custom-code/output/rust/.gitignore (renamed from examples/13-imports/output/rust/.gitignore)0
-rw-r--r--examples/13-custom-code/output/rust/Cargo.lock (renamed from examples/13-imports/output/rust/Cargo.lock)0
-rw-r--r--examples/13-custom-code/output/rust/Cargo.toml (renamed from examples/13-imports/output/rust/Cargo.toml)0
-rw-r--r--examples/13-custom-code/output/rust/rust-toolchain.toml (renamed from examples/13-imports/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/13-custom-code/output/rust/src/gen/shapes.rs (renamed from examples/12-custom-code/output/rust/src/gen/shapes.rs)0
-rw-r--r--examples/13-custom-code/output/rust/src/lib.rs (renamed from examples/12-custom-code/output/rust/src/lib.rs)0
-rw-r--r--examples/13-custom-code/output/rust/src/shapes.rs (renamed from examples/12-custom-code/output/rust/src/shapes.rs)0
-rw-r--r--examples/13-custom-code/src/shapes.hob (renamed from examples/12-custom-code/src/shapes.hob)0
-rw-r--r--examples/14-imports/hobgoblin.json5 (renamed from examples/13-imports/hobgoblin.json5)0
-rw-r--r--examples/14-imports/output/java/.gitignore2
l---------examples/14-imports/output/java/pom.xml (renamed from examples/14-transient-0/output/java/pom.xml)0
-rw-r--r--examples/14-imports/output/java/src/test/java/org/zwobble/example/LineTests.java (renamed from examples/13-imports/output/java/src/test/java/org/zwobble/example/LineTests.java)0
-rw-r--r--examples/14-imports/output/rust/.gitignore1
-rw-r--r--examples/14-imports/output/rust/Cargo.lock (renamed from examples/14-transient-0/output/rust/Cargo.lock)0
-rw-r--r--examples/14-imports/output/rust/Cargo.toml (renamed from examples/14-transient-0/output/rust/Cargo.toml)0
-rw-r--r--examples/14-imports/output/rust/rust-toolchain.toml (renamed from examples/14-transient-0/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/14-imports/output/rust/src/lib.rs (renamed from examples/13-imports/output/rust/src/lib.rs)0
-rw-r--r--examples/14-imports/output/rust/src/line.rs (renamed from examples/13-imports/output/rust/src/line.rs)0
-rw-r--r--examples/14-imports/output/rust/src/point.rs (renamed from examples/13-imports/output/rust/src/point.rs)0
-rw-r--r--examples/14-imports/src/line.hob (renamed from examples/13-imports/src/line.hob)0
-rw-r--r--examples/14-imports/src/point.hob (renamed from examples/13-imports/src/point.hob)0
-rw-r--r--examples/15-transient-0/hobgoblin.json5 (renamed from examples/14-transient-0/hobgoblin.json5)0
-rw-r--r--examples/15-transient-0/output/java/.gitignore (renamed from examples/14-transient-0/output/java/.gitignore)0
l---------examples/15-transient-0/output/java/pom.xml1
-rw-r--r--examples/15-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java (renamed from examples/14-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java)0
-rw-r--r--examples/15-transient-0/output/rust/.gitignore (renamed from examples/14-transient-0/output/rust/.gitignore)0
-rw-r--r--examples/15-transient-0/output/rust/Cargo.lock7
-rw-r--r--examples/15-transient-0/output/rust/Cargo.toml6
-rw-r--r--examples/15-transient-0/output/rust/rust-toolchain.toml2
-rw-r--r--examples/15-transient-0/output/rust/src/data.rs (renamed from examples/14-transient-0/output/rust/src/data.rs)0
-rw-r--r--examples/15-transient-0/output/rust/src/gen/data.rs (renamed from examples/14-transient-0/output/rust/src/gen/data.rs)0
-rw-r--r--examples/15-transient-0/output/rust/src/gen/data/transient_0.rs (renamed from examples/14-transient-0/output/rust/src/gen/data/transient_0.rs)0
-rw-r--r--examples/15-transient-0/output/rust/src/gen/transient_0.rs (renamed from examples/14-transient-0/output/rust/src/gen/transient_0.rs)0
-rw-r--r--examples/15-transient-0/output/rust/src/lib.rs (renamed from examples/14-transient-0/output/rust/src/lib.rs)0
-rw-r--r--examples/15-transient-0/output/rust/src/transient_0.rs (renamed from examples/14-transient-0/output/rust/src/transient_0.rs)0
-rw-r--r--examples/15-transient-0/src/data.hob (renamed from examples/14-transient-0/src/data.hob)0
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedNativeTypeDefinitionNode.java5
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java26
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/TypeConstructor.java4
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/TypeOrConstructor.java20
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNativeTypeDefinitionTests.java7
70 files changed, 153 insertions, 8 deletions
diff --git a/examples/11-native-type-generic/hobgoblin.json5 b/examples/11-native-type-generic/hobgoblin.json5
new file mode 100644
index 0000000..ca81993
--- /dev/null
+++ b/examples/11-native-type-generic/hobgoblin.json5
@@ -0,0 +1,33 @@
+{
+ outputs: {
+ langs: {
+ java: {
+ packageName: "org.zwobble.example.types",
+ nativeTypes: [
+ {
+ hobgoblin: "map.NativeMap",
+ java: "java.util.Map",
+ },
+ ],
+ },
+ rust: {
+ nativeTypes: [
+ {
+ hobgoblin: "map.NativeMap",
+ rust: "::std::collections::BTreeMap",
+ },
+ ],
+ },
+ },
+ generators: [
+ {
+ generator: "java-types",
+ path: "output/java/src/gen/java",
+ },
+ {
+ generator: "rust-types",
+ path: "output/rust/src/gen",
+ },
+ ],
+ },
+}
diff --git a/examples/11-shared/output/java/.gitignore b/examples/11-native-type-generic/output/java/.gitignore
index ff511d4..ff511d4 100644
--- a/examples/11-shared/output/java/.gitignore
+++ b/examples/11-native-type-generic/output/java/.gitignore
diff --git a/examples/11-shared/output/java/pom.xml b/examples/11-native-type-generic/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/11-shared/output/java/pom.xml
+++ b/examples/11-native-type-generic/output/java/pom.xml
diff --git a/examples/11-native-type-generic/output/java/src/main/java/org/zwobble/example/types/map/HobgoblinNativeMap.java b/examples/11-native-type-generic/output/java/src/main/java/org/zwobble/example/types/map/HobgoblinNativeMap.java
new file mode 100644
index 0000000..309ba0b
--- /dev/null
+++ b/examples/11-native-type-generic/output/java/src/main/java/org/zwobble/example/types/map/HobgoblinNativeMap.java
@@ -0,0 +1,9 @@
+package org.zwobble.example.types.map;
+
+public class HobgoblinNativeMap {
+ private HobgoblinNativeMap() {}
+
+ public static <K, V> java.util.Map<K, V> arbitraryNativeMap() {
+ return new java.util.HashMap<>();
+ }
+}
diff --git a/examples/11-native-type-generic/output/java/src/test/java/org/zwobble/example/MapTests.java b/examples/11-native-type-generic/output/java/src/test/java/org/zwobble/example/MapTests.java
new file mode 100644
index 0000000..5b6a764
--- /dev/null
+++ b/examples/11-native-type-generic/output/java/src/test/java/org/zwobble/example/MapTests.java
@@ -0,0 +1,13 @@
+package org.zwobble.example;
+
+import java.util.Map;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import org.junit.jupiter.api.Test;
+import org.zwobble.example.types.map.X;
+
+public class MapTests {
+ @Test
+ public void canUseGenericNativeTypes() {
+ var x = new X(Map.ofEntries(Map.entry("a", 1), Map.entry("b", 2)));
+ }
+}
diff --git a/examples/11-shared/output/rust/.gitignore b/examples/11-native-type-generic/output/rust/.gitignore
index ea8c4bf..ea8c4bf 100644
--- a/examples/11-shared/output/rust/.gitignore
+++ b/examples/11-native-type-generic/output/rust/.gitignore
diff --git a/examples/11-shared/output/rust/Cargo.lock b/examples/11-native-type-generic/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/11-shared/output/rust/Cargo.lock
+++ b/examples/11-native-type-generic/output/rust/Cargo.lock
diff --git a/examples/11-shared/output/rust/Cargo.toml b/examples/11-native-type-generic/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/11-shared/output/rust/Cargo.toml
+++ b/examples/11-native-type-generic/output/rust/Cargo.toml
diff --git a/examples/11-shared/output/rust/rust-toolchain.toml b/examples/11-native-type-generic/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/11-shared/output/rust/rust-toolchain.toml
+++ b/examples/11-native-type-generic/output/rust/rust-toolchain.toml
diff --git a/examples/11-native-type-generic/output/rust/src/gen/map.rs b/examples/11-native-type-generic/output/rust/src/gen/map.rs
new file mode 100644
index 0000000..5d9c837
--- /dev/null
+++ b/examples/11-native-type-generic/output/rust/src/gen/map.rs
@@ -0,0 +1,6 @@
+// Generated by hobgoblin.
+
+#[derive(Clone, Debug, Hash, PartialEq)]
+pub struct X {
+ pub map: ::std::collections::BTreeMap::<::std::string::String, ::core::primitive::i32>,
+}
diff --git a/examples/11-native-type-generic/output/rust/src/lib.rs b/examples/11-native-type-generic/output/rust/src/lib.rs
new file mode 100644
index 0000000..b0adf47
--- /dev/null
+++ b/examples/11-native-type-generic/output/rust/src/lib.rs
@@ -0,0 +1,12 @@
+mod map;
+
+#[cfg(test)]
+mod test {
+ use std::collections::BTreeMap;
+ use super::map::X;
+
+ #[test]
+ fn can_use_generic_native_types() {
+ let x = X { map: BTreeMap::from([("a".to_string(), 1), ("b".to_string(), 2)]) };
+ }
+}
diff --git a/examples/11-native-type-generic/output/rust/src/map.rs b/examples/11-native-type-generic/output/rust/src/map.rs
new file mode 100644
index 0000000..3dd0a72
--- /dev/null
+++ b/examples/11-native-type-generic/output/rust/src/map.rs
@@ -0,0 +1 @@
+include!("gen/map.rs");
diff --git a/examples/11-native-type-generic/src/map.hob b/examples/11-native-type-generic/src/map.hob
new file mode 100644
index 0000000..0118889
--- /dev/null
+++ b/examples/11-native-type-generic/src/map.hob
@@ -0,0 +1,6 @@
+native NativeMap[K, V] {
+}
+
+struct X {
+ field map: NativeMap[String, Int32];
+}
diff --git a/examples/11-shared/hobgoblin.json5 b/examples/12-shared/hobgoblin.json5
index 19e0f93..19e0f93 100644
--- a/examples/11-shared/hobgoblin.json5
+++ b/examples/12-shared/hobgoblin.json5
diff --git a/examples/12-custom-code/output/java/.gitignore b/examples/12-shared/output/java/.gitignore
index ff511d4..ff511d4 100644
--- a/examples/12-custom-code/output/java/.gitignore
+++ b/examples/12-shared/output/java/.gitignore
diff --git a/examples/12-custom-code/output/java/pom.xml b/examples/12-shared/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/12-custom-code/output/java/pom.xml
+++ b/examples/12-shared/output/java/pom.xml
diff --git a/examples/11-shared/output/java/src/test/java/org/zwobble/example/PointTests.java b/examples/12-shared/output/java/src/test/java/org/zwobble/example/PointTests.java
index b4c140d..b4c140d 100644
--- a/examples/11-shared/output/java/src/test/java/org/zwobble/example/PointTests.java
+++ b/examples/12-shared/output/java/src/test/java/org/zwobble/example/PointTests.java
diff --git a/examples/12-custom-code/output/rust/.gitignore b/examples/12-shared/output/rust/.gitignore
index ea8c4bf..ea8c4bf 100644
--- a/examples/12-custom-code/output/rust/.gitignore
+++ b/examples/12-shared/output/rust/.gitignore
diff --git a/examples/12-custom-code/output/rust/Cargo.lock b/examples/12-shared/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/12-custom-code/output/rust/Cargo.lock
+++ b/examples/12-shared/output/rust/Cargo.lock
diff --git a/examples/12-custom-code/output/rust/Cargo.toml b/examples/12-shared/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/12-custom-code/output/rust/Cargo.toml
+++ b/examples/12-shared/output/rust/Cargo.toml
diff --git a/examples/12-custom-code/output/rust/rust-toolchain.toml b/examples/12-shared/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/12-custom-code/output/rust/rust-toolchain.toml
+++ b/examples/12-shared/output/rust/rust-toolchain.toml
diff --git a/examples/11-shared/output/rust/src/lib.rs b/examples/12-shared/output/rust/src/lib.rs
index af2c87f..af2c87f 100644
--- a/examples/11-shared/output/rust/src/lib.rs
+++ b/examples/12-shared/output/rust/src/lib.rs
diff --git a/examples/11-shared/output/rust/src/point.rs b/examples/12-shared/output/rust/src/point.rs
index 7bc470a..7bc470a 100644
--- a/examples/11-shared/output/rust/src/point.rs
+++ b/examples/12-shared/output/rust/src/point.rs
diff --git a/examples/11-shared/src/point.hob b/examples/12-shared/src/point.hob
index 7b9a8e6..7b9a8e6 100644
--- a/examples/11-shared/src/point.hob
+++ b/examples/12-shared/src/point.hob
diff --git a/examples/12-custom-code/hobgoblin.json5 b/examples/13-custom-code/hobgoblin.json5
index 1d08a40..1d08a40 100644
--- a/examples/12-custom-code/hobgoblin.json5
+++ b/examples/13-custom-code/hobgoblin.json5
diff --git a/examples/13-imports/output/java/.gitignore b/examples/13-custom-code/output/java/.gitignore
index ff511d4..ff511d4 100644
--- a/examples/13-imports/output/java/.gitignore
+++ b/examples/13-custom-code/output/java/.gitignore
diff --git a/examples/13-imports/output/java/pom.xml b/examples/13-custom-code/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/13-imports/output/java/pom.xml
+++ b/examples/13-custom-code/output/java/pom.xml
diff --git a/examples/12-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java b/examples/13-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java
index 69a1ab1..69a1ab1 100644
--- a/examples/12-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java
+++ b/examples/13-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java
diff --git a/examples/12-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java b/examples/13-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java
index fba8e6c..fba8e6c 100644
--- a/examples/12-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java
+++ b/examples/13-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java
diff --git a/examples/13-imports/output/rust/.gitignore b/examples/13-custom-code/output/rust/.gitignore
index ea8c4bf..ea8c4bf 100644
--- a/examples/13-imports/output/rust/.gitignore
+++ b/examples/13-custom-code/output/rust/.gitignore
diff --git a/examples/13-imports/output/rust/Cargo.lock b/examples/13-custom-code/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/13-imports/output/rust/Cargo.lock
+++ b/examples/13-custom-code/output/rust/Cargo.lock
diff --git a/examples/13-imports/output/rust/Cargo.toml b/examples/13-custom-code/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/13-imports/output/rust/Cargo.toml
+++ b/examples/13-custom-code/output/rust/Cargo.toml
diff --git a/examples/13-imports/output/rust/rust-toolchain.toml b/examples/13-custom-code/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/13-imports/output/rust/rust-toolchain.toml
+++ b/examples/13-custom-code/output/rust/rust-toolchain.toml
diff --git a/examples/12-custom-code/output/rust/src/gen/shapes.rs b/examples/13-custom-code/output/rust/src/gen/shapes.rs
index d1582ad..d1582ad 100644
--- a/examples/12-custom-code/output/rust/src/gen/shapes.rs
+++ b/examples/13-custom-code/output/rust/src/gen/shapes.rs
diff --git a/examples/12-custom-code/output/rust/src/lib.rs b/examples/13-custom-code/output/rust/src/lib.rs
index 1825d72..1825d72 100644
--- a/examples/12-custom-code/output/rust/src/lib.rs
+++ b/examples/13-custom-code/output/rust/src/lib.rs
diff --git a/examples/12-custom-code/output/rust/src/shapes.rs b/examples/13-custom-code/output/rust/src/shapes.rs
index f806bbb..f806bbb 100644
--- a/examples/12-custom-code/output/rust/src/shapes.rs
+++ b/examples/13-custom-code/output/rust/src/shapes.rs
diff --git a/examples/12-custom-code/src/shapes.hob b/examples/13-custom-code/src/shapes.hob
index 5dfe833..5dfe833 100644
--- a/examples/12-custom-code/src/shapes.hob
+++ b/examples/13-custom-code/src/shapes.hob
diff --git a/examples/13-imports/hobgoblin.json5 b/examples/14-imports/hobgoblin.json5
index 12713d4..12713d4 100644
--- a/examples/13-imports/hobgoblin.json5
+++ b/examples/14-imports/hobgoblin.json5
diff --git a/examples/14-imports/output/java/.gitignore b/examples/14-imports/output/java/.gitignore
new file mode 100644
index 0000000..ff511d4
--- /dev/null
+++ b/examples/14-imports/output/java/.gitignore
@@ -0,0 +1,2 @@
+/src/gen/
+/target/
diff --git a/examples/14-transient-0/output/java/pom.xml b/examples/14-imports/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/14-transient-0/output/java/pom.xml
+++ b/examples/14-imports/output/java/pom.xml
diff --git a/examples/13-imports/output/java/src/test/java/org/zwobble/example/LineTests.java b/examples/14-imports/output/java/src/test/java/org/zwobble/example/LineTests.java
index c376b19..c376b19 100644
--- a/examples/13-imports/output/java/src/test/java/org/zwobble/example/LineTests.java
+++ b/examples/14-imports/output/java/src/test/java/org/zwobble/example/LineTests.java
diff --git a/examples/14-imports/output/rust/.gitignore b/examples/14-imports/output/rust/.gitignore
new file mode 100644
index 0000000..ea8c4bf
--- /dev/null
+++ b/examples/14-imports/output/rust/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/examples/14-transient-0/output/rust/Cargo.lock b/examples/14-imports/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/14-transient-0/output/rust/Cargo.lock
+++ b/examples/14-imports/output/rust/Cargo.lock
diff --git a/examples/14-transient-0/output/rust/Cargo.toml b/examples/14-imports/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/14-transient-0/output/rust/Cargo.toml
+++ b/examples/14-imports/output/rust/Cargo.toml
diff --git a/examples/14-transient-0/output/rust/rust-toolchain.toml b/examples/14-imports/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/14-transient-0/output/rust/rust-toolchain.toml
+++ b/examples/14-imports/output/rust/rust-toolchain.toml
diff --git a/examples/13-imports/output/rust/src/lib.rs b/examples/14-imports/output/rust/src/lib.rs
index ffbcbf4..ffbcbf4 100644
--- a/examples/13-imports/output/rust/src/lib.rs
+++ b/examples/14-imports/output/rust/src/lib.rs
diff --git a/examples/13-imports/output/rust/src/line.rs b/examples/14-imports/output/rust/src/line.rs
index 8561605..8561605 100644
--- a/examples/13-imports/output/rust/src/line.rs
+++ b/examples/14-imports/output/rust/src/line.rs
diff --git a/examples/13-imports/output/rust/src/point.rs b/examples/14-imports/output/rust/src/point.rs
index 6d9b010..6d9b010 100644
--- a/examples/13-imports/output/rust/src/point.rs
+++ b/examples/14-imports/output/rust/src/point.rs
diff --git a/examples/13-imports/src/line.hob b/examples/14-imports/src/line.hob
index 562d77f..562d77f 100644
--- a/examples/13-imports/src/line.hob
+++ b/examples/14-imports/src/line.hob
diff --git a/examples/13-imports/src/point.hob b/examples/14-imports/src/point.hob
index 87f9953..87f9953 100644
--- a/examples/13-imports/src/point.hob
+++ b/examples/14-imports/src/point.hob
diff --git a/examples/14-transient-0/hobgoblin.json5 b/examples/15-transient-0/hobgoblin.json5
index 2160c60..2160c60 100644
--- a/examples/14-transient-0/hobgoblin.json5
+++ b/examples/15-transient-0/hobgoblin.json5
diff --git a/examples/14-transient-0/output/java/.gitignore b/examples/15-transient-0/output/java/.gitignore
index 2fcf0b8..2fcf0b8 100644
--- a/examples/14-transient-0/output/java/.gitignore
+++ b/examples/15-transient-0/output/java/.gitignore
diff --git a/examples/15-transient-0/output/java/pom.xml b/examples/15-transient-0/output/java/pom.xml
new file mode 120000
index 0000000..445fa65
--- /dev/null
+++ b/examples/15-transient-0/output/java/pom.xml
@@ -0,0 +1 @@
+../../../templates/java-junit/pom.xml \ No newline at end of file
diff --git a/examples/14-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java b/examples/15-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java
index 6732f72..6732f72 100644
--- a/examples/14-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java
+++ b/examples/15-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java
diff --git a/examples/14-transient-0/output/rust/.gitignore b/examples/15-transient-0/output/rust/.gitignore
index fc03479..fc03479 100644
--- a/examples/14-transient-0/output/rust/.gitignore
+++ b/examples/15-transient-0/output/rust/.gitignore
diff --git a/examples/15-transient-0/output/rust/Cargo.lock b/examples/15-transient-0/output/rust/Cargo.lock
new file mode 100644
index 0000000..9dc6e3e
--- /dev/null
+++ b/examples/15-transient-0/output/rust/Cargo.lock
@@ -0,0 +1,7 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "example"
+version = "0.1.0"
diff --git a/examples/15-transient-0/output/rust/Cargo.toml b/examples/15-transient-0/output/rust/Cargo.toml
new file mode 100644
index 0000000..5d4c622
--- /dev/null
+++ b/examples/15-transient-0/output/rust/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "example"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
diff --git a/examples/15-transient-0/output/rust/rust-toolchain.toml b/examples/15-transient-0/output/rust/rust-toolchain.toml
new file mode 100644
index 0000000..4fedb95
--- /dev/null
+++ b/examples/15-transient-0/output/rust/rust-toolchain.toml
@@ -0,0 +1,2 @@
+[toolchain]
+channel = "1.96"
diff --git a/examples/14-transient-0/output/rust/src/data.rs b/examples/15-transient-0/output/rust/src/data.rs
index 7a0c4fa..7a0c4fa 100644
--- a/examples/14-transient-0/output/rust/src/data.rs
+++ b/examples/15-transient-0/output/rust/src/data.rs
diff --git a/examples/14-transient-0/output/rust/src/gen/data.rs b/examples/15-transient-0/output/rust/src/gen/data.rs
index d4847ec..d4847ec 100644
--- a/examples/14-transient-0/output/rust/src/gen/data.rs
+++ b/examples/15-transient-0/output/rust/src/gen/data.rs
diff --git a/examples/14-transient-0/output/rust/src/gen/data/transient_0.rs b/examples/15-transient-0/output/rust/src/gen/data/transient_0.rs
index f802163..f802163 100644
--- a/examples/14-transient-0/output/rust/src/gen/data/transient_0.rs
+++ b/examples/15-transient-0/output/rust/src/gen/data/transient_0.rs
diff --git a/examples/14-transient-0/output/rust/src/gen/transient_0.rs b/examples/15-transient-0/output/rust/src/gen/transient_0.rs
index 6505408..6505408 100644
--- a/examples/14-transient-0/output/rust/src/gen/transient_0.rs
+++ b/examples/15-transient-0/output/rust/src/gen/transient_0.rs
diff --git a/examples/14-transient-0/output/rust/src/lib.rs b/examples/15-transient-0/output/rust/src/lib.rs
index f0f6e24..f0f6e24 100644
--- a/examples/14-transient-0/output/rust/src/lib.rs
+++ b/examples/15-transient-0/output/rust/src/lib.rs
diff --git a/examples/14-transient-0/output/rust/src/transient_0.rs b/examples/15-transient-0/output/rust/src/transient_0.rs
index 8b2b800..8b2b800 100644
--- a/examples/14-transient-0/output/rust/src/transient_0.rs
+++ b/examples/15-transient-0/output/rust/src/transient_0.rs
diff --git a/examples/14-transient-0/src/data.hob b/examples/15-transient-0/src/data.hob
index fb53553..fb53553 100644
--- a/examples/14-transient-0/src/data.hob
+++ b/examples/15-transient-0/src/data.hob
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedNativeTypeDefinitionNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedNativeTypeDefinitionNode.java
index e81705b..487a80b 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedNativeTypeDefinitionNode.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedNativeTypeDefinitionNode.java
@@ -3,13 +3,14 @@ package org.zwobble.hobgoblin.compiler.ast.typed;
import org.zwobble.hobgoblin.compiler.ast.DocComment;
import org.zwobble.hobgoblin.compiler.sources.Source;
import org.zwobble.hobgoblin.compiler.types.SimpleNativeType;
+import org.zwobble.hobgoblin.compiler.types.TypeOrConstructor;
public record TypedNativeTypeDefinitionNode(
- SimpleNativeType type,
+ TypeOrConstructor<SimpleNativeType> typeOrConstructor,
DocComment docComment,
Source source
) implements TypedNamespaceStatementNode {
public String name() {
- return this.type.name();
+ return this.typeOrConstructor.name();
}
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
index eb47870..e403f5b 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
@@ -165,7 +165,17 @@ public class TypeChecker {
TypeCheckerNamespaceContext context
) {
var nativeType = new SimpleNativeType(context.namespaceName(), untyped.name());
- var metaType = new TypeLevelValueType(nativeType);
+
+ var nativeTypeOrConstructor = untyped.typeParams().isEmpty()
+ ? new TypeOrConstructor.Type<>(nativeType)
+ : new TypeOrConstructor.Constructor<>(new NativeTypeConstructor(
+ untyped.typeParams().stream()
+ .map(typeParam -> new TypeParam(typeParam.name()))
+ .toList(),
+ nativeType
+ ));
+
+ var metaType = new TypeLevelValueType(nativeTypeOrConstructor.value());
context.declare(untyped.name(), metaType, untyped.source());
return metaType;
}
@@ -174,10 +184,20 @@ public class TypeChecker {
UntypedNativeTypeDefinitionNode untyped,
TypeCheckerNamespaceContext context
) {
- var nativeType = (SimpleNativeType) lookupMetaType(untyped.name(), untyped.source(), context);
+ var nativeMetaType = lookupTypeLevelValue(untyped.name(), untyped.source(), context);
+ var nativeTypeOrConstructor = switch (nativeMetaType) {
+ case SimpleNativeType type ->
+ new TypeOrConstructor.Type<>(type);
+
+ case NativeTypeConstructor typeConstructor ->
+ new TypeOrConstructor.Constructor<>(typeConstructor);
+
+ default ->
+ throw new UnsupportedOperationException("TODO");
+ };
return new TypedNativeTypeDefinitionNode(
- nativeType,
+ nativeTypeOrConstructor,
untyped.docComment(),
untyped.source()
);
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeConstructor.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeConstructor.java
index e2726fb..2c779d2 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeConstructor.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeConstructor.java
@@ -9,4 +9,8 @@ public sealed interface TypeConstructor<T extends ConstructibleType> extends Typ
default String describe() {
return genericType().describe();
}
+
+ default String name() {
+ return genericType().name();
+ }
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeOrConstructor.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeOrConstructor.java
new file mode 100644
index 0000000..8844669
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeOrConstructor.java
@@ -0,0 +1,20 @@
+package org.zwobble.hobgoblin.compiler.types;
+
+public sealed interface TypeOrConstructor<T extends ConstructibleType> {
+ record Type<T extends ConstructibleType>(T value) implements TypeOrConstructor<T> {
+ @Override
+ public String name() {
+ return this.value.name();
+ }
+ }
+
+ record Constructor<T extends ConstructibleType>(TypeConstructor<T> value) implements TypeOrConstructor<T> {
+ @Override
+ public String name() {
+ return this.value.name();
+ }
+ }
+
+ String name();
+ TypeLevelValue value();
+}
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNativeTypeDefinitionTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNativeTypeDefinitionTests.java
index c0a329a..1777506 100644
--- a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNativeTypeDefinitionTests.java
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNativeTypeDefinitionTests.java
@@ -5,6 +5,7 @@ import org.zwobble.hobgoblin.compiler.ast.typed.TypedNativeTypeDefinitionNode;
import org.zwobble.hobgoblin.compiler.ast.untyped.UntypedNativeTypeDefinitionNode;
import org.zwobble.hobgoblin.compiler.types.NamespaceName;
import org.zwobble.hobgoblin.compiler.types.SimpleNativeType;
+import org.zwobble.hobgoblin.compiler.types.TypeOrConstructor;
import static org.zwobble.hobgoblin.compiler.typechecker.TypeCheckerTesting.typeCheckNamespaceStatement;
import static org.zwobble.precisely.AssertThat.assertThat;
@@ -23,9 +24,9 @@ public class TypeCheckerNativeTypeDefinitionTests {
assertThat(typed, instanceOf(
TypedNativeTypeDefinitionNode.class,
has(
- "type",
- TypedNativeTypeDefinitionNode::type,
- equalTo(new SimpleNativeType(NamespaceName.of("a", "b"), "X"))
+ "typeOrConstructor",
+ TypedNativeTypeDefinitionNode::typeOrConstructor,
+ equalTo(new TypeOrConstructor.Type<>(new SimpleNativeType(NamespaceName.of("a", "b"), "X")))
)
));
}