Skip to content

Commit 0497b22

Browse files
authored
Merge pull request #144 from modelix/feature/model-api-gen-ts-refs
fix(model-api-gen): references where not generated for TypeScript
2 parents 5874006 + c5acd7e commit 0497b22

File tree

2 files changed

+60
-6
lines changed

2 files changed

+60
-6
lines changed

model-api-gen/src/main/kotlin/org/modelix/metamodel/generator/TypescriptMMGenerator.kt

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.squareup.kotlinpoet.ClassName
44
import org.modelix.model.data.LanguageData
55
import org.modelix.model.data.Primitive
66
import org.modelix.model.data.PrimitivePropertyType
7+
import java.nio.file.Files
78
import java.nio.file.Path
89
import kotlin.io.path.writeText
910

@@ -25,6 +26,7 @@ class TypescriptMMGenerator(val outputDir: Path, val nameConfig: NameConfig = Na
2526
}
2627

2728
internal fun generate(languages: ProcessedLanguageSet) {
29+
Files.createDirectories(outputDir)
2830
for (language in languages.getLanguages()) {
2931
// TODO delete old files from previous generation
3032
outputDir
@@ -62,7 +64,8 @@ class TypescriptMMGenerator(val outputDir: Path, val nameConfig: NameConfig = Na
6264
INodeJS,
6365
ITypedNode,
6466
SingleChildAccessor,
65-
TypedNode
67+
TypedNode,
68+
LanguageRegistry
6669
} from "@modelix/ts-model-api";
6770
6871
${language.languageDependencies().joinToString("\n") {
@@ -129,9 +132,19 @@ class TypescriptMMGenerator(val outputDir: Path, val nameConfig: NameConfig = Na
129132
}
130133
} else defaultPropertyText
131134
}
132-
is ProcessedReferenceLink -> """
133-
135+
is ProcessedReferenceLink -> {
136+
val typeRef = feature.type.resolved
137+
val languagePrefix = typeRef.languagePrefix(concept.language)
138+
val entityType = "$languagePrefix${typeRef.nodeWrapperInterfaceName()}"
139+
"""
140+
public set ${feature.generatedName}(value: $entityType | undefined) {
141+
this.node.setReferenceTargetNode("${feature.originalName}", value.unwrap());
142+
}
143+
public get ${feature.generatedName}: $entityType | undefined {
144+
return LanguageRegistry.INSTANCE.wrapNode(this.node.getReferenceTargetNode("${feature.originalName}"));
145+
}
134146
""".trimIndent()
147+
}
135148
is ProcessedChildLink -> {
136149
val accessorClassName = if (feature.multiple) "ChildListAccessor" else "SingleChildAccessor"
137150
val typeRef = feature.type.resolved
@@ -167,9 +180,15 @@ class TypescriptMMGenerator(val outputDir: Path, val nameConfig: NameConfig = Na
167180
}
168181
} else defaultPropertyText
169182
}
170-
is ProcessedReferenceLink -> """
171-
172-
""".trimIndent()
183+
is ProcessedReferenceLink -> {
184+
val typeRef = feature.type.resolved
185+
val languagePrefix = typeRef.languagePrefix(concept.language)
186+
val entityType = "$languagePrefix${typeRef.nodeWrapperInterfaceName()}"
187+
"""
188+
set ${feature.generatedName}(value: $entityType | undefined);
189+
get ${feature.generatedName}: $entityType | undefined;
190+
""".trimIndent()
191+
}
173192
is ProcessedChildLink -> {
174193
val accessorClassName = if (feature.multiple) "ChildListAccessor" else "SingleChildAccessor"
175194
"""

model-api-gen/src/test/kotlin/org/modelix/metamodel/generator/KotlinGeneratorTest.kt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,41 @@ class KotlinGeneratorTest {
4444
val outputDir = File("build/test-generator-output").toPath()
4545
MetaModelGenerator(outputDir).generate(LanguageSet(listOf(language)).process())
4646
}
47+
@Test
48+
fun test_ts() {
49+
val input = """
50+
name: org.modelix.entities
51+
concepts:
52+
- name: Entity
53+
properties:
54+
- name: name
55+
children:
56+
- name: properties
57+
type: Property
58+
multiple: true
59+
optional: true
60+
- name: Property
61+
children:
62+
- name: type
63+
type: Type
64+
optional: false
65+
- name: Type
66+
- name: EntityType
67+
extends:
68+
- Type
69+
references:
70+
- name: entity
71+
type: Entity
72+
optional: false
73+
enums: []
74+
""".trimIndent()
75+
76+
val language = Yaml.default.decodeFromString<LanguageData>(input)
77+
//val outputDir = File(".").toPath().resolve("build").resolve("test-generator-output")
78+
val outputDir = File("build/test-generator-output").toPath()
79+
TypescriptMMGenerator(outputDir).generate(LanguageSet(listOf(language)).process())
80+
}
81+
4782

4883
@OptIn(ExperimentalPathApi::class)
4984
@Test

0 commit comments

Comments
 (0)