summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-08-30 09:16:55 +0100
committerMichael Williamson <mike@zwobble.org>2026-08-30 09:16:55 +0100
commit93fdddf21b33fb95f249348d6fe8d38f6564243c (patch)
tree6028c4d4cc8ae48c35aa7cb4cc57023765565d9a /src/main/java
parentd8771a35c842daab25d6e02df99855ef1e41b740 (diff)
Support generating TypeScript type expressions for simple types
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGenerator.java38
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptGeneratorConfig.java20
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptNativeTypeConfig.java6
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/lang/typescript/TypescriptTypes.java11
4 files changed, 73 insertions, 2 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 bf14e2e..7092a52 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,8 +1,11 @@
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.types.*;
import java.io.File;
import java.io.IOException;
@@ -35,4 +38,39 @@ public class TypescriptGenerator {
public TypescriptIdentifier generateTypeName(String name) {
return new TypescriptIdentifier(name);
}
+
+ public TypescriptIdentifier generateFieldName(String name) {
+ return new TypescriptIdentifier(name);
+ }
+
+ public TypescriptExpression generateTypeExpression(Type value) {
+ return switch (value) {
+ case ConstructedNativeType _ -> {
+ throw new UnsupportedOperationException("TODO");
+ }
+
+ case ConstructedStructType _ -> {
+ throw new UnsupportedOperationException("TODO");
+ }
+
+ case SimpleType simpleType -> {
+ if (simpleType instanceof SimpleNativeType simpleNativeType) {
+ var nativeTypeConfig = this.config.nativeTypeConfig(simpleNativeType);
+ if (nativeTypeConfig.isPresent()) {
+ yield nativeTypeConfig.get().typeExpression();
+ }
+ }
+
+ yield new TypescriptRef(this.generateTypeName(simpleType.name()));
+ }
+
+ case TypeLevelValueType _ -> {
+ throw new UnsupportedOperationException("TODO");
+ }
+
+ case TypeParam _ -> {
+ throw new UnsupportedOperationException("TODO");
+ }
+ };
+ }
}
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 6a93eea..f49edda 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
@@ -1,11 +1,27 @@
package org.zwobble.hobgoblin.compiler.output.generators.typescript;
+import org.zwobble.hobgoblin.compiler.builtins.NativeTypes;
+import org.zwobble.hobgoblin.compiler.output.lang.typescript.TypescriptTypes;
+import org.zwobble.hobgoblin.compiler.types.SimpleNativeType;
import org.zwobble.json5.reader.Json5ObjectReader;
-public record TypescriptGeneratorConfig() {
+import java.util.Map;
+import java.util.Optional;
+
+public record TypescriptGeneratorConfig(
+ Map<SimpleNativeType, TypescriptNativeTypeConfig> nativeTypeConfigs
+) {
public static TypescriptGeneratorConfig parseLangsConfig(Json5ObjectReader langsJson) {
var output = langsJson.getObjectOrNone("typescript");
- return new TypescriptGeneratorConfig();
+ return new TypescriptGeneratorConfig(DEFAULT_NATIVE_TYPE_CONFIGS);
+ }
+
+ private static final Map<SimpleNativeType, TypescriptNativeTypeConfig> DEFAULT_NATIVE_TYPE_CONFIGS = Map.ofEntries(
+ Map.entry(NativeTypes.INT_32, new TypescriptNativeTypeConfig(TypescriptTypes.NUMBER))
+ );
+
+ public Optional<TypescriptNativeTypeConfig> nativeTypeConfig(SimpleNativeType type) {
+ return Optional.ofNullable(this.nativeTypeConfigs.get(type));
}
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptNativeTypeConfig.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptNativeTypeConfig.java
new file mode 100644
index 0000000..35b72f9
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/typescript/TypescriptNativeTypeConfig.java
@@ -0,0 +1,6 @@
+package org.zwobble.hobgoblin.compiler.output.generators.typescript;
+
+import org.zwobble.hobgoblin.compiler.output.lang.typescript.ast.TypescriptExpression;
+
+public record TypescriptNativeTypeConfig(TypescriptExpression typeExpression) {
+}
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
new file mode 100644
index 0000000..308a297
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/lang/typescript/TypescriptTypes.java
@@ -0,0 +1,11 @@
+package org.zwobble.hobgoblin.compiler.output.lang.typescript;
+
+import org.zwobble.hobgoblin.compiler.output.lang.typescript.ast.TypescriptIdentifier;
+import org.zwobble.hobgoblin.compiler.output.lang.typescript.ast.TypescriptRef;
+
+public class TypescriptTypes {
+ private TypescriptTypes() {
+ }
+
+ public static final TypescriptRef NUMBER = new TypescriptRef(TypescriptIdentifier.of("number"));
+}