From 2bc23bdc7fe01fc5921be8e09f405a8a1fd7bd65 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 24 Jul 2026 17:59:45 +0100 Subject: Add Shared type --- .../org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java | 1 + .../zwobble/hobgoblin/compiler/builtins/NativeTypes.java | 7 +++++++ .../compiler/output/generators/java/JavaGenerator.java | 15 ++++++++++++++- .../output/generators/javatypes/JavaTypesGenerator.java | 12 +++++++----- 4 files changed, 29 insertions(+), 6 deletions(-) (limited to 'src/main/java/org/zwobble') diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java index 89da3ac..d5bbf56 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java @@ -55,6 +55,7 @@ public class HobgoblinCompiler { typeCheckerContext.addNativeType(NativeTypes.STRING); typeCheckerContext.addNativeTypeConstructor(NativeTypes.LIST); typeCheckerContext.addNativeTypeConstructor(NativeTypes.OPTION); + typeCheckerContext.addNativeTypeConstructor(NativeTypes.SHARED); for (var untypedNamespaceNode : sortUntypedNamespaceNodes(untypedNamespaceNodes)) { var typedNamespaceNode = TypeChecker.typeCheckNamespace(untypedNamespaceNode, typeCheckerContext); 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 7d03a91..8f96709 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java @@ -25,4 +25,11 @@ public class NativeTypes { List.of(new TypeParam("T")), OPTION_INNER ); + + public static final SimpleNativeType SHARED_INNER = SimpleNativeType.builtin("Shared"); + + public static TypeConstructor SHARED = new TypeConstructor<>( + List.of(new TypeParam("T")), + SHARED_INNER + ); } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGenerator.java index 46646d5..1325149 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/java/JavaGenerator.java @@ -1,5 +1,6 @@ package org.zwobble.hobgoblin.compiler.output.generators.java; +import org.zwobble.hobgoblin.compiler.builtins.NativeTypes; import org.zwobble.hobgoblin.compiler.output.lang.java.JavaWriter; import org.zwobble.hobgoblin.compiler.output.lang.java.ast.*; import org.zwobble.hobgoblin.compiler.types.*; @@ -143,7 +144,7 @@ public class JavaGenerator { } private JavaTypeRef generateTypeRef(Type type, boolean referenceType) { - return switch (type) { + return switch (collapseType(type)) { case ConstructedNativeType constructedNativeType -> { var innerTypeRef = generateTypeRef( constructedNativeType.constructor().genericType(), @@ -199,4 +200,16 @@ public class JavaGenerator { throw new UnsupportedOperationException("TODO"); }; } + + public Type collapseType(Type type) { + if (!(type instanceof ConstructedNativeType constructedNativeType)) { + return type; + } + + if (!constructedNativeType.constructor().equals(NativeTypes.SHARED)) { + return type; + } + + return constructedNativeType.args().getFirst(); + } } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java index 2a2c7ca..62c73ff 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java @@ -215,13 +215,15 @@ public class JavaTypesGenerator implements Generator { var javaFieldName = generateFieldName(field.name()); var withMethodName = generateFieldName("with" + lowerCamelCaseToUpperCamelCase(field.name())); + var fieldType = this.javaGenerator.collapseType(field.type().value()); + methods.add(new JavaMethodDeclaration( withMethodName, JavaVisibility.PUBLIC, JavaMemberKind.INSTANCE, builderJavaTypeRef, List.of( - new JavaParam(generateTypeRef(field.type(), context), javaFieldName) + new JavaParam(generateTypeRef(fieldType, context), javaFieldName) ), List.of(), new JavaBlock(List.of( @@ -232,7 +234,7 @@ public class JavaTypesGenerator implements Generator { )) )); - var fieldBuilderTypeRef = generateBuilderTypeRef(field.type().value()); + var fieldBuilderTypeRef = generateBuilderTypeRef(fieldType); if (fieldBuilderTypeRef.isPresent()) { methods.add(new JavaMethodDeclaration( @@ -260,7 +262,7 @@ public class JavaTypesGenerator implements Generator { } if ( - field.type().value() instanceof ConstructedNativeType fieldConstructedNativeType && + fieldType instanceof ConstructedNativeType fieldConstructedNativeType && fieldConstructedNativeType.constructor().equals(NativeTypes.LIST) ) { var elementType = fieldConstructedNativeType.args().getFirst(); @@ -340,7 +342,7 @@ public class JavaTypesGenerator implements Generator { } if ( - field.type().value() instanceof ConstructedNativeType fieldConstructedNativeType && + fieldType instanceof ConstructedNativeType fieldConstructedNativeType && fieldConstructedNativeType.constructor().equals(NativeTypes.OPTION) ) { var elementType = fieldConstructedNativeType.args().getFirst(); @@ -506,7 +508,7 @@ public class JavaTypesGenerator implements Generator { } private JavaExpression arbitraryValue(Type type, Context context) { - return switch (type) { + return switch (this.javaGenerator.collapseType(type)) { case ConstructedNativeType constructedNativeType -> { yield arbitraryValue(constructedNativeType.constructor().genericType(), context); } -- cgit v1.2.3