diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-08-30 15:19:26 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-08-30 15:19:26 +0100 |
| commit | 58788b5e549ac31f714074928691fc2ec776c20b (patch) | |
| tree | 6da490ed350b0ea07f27e30abf33261cc20911b4 /src | |
| parent | 119324389887cf76e7e0f52bcb9c1067ede463d4 (diff) | |
Support generic structs in typescript-types
Diffstat (limited to 'src')
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")); } |
