summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-08-30 15:19:26 +0100
committerMichael Williamson <mike@zwobble.org>2026-08-30 15:19:26 +0100
commit58788b5e549ac31f714074928691fc2ec776c20b (patch)
tree6da490ed350b0ea07f27e30abf33261cc20911b4 /src
parent119324389887cf76e7e0f52bcb9c1067ede463d4 (diff)
Support generic structs in typescript-types
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGenerator.java22
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGeneratorConfig.java3
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java16
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/typescript/TypescriptTypes.java1
4 files changed, 28 insertions, 14 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGenerator.java
index 7092a52..3832f35 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGenerator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGenerator.java
@@ -1,10 +1,7 @@
package org.zwobble.hobgoblin.compiler.output.generators.typescript;
import org.zwobble.hobgoblin.compiler.output.lang.typescript.TypescriptWriter;
-import org.zwobble.hobgoblin.compiler.output.lang.typescript.ast.TypescriptExpression;
-import org.zwobble.hobgoblin.compiler.output.lang.typescript.ast.TypescriptIdentifier;
-import org.zwobble.hobgoblin.compiler.output.lang.typescript.ast.TypescriptModule;
-import org.zwobble.hobgoblin.compiler.output.lang.typescript.ast.TypescriptRef;
+import org.zwobble.hobgoblin.compiler.output.lang.typescript.ast.*;
import org.zwobble.hobgoblin.compiler.types.*;
import java.io.File;
@@ -45,12 +42,13 @@ public class TypescriptGenerator {
public TypescriptExpression generateTypeExpression(Type value) {
return switch (value) {
- case ConstructedNativeType _ -> {
- throw new UnsupportedOperationException("TODO");
- }
-
- case ConstructedStructType _ -> {
- throw new UnsupportedOperationException("TODO");
+ case ConstructedType constructedType -> {
+ yield new TypescriptConstructedType(
+ generateTypeExpression(constructedType.constructor().genericType()),
+ constructedType.args().stream()
+ .map(this::generateTypeExpression)
+ .toList()
+ );
}
case SimpleType simpleType -> {
@@ -68,8 +66,8 @@ public class TypescriptGenerator {
throw new UnsupportedOperationException("TODO");
}
- case TypeParam _ -> {
- throw new UnsupportedOperationException("TODO");
+ case TypeParam typeParam -> {
+ yield new TypescriptRef(this.generateTypeName(typeParam.name()));
}
};
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGeneratorConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGeneratorConfig.java
index f49edda..ae34658 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGeneratorConfig.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGeneratorConfig.java
@@ -18,7 +18,8 @@ public record TypescriptGeneratorConfig(
}
private static final Map<SimpleNativeType, TypescriptNativeTypeConfig> DEFAULT_NATIVE_TYPE_CONFIGS = Map.ofEntries(
- Map.entry(NativeTypes.INT_32, new TypescriptNativeTypeConfig(TypescriptTypes.NUMBER))
+ Map.entry(NativeTypes.INT_32, new TypescriptNativeTypeConfig(TypescriptTypes.NUMBER)),
+ Map.entry(NativeTypes.LIST_INNER, new TypescriptNativeTypeConfig(TypescriptTypes.READONLY_ARRAY))
);
public Optional<TypescriptNativeTypeConfig> nativeTypeConfig(SimpleNativeType type) {
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java
index b048e8d..9a21ea9 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescripttypes/TypescriptTypesGenerator.java
@@ -8,6 +8,8 @@ import org.zwobble.hobgoblin.compiler.output.generators.typescript.TypescriptGen
import org.zwobble.hobgoblin.compiler.output.generators.typescript.TypescriptGeneratorConfig;
import org.zwobble.hobgoblin.compiler.output.lang.typescript.ast.*;
import org.zwobble.hobgoblin.compiler.typechecker.TypesInfo;
+import org.zwobble.hobgoblin.compiler.types.SimpleStructType;
+import org.zwobble.hobgoblin.compiler.types.TypeOrConstructor;
import org.zwobble.json5.reader.Json5ObjectReader;
import java.io.IOException;
@@ -106,6 +108,18 @@ public class TypescriptTypesGenerator implements Generator {
private List<TypescriptStatement> generateStructDefinition(TypedStructDefinitionNode structDefinition) {
var typescriptTypeName = this.typescriptGenerator.generateTypeName(structDefinition.name());
+ var typescriptTypeParams = switch (structDefinition.typeOrConstructor()) {
+ case TypeOrConstructor.Constructor<SimpleStructType> constructor ->
+ constructor.value().params().stream()
+ .map(typeParam -> new TypescriptTypeParam(
+ this.typescriptGenerator.generateTypeName(typeParam.name())
+ ))
+ .toList();
+
+ case TypeOrConstructor.Type<SimpleStructType> _ ->
+ List.<TypescriptTypeParam>of();
+ };
+
var body = new ArrayList<TypescriptClassElement>();
for (var field : structDefinition.fields().orElse(List.of())) {
@@ -160,7 +174,7 @@ public class TypescriptTypesGenerator implements Generator {
return List.of(
new TypescriptClassDeclaration(
typescriptTypeName,
- List.of(),
+ typescriptTypeParams,
body,
structDefinition.docComment()
),
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/typescript/TypescriptTypes.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/typescript/TypescriptTypes.java
index 308a297..1403187 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/typescript/TypescriptTypes.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/typescript/TypescriptTypes.java
@@ -8,4 +8,5 @@ public class TypescriptTypes {
}
public static final TypescriptRef NUMBER = new TypescriptRef(TypescriptIdentifier.of("number"));
+ public static final TypescriptRef READONLY_ARRAY = new TypescriptRef(TypescriptIdentifier.of("ReadonlyArray"));
}