Skip to content

Commit d29aa82

Browse files
authored
Merge pull request #267 from modelix/typescript-gen-identation
fix(model-api-gen): indentation in generated TypeScript files
2 parents 9b7de09 + 9080f16 commit d29aa82

File tree

1 file changed

+41
-23
lines changed

1 file changed

+41
-23
lines changed

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

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -31,27 +31,44 @@ class TypescriptMMGenerator(val outputDir: Path, val nameConfig: NameConfig = Na
3131
// TODO delete old files from previous generation
3232
outputDir
3333
.resolve(language.generatedClassName().simpleName + ".ts")
34-
.writeText(generateLanguage(language))
34+
.fixFormatAndWriteText(generateLanguage(language))
3535

3636
generateRegistry(languages)
3737
}
3838
}
3939

40+
private fun fixFormat(input: CharSequence): CharSequence {
41+
val result = StringBuffer(input.length)
42+
var indentLevel = 0
43+
for (line in input.lineSequence()) {
44+
val trimmed = line.trimStart()
45+
if (trimmed.isEmpty()) continue
46+
repeat(indentLevel - (if (trimmed.startsWith("}")) 1 else 0)) {
47+
result.append(" ")
48+
}
49+
result.appendLine(trimmed)
50+
indentLevel += line.count { it == '{' } - line.count { it == '}' }
51+
}
52+
return result
53+
}
54+
55+
private fun Path.fixFormatAndWriteText(text: String) = writeText(fixFormat(text))
56+
4057
private fun generateRegistry(languages: ProcessedLanguageSet) {
41-
outputDir.resolve("index.ts").writeText(
58+
outputDir.resolve("index.ts").fixFormatAndWriteText(
4259
"""
4360
import { LanguageRegistry } from "@modelix/ts-model-api";
4461
${languages.getLanguages().joinToString("\n") { """
4562
import { ${it.simpleClassName()} } from "./${it.simpleClassName()}";
46-
""".trimIndent()
63+
"""
4764
}}
4865
export function registerLanguages() {
4966
${languages.getLanguages().joinToString("\n") { """
5067
LanguageRegistry.INSTANCE.register(${it.simpleClassName()}.INSTANCE);
51-
""".trimIndent()
68+
"""
5269
}}
5370
}
54-
""".trimIndent(),
71+
""",
5572
)
5673
}
5774

@@ -84,7 +101,7 @@ class TypescriptMMGenerator(val outputDir: Path, val nameConfig: NameConfig = Na
84101
${language.getConcepts().joinToString("\n") { concept ->
85102
"""
86103
this.nodeWrappers.set("${concept.uid}", (node: INodeJS) => new ${concept.nodeWrapperImplName()}(node))
87-
""".trimIndent()
104+
"""
88105
}}
89106
}
90107
public getConcepts() {
@@ -93,7 +110,7 @@ class TypescriptMMGenerator(val outputDir: Path, val nameConfig: NameConfig = Na
93110
}
94111
95112
${language.getConcepts().joinToString("\n") { generateConcept(it) }.replaceIndent(" ")}
96-
""".trimIndent()
113+
"""
97114
}
98115

99116
private fun generateConcept(concept: ProcessedConcept): String {
@@ -108,7 +125,7 @@ class TypescriptMMGenerator(val outputDir: Path, val nameConfig: NameConfig = Na
108125
public get $rawValueName(): string | undefined {
109126
return this._node.getPropertyValue("${feature.originalName}")
110127
}
111-
""".trimIndent()
128+
"""
112129
val typedPropertyText = if (feature.type is PrimitivePropertyType) {
113130
when ((feature.type as PrimitivePropertyType).primitive) {
114131
Primitive.INT -> {
@@ -121,7 +138,7 @@ class TypescriptMMGenerator(val outputDir: Path, val nameConfig: NameConfig = Na
121138
return str ? parseInt(str) : 0;
122139
}
123140
124-
""".trimIndent()
141+
"""
125142
}
126143
Primitive.BOOLEAN -> {
127144
"""
@@ -132,25 +149,26 @@ class TypescriptMMGenerator(val outputDir: Path, val nameConfig: NameConfig = Na
132149
return this.$rawValueName === "true";
133150
}
134151
135-
""".trimIndent()
152+
"""
136153
}
137-
Primitive.STRING -> """
154+
Primitive.STRING ->
155+
"""
138156
public set ${feature.generatedName}(value: string) {
139157
this.$rawValueName = value;
140158
}
141159
public get ${feature.generatedName}(): string {
142160
return this.$rawValueName ?? "";
143161
}
144162
145-
""".trimIndent()
163+
"""
146164
}
147165
} else {
148166
""
149167
}
150168
"""
151169
$rawPropertyText
152170
$typedPropertyText
153-
""".trimIndent()
171+
"""
154172
}
155173
is ProcessedReferenceLink -> {
156174
val typeRef = feature.type.resolved
@@ -164,15 +182,15 @@ class TypescriptMMGenerator(val outputDir: Path, val nameConfig: NameConfig = Na
164182
let target = this._node.getReferenceTargetNode("${feature.originalName}");
165183
return target ? LanguageRegistry.INSTANCE.wrapNode(target) as $entityType : undefined;
166184
}
167-
""".trimIndent()
185+
"""
168186
}
169187
is ProcessedChildLink -> {
170188
val accessorClassName = if (feature.multiple) "ChildListAccessor" else "SingleChildAccessor"
171189
val typeRef = feature.type.resolved
172190
val languagePrefix = typeRef.languagePrefix(concept.language)
173191
"""
174192
public ${feature.generatedName}: $accessorClassName<$languagePrefix${typeRef.nodeWrapperInterfaceName()}> = new $accessorClassName(this._node, "${feature.originalName}")
175-
""".trimIndent()
193+
"""
176194
}
177195
else -> ""
178196
}
@@ -182,26 +200,26 @@ class TypescriptMMGenerator(val outputDir: Path, val nameConfig: NameConfig = Na
182200
is ProcessedProperty -> {
183201
val rawPropertyText = """
184202
${feature.rawValueName()}: string | undefined
185-
""".trimIndent()
203+
"""
186204
val typedPropertyText = if (feature.type is PrimitivePropertyType) {
187205
when ((feature.type as PrimitivePropertyType).primitive) {
188206
Primitive.BOOLEAN -> {
189207
"""
190208
${feature.generatedName}: boolean
191209
192-
""".trimIndent()
210+
"""
193211
}
194212
Primitive.INT -> {
195213
"""
196214
${feature.generatedName}: number
197215
198-
""".trimIndent()
216+
"""
199217
}
200218
Primitive.STRING -> {
201219
"""
202220
${feature.generatedName}: string
203221
204-
""".trimIndent()
222+
"""
205223
}
206224
}
207225
} else {
@@ -210,7 +228,7 @@ class TypescriptMMGenerator(val outputDir: Path, val nameConfig: NameConfig = Na
210228
"""
211229
$rawPropertyText
212230
$typedPropertyText
213-
""".trimIndent()
231+
"""
214232
}
215233
is ProcessedReferenceLink -> {
216234
val typeRef = feature.type.resolved
@@ -219,13 +237,13 @@ class TypescriptMMGenerator(val outputDir: Path, val nameConfig: NameConfig = Na
219237
"""
220238
set ${feature.generatedName}(value: $entityType | undefined);
221239
get ${feature.generatedName}(): $entityType | undefined;
222-
""".trimIndent()
240+
"""
223241
}
224242
is ProcessedChildLink -> {
225243
val accessorClassName = if (feature.multiple) "ChildListAccessor" else "SingleChildAccessor"
226244
"""
227245
${feature.generatedName}: $accessorClassName<${feature.type.resolved.tsInterfaceRef(concept.language)}>
228-
""".trimIndent()
246+
"""
229247
}
230248
else -> ""
231249
}
@@ -259,7 +277,7 @@ class TypescriptMMGenerator(val outputDir: Path, val nameConfig: NameConfig = Na
259277
${featuresImpl.replaceIndent(" ")}
260278
}
261279
262-
""".trimIndent()
280+
"""
263281
}
264282

265283
private fun ProcessedConcept.nodeWrapperInterfaceName() =

0 commit comments

Comments
 (0)