summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-31 12:34:40 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-31 12:41:53 +0100
commit5148cdd9343e28e945c3e4c206d5d29c5790c001 (patch)
tree191b5f9b494dfa046f61286185c09d6d4ef5ed81
parent4bf0bacb0f369962144f51ad4491ac58875532a0 (diff)
Support circular imports
-rw-r--r--examples/05-inductive-data-types-separate-namespaces/hobgoblin.json5 (renamed from examples/05-enum/hobgoblin.json5)0
-rw-r--r--examples/05-inductive-data-types-separate-namespaces/output/java/.gitignore (renamed from examples/05-enum/output/java/.gitignore)0
l---------examples/05-inductive-data-types-separate-namespaces/output/java/pom.xml (renamed from examples/05-enum/output/java/pom.xml)0
-rw-r--r--examples/05-inductive-data-types-separate-namespaces/output/java/src/test/java/org/zwobble/example/DataTests.java14
-rw-r--r--examples/05-inductive-data-types-separate-namespaces/output/rust/.gitignore (renamed from examples/05-enum/output/rust/.gitignore)0
-rw-r--r--examples/05-inductive-data-types-separate-namespaces/output/rust/Cargo.lock (renamed from examples/05-enum/output/rust/Cargo.lock)0
-rw-r--r--examples/05-inductive-data-types-separate-namespaces/output/rust/Cargo.toml (renamed from examples/05-enum/output/rust/Cargo.toml)0
-rw-r--r--examples/05-inductive-data-types-separate-namespaces/output/rust/rust-toolchain.toml (renamed from examples/05-enum/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/05-inductive-data-types-separate-namespaces/output/rust/src/data/a.rs17
-rw-r--r--examples/05-inductive-data-types-separate-namespaces/output/rust/src/data/b.rs6
-rw-r--r--examples/05-inductive-data-types-separate-namespaces/output/rust/src/data/mod.rs2
-rw-r--r--examples/05-inductive-data-types-separate-namespaces/output/rust/src/lib.rs15
-rw-r--r--examples/05-inductive-data-types-separate-namespaces/src/data/a.hob9
-rw-r--r--examples/05-inductive-data-types-separate-namespaces/src/data/b.hob5
-rw-r--r--examples/06-enum/hobgoblin.json5 (renamed from examples/06-list/hobgoblin.json5)0
-rw-r--r--examples/06-enum/output/java/.gitignore (renamed from examples/06-list/output/java/.gitignore)0
l---------examples/06-enum/output/java/pom.xml (renamed from examples/06-list/output/java/pom.xml)0
-rw-r--r--examples/06-enum/output/java/src/main/java/org/zwobble/example/Numbers.java (renamed from examples/05-enum/output/java/src/main/java/org/zwobble/example/Numbers.java)0
-rw-r--r--examples/06-enum/output/java/src/test/java/org/zwobble/example/NumbersTests.java (renamed from examples/05-enum/output/java/src/test/java/org/zwobble/example/NumbersTests.java)0
-rw-r--r--examples/06-enum/output/rust/.gitignore (renamed from examples/06-list/output/rust/.gitignore)0
-rw-r--r--examples/06-enum/output/rust/Cargo.lock (renamed from examples/06-list/output/rust/Cargo.lock)0
-rw-r--r--examples/06-enum/output/rust/Cargo.toml (renamed from examples/06-list/output/rust/Cargo.toml)0
-rw-r--r--examples/06-enum/output/rust/rust-toolchain.toml (renamed from examples/06-list/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/06-enum/output/rust/src/lib.rs (renamed from examples/05-enum/output/rust/src/lib.rs)0
-rw-r--r--examples/06-enum/output/rust/src/numbers.rs (renamed from examples/05-enum/output/rust/src/numbers.rs)0
-rw-r--r--examples/06-enum/src/numbers.hob (renamed from examples/05-enum/src/numbers.hob)0
-rw-r--r--examples/07-list/hobgoblin.json5 (renamed from examples/11-imports/hobgoblin.json5)0
-rw-r--r--examples/07-list/output/java/.gitignore (renamed from examples/07-native-type/output/java/.gitignore)0
l---------examples/07-list/output/java/pom.xml (renamed from examples/07-native-type/output/java/pom.xml)0
-rw-r--r--examples/07-list/output/java/src/test/java/org/zwobble/example/PointTests.java (renamed from examples/06-list/output/java/src/test/java/org/zwobble/example/PointTests.java)0
-rw-r--r--examples/07-list/output/rust/.gitignore (renamed from examples/07-native-type/output/rust/.gitignore)0
-rw-r--r--examples/07-list/output/rust/Cargo.lock (renamed from examples/07-native-type/output/rust/Cargo.lock)0
-rw-r--r--examples/07-list/output/rust/Cargo.toml (renamed from examples/07-native-type/output/rust/Cargo.toml)0
-rw-r--r--examples/07-list/output/rust/rust-toolchain.toml (renamed from examples/07-native-type/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/07-list/output/rust/src/lib.rs (renamed from examples/06-list/output/rust/src/lib.rs)0
-rw-r--r--examples/07-list/output/rust/src/point.rs (renamed from examples/06-list/output/rust/src/point.rs)0
-rw-r--r--examples/07-list/src/point.hob (renamed from examples/06-list/src/point.hob)0
-rw-r--r--examples/08-native-type/hobgoblin.json5 (renamed from examples/07-native-type/hobgoblin.json5)0
-rw-r--r--examples/08-native-type/output/java/.gitignore (renamed from examples/08-native-type-custom-config/output/java/.gitignore)0
l---------examples/08-native-type/output/java/pom.xml (renamed from examples/08-native-type-custom-config/output/java/pom.xml)0
-rw-r--r--examples/08-native-type/output/java/src/main/java/org/zwobble/example/types/point/HobgoblinNativePoint.java (renamed from examples/07-native-type/output/java/src/main/java/org/zwobble/example/types/point/HobgoblinNativePoint.java)0
-rw-r--r--examples/08-native-type/output/java/src/main/java/org/zwobble/example/types/point/Point.java (renamed from examples/07-native-type/output/java/src/main/java/org/zwobble/example/types/point/Point.java)0
-rw-r--r--examples/08-native-type/output/java/src/test/java/org/zwobble/example/PointTests.java (renamed from examples/07-native-type/output/java/src/test/java/org/zwobble/example/PointTests.java)0
-rw-r--r--examples/08-native-type/output/rust/.gitignore (renamed from examples/08-native-type-custom-config/output/rust/.gitignore)0
-rw-r--r--examples/08-native-type/output/rust/Cargo.lock (renamed from examples/08-native-type-custom-config/output/rust/Cargo.lock)0
-rw-r--r--examples/08-native-type/output/rust/Cargo.toml (renamed from examples/08-native-type-custom-config/output/rust/Cargo.toml)0
-rw-r--r--examples/08-native-type/output/rust/rust-toolchain.toml (renamed from examples/08-native-type-custom-config/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/08-native-type/output/rust/src/gen/point.rs (renamed from examples/07-native-type/output/rust/src/gen/point.rs)0
-rw-r--r--examples/08-native-type/output/rust/src/lib.rs (renamed from examples/07-native-type/output/rust/src/lib.rs)0
-rw-r--r--examples/08-native-type/output/rust/src/point.rs (renamed from examples/07-native-type/output/rust/src/point.rs)0
-rw-r--r--examples/08-native-type/src/point.hob (renamed from examples/07-native-type/src/point.hob)0
-rw-r--r--examples/09-native-type-custom-config/hobgoblin.json5 (renamed from examples/08-native-type-custom-config/hobgoblin.json5)0
-rw-r--r--examples/09-native-type-custom-config/output/java/.gitignore (renamed from examples/09-shared/output/java/.gitignore)0
l---------examples/09-native-type-custom-config/output/java/pom.xml (renamed from examples/09-shared/output/java/pom.xml)0
-rw-r--r--examples/09-native-type-custom-config/output/java/src/main/java/org/zwobble/example/Point.java (renamed from examples/08-native-type-custom-config/output/java/src/main/java/org/zwobble/example/Point.java)0
-rw-r--r--examples/09-native-type-custom-config/output/java/src/main/java/org/zwobble/example/types/point/HobgoblinNativePoint.java (renamed from examples/08-native-type-custom-config/output/java/src/main/java/org/zwobble/example/types/point/HobgoblinNativePoint.java)0
-rw-r--r--examples/09-native-type-custom-config/output/java/src/test/java/org/zwobble/example/PointTests.java (renamed from examples/08-native-type-custom-config/output/java/src/test/java/org/zwobble/example/PointTests.java)0
-rw-r--r--examples/09-native-type-custom-config/output/rust/.gitignore (renamed from examples/09-shared/output/rust/.gitignore)0
-rw-r--r--examples/09-native-type-custom-config/output/rust/Cargo.lock (renamed from examples/09-shared/output/rust/Cargo.lock)0
-rw-r--r--examples/09-native-type-custom-config/output/rust/Cargo.toml (renamed from examples/09-shared/output/rust/Cargo.toml)0
-rw-r--r--examples/09-native-type-custom-config/output/rust/rust-toolchain.toml (renamed from examples/09-shared/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/09-native-type-custom-config/output/rust/src/main.rs (renamed from examples/08-native-type-custom-config/output/rust/src/main.rs)0
-rw-r--r--examples/09-native-type-custom-config/output/rust/src/point.rs (renamed from examples/08-native-type-custom-config/output/rust/src/point.rs)0
-rw-r--r--examples/09-native-type-custom-config/src/point.hob (renamed from examples/08-native-type-custom-config/src/point.hob)0
-rw-r--r--examples/10-shared/hobgoblin.json5 (renamed from examples/09-shared/hobgoblin.json5)0
-rw-r--r--examples/10-shared/output/java/.gitignore (renamed from examples/10-custom-code/output/java/.gitignore)0
l---------examples/10-shared/output/java/pom.xml (renamed from examples/10-custom-code/output/java/pom.xml)0
-rw-r--r--examples/10-shared/output/java/src/test/java/org/zwobble/example/PointTests.java (renamed from examples/09-shared/output/java/src/test/java/org/zwobble/example/PointTests.java)0
-rw-r--r--examples/10-shared/output/rust/.gitignore (renamed from examples/10-custom-code/output/rust/.gitignore)0
-rw-r--r--examples/10-shared/output/rust/Cargo.lock (renamed from examples/10-custom-code/output/rust/Cargo.lock)0
-rw-r--r--examples/10-shared/output/rust/Cargo.toml (renamed from examples/10-custom-code/output/rust/Cargo.toml)0
-rw-r--r--examples/10-shared/output/rust/rust-toolchain.toml (renamed from examples/10-custom-code/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/10-shared/output/rust/src/lib.rs (renamed from examples/09-shared/output/rust/src/lib.rs)0
-rw-r--r--examples/10-shared/output/rust/src/point.rs (renamed from examples/09-shared/output/rust/src/point.rs)0
-rw-r--r--examples/10-shared/src/point.hob (renamed from examples/09-shared/src/point.hob)0
-rw-r--r--examples/11-custom-code/hobgoblin.json5 (renamed from examples/10-custom-code/hobgoblin.json5)0
-rw-r--r--examples/11-custom-code/output/java/.gitignore (renamed from examples/11-imports/output/java/.gitignore)0
l---------examples/11-custom-code/output/java/pom.xml (renamed from examples/11-imports/output/java/pom.xml)0
-rw-r--r--examples/11-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java (renamed from examples/10-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java)0
-rw-r--r--examples/11-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java (renamed from examples/10-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java)0
-rw-r--r--examples/11-custom-code/output/rust/.gitignore (renamed from examples/11-imports/output/rust/.gitignore)0
-rw-r--r--examples/11-custom-code/output/rust/Cargo.lock (renamed from examples/11-imports/output/rust/Cargo.lock)0
-rw-r--r--examples/11-custom-code/output/rust/Cargo.toml (renamed from examples/11-imports/output/rust/Cargo.toml)0
-rw-r--r--examples/11-custom-code/output/rust/rust-toolchain.toml (renamed from examples/11-imports/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/11-custom-code/output/rust/src/gen/shapes.rs (renamed from examples/10-custom-code/output/rust/src/gen/shapes.rs)0
-rw-r--r--examples/11-custom-code/output/rust/src/lib.rs (renamed from examples/10-custom-code/output/rust/src/lib.rs)0
-rw-r--r--examples/11-custom-code/output/rust/src/shapes.rs (renamed from examples/10-custom-code/output/rust/src/shapes.rs)0
-rw-r--r--examples/11-custom-code/src/shapes.hob (renamed from examples/10-custom-code/src/shapes.hob)0
-rw-r--r--examples/12-imports/hobgoblin.json519
-rw-r--r--examples/12-imports/output/java/.gitignore2
l---------examples/12-imports/output/java/pom.xml (renamed from examples/12-transient-0/output/java/pom.xml)0
-rw-r--r--examples/12-imports/output/java/src/test/java/org/zwobble/example/LineTests.java (renamed from examples/11-imports/output/java/src/test/java/org/zwobble/example/LineTests.java)0
-rw-r--r--examples/12-imports/output/rust/.gitignore1
-rw-r--r--examples/12-imports/output/rust/Cargo.lock (renamed from examples/12-transient-0/output/rust/Cargo.lock)0
-rw-r--r--examples/12-imports/output/rust/Cargo.toml (renamed from examples/12-transient-0/output/rust/Cargo.toml)0
-rw-r--r--examples/12-imports/output/rust/rust-toolchain.toml (renamed from examples/12-transient-0/output/rust/rust-toolchain.toml)0
-rw-r--r--examples/12-imports/output/rust/src/lib.rs (renamed from examples/11-imports/output/rust/src/lib.rs)0
-rw-r--r--examples/12-imports/output/rust/src/line.rs (renamed from examples/11-imports/output/rust/src/line.rs)0
-rw-r--r--examples/12-imports/output/rust/src/point.rs (renamed from examples/11-imports/output/rust/src/point.rs)0
-rw-r--r--examples/12-imports/src/line.hob (renamed from examples/11-imports/src/line.hob)0
-rw-r--r--examples/12-imports/src/point.hob (renamed from examples/11-imports/src/point.hob)0
-rw-r--r--examples/13-transient-0/hobgoblin.json5 (renamed from examples/12-transient-0/hobgoblin.json5)0
-rw-r--r--examples/13-transient-0/output/java/.gitignore (renamed from examples/12-transient-0/output/java/.gitignore)0
l---------examples/13-transient-0/output/java/pom.xml1
-rw-r--r--examples/13-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java (renamed from examples/12-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java)0
-rw-r--r--examples/13-transient-0/output/rust/.gitignore (renamed from examples/12-transient-0/output/rust/.gitignore)0
-rw-r--r--examples/13-transient-0/output/rust/Cargo.lock7
-rw-r--r--examples/13-transient-0/output/rust/Cargo.toml6
-rw-r--r--examples/13-transient-0/output/rust/rust-toolchain.toml2
-rw-r--r--examples/13-transient-0/output/rust/src/data.rs (renamed from examples/12-transient-0/output/rust/src/data.rs)0
-rw-r--r--examples/13-transient-0/output/rust/src/gen/data.rs (renamed from examples/12-transient-0/output/rust/src/gen/data.rs)0
-rw-r--r--examples/13-transient-0/output/rust/src/gen/data/transient_0.rs (renamed from examples/12-transient-0/output/rust/src/gen/data/transient_0.rs)0
-rw-r--r--examples/13-transient-0/output/rust/src/gen/transient_0.rs (renamed from examples/12-transient-0/output/rust/src/gen/transient_0.rs)0
-rw-r--r--examples/13-transient-0/output/rust/src/lib.rs (renamed from examples/12-transient-0/output/rust/src/lib.rs)0
-rw-r--r--examples/13-transient-0/output/rust/src/transient_0.rs (renamed from examples/12-transient-0/output/rust/src/transient_0.rs)0
-rw-r--r--examples/13-transient-0/src/data.hob (renamed from examples/12-transient-0/src/data.hob)0
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java56
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java97
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceTests.java16
-rw-r--r--src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerStructDefinitionTests.java6
120 files changed, 178 insertions, 103 deletions
diff --git a/examples/05-enum/hobgoblin.json5 b/examples/05-inductive-data-types-separate-namespaces/hobgoblin.json5
index 12713d4..12713d4 100644
--- a/examples/05-enum/hobgoblin.json5
+++ b/examples/05-inductive-data-types-separate-namespaces/hobgoblin.json5
diff --git a/examples/05-enum/output/java/.gitignore b/examples/05-inductive-data-types-separate-namespaces/output/java/.gitignore
index ff511d4..ff511d4 100644
--- a/examples/05-enum/output/java/.gitignore
+++ b/examples/05-inductive-data-types-separate-namespaces/output/java/.gitignore
diff --git a/examples/05-enum/output/java/pom.xml b/examples/05-inductive-data-types-separate-namespaces/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/05-enum/output/java/pom.xml
+++ b/examples/05-inductive-data-types-separate-namespaces/output/java/pom.xml
diff --git a/examples/05-inductive-data-types-separate-namespaces/output/java/src/test/java/org/zwobble/example/DataTests.java b/examples/05-inductive-data-types-separate-namespaces/output/java/src/test/java/org/zwobble/example/DataTests.java
new file mode 100644
index 0000000..f01bf0a
--- /dev/null
+++ b/examples/05-inductive-data-types-separate-namespaces/output/java/src/test/java/org/zwobble/example/DataTests.java
@@ -0,0 +1,14 @@
+package org.zwobble.example;
+
+import java.util.Optional;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import org.junit.jupiter.api.Test;
+import org.zwobble.example.types.data.a.A1;
+import org.zwobble.example.types.data.b.B;
+
+public class DataTests {
+ @Test
+ public void data() {
+ var data = new A1(Optional.of(new B(Optional.of(new A1(Optional.empty())))));
+ }
+}
diff --git a/examples/05-enum/output/rust/.gitignore b/examples/05-inductive-data-types-separate-namespaces/output/rust/.gitignore
index ea8c4bf..ea8c4bf 100644
--- a/examples/05-enum/output/rust/.gitignore
+++ b/examples/05-inductive-data-types-separate-namespaces/output/rust/.gitignore
diff --git a/examples/05-enum/output/rust/Cargo.lock b/examples/05-inductive-data-types-separate-namespaces/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/05-enum/output/rust/Cargo.lock
+++ b/examples/05-inductive-data-types-separate-namespaces/output/rust/Cargo.lock
diff --git a/examples/05-enum/output/rust/Cargo.toml b/examples/05-inductive-data-types-separate-namespaces/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/05-enum/output/rust/Cargo.toml
+++ b/examples/05-inductive-data-types-separate-namespaces/output/rust/Cargo.toml
diff --git a/examples/05-enum/output/rust/rust-toolchain.toml b/examples/05-inductive-data-types-separate-namespaces/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/05-enum/output/rust/rust-toolchain.toml
+++ b/examples/05-inductive-data-types-separate-namespaces/output/rust/rust-toolchain.toml
diff --git a/examples/05-inductive-data-types-separate-namespaces/output/rust/src/data/a.rs b/examples/05-inductive-data-types-separate-namespaces/output/rust/src/data/a.rs
new file mode 100644
index 0000000..3acec99
--- /dev/null
+++ b/examples/05-inductive-data-types-separate-namespaces/output/rust/src/data/a.rs
@@ -0,0 +1,17 @@
+// Generated by hobgoblin.
+
+#[derive(Debug, Hash, PartialEq)]
+pub enum A {
+ A1(::std::boxed::Box::<crate::data::a::A1>),
+}
+
+impl ::std::convert::From::<crate::data::a::A1> for crate::data::a::A {
+ fn from(value: crate::data::a::A1) -> Self {
+ Self::A1(::std::boxed::Box::new(value))
+ }
+}
+
+#[derive(Debug, Hash, PartialEq)]
+pub struct A1 {
+ pub b: ::std::option::Option::<crate::data::b::B>,
+}
diff --git a/examples/05-inductive-data-types-separate-namespaces/output/rust/src/data/b.rs b/examples/05-inductive-data-types-separate-namespaces/output/rust/src/data/b.rs
new file mode 100644
index 0000000..11dee96
--- /dev/null
+++ b/examples/05-inductive-data-types-separate-namespaces/output/rust/src/data/b.rs
@@ -0,0 +1,6 @@
+// Generated by hobgoblin.
+
+#[derive(Debug, Hash, PartialEq)]
+pub struct B {
+ pub a: ::std::option::Option::<crate::data::a::A>,
+}
diff --git a/examples/05-inductive-data-types-separate-namespaces/output/rust/src/data/mod.rs b/examples/05-inductive-data-types-separate-namespaces/output/rust/src/data/mod.rs
new file mode 100644
index 0000000..677af14
--- /dev/null
+++ b/examples/05-inductive-data-types-separate-namespaces/output/rust/src/data/mod.rs
@@ -0,0 +1,2 @@
+pub mod a;
+pub mod b;
diff --git a/examples/05-inductive-data-types-separate-namespaces/output/rust/src/lib.rs b/examples/05-inductive-data-types-separate-namespaces/output/rust/src/lib.rs
new file mode 100644
index 0000000..01aaddf
--- /dev/null
+++ b/examples/05-inductive-data-types-separate-namespaces/output/rust/src/lib.rs
@@ -0,0 +1,15 @@
+mod data;
+
+#[cfg(test)]
+mod test {
+ use super::data::{a::{A, A1}, b::B};
+
+ #[test]
+ fn data() {
+ let data = A::A1(Box::new(A1 {
+ b: Some(B {
+ a: Some(A::A1(Box::new(A1 { b: None }))),
+ }),
+ }));
+ }
+}
diff --git a/examples/05-inductive-data-types-separate-namespaces/src/data/a.hob b/examples/05-inductive-data-types-separate-namespaces/src/data/a.hob
new file mode 100644
index 0000000..47f1d3c
--- /dev/null
+++ b/examples/05-inductive-data-types-separate-namespaces/src/data/a.hob
@@ -0,0 +1,9 @@
+import {B} from ./b;
+
+sum A {
+ variant A1 box;
+}
+
+struct A1 {
+ field b: Option[B];
+}
diff --git a/examples/05-inductive-data-types-separate-namespaces/src/data/b.hob b/examples/05-inductive-data-types-separate-namespaces/src/data/b.hob
new file mode 100644
index 0000000..4d538fc
--- /dev/null
+++ b/examples/05-inductive-data-types-separate-namespaces/src/data/b.hob
@@ -0,0 +1,5 @@
+import {A} from ./a;
+
+struct B {
+ field a: Option[A];
+}
diff --git a/examples/06-list/hobgoblin.json5 b/examples/06-enum/hobgoblin.json5
index 12713d4..12713d4 100644
--- a/examples/06-list/hobgoblin.json5
+++ b/examples/06-enum/hobgoblin.json5
diff --git a/examples/06-list/output/java/.gitignore b/examples/06-enum/output/java/.gitignore
index ff511d4..ff511d4 100644
--- a/examples/06-list/output/java/.gitignore
+++ b/examples/06-enum/output/java/.gitignore
diff --git a/examples/06-list/output/java/pom.xml b/examples/06-enum/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/06-list/output/java/pom.xml
+++ b/examples/06-enum/output/java/pom.xml
diff --git a/examples/05-enum/output/java/src/main/java/org/zwobble/example/Numbers.java b/examples/06-enum/output/java/src/main/java/org/zwobble/example/Numbers.java
index fc17869..fc17869 100644
--- a/examples/05-enum/output/java/src/main/java/org/zwobble/example/Numbers.java
+++ b/examples/06-enum/output/java/src/main/java/org/zwobble/example/Numbers.java
diff --git a/examples/05-enum/output/java/src/test/java/org/zwobble/example/NumbersTests.java b/examples/06-enum/output/java/src/test/java/org/zwobble/example/NumbersTests.java
index 141d5d1..141d5d1 100644
--- a/examples/05-enum/output/java/src/test/java/org/zwobble/example/NumbersTests.java
+++ b/examples/06-enum/output/java/src/test/java/org/zwobble/example/NumbersTests.java
diff --git a/examples/06-list/output/rust/.gitignore b/examples/06-enum/output/rust/.gitignore
index ea8c4bf..ea8c4bf 100644
--- a/examples/06-list/output/rust/.gitignore
+++ b/examples/06-enum/output/rust/.gitignore
diff --git a/examples/06-list/output/rust/Cargo.lock b/examples/06-enum/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/06-list/output/rust/Cargo.lock
+++ b/examples/06-enum/output/rust/Cargo.lock
diff --git a/examples/06-list/output/rust/Cargo.toml b/examples/06-enum/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/06-list/output/rust/Cargo.toml
+++ b/examples/06-enum/output/rust/Cargo.toml
diff --git a/examples/06-list/output/rust/rust-toolchain.toml b/examples/06-enum/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/06-list/output/rust/rust-toolchain.toml
+++ b/examples/06-enum/output/rust/rust-toolchain.toml
diff --git a/examples/05-enum/output/rust/src/lib.rs b/examples/06-enum/output/rust/src/lib.rs
index ae0b67c..ae0b67c 100644
--- a/examples/05-enum/output/rust/src/lib.rs
+++ b/examples/06-enum/output/rust/src/lib.rs
diff --git a/examples/05-enum/output/rust/src/numbers.rs b/examples/06-enum/output/rust/src/numbers.rs
index 1c62012..1c62012 100644
--- a/examples/05-enum/output/rust/src/numbers.rs
+++ b/examples/06-enum/output/rust/src/numbers.rs
diff --git a/examples/05-enum/src/numbers.hob b/examples/06-enum/src/numbers.hob
index 125082d..125082d 100644
--- a/examples/05-enum/src/numbers.hob
+++ b/examples/06-enum/src/numbers.hob
diff --git a/examples/11-imports/hobgoblin.json5 b/examples/07-list/hobgoblin.json5
index 12713d4..12713d4 100644
--- a/examples/11-imports/hobgoblin.json5
+++ b/examples/07-list/hobgoblin.json5
diff --git a/examples/07-native-type/output/java/.gitignore b/examples/07-list/output/java/.gitignore
index ff511d4..ff511d4 100644
--- a/examples/07-native-type/output/java/.gitignore
+++ b/examples/07-list/output/java/.gitignore
diff --git a/examples/07-native-type/output/java/pom.xml b/examples/07-list/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/07-native-type/output/java/pom.xml
+++ b/examples/07-list/output/java/pom.xml
diff --git a/examples/06-list/output/java/src/test/java/org/zwobble/example/PointTests.java b/examples/07-list/output/java/src/test/java/org/zwobble/example/PointTests.java
index e1528b5..e1528b5 100644
--- a/examples/06-list/output/java/src/test/java/org/zwobble/example/PointTests.java
+++ b/examples/07-list/output/java/src/test/java/org/zwobble/example/PointTests.java
diff --git a/examples/07-native-type/output/rust/.gitignore b/examples/07-list/output/rust/.gitignore
index ea8c4bf..ea8c4bf 100644
--- a/examples/07-native-type/output/rust/.gitignore
+++ b/examples/07-list/output/rust/.gitignore
diff --git a/examples/07-native-type/output/rust/Cargo.lock b/examples/07-list/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/07-native-type/output/rust/Cargo.lock
+++ b/examples/07-list/output/rust/Cargo.lock
diff --git a/examples/07-native-type/output/rust/Cargo.toml b/examples/07-list/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/07-native-type/output/rust/Cargo.toml
+++ b/examples/07-list/output/rust/Cargo.toml
diff --git a/examples/07-native-type/output/rust/rust-toolchain.toml b/examples/07-list/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/07-native-type/output/rust/rust-toolchain.toml
+++ b/examples/07-list/output/rust/rust-toolchain.toml
diff --git a/examples/06-list/output/rust/src/lib.rs b/examples/07-list/output/rust/src/lib.rs
index 907ab8b..907ab8b 100644
--- a/examples/06-list/output/rust/src/lib.rs
+++ b/examples/07-list/output/rust/src/lib.rs
diff --git a/examples/06-list/output/rust/src/point.rs b/examples/07-list/output/rust/src/point.rs
index 2625f9f..2625f9f 100644
--- a/examples/06-list/output/rust/src/point.rs
+++ b/examples/07-list/output/rust/src/point.rs
diff --git a/examples/06-list/src/point.hob b/examples/07-list/src/point.hob
index 8dd438c..8dd438c 100644
--- a/examples/06-list/src/point.hob
+++ b/examples/07-list/src/point.hob
diff --git a/examples/07-native-type/hobgoblin.json5 b/examples/08-native-type/hobgoblin.json5
index a0f60c3..a0f60c3 100644
--- a/examples/07-native-type/hobgoblin.json5
+++ b/examples/08-native-type/hobgoblin.json5
diff --git a/examples/08-native-type-custom-config/output/java/.gitignore b/examples/08-native-type/output/java/.gitignore
index ff511d4..ff511d4 100644
--- a/examples/08-native-type-custom-config/output/java/.gitignore
+++ b/examples/08-native-type/output/java/.gitignore
diff --git a/examples/08-native-type-custom-config/output/java/pom.xml b/examples/08-native-type/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/08-native-type-custom-config/output/java/pom.xml
+++ b/examples/08-native-type/output/java/pom.xml
diff --git a/examples/07-native-type/output/java/src/main/java/org/zwobble/example/types/point/HobgoblinNativePoint.java b/examples/08-native-type/output/java/src/main/java/org/zwobble/example/types/point/HobgoblinNativePoint.java
index bdb5427..bdb5427 100644
--- a/examples/07-native-type/output/java/src/main/java/org/zwobble/example/types/point/HobgoblinNativePoint.java
+++ b/examples/08-native-type/output/java/src/main/java/org/zwobble/example/types/point/HobgoblinNativePoint.java
diff --git a/examples/07-native-type/output/java/src/main/java/org/zwobble/example/types/point/Point.java b/examples/08-native-type/output/java/src/main/java/org/zwobble/example/types/point/Point.java
index cd26290..cd26290 100644
--- a/examples/07-native-type/output/java/src/main/java/org/zwobble/example/types/point/Point.java
+++ b/examples/08-native-type/output/java/src/main/java/org/zwobble/example/types/point/Point.java
diff --git a/examples/07-native-type/output/java/src/test/java/org/zwobble/example/PointTests.java b/examples/08-native-type/output/java/src/test/java/org/zwobble/example/PointTests.java
index 8482673..8482673 100644
--- a/examples/07-native-type/output/java/src/test/java/org/zwobble/example/PointTests.java
+++ b/examples/08-native-type/output/java/src/test/java/org/zwobble/example/PointTests.java
diff --git a/examples/08-native-type-custom-config/output/rust/.gitignore b/examples/08-native-type/output/rust/.gitignore
index ea8c4bf..ea8c4bf 100644
--- a/examples/08-native-type-custom-config/output/rust/.gitignore
+++ b/examples/08-native-type/output/rust/.gitignore
diff --git a/examples/08-native-type-custom-config/output/rust/Cargo.lock b/examples/08-native-type/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/08-native-type-custom-config/output/rust/Cargo.lock
+++ b/examples/08-native-type/output/rust/Cargo.lock
diff --git a/examples/08-native-type-custom-config/output/rust/Cargo.toml b/examples/08-native-type/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/08-native-type-custom-config/output/rust/Cargo.toml
+++ b/examples/08-native-type/output/rust/Cargo.toml
diff --git a/examples/08-native-type-custom-config/output/rust/rust-toolchain.toml b/examples/08-native-type/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/08-native-type-custom-config/output/rust/rust-toolchain.toml
+++ b/examples/08-native-type/output/rust/rust-toolchain.toml
diff --git a/examples/07-native-type/output/rust/src/gen/point.rs b/examples/08-native-type/output/rust/src/gen/point.rs
index d383b15..d383b15 100644
--- a/examples/07-native-type/output/rust/src/gen/point.rs
+++ b/examples/08-native-type/output/rust/src/gen/point.rs
diff --git a/examples/07-native-type/output/rust/src/lib.rs b/examples/08-native-type/output/rust/src/lib.rs
index 1179cff..1179cff 100644
--- a/examples/07-native-type/output/rust/src/lib.rs
+++ b/examples/08-native-type/output/rust/src/lib.rs
diff --git a/examples/07-native-type/output/rust/src/point.rs b/examples/08-native-type/output/rust/src/point.rs
index c5b73d7..c5b73d7 100644
--- a/examples/07-native-type/output/rust/src/point.rs
+++ b/examples/08-native-type/output/rust/src/point.rs
diff --git a/examples/07-native-type/src/point.hob b/examples/08-native-type/src/point.hob
index 7178dcb..7178dcb 100644
--- a/examples/07-native-type/src/point.hob
+++ b/examples/08-native-type/src/point.hob
diff --git a/examples/08-native-type-custom-config/hobgoblin.json5 b/examples/09-native-type-custom-config/hobgoblin.json5
index f925903..f925903 100644
--- a/examples/08-native-type-custom-config/hobgoblin.json5
+++ b/examples/09-native-type-custom-config/hobgoblin.json5
diff --git a/examples/09-shared/output/java/.gitignore b/examples/09-native-type-custom-config/output/java/.gitignore
index ff511d4..ff511d4 100644
--- a/examples/09-shared/output/java/.gitignore
+++ b/examples/09-native-type-custom-config/output/java/.gitignore
diff --git a/examples/09-shared/output/java/pom.xml b/examples/09-native-type-custom-config/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/09-shared/output/java/pom.xml
+++ b/examples/09-native-type-custom-config/output/java/pom.xml
diff --git a/examples/08-native-type-custom-config/output/java/src/main/java/org/zwobble/example/Point.java b/examples/09-native-type-custom-config/output/java/src/main/java/org/zwobble/example/Point.java
index 8862a62..8862a62 100644
--- a/examples/08-native-type-custom-config/output/java/src/main/java/org/zwobble/example/Point.java
+++ b/examples/09-native-type-custom-config/output/java/src/main/java/org/zwobble/example/Point.java
diff --git a/examples/08-native-type-custom-config/output/java/src/main/java/org/zwobble/example/types/point/HobgoblinNativePoint.java b/examples/09-native-type-custom-config/output/java/src/main/java/org/zwobble/example/types/point/HobgoblinNativePoint.java
index 74ac856..74ac856 100644
--- a/examples/08-native-type-custom-config/output/java/src/main/java/org/zwobble/example/types/point/HobgoblinNativePoint.java
+++ b/examples/09-native-type-custom-config/output/java/src/main/java/org/zwobble/example/types/point/HobgoblinNativePoint.java
diff --git a/examples/08-native-type-custom-config/output/java/src/test/java/org/zwobble/example/PointTests.java b/examples/09-native-type-custom-config/output/java/src/test/java/org/zwobble/example/PointTests.java
index ea635ca..ea635ca 100644
--- a/examples/08-native-type-custom-config/output/java/src/test/java/org/zwobble/example/PointTests.java
+++ b/examples/09-native-type-custom-config/output/java/src/test/java/org/zwobble/example/PointTests.java
diff --git a/examples/09-shared/output/rust/.gitignore b/examples/09-native-type-custom-config/output/rust/.gitignore
index ea8c4bf..ea8c4bf 100644
--- a/examples/09-shared/output/rust/.gitignore
+++ b/examples/09-native-type-custom-config/output/rust/.gitignore
diff --git a/examples/09-shared/output/rust/Cargo.lock b/examples/09-native-type-custom-config/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/09-shared/output/rust/Cargo.lock
+++ b/examples/09-native-type-custom-config/output/rust/Cargo.lock
diff --git a/examples/09-shared/output/rust/Cargo.toml b/examples/09-native-type-custom-config/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/09-shared/output/rust/Cargo.toml
+++ b/examples/09-native-type-custom-config/output/rust/Cargo.toml
diff --git a/examples/09-shared/output/rust/rust-toolchain.toml b/examples/09-native-type-custom-config/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/09-shared/output/rust/rust-toolchain.toml
+++ b/examples/09-native-type-custom-config/output/rust/rust-toolchain.toml
diff --git a/examples/08-native-type-custom-config/output/rust/src/main.rs b/examples/09-native-type-custom-config/output/rust/src/main.rs
index 10dc437..10dc437 100644
--- a/examples/08-native-type-custom-config/output/rust/src/main.rs
+++ b/examples/09-native-type-custom-config/output/rust/src/main.rs
diff --git a/examples/08-native-type-custom-config/output/rust/src/point.rs b/examples/09-native-type-custom-config/output/rust/src/point.rs
index 6ab4330..6ab4330 100644
--- a/examples/08-native-type-custom-config/output/rust/src/point.rs
+++ b/examples/09-native-type-custom-config/output/rust/src/point.rs
diff --git a/examples/08-native-type-custom-config/src/point.hob b/examples/09-native-type-custom-config/src/point.hob
index 7178dcb..7178dcb 100644
--- a/examples/08-native-type-custom-config/src/point.hob
+++ b/examples/09-native-type-custom-config/src/point.hob
diff --git a/examples/09-shared/hobgoblin.json5 b/examples/10-shared/hobgoblin.json5
index 19e0f93..19e0f93 100644
--- a/examples/09-shared/hobgoblin.json5
+++ b/examples/10-shared/hobgoblin.json5
diff --git a/examples/10-custom-code/output/java/.gitignore b/examples/10-shared/output/java/.gitignore
index ff511d4..ff511d4 100644
--- a/examples/10-custom-code/output/java/.gitignore
+++ b/examples/10-shared/output/java/.gitignore
diff --git a/examples/10-custom-code/output/java/pom.xml b/examples/10-shared/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/10-custom-code/output/java/pom.xml
+++ b/examples/10-shared/output/java/pom.xml
diff --git a/examples/09-shared/output/java/src/test/java/org/zwobble/example/PointTests.java b/examples/10-shared/output/java/src/test/java/org/zwobble/example/PointTests.java
index b4c140d..b4c140d 100644
--- a/examples/09-shared/output/java/src/test/java/org/zwobble/example/PointTests.java
+++ b/examples/10-shared/output/java/src/test/java/org/zwobble/example/PointTests.java
diff --git a/examples/10-custom-code/output/rust/.gitignore b/examples/10-shared/output/rust/.gitignore
index ea8c4bf..ea8c4bf 100644
--- a/examples/10-custom-code/output/rust/.gitignore
+++ b/examples/10-shared/output/rust/.gitignore
diff --git a/examples/10-custom-code/output/rust/Cargo.lock b/examples/10-shared/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/10-custom-code/output/rust/Cargo.lock
+++ b/examples/10-shared/output/rust/Cargo.lock
diff --git a/examples/10-custom-code/output/rust/Cargo.toml b/examples/10-shared/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/10-custom-code/output/rust/Cargo.toml
+++ b/examples/10-shared/output/rust/Cargo.toml
diff --git a/examples/10-custom-code/output/rust/rust-toolchain.toml b/examples/10-shared/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/10-custom-code/output/rust/rust-toolchain.toml
+++ b/examples/10-shared/output/rust/rust-toolchain.toml
diff --git a/examples/09-shared/output/rust/src/lib.rs b/examples/10-shared/output/rust/src/lib.rs
index af2c87f..af2c87f 100644
--- a/examples/09-shared/output/rust/src/lib.rs
+++ b/examples/10-shared/output/rust/src/lib.rs
diff --git a/examples/09-shared/output/rust/src/point.rs b/examples/10-shared/output/rust/src/point.rs
index dea7678..dea7678 100644
--- a/examples/09-shared/output/rust/src/point.rs
+++ b/examples/10-shared/output/rust/src/point.rs
diff --git a/examples/09-shared/src/point.hob b/examples/10-shared/src/point.hob
index 7b9a8e6..7b9a8e6 100644
--- a/examples/09-shared/src/point.hob
+++ b/examples/10-shared/src/point.hob
diff --git a/examples/10-custom-code/hobgoblin.json5 b/examples/11-custom-code/hobgoblin.json5
index 1d08a40..1d08a40 100644
--- a/examples/10-custom-code/hobgoblin.json5
+++ b/examples/11-custom-code/hobgoblin.json5
diff --git a/examples/11-imports/output/java/.gitignore b/examples/11-custom-code/output/java/.gitignore
index ff511d4..ff511d4 100644
--- a/examples/11-imports/output/java/.gitignore
+++ b/examples/11-custom-code/output/java/.gitignore
diff --git a/examples/11-imports/output/java/pom.xml b/examples/11-custom-code/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/11-imports/output/java/pom.xml
+++ b/examples/11-custom-code/output/java/pom.xml
diff --git a/examples/10-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java b/examples/11-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java
index 69a1ab1..69a1ab1 100644
--- a/examples/10-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java
+++ b/examples/11-custom-code/output/java/src/main/java/org/zwobble/example/types/shapes/Square.java
diff --git a/examples/10-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java b/examples/11-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java
index fba8e6c..fba8e6c 100644
--- a/examples/10-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java
+++ b/examples/11-custom-code/output/java/src/test/java/org/zwobble/example/ShapesTests.java
diff --git a/examples/11-imports/output/rust/.gitignore b/examples/11-custom-code/output/rust/.gitignore
index ea8c4bf..ea8c4bf 100644
--- a/examples/11-imports/output/rust/.gitignore
+++ b/examples/11-custom-code/output/rust/.gitignore
diff --git a/examples/11-imports/output/rust/Cargo.lock b/examples/11-custom-code/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/11-imports/output/rust/Cargo.lock
+++ b/examples/11-custom-code/output/rust/Cargo.lock
diff --git a/examples/11-imports/output/rust/Cargo.toml b/examples/11-custom-code/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/11-imports/output/rust/Cargo.toml
+++ b/examples/11-custom-code/output/rust/Cargo.toml
diff --git a/examples/11-imports/output/rust/rust-toolchain.toml b/examples/11-custom-code/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/11-imports/output/rust/rust-toolchain.toml
+++ b/examples/11-custom-code/output/rust/rust-toolchain.toml
diff --git a/examples/10-custom-code/output/rust/src/gen/shapes.rs b/examples/11-custom-code/output/rust/src/gen/shapes.rs
index 815db2a..815db2a 100644
--- a/examples/10-custom-code/output/rust/src/gen/shapes.rs
+++ b/examples/11-custom-code/output/rust/src/gen/shapes.rs
diff --git a/examples/10-custom-code/output/rust/src/lib.rs b/examples/11-custom-code/output/rust/src/lib.rs
index 1825d72..1825d72 100644
--- a/examples/10-custom-code/output/rust/src/lib.rs
+++ b/examples/11-custom-code/output/rust/src/lib.rs
diff --git a/examples/10-custom-code/output/rust/src/shapes.rs b/examples/11-custom-code/output/rust/src/shapes.rs
index f806bbb..f806bbb 100644
--- a/examples/10-custom-code/output/rust/src/shapes.rs
+++ b/examples/11-custom-code/output/rust/src/shapes.rs
diff --git a/examples/10-custom-code/src/shapes.hob b/examples/11-custom-code/src/shapes.hob
index 5dfe833..5dfe833 100644
--- a/examples/10-custom-code/src/shapes.hob
+++ b/examples/11-custom-code/src/shapes.hob
diff --git a/examples/12-imports/hobgoblin.json5 b/examples/12-imports/hobgoblin.json5
new file mode 100644
index 0000000..12713d4
--- /dev/null
+++ b/examples/12-imports/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: "rust-types",
+ path: "output/rust/src",
+ },
+ ],
+ },
+}
diff --git a/examples/12-imports/output/java/.gitignore b/examples/12-imports/output/java/.gitignore
new file mode 100644
index 0000000..ff511d4
--- /dev/null
+++ b/examples/12-imports/output/java/.gitignore
@@ -0,0 +1,2 @@
+/src/gen/
+/target/
diff --git a/examples/12-transient-0/output/java/pom.xml b/examples/12-imports/output/java/pom.xml
index 445fa65..445fa65 120000
--- a/examples/12-transient-0/output/java/pom.xml
+++ b/examples/12-imports/output/java/pom.xml
diff --git a/examples/11-imports/output/java/src/test/java/org/zwobble/example/LineTests.java b/examples/12-imports/output/java/src/test/java/org/zwobble/example/LineTests.java
index c376b19..c376b19 100644
--- a/examples/11-imports/output/java/src/test/java/org/zwobble/example/LineTests.java
+++ b/examples/12-imports/output/java/src/test/java/org/zwobble/example/LineTests.java
diff --git a/examples/12-imports/output/rust/.gitignore b/examples/12-imports/output/rust/.gitignore
new file mode 100644
index 0000000..ea8c4bf
--- /dev/null
+++ b/examples/12-imports/output/rust/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/examples/12-transient-0/output/rust/Cargo.lock b/examples/12-imports/output/rust/Cargo.lock
index 9dc6e3e..9dc6e3e 100644
--- a/examples/12-transient-0/output/rust/Cargo.lock
+++ b/examples/12-imports/output/rust/Cargo.lock
diff --git a/examples/12-transient-0/output/rust/Cargo.toml b/examples/12-imports/output/rust/Cargo.toml
index 5d4c622..5d4c622 100644
--- a/examples/12-transient-0/output/rust/Cargo.toml
+++ b/examples/12-imports/output/rust/Cargo.toml
diff --git a/examples/12-transient-0/output/rust/rust-toolchain.toml b/examples/12-imports/output/rust/rust-toolchain.toml
index 4fedb95..4fedb95 100644
--- a/examples/12-transient-0/output/rust/rust-toolchain.toml
+++ b/examples/12-imports/output/rust/rust-toolchain.toml
diff --git a/examples/11-imports/output/rust/src/lib.rs b/examples/12-imports/output/rust/src/lib.rs
index ffbcbf4..ffbcbf4 100644
--- a/examples/11-imports/output/rust/src/lib.rs
+++ b/examples/12-imports/output/rust/src/lib.rs
diff --git a/examples/11-imports/output/rust/src/line.rs b/examples/12-imports/output/rust/src/line.rs
index d383b15..d383b15 100644
--- a/examples/11-imports/output/rust/src/line.rs
+++ b/examples/12-imports/output/rust/src/line.rs
diff --git a/examples/11-imports/output/rust/src/point.rs b/examples/12-imports/output/rust/src/point.rs
index 943331f..943331f 100644
--- a/examples/11-imports/output/rust/src/point.rs
+++ b/examples/12-imports/output/rust/src/point.rs
diff --git a/examples/11-imports/src/line.hob b/examples/12-imports/src/line.hob
index 562d77f..562d77f 100644
--- a/examples/11-imports/src/line.hob
+++ b/examples/12-imports/src/line.hob
diff --git a/examples/11-imports/src/point.hob b/examples/12-imports/src/point.hob
index 87f9953..87f9953 100644
--- a/examples/11-imports/src/point.hob
+++ b/examples/12-imports/src/point.hob
diff --git a/examples/12-transient-0/hobgoblin.json5 b/examples/13-transient-0/hobgoblin.json5
index 2160c60..2160c60 100644
--- a/examples/12-transient-0/hobgoblin.json5
+++ b/examples/13-transient-0/hobgoblin.json5
diff --git a/examples/12-transient-0/output/java/.gitignore b/examples/13-transient-0/output/java/.gitignore
index 2fcf0b8..2fcf0b8 100644
--- a/examples/12-transient-0/output/java/.gitignore
+++ b/examples/13-transient-0/output/java/.gitignore
diff --git a/examples/13-transient-0/output/java/pom.xml b/examples/13-transient-0/output/java/pom.xml
new file mode 120000
index 0000000..445fa65
--- /dev/null
+++ b/examples/13-transient-0/output/java/pom.xml
@@ -0,0 +1 @@
+../../../templates/java-junit/pom.xml \ No newline at end of file
diff --git a/examples/12-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java b/examples/13-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java
index aa3355e..aa3355e 100644
--- a/examples/12-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java
+++ b/examples/13-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java
diff --git a/examples/12-transient-0/output/rust/.gitignore b/examples/13-transient-0/output/rust/.gitignore
index fc03479..fc03479 100644
--- a/examples/12-transient-0/output/rust/.gitignore
+++ b/examples/13-transient-0/output/rust/.gitignore
diff --git a/examples/13-transient-0/output/rust/Cargo.lock b/examples/13-transient-0/output/rust/Cargo.lock
new file mode 100644
index 0000000..9dc6e3e
--- /dev/null
+++ b/examples/13-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/13-transient-0/output/rust/Cargo.toml b/examples/13-transient-0/output/rust/Cargo.toml
new file mode 100644
index 0000000..5d4c622
--- /dev/null
+++ b/examples/13-transient-0/output/rust/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "example"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
diff --git a/examples/13-transient-0/output/rust/rust-toolchain.toml b/examples/13-transient-0/output/rust/rust-toolchain.toml
new file mode 100644
index 0000000..4fedb95
--- /dev/null
+++ b/examples/13-transient-0/output/rust/rust-toolchain.toml
@@ -0,0 +1,2 @@
+[toolchain]
+channel = "1.96"
diff --git a/examples/12-transient-0/output/rust/src/data.rs b/examples/13-transient-0/output/rust/src/data.rs
index 7a0c4fa..7a0c4fa 100644
--- a/examples/12-transient-0/output/rust/src/data.rs
+++ b/examples/13-transient-0/output/rust/src/data.rs
diff --git a/examples/12-transient-0/output/rust/src/gen/data.rs b/examples/13-transient-0/output/rust/src/gen/data.rs
index bbaf4e7..bbaf4e7 100644
--- a/examples/12-transient-0/output/rust/src/gen/data.rs
+++ b/examples/13-transient-0/output/rust/src/gen/data.rs
diff --git a/examples/12-transient-0/output/rust/src/gen/data/transient_0.rs b/examples/13-transient-0/output/rust/src/gen/data/transient_0.rs
index 8bf68cb..8bf68cb 100644
--- a/examples/12-transient-0/output/rust/src/gen/data/transient_0.rs
+++ b/examples/13-transient-0/output/rust/src/gen/data/transient_0.rs
diff --git a/examples/12-transient-0/output/rust/src/gen/transient_0.rs b/examples/13-transient-0/output/rust/src/gen/transient_0.rs
index 6505408..6505408 100644
--- a/examples/12-transient-0/output/rust/src/gen/transient_0.rs
+++ b/examples/13-transient-0/output/rust/src/gen/transient_0.rs
diff --git a/examples/12-transient-0/output/rust/src/lib.rs b/examples/13-transient-0/output/rust/src/lib.rs
index b858f24..b858f24 100644
--- a/examples/12-transient-0/output/rust/src/lib.rs
+++ b/examples/13-transient-0/output/rust/src/lib.rs
diff --git a/examples/12-transient-0/output/rust/src/transient_0.rs b/examples/13-transient-0/output/rust/src/transient_0.rs
index 8b2b800..8b2b800 100644
--- a/examples/12-transient-0/output/rust/src/transient_0.rs
+++ b/examples/13-transient-0/output/rust/src/transient_0.rs
diff --git a/examples/12-transient-0/src/data.hob b/examples/13-transient-0/src/data.hob
index 39a55c9..39a55c9 100644
--- a/examples/12-transient-0/src/data.hob
+++ b/examples/13-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 e4622a0..6f4c65d 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java
@@ -1,13 +1,11 @@
package org.zwobble.hobgoblin.compiler;
-import org.zwobble.hobgoblin.compiler.ast.typed.TypedNamespaceNode;
import org.zwobble.hobgoblin.compiler.ast.untyped.UntypedNamespaceNode;
import org.zwobble.hobgoblin.compiler.builtins.NativeTypes;
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;
-import org.zwobble.hobgoblin.compiler.typechecker.errors.UnknownNamespaceError;
import org.zwobble.hobgoblin.compiler.types.NamespaceName;
import org.zwobble.sourcetext.SourceText;
@@ -18,10 +16,8 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
-import java.util.*;
-import java.util.stream.Collectors;
-
-import static org.zwobble.hobgoblin.compiler.typechecker.NamespaceNameResolution.resolveNamespaceName;
+import java.util.ArrayList;
+import java.util.List;
public class HobgoblinCompiler {
public static final String FILE_NAME_EXTENSION = ".hob";
@@ -46,8 +42,6 @@ public class HobgoblinCompiler {
untypedNamespaceNodes.add(untypedNamespaceNode);
}
- var typedNamespaceNodes = new ArrayList<TypedNamespaceNode>();
-
var typeCheckerContext = TypeCheckerGlobalContext.initial();
typeCheckerContext.addNativeType(NativeTypes.BOOL);
typeCheckerContext.addNativeType(NativeTypes.INT_8);
@@ -58,10 +52,7 @@ public class HobgoblinCompiler {
typeCheckerContext.addNativeTypeConstructor(NativeTypes.OPTION);
typeCheckerContext.addNativeTypeConstructor(NativeTypes.SHARED);
- for (var untypedNamespaceNode : sortUntypedNamespaceNodes(untypedNamespaceNodes)) {
- var typedNamespaceNode = TypeChecker.typeCheckNamespace(untypedNamespaceNode, typeCheckerContext);
- typedNamespaceNodes.add(typedNamespaceNode);
- }
+ var typedNamespaceNodes = TypeChecker.typeCheckNamespaces(untypedNamespaceNodes, typeCheckerContext);
var typesInfo = typeCheckerContext.toTypesInfo();
@@ -70,47 +61,6 @@ public class HobgoblinCompiler {
}
}
- private static List<UntypedNamespaceNode> sortUntypedNamespaceNodes(List<UntypedNamespaceNode> namespaceNodes) {
- var namespaceNodesByName = namespaceNodes.stream()
- .collect(Collectors.toMap(node -> node.namespaceName(), node -> node));
-
- var sortedNamespaceNodes = new ArrayList<UntypedNamespaceNode>();
- var handledNamespaceNames = new HashSet<NamespaceName>();
- var pendingNamespaceNodes = new ArrayDeque<>(namespaceNodes);
-
- while (!pendingNamespaceNodes.isEmpty()) {
- var namespaceNode = pendingNamespaceNodes.removeLast();
- // TODO: handle cycles
- if (!handledNamespaceNames.contains(namespaceNode.namespaceName())) {
- var unhandledDependencies = new ArrayList<UntypedNamespaceNode>();
- for (var importNode : namespaceNode.imports()) {
- var importedNamespaceName = resolveNamespaceName(
- namespaceNode.namespaceName(),
- importNode.ancestorDepth(),
- importNode.namespaceName(),
- importNode.source()
- );
- if (!handledNamespaceNames.contains(importedNamespaceName)) {
- unhandledDependencies.add(
- Optional.ofNullable(namespaceNodesByName.get(importedNamespaceName))
- .orElseThrow(() -> new UnknownNamespaceError(importedNamespaceName, importNode.source()))
- );
- }
- }
-
- if (unhandledDependencies.isEmpty()) {
- handledNamespaceNames.add(namespaceNode.namespaceName());
- sortedNamespaceNodes.add(namespaceNode);
- } else {
- pendingNamespaceNodes.add(namespaceNode);
- pendingNamespaceNodes.addAll(unhandledDependencies);
- }
- }
- }
-
- return sortedNamespaceNodes;
- }
-
static NamespaceName sourceFileNamespaceName(Path sourceDirectory, Path sourceFilePath) {
var relativePath = sourceDirectory.relativize(sourceFilePath);
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 e8fc633..f448a56 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java
@@ -9,6 +9,7 @@ import org.zwobble.hobgoblin.compiler.types.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
+import java.util.stream.Collectors;
import static org.zwobble.hobgoblin.compiler.typechecker.NamespaceNameResolution.resolveNamespaceName;
import static org.zwobble.hobgoblin.compiler.typechecker.TypeCheckerSubtyping.isSubtype;
@@ -18,53 +19,69 @@ public class TypeChecker {
private TypeChecker() {
}
- public static TypedNamespaceNode typeCheckNamespace(
- UntypedNamespaceNode untyped,
+ public static List<TypedNamespaceNode> typeCheckNamespaces(
+ List<UntypedNamespaceNode> untypedNamespaces,
TypeCheckerGlobalContext context
) {
- var namespaceContext = context.enterNamespace(untyped.namespaceName());
-
- for (var untypedImport : untyped.imports()) {
- var importedNamespace = resolveNamespaceName(
- untyped.namespaceName(),
- untypedImport.ancestorDepth(),
- untypedImport.namespaceName(),
- untypedImport.source()
- );
-
- var importedNamespaceFields = context.namespaceFields(importedNamespace)
- .orElseThrow(() -> new UnknownNamespaceError(importedNamespace, untypedImport.source()));
-
- for (var importedName : untypedImport.importedNames()) {
- var fieldType = importedNamespaceFields.fieldType(importedName)
- .orElseThrow(() -> new UnknownNamespaceFieldError(
- importedName,
- importedNamespace,
- untypedImport.source()
- ));
- namespaceContext.declare(importedName, fieldType, untypedImport.source());
+ var namespaceContexts = untypedNamespaces.stream()
+ .collect(Collectors.toMap(
+ untypedNamespace -> untypedNamespace.namespaceName(),
+ untypedNamespace -> context.enterNamespace(untypedNamespace.namespaceName())
+ ));
+
+ for (var untypedNamespace : untypedNamespaces) {
+ var namespaceContext = namespaceContexts.get(untypedNamespace.namespaceName());
+
+ var fields = new ArrayList<Field>();
+ for (var untypedStatement : untypedNamespace.body()) {
+ var type = declareNamespaceStatement(untypedStatement, namespaceContext);
+ var field = new Field(untypedStatement.name(), type, untypedStatement.source());
+ fields.add(field);
}
+ context.defineNamespace(untypedNamespace.namespaceName(), fields);
}
- var fields = new ArrayList<Field>();
- for (var untypedStatement : untyped.body()) {
- var type = declareNamespaceStatement(untypedStatement, namespaceContext);
- var field = new Field(untypedStatement.name(), type, untypedStatement.source());
- fields.add(field);
- }
- context.defineNamespace(untyped.namespaceName(), fields);
+ var typedNamespaceNodes = new ArrayList<TypedNamespaceNode>();
+
+ for (var untypedNamespace : untypedNamespaces) {
+ var namespaceContext = namespaceContexts.get(untypedNamespace.namespaceName());
+
+ for (var untypedImport : untypedNamespace.imports()) {
+ var importedNamespace = resolveNamespaceName(
+ untypedNamespace.namespaceName(),
+ untypedImport.ancestorDepth(),
+ untypedImport.namespaceName(),
+ untypedImport.source()
+ );
- var typedBody = new ArrayList<TypedNamespaceStatementNode>();
- for (var untypedStatement : untyped.body()) {
- var typedStatement = defineNamespaceStatement(untypedStatement, namespaceContext);
- typedBody.add(typedStatement);
+ var importedNamespaceFields = context.namespaceFields(importedNamespace)
+ .orElseThrow(() -> new UnknownNamespaceError(importedNamespace, untypedImport.source()));
+
+ for (var importedName : untypedImport.importedNames()) {
+ var fieldType = importedNamespaceFields.fieldType(importedName)
+ .orElseThrow(() -> new UnknownNamespaceFieldError(
+ importedName,
+ importedNamespace,
+ untypedImport.source()
+ ));
+ namespaceContext.declare(importedName, fieldType, untypedImport.source());
+ }
+ }
+
+ var typedBody = new ArrayList<TypedNamespaceStatementNode>();
+ for (var untypedStatement : untypedNamespace.body()) {
+ var typedStatement = defineNamespaceStatement(untypedStatement, namespaceContext);
+ typedBody.add(typedStatement);
+ }
+
+ typedNamespaceNodes.add(new TypedNamespaceNode(
+ untypedNamespace.namespaceName(),
+ typedBody,
+ untypedNamespace.source()
+ ));
}
- return new TypedNamespaceNode(
- untyped.namespaceName(),
- typedBody,
- untyped.source()
- );
+ return typedNamespaceNodes;
}
static Type declareNamespaceStatement(
@@ -311,6 +328,8 @@ public class TypeChecker {
Optional<List<Field>> variantTypeFields,
TypesInfo typesInfo
) {
+ // TODO: check that variant and sum are in the same namespace.
+
for (var sumTypeField : sumTypeFields) {
var variantTypeField = variantTypeFields.flatMap(
fields -> fields.stream()
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceTests.java
index b5814a8..95ad671 100644
--- a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceTests.java
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNamespaceTests.java
@@ -31,9 +31,9 @@ public class TypeCheckerNamespaceTests {
.build();
var context = TypeCheckerContextArb.globalContext();
- var typed = TypeChecker.typeCheckNamespace(untyped, context);
+ var typed = TypeChecker.typeCheckNamespaces(List.of(untyped), context);
- assertThat(typed, instanceOf(
+ assertThat(typed, containsExactly(instanceOf(
TypedNamespaceNode.class,
has("body", TypedNamespaceNode::body, isSequence(
instanceOf(
@@ -45,7 +45,7 @@ public class TypeCheckerNamespaceTests {
)
)
))
- ));
+ )));
assertThat(
context.namespaceFields(NamespaceName.of("a", "b")).orElseThrow().fieldType("X").orElseThrow(),
isMetaType(new StructType(NamespaceName.of("a", "b"), "X"))
@@ -83,9 +83,9 @@ public class TypeCheckerNamespaceTests {
NullSource.INSTANCE
)));
- var typed = TypeChecker.typeCheckNamespace(untyped, context);
+ var typed = TypeChecker.typeCheckNamespaces(List.of(untyped), context);
- assertThat(typed, instanceOf(
+ assertThat(typed, containsExactly(instanceOf(
TypedNamespaceNode.class,
has("body", TypedNamespaceNode::body, isSequence(
instanceOf(
@@ -97,7 +97,7 @@ public class TypeCheckerNamespaceTests {
)
)
))
- ));
+ )));
assertThat(
context.toTypesInfo().fieldsOf(new StructType(NamespaceName.of("a", "b"), "X")),
isOptionalOf(isSequence(
@@ -121,7 +121,7 @@ public class TypeCheckerNamespaceTests {
var error = assertThrows(
UnknownNamespaceError.class,
- () -> TypeChecker.typeCheckNamespace(untyped, context)
+ () -> TypeChecker.typeCheckNamespaces(List.of(untyped), context)
);
assertThat(error.namespaceName(), equalTo(NamespaceName.of("a")));
@@ -143,7 +143,7 @@ public class TypeCheckerNamespaceTests {
var error = assertThrows(
UnknownNamespaceFieldError.class,
- () -> TypeChecker.typeCheckNamespace(untyped, context)
+ () -> TypeChecker.typeCheckNamespaces(List.of(untyped), context)
);
assertThat(error.fieldName(), equalTo("A"));
diff --git a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerStructDefinitionTests.java b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerStructDefinitionTests.java
index d86fd59..ceb7a9b 100644
--- a/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerStructDefinitionTests.java
+++ b/src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerStructDefinitionTests.java
@@ -150,9 +150,9 @@ public class TypeCheckerStructDefinitionTests {
var context = TypeCheckerContextArb.globalContext();
context.addNativeType(int32Type);
- var typed = TypeChecker.typeCheckNamespace(untyped, context);
+ var typed = TypeChecker.typeCheckNamespaces(List.of(untyped), context);
- assertThat(typed, has(
+ assertThat(typed, containsExactly(has(
"body",
TypedNamespaceNode::body,
isSequence(
@@ -193,6 +193,6 @@ public class TypeCheckerStructDefinitionTests {
)
)
)
- ));
+ )));
}
}