diff options
9 files changed, 94 insertions, 6 deletions
diff --git a/examples/03-struct-generic/hobgoblin.json5 b/examples/03-struct-generic/hobgoblin.json5 index 39e039d..19e0f93 100644 --- a/examples/03-struct-generic/hobgoblin.json5 +++ b/examples/03-struct-generic/hobgoblin.json5 @@ -14,10 +14,10 @@ generator: "java-precisely-matchers", path: "output/java/src/gen/java", }, -// { -// generator: "rust-types", -// path: "output/rust/src", -// }, + { + generator: "rust-types", + path: "output/rust/src", + }, ], } } diff --git a/examples/03-struct-generic/output/rust/.gitignore b/examples/03-struct-generic/output/rust/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/examples/03-struct-generic/output/rust/.gitignore @@ -0,0 +1 @@ +/target diff --git a/examples/03-struct-generic/output/rust/Cargo.lock b/examples/03-struct-generic/output/rust/Cargo.lock new file mode 100644 index 0000000..9dc6e3e --- /dev/null +++ b/examples/03-struct-generic/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/03-struct-generic/output/rust/Cargo.toml b/examples/03-struct-generic/output/rust/Cargo.toml new file mode 100644 index 0000000..5d4c622 --- /dev/null +++ b/examples/03-struct-generic/output/rust/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "example" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/examples/03-struct-generic/output/rust/rust-toolchain.toml b/examples/03-struct-generic/output/rust/rust-toolchain.toml new file mode 100644 index 0000000..4fedb95 --- /dev/null +++ b/examples/03-struct-generic/output/rust/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "1.96" diff --git a/examples/03-struct-generic/output/rust/src/lib.rs b/examples/03-struct-generic/output/rust/src/lib.rs new file mode 100644 index 0000000..75ae1f1 --- /dev/null +++ b/examples/03-struct-generic/output/rust/src/lib.rs @@ -0,0 +1,16 @@ +mod point; + +#[cfg(test)] +mod test { + use super::point::{Line, Point2D}; + + #[test] + fn line() { + let line = Line { + start: Point2D { x: 10, y: 25 }, + end: Point2D { x: 42, y: 47 }, + }; + assert_eq!(line.start.x, 10); + assert_eq!(line.end.y, 47); + } +} diff --git a/examples/03-struct-generic/output/rust/src/point.rs b/examples/03-struct-generic/output/rust/src/point.rs new file mode 100644 index 0000000..ae6a1ee --- /dev/null +++ b/examples/03-struct-generic/output/rust/src/point.rs @@ -0,0 +1,41 @@ +// Generated by hobgoblin. + +/// A set of drawings. +#[derive(Clone, Debug, Hash, PartialEq)] +pub struct OwnedLineDrawing<TPoint> { + pub drawing: crate::point::LineDrawing::<TPoint>, + pub owner: ::std::string::String, +} + +/// A 2D drawing made up of straight lines. +#[derive(Clone, Debug, Hash, PartialEq)] +pub struct LineDrawing2D { + pub lines: ::std::vec::Vec::<crate::point::Line::<crate::point::Point2D>>, +} + +/// A drawing made up of straight lines. +#[derive(Clone, Debug, Hash, PartialEq)] +pub struct LineDrawing<TPoint> { + pub lines: ::std::vec::Vec::<crate::point::Line::<TPoint>>, +} + +/// A cubic Bezier curve. +#[derive(Clone, Debug, Hash, PartialEq)] +pub struct BezierCurve<TPoint> { + pub start: crate::point::Line::<TPoint>, + pub end: crate::point::Line::<TPoint>, +} + +/// A straight line from one point to another. +#[derive(Clone, Debug, Hash, PartialEq)] +pub struct Line<TPoint> { + pub start: TPoint, + pub end: TPoint, +} + +/// A 2D point. +#[derive(Clone, Debug, Hash, PartialEq)] +pub struct Point2D { + pub x: ::core::primitive::i32, + pub y: ::core::primitive::i32, +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGenerator.java index 089a854..fae9066 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGenerator.java @@ -79,7 +79,7 @@ public class RustGenerator { } case TypeParam typeParam -> { - throw new UnsupportedOperationException("TODO"); + yield RustPath.of(this.generateTypeName(typeParam.name())); } }; } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java index 2070ec3..a5c2118 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java @@ -7,7 +7,9 @@ import org.zwobble.hobgoblin.compiler.output.generators.rust.RustGenerator; import org.zwobble.hobgoblin.compiler.output.generators.rust.RustGeneratorConfig; import org.zwobble.hobgoblin.compiler.output.lang.rust.ast.*; import org.zwobble.hobgoblin.compiler.typechecker.TypesInfo; +import org.zwobble.hobgoblin.compiler.types.SimpleStructType; import org.zwobble.hobgoblin.compiler.types.Type; +import org.zwobble.hobgoblin.compiler.types.TypeOrConstructor; import org.zwobble.json5.reader.Json5ObjectReader; import java.io.IOException; @@ -127,6 +129,19 @@ public class RustTypesGenerator implements Generator { var rustStructName = this.rustGenerator.generateTypeName(structDefinition.name()); + var rustTypeParams = switch (structDefinition.typeOrConstructor()) { + case TypeOrConstructor.Constructor<SimpleStructType> constructor -> + constructor.value().params().stream() + .map(typeParam -> new RustTypeParam( + this.rustGenerator.generateTypeName(typeParam.name()), + List.of() + )) + .toList(); + + case TypeOrConstructor.Type<SimpleStructType> _ -> + List.<RustTypeParam>of(); + }; + var rustFields = structDefinition.fields().map( fields -> fields.stream() .map(field -> new RustStructField( @@ -139,7 +154,7 @@ public class RustTypesGenerator implements Generator { var rustStruct = new RustStructStruct( rustAttributes, rustStructName, - List.of(), + rustTypeParams, rustFields, structDefinition.docComment() ); |
