From ae413b3defdde71acbbb59b455e5e15321df6893 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 31 Jul 2026 11:51:54 +0100 Subject: Add Int8 type --- .../src/test/java/org/zwobble/example/Transient0Tests.java | 13 +++++++++++++ examples/12-transient-0/output/rust/src/gen/data.rs | 6 ++++++ .../12-transient-0/output/rust/src/gen/data/transient_0.rs | 12 ++++++++++++ examples/12-transient-0/output/rust/src/gen/transient_0.rs | 14 ++++++++++++++ examples/12-transient-0/output/rust/src/lib.rs | 14 +++++++++++++- examples/12-transient-0/src/data.hob | 5 +++++ .../org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java | 1 + .../zwobble/hobgoblin/compiler/builtins/NativeTypes.java | 1 + .../output/generators/java/JavaGeneratorConfig.java | 1 + .../generators/javatransient0/JavaTransient0Generator.java | 10 ++++++++++ .../output/generators/rust/RustGeneratorConfig.java | 1 + .../generators/rusttransient0/RustTransient0Generator.java | 10 ++++++++++ .../compiler/output/lang/java/ast/JavaTypeRef.java | 2 ++ .../hobgoblin/compiler/output/lang/rust/RustTypes.java | 1 + 14 files changed, 90 insertions(+), 1 deletion(-) diff --git a/examples/12-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java b/examples/12-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java index d8d4f3f..aa3355e 100644 --- a/examples/12-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java +++ b/examples/12-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java @@ -19,6 +19,7 @@ import org.zwobble.example.types.data.StructSingleton; import org.zwobble.example.types.data.StructWithBool; import org.zwobble.example.types.data.StructWithDifferentSharedTypes; import org.zwobble.example.types.data.StructWithEnum; +import org.zwobble.example.types.data.StructWithInt8; import org.zwobble.example.types.data.StructWithInt32; import org.zwobble.example.types.data.StructWithInt64; import org.zwobble.example.types.data.StructWithList; @@ -58,6 +59,18 @@ public class Transient0Tests { ); } + @Test + public void structWithInt8() throws IOException { + var value = new StructWithInt8(10, 25); + + assertRoundTripEncoding( + "StructWithInt8", + value, + HobgoblinTransient0Data::encodeStructWithInt8, + HobgoblinTransient0Data::decodeStructWithInt8 + ); + } + @Test public void structWithInt32() throws IOException { var value = new StructWithInt32(10, 25); diff --git a/examples/12-transient-0/output/rust/src/gen/data.rs b/examples/12-transient-0/output/rust/src/gen/data.rs index aef9f69..bbaf4e7 100644 --- a/examples/12-transient-0/output/rust/src/gen/data.rs +++ b/examples/12-transient-0/output/rust/src/gen/data.rs @@ -9,6 +9,12 @@ pub struct StructWithBool { pub b: ::core::primitive::bool, } +#[derive(Debug, Hash, PartialEq)] +pub struct StructWithInt8 { + pub a: ::core::primitive::i8, + pub b: ::core::primitive::i8, +} + #[derive(Debug, Hash, PartialEq)] pub struct StructWithInt32 { pub a: ::core::primitive::i32, diff --git a/examples/12-transient-0/output/rust/src/gen/data/transient_0.rs b/examples/12-transient-0/output/rust/src/gen/data/transient_0.rs index ca9beaf..8bf68cb 100644 --- a/examples/12-transient-0/output/rust/src/gen/data/transient_0.rs +++ b/examples/12-transient-0/output/rust/src/gen/data/transient_0.rs @@ -20,6 +20,18 @@ pub fn decode_struct_with_bool(reader: &mut impl std::io::Read, shared_values: & ::std::io::Result::Ok(crate::data::StructWithBool { a: a, b: b }) } +pub fn encode_struct_with_int_8(value: &crate::data::StructWithInt8, writer: &mut impl std::io::Write, shared_values: &mut ::std::collections::HashMap::<::core::primitive::usize, ::core::primitive::i64>) -> ::std::io::Result::<()> { + crate::transient_0::encode_int_8(&value.a, writer, shared_values)?; + crate::transient_0::encode_int_8(&value.b, writer, shared_values)?; + ::std::io::Result::Ok(()) +} + +pub fn decode_struct_with_int_8(reader: &mut impl std::io::Read, shared_values: &mut ::std::vec::Vec::<::std::sync::Arc::>) -> ::std::io::Result:: { + let a = crate::transient_0::decode_int_8(reader, shared_values)?; + let b = crate::transient_0::decode_int_8(reader, shared_values)?; + ::std::io::Result::Ok(crate::data::StructWithInt8 { a: a, b: b }) +} + pub fn encode_struct_with_int_32(value: &crate::data::StructWithInt32, writer: &mut impl std::io::Write, shared_values: &mut ::std::collections::HashMap::<::core::primitive::usize, ::core::primitive::i64>) -> ::std::io::Result::<()> { crate::transient_0::encode_int_32(&value.a, writer, shared_values)?; crate::transient_0::encode_int_32(&value.b, writer, shared_values)?; diff --git a/examples/12-transient-0/output/rust/src/gen/transient_0.rs b/examples/12-transient-0/output/rust/src/gen/transient_0.rs index d88284e..6505408 100644 --- a/examples/12-transient-0/output/rust/src/gen/transient_0.rs +++ b/examples/12-transient-0/output/rust/src/gen/transient_0.rs @@ -25,6 +25,20 @@ pub fn decode_bool(reader: &mut impl std::io::Read, shared_values: &mut ::std::v }) } +pub fn encode_int_8(value: &::core::primitive::i8, writer: &mut impl std::io::Write, shared_values: &mut ::std::collections::HashMap::<::core::primitive::usize, ::core::primitive::i64>) -> ::std::io::Result::<()> { + writer.write_all(&value.to_le_bytes())?; + ::std::io::Result::Ok(()) +} + +pub fn decode_int_8(reader: &mut impl std::io::Read, shared_values: &mut ::std::vec::Vec::<::std::sync::Arc::>) -> ::std::io::Result::<::core::primitive::i8> { + let bytes = { + let mut bytes = [0; 1]; + reader.read_exact(&mut bytes)?; + bytes + }; + ::std::io::Result::Ok(::core::primitive::i8::from_le_bytes(bytes)) +} + pub fn encode_int_32(value: &::core::primitive::i32, writer: &mut impl std::io::Write, shared_values: &mut ::std::collections::HashMap::<::core::primitive::usize, ::core::primitive::i64>) -> ::std::io::Result::<()> { writer.write_all(&value.to_le_bytes())?; ::std::io::Result::Ok(()) diff --git a/examples/12-transient-0/output/rust/src/lib.rs b/examples/12-transient-0/output/rust/src/lib.rs index 365a352..b858f24 100644 --- a/examples/12-transient-0/output/rust/src/lib.rs +++ b/examples/12-transient-0/output/rust/src/lib.rs @@ -8,7 +8,7 @@ mod test { use std::path::PathBuf; use std::sync::Arc; use std::collections::HashMap; - use super::data::{EnumWithVariants, StructSingleton, StructWithBool, StructWithDifferentSharedTypes, StructWithEnum, StructWithInt32, StructWithInt64, StructWithList, StructWithListOfShared, StructWithOption, StructWithSharedSumAndVariant, StructWithString, StructWithStruct, StructWithSum, SumWithVariants, VariantOne, VariantTwo }; + use super::data::{EnumWithVariants, StructSingleton, StructWithBool, StructWithDifferentSharedTypes, StructWithEnum, StructWithInt8, StructWithInt32, StructWithInt64, StructWithList, StructWithListOfShared, StructWithOption, StructWithSharedSumAndVariant, StructWithString, StructWithStruct, StructWithSum, SumWithVariants, VariantOne, VariantTwo }; #[test] fn struct_singleton() { @@ -34,6 +34,18 @@ mod test { ); } + #[test] + fn struct_with_int_8() { + let value = StructWithInt8 { a: 10, b: 25 }; + + assert_round_trip_encoding( + "StructWithInt8", + value, + super::data::transient_0::encode_struct_with_int_8, + super::data::transient_0::decode_struct_with_int_8, + ); + } + #[test] fn struct_with_int_32() { let value = StructWithInt32 { a: 10, b: 25 }; diff --git a/examples/12-transient-0/src/data.hob b/examples/12-transient-0/src/data.hob index 0a55e39..39a55c9 100644 --- a/examples/12-transient-0/src/data.hob +++ b/examples/12-transient-0/src/data.hob @@ -7,6 +7,11 @@ struct StructWithBool { field b: Bool; } +struct StructWithInt8 { + field a: Int8; + field b: Int8; +} + struct StructWithInt32 { field a: Int32; field b: Int32; diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java index 6c3a494..e4622a0 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java @@ -50,6 +50,7 @@ public class HobgoblinCompiler { var typeCheckerContext = TypeCheckerGlobalContext.initial(); typeCheckerContext.addNativeType(NativeTypes.BOOL); + typeCheckerContext.addNativeType(NativeTypes.INT_8); typeCheckerContext.addNativeType(NativeTypes.INT_32); typeCheckerContext.addNativeType(NativeTypes.INT_64); typeCheckerContext.addNativeType(NativeTypes.STRING); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java b/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java index 8f96709..58c8143 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java @@ -8,6 +8,7 @@ import java.util.List; public class NativeTypes { public static SimpleNativeType BOOL = SimpleNativeType.builtin("Bool"); + public static SimpleNativeType INT_8 = SimpleNativeType.builtin("Int8"); public static SimpleNativeType INT_32 = SimpleNativeType.builtin("Int32"); public static SimpleNativeType INT_64 = SimpleNativeType.builtin("Int64"); public static SimpleNativeType STRING = SimpleNativeType.builtin("String"); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java index 2b04294..fa4dd85 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java @@ -79,6 +79,7 @@ public record JavaGeneratorConfig( private static final Map DEFAULT_NATIVE_TYPE_CONFIGS = Map.ofEntries( Map.entry(NativeTypes.BOOL, JavaNativeTypeConfig.primitive(JavaTypeRef.BOOLEAN, JavaTypeRef.BOOLEAN_BOXED, new JavaBooleanLiteral(false))), + Map.entry(NativeTypes.INT_8, JavaNativeTypeConfig.primitive(JavaTypeRef.INT, JavaTypeRef.BYTE_BOXED, new JavaIntegerLiteral(0))), Map.entry(NativeTypes.INT_32, JavaNativeTypeConfig.primitive(JavaTypeRef.INT, JavaTypeRef.INT_BOXED, new JavaIntegerLiteral(0))), Map.entry(NativeTypes.INT_64, JavaNativeTypeConfig.primitive(JavaTypeRef.LONG, JavaTypeRef.LONG_BOXED, new JavaIntegerLiteral(0))), Map.entry(NativeTypes.STRING, JavaNativeTypeConfig.of(JavaTypeRef.STRING, new JavaStringLiteral(""))), diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java index 1c7c962..7e3219a 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java @@ -172,6 +172,8 @@ public class JavaTransient0Generator implements Generator { List.of( generateEncodeBoolMethod(), generateDecodeBoolMethod(), + generateEncodeInt8Method(), + generateDecodeInt8Method(), generateEncodeInt32Method(), generateDecodeInt32Method(), generateEncodeInt64Method(), @@ -211,6 +213,14 @@ public class JavaTransient0Generator implements Generator { ); } + private JavaMethodDeclaration generateEncodeInt8Method() { + return generateEncodeIntMethod(NativeTypes.INT_8, 8); + } + + private JavaMethodDeclaration generateDecodeInt8Method() { + return generateDecodeIntMethod(NativeTypes.INT_8, 8); + } + private JavaMethodDeclaration generateEncodeInt32Method() { return generateEncodeIntMethod(NativeTypes.INT_32, 32); } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGeneratorConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGeneratorConfig.java index 823189e..13721d4 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGeneratorConfig.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGeneratorConfig.java @@ -53,6 +53,7 @@ public record RustGeneratorConfig( private static final Map DEFAULT_NATIVE_TYPE_CONFIGS = Map.ofEntries( Map.entry(NativeTypes.BOOL, new RustNativeTypeConfig(RustTypes.BOOL)), + Map.entry(NativeTypes.INT_8, new RustNativeTypeConfig(RustTypes.I8)), Map.entry(NativeTypes.INT_32, new RustNativeTypeConfig(RustTypes.I32)), Map.entry(NativeTypes.INT_64, new RustNativeTypeConfig(RustTypes.I64)), Map.entry(NativeTypes.STRING, new RustNativeTypeConfig(RustTypes.STRING)), diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java index 1401b83..2af97a8 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java @@ -72,6 +72,8 @@ public class RustTransient0Generator implements Generator { List.of( generateEncodeBoolFunction(), generateDecodeBoolFunction(), + generateEncodeInt8Function(), + generateDecodeInt8Function(), generateEncodeInt32Function(), generateDecodeInt32Function(), generateEncodeInt64Function(), @@ -146,6 +148,14 @@ public class RustTransient0Generator implements Generator { ); } + private RustItem generateEncodeInt8Function() { + return generateEncodeIntFunction(NativeTypes.INT_8); + } + + private RustItem generateDecodeInt8Function() { + return generateDecodeIntFunction(NativeTypes.INT_8, 8); + } + private RustItem generateEncodeInt32Function() { return generateEncodeIntFunction(NativeTypes.INT_32); } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java index ef2686a..6f88a6c 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java @@ -52,6 +52,8 @@ public record JavaTypeRef( public static final JavaTypeRef BOOLEAN = primitive("boolean"); public static final JavaTypeRef BOOLEAN_BOXED = topLevel(JavaPackages.JAVA_LANG, JavaIdentifier.of("Boolean")); + public static final JavaTypeRef BYTE = primitive("byte"); + public static final JavaTypeRef BYTE_BOXED = topLevel(JavaPackages.JAVA_LANG, JavaIdentifier.of("Byte")); public static final JavaTypeRef INT = primitive("int"); public static final JavaTypeRef INT_BOXED = topLevel(JavaPackages.JAVA_LANG, JavaIdentifier.of("Integer")); public static final JavaTypeRef LONG = primitive("long"); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustTypes.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustTypes.java index 3b55420..ec473b1 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustTypes.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustTypes.java @@ -13,6 +13,7 @@ public class RustTypes { } public static RustPath BOOL = RustPath.primitive("bool"); + public static RustPath I8 = RustPath.primitive("i8"); public static RustPath I32 = RustPath.primitive("i32"); public static RustPath I64 = RustPath.primitive("i64"); public static RustPath USIZE = RustPath.primitive("usize"); -- cgit v1.2.3