Skip to content

Commit a14f95f

Browse files
authored
Merge pull request #136 from modelix/feature/MODELIX-457_configurable_CN_typealias_names
MODELIX-457: configurable CN_ typealias names
2 parents 354e578 + 21851c4 commit a14f95f

File tree

5 files changed

+64
-4
lines changed

5 files changed

+64
-4
lines changed

docs/global/modules/core/pages/reference/component-model-api-gen-gradle.adoc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,10 @@ Inside the `metamodel` block a `names` block can be declared to configure `prefi
175175
|"\_C_TypedImpl_"
176176
|""
177177

178+
|`conceptTypeAlias`
179+
|"CN_"
180+
|""
181+
178182
|===
179183

180184
== Example

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ class MetaModelGenerator(val outputDir: Path, val nameConfig: NameConfig = NameC
141141
FileSpec.builder(concept.language.name, concept.name)
142142
.addFileComment(headerComment)
143143
.addType(generateConceptObject(concept))
144-
.addTypeAlias(TypeAliasSpec.builder("CN_" + concept.name, concept.conceptWrapperInterfaceType()).build())
144+
.addTypeAlias(TypeAliasSpec.builder(concept.conceptTypeAliasName(), concept.conceptWrapperInterfaceType()).build())
145145
.addType(generateConceptWrapperInterface(concept))
146146
// .addType(generateConceptWrapperImpl(concept))
147147
.addType(generateNodeWrapperInterface(concept))
@@ -641,6 +641,7 @@ class MetaModelGenerator(val outputDir: Path, val nameConfig: NameConfig = NameC
641641
private fun ProcessedConcept.nodeWrapperInterfaceName() = nameConfig.typedNode(name)
642642
private fun ProcessedConcept.nodeWrapperImplName() = nameConfig.typedNodeImpl(name)
643643
private fun ProcessedConcept.conceptObjectName() = nameConfig.untypedConcept(name)
644+
private fun ProcessedConcept.conceptTypeAliasName() = nameConfig.conceptTypeAlias(name)
644645
//private fun ProcessedConcept.conceptWrapperImplName() = nameConfig.conceptWrapperImplName(name)
645646
//private fun ProcessedConcept.conceptWrapperInterfaceName() = nameConfig.conceptWrapperInterfaceName(name)
646647

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,23 @@ package org.modelix.metamodel.generator
33
import java.io.Serializable
44

55
class NameConfig : Serializable {
6-
val languageClass = ConfigurableName(prefix = "L_" ,baseNameConversion = { it.replace(".", "_") })
6+
val languageClass = ConfigurableName(prefix = "L_", baseNameConversion = { it.replace(".", "_") })
77
val typedNode = ConfigurableName(prefix = "N_")
88
val typedNodeImpl = ConfigurableName(prefix = "_N_TypedImpl_")
99
val untypedConcept = ConfigurableName(prefix = "_C_UntypedImpl_")
1010
val typedConcept = ConfigurableName(prefix = "C_")
1111
val typedConceptImpl = ConfigurableName(prefix = "_C_TypedImpl_")
12+
val conceptTypeAlias = ConfigurableName(prefix = "CN_")
1213
}
1314

14-
private val UNMODIFED_SIMPLE_NAME: (String) -> String = {
15+
private val UNMODIFIED_SIMPLE_NAME: (String) -> String = {
1516
require(!it.contains(".")) { "Simple name expected, but full-qualified name provided: $it" }
1617
it
1718
}
1819
class ConfigurableName(
1920
var prefix: String = "",
2021
var suffix: String = "",
21-
var baseNameConversion: (String) -> String = UNMODIFED_SIMPLE_NAME
22+
var baseNameConversion: (String) -> String = UNMODIFIED_SIMPLE_NAME
2223
) : Serializable {
2324
operator fun invoke(baseName: String): String {
2425
return prefix + baseNameConversion(baseName) + suffix

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import kotlinx.serialization.decodeFromString
55
import org.junit.Test
66
import org.modelix.model.data.LanguageData
77
import java.io.File
8+
import kotlin.io.path.*
9+
import kotlin.test.assertContains
810

911
class KotlinGeneratorTest {
1012

@@ -43,4 +45,46 @@ class KotlinGeneratorTest {
4345
MetaModelGenerator(outputDir).generate(LanguageSet(listOf(language)).process())
4446
}
4547

48+
@OptIn(ExperimentalPathApi::class)
49+
@Test
50+
fun `uses configured names`() {
51+
val input = """
52+
name: org.modelix.entities
53+
concepts:
54+
- name: Entity
55+
properties: []
56+
children: []
57+
enums: []
58+
""".trimIndent()
59+
60+
val language = Yaml.default.decodeFromString<LanguageData>(input)
61+
val outputDir = createTempDirectory()
62+
try {
63+
val nameConfig = NameConfig().apply {
64+
conceptTypeAlias.prefix = "AAAA"
65+
languageClass.prefix = "BBBB"
66+
typedNode.prefix = "CCCC"
67+
typedNodeImpl.prefix = "DDDD"
68+
untypedConcept.prefix = "EEEE"
69+
typedConcept.prefix = "FFFF"
70+
}
71+
72+
MetaModelGenerator(outputDir, nameConfig).generate(LanguageSet(listOf(language)).process())
73+
74+
val fileContents = outputDir.resolve("org/modelix/entities/Entity.kt").readText()
75+
setOf(
76+
nameConfig.conceptTypeAlias.prefix,
77+
nameConfig.languageClass.prefix,
78+
nameConfig.typedNode.prefix,
79+
nameConfig.typedNodeImpl.prefix,
80+
nameConfig.untypedConcept.prefix,
81+
nameConfig.typedConcept.prefix,
82+
).forEach { needle ->
83+
assertContains(fileContents, needle)
84+
}
85+
} finally {
86+
outputDir.deleteRecursively()
87+
}
88+
}
89+
4690
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,16 @@ class NameConfigTest {
2727
assertEquals("PREorg_example_MyLanguageSUF", nameConfig.languageClass(input))
2828
}
2929

30+
@Test
31+
fun `Concept type alias`() {
32+
val input = "MyConcept"
33+
val nameConfig = NameConfig().apply {
34+
conceptTypeAlias.prefix = "PRE"
35+
conceptTypeAlias.suffix = "SUF"
36+
}
37+
assertEquals("PREMyConceptSUF", nameConfig.conceptTypeAlias(input))
38+
}
39+
3040
@Test
3141
fun `ConfigurableName - simple`() {
3242
val input = "MyInterface"

0 commit comments

Comments
 (0)