summaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-06-12 20:33:18 +0100
committerMichael Williamson <mike@zwobble.org>2026-06-12 20:45:25 +0100
commit4b69bc1f750388f1a9238f4dd3bb66e91d982c97 (patch)
tree210b1946fc0424e348e3c9cb7e6b838694e330fc /src/main/java/org
parent17c98fecd0142074089a62d8e7904bdff5e6fcea (diff)
Add Option type
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java1
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java7
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGeneratorConfig.java3
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/java/ast/JavaTypeRef.java2
4 files changed, 12 insertions, 1 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java
index 8d28d7f..4093938 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java
@@ -38,6 +38,7 @@ public class HobgoblinCompiler {
typeCheckerContext.addNativeType(NativeTypes.INT_64);
typeCheckerContext.addNativeType(NativeTypes.STRING);
typeCheckerContext.addNativeTypeConstructor(NativeTypes.LIST);
+ typeCheckerContext.addNativeTypeConstructor(NativeTypes.OPTION);
for (var sourceFile : collectSourceFiles(sourceDirectory)) {
var namespaceName = sourceFileNamespaceName(sourceDirectory, sourceFile);
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 1ce8e0e..201fea3 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java
@@ -17,4 +17,11 @@ public class NativeTypes {
List.of(new TypeParam("T")),
LIST_INNER
);
+
+ public static final SimpleNativeType OPTION_INNER = SimpleNativeType.builtin("Option");
+
+ public static TypeConstructor<SimpleNativeType> OPTION = new TypeConstructor<>(
+ List.of(new TypeParam("T")),
+ OPTION_INNER
+ );
}
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 be2fa95..9be9eed 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
@@ -72,7 +72,8 @@ public record JavaGeneratorConfig(
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(""))),
- Map.entry(NativeTypes.LIST_INNER, JavaNativeTypeConfig.of(JavaTypeRef.LIST, new JavaStaticMethodCall(JavaTypeRef.LIST, "of", List.of())))
+ Map.entry(NativeTypes.LIST_INNER, JavaNativeTypeConfig.of(JavaTypeRef.LIST, new JavaStaticMethodCall(JavaTypeRef.LIST, "of", List.of()))),
+ Map.entry(NativeTypes.OPTION_INNER, JavaNativeTypeConfig.of(JavaTypeRef.OPTIONAL, new JavaStaticMethodCall(JavaTypeRef.OPTIONAL, "empty", List.of())))
);
public Optional<JavaNativeTypeConfig> nativeTypeConfig(SimpleNativeType type) {
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 d58d073..2738098 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
@@ -51,5 +51,7 @@ public record JavaTypeRef(List<String> packageName, List<String> typeNames, List
public static final JavaTypeRef OBJECT = topLevel(List.of("java", "lang"), "Object");
+ public static final JavaTypeRef OPTIONAL = topLevel(List.of("java", "util"), "Optional");
+
public static final JavaTypeRef STREAM = topLevel(List.of("java", "util", "stream"), "Stream");
}