From 5148cdd9343e28e945c3e4c206d5d29c5790c001 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 31 Jul 2026 12:34:40 +0100 Subject: Support circular imports --- .../hobgoblin.json5 | 19 +++++++++++++++++++ .../output/java/.gitignore | 2 ++ .../output/java/pom.xml | 1 + .../src/test/java/org/zwobble/example/DataTests.java | 14 ++++++++++++++ .../output/rust/.gitignore | 1 + .../output/rust/Cargo.lock | 7 +++++++ .../output/rust/Cargo.toml | 6 ++++++ .../output/rust/rust-toolchain.toml | 2 ++ .../output/rust/src/data/a.rs | 17 +++++++++++++++++ .../output/rust/src/data/b.rs | 6 ++++++ .../output/rust/src/data/mod.rs | 2 ++ .../output/rust/src/lib.rs | 15 +++++++++++++++ .../src/data/a.hob | 9 +++++++++ .../src/data/b.hob | 5 +++++ 14 files changed, 106 insertions(+) create mode 100644 examples/05-inductive-data-types-separate-namespaces/hobgoblin.json5 create mode 100644 examples/05-inductive-data-types-separate-namespaces/output/java/.gitignore create mode 120000 examples/05-inductive-data-types-separate-namespaces/output/java/pom.xml create mode 100644 examples/05-inductive-data-types-separate-namespaces/output/java/src/test/java/org/zwobble/example/DataTests.java create mode 100644 examples/05-inductive-data-types-separate-namespaces/output/rust/.gitignore create mode 100644 examples/05-inductive-data-types-separate-namespaces/output/rust/Cargo.lock create mode 100644 examples/05-inductive-data-types-separate-namespaces/output/rust/Cargo.toml create mode 100644 examples/05-inductive-data-types-separate-namespaces/output/rust/rust-toolchain.toml create mode 100644 examples/05-inductive-data-types-separate-namespaces/output/rust/src/data/a.rs create mode 100644 examples/05-inductive-data-types-separate-namespaces/output/rust/src/data/b.rs create mode 100644 examples/05-inductive-data-types-separate-namespaces/output/rust/src/data/mod.rs create mode 100644 examples/05-inductive-data-types-separate-namespaces/output/rust/src/lib.rs create mode 100644 examples/05-inductive-data-types-separate-namespaces/src/data/a.hob create mode 100644 examples/05-inductive-data-types-separate-namespaces/src/data/b.hob (limited to 'examples/05-inductive-data-types-separate-namespaces') diff --git a/examples/05-inductive-data-types-separate-namespaces/hobgoblin.json5 b/examples/05-inductive-data-types-separate-namespaces/hobgoblin.json5 new file mode 100644 index 0000000..12713d4 --- /dev/null +++ b/examples/05-inductive-data-types-separate-namespaces/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/05-inductive-data-types-separate-namespaces/output/java/.gitignore b/examples/05-inductive-data-types-separate-namespaces/output/java/.gitignore new file mode 100644 index 0000000..ff511d4 --- /dev/null +++ b/examples/05-inductive-data-types-separate-namespaces/output/java/.gitignore @@ -0,0 +1,2 @@ +/src/gen/ +/target/ diff --git a/examples/05-inductive-data-types-separate-namespaces/output/java/pom.xml b/examples/05-inductive-data-types-separate-namespaces/output/java/pom.xml new file mode 120000 index 0000000..445fa65 --- /dev/null +++ b/examples/05-inductive-data-types-separate-namespaces/output/java/pom.xml @@ -0,0 +1 @@ +../../../templates/java-junit/pom.xml \ No newline at end of file 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-inductive-data-types-separate-namespaces/output/rust/.gitignore b/examples/05-inductive-data-types-separate-namespaces/output/rust/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/examples/05-inductive-data-types-separate-namespaces/output/rust/.gitignore @@ -0,0 +1 @@ +/target diff --git a/examples/05-inductive-data-types-separate-namespaces/output/rust/Cargo.lock b/examples/05-inductive-data-types-separate-namespaces/output/rust/Cargo.lock new file mode 100644 index 0000000..9dc6e3e --- /dev/null +++ b/examples/05-inductive-data-types-separate-namespaces/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/05-inductive-data-types-separate-namespaces/output/rust/Cargo.toml b/examples/05-inductive-data-types-separate-namespaces/output/rust/Cargo.toml new file mode 100644 index 0000000..5d4c622 --- /dev/null +++ b/examples/05-inductive-data-types-separate-namespaces/output/rust/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "example" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/examples/05-inductive-data-types-separate-namespaces/output/rust/rust-toolchain.toml b/examples/05-inductive-data-types-separate-namespaces/output/rust/rust-toolchain.toml new file mode 100644 index 0000000..4fedb95 --- /dev/null +++ b/examples/05-inductive-data-types-separate-namespaces/output/rust/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "1.96" 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::), +} + +impl ::std::convert::From:: 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::, +} 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::, +} 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]; +} -- cgit v1.2.3