summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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/JavaGenerator.java15
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatypes/JavaTypesGenerator.java12
4 files changed, 29 insertions, 6 deletions
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<SimpleNativeType> 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);
}