diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-08-05 18:44:26 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-08-05 18:44:26 +0100 |
| commit | 8455bb19b7d4235e667cab9112aa276557969dcc (patch) | |
| tree | 3ad5a7cf2941c4918f9e6de612a711cd8846570f | |
| parent | 266e826749b62c46e14d9590351f8c3b2de53512 (diff) | |
Type check generic native types
| -rw-r--r-- | examples/11-native-type-generic/hobgoblin.json5 | 33 | ||||
| -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.java | 9 | ||||
| -rw-r--r-- | examples/11-native-type-generic/output/java/src/test/java/org/zwobble/example/MapTests.java | 13 | ||||
| -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.rs | 6 | ||||
| -rw-r--r-- | examples/11-native-type-generic/output/rust/src/lib.rs | 12 | ||||
| -rw-r--r-- | examples/11-native-type-generic/output/rust/src/map.rs | 1 | ||||
| -rw-r--r-- | examples/11-native-type-generic/src/map.hob | 6 | ||||
| -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/.gitignore | 2 | ||||
| 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/.gitignore | 1 | ||||
| -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.xml | 1 | ||||
| -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.lock | 7 | ||||
| -rw-r--r-- | examples/15-transient-0/output/rust/Cargo.toml | 6 | ||||
| -rw-r--r-- | examples/15-transient-0/output/rust/rust-toolchain.toml | 2 | ||||
| -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.java | 5 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java | 26 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/hobgoblin/compiler/types/TypeConstructor.java | 4 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/hobgoblin/compiler/types/TypeOrConstructor.java | 20 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/hobgoblin/compiler/typechecker/TypeCheckerNativeTypeDefinitionTests.java | 7 |
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"))) ) )); } |
