summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-31 11:51:54 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-31 11:51:54 +0100
commitae413b3defdde71acbbb59b455e5e15321df6893 (patch)
treef7e6c78ed2fa839c1e659ab57a66fa309db92518
parent69ab5f074540a550393806de1a32d70d1c895121 (diff)
Add Int8 type
-rw-r--r--examples/12-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java13
-rw-r--r--examples/12-transient-0/output/rust/src/gen/data.rs6
-rw-r--r--examples/12-transient-0/output/rust/src/gen/data/transient_0.rs12
-rw-r--r--examples/12-transient-0/output/rust/src/gen/transient_0.rs14
-rw-r--r--examples/12-transient-0/output/rust/src/lib.rs14
-rw-r--r--examples/12-transient-0/src/data.hob5
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java1
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java1
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java1
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java10
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGeneratorConfig.java1
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java10
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/rust/RustTypes.java1
14 files changed, 90 insertions, 1 deletions
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;
@@ -59,6 +60,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
@@ -10,6 +10,12 @@ pub struct StructWithBool {
}
#[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,
pub b: ::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::<dyn ::std::any::Any + ::std::marker::Sync + ::std::marker::Send>>) -> ::std::io::Result::<crate::data::StructWithInt8> {
+ 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::<dyn ::std::any::Any + ::std::marker::Sync + ::std::marker::Send>>) -> ::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() {
@@ -35,6 +35,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<SimpleNativeType, JavaNativeTypeConfig> 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<SimpleNativeType, RustNativeTypeConfig> 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");