Skip to content

Commit a570fb1

Browse files
committed
feat(model-api-gen): default concepts for setChild and addChild
If the child concept is not abstract it will be used as the default.
1 parent c020358 commit a570fb1

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

model-api-gen-gradle-test/kotlin-generation/src/test/kotlin/org/modelix/modelql/typed/TypedModelQLTest.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ import jetbrains.mps.baseLanguage.C_StaticMethodDeclaration
2626
import jetbrains.mps.baseLanguage.C_VariableReference
2727
import jetbrains.mps.baseLanguage.ClassConcept
2828
import jetbrains.mps.baseLanguage.StaticMethodDeclaration
29+
import jetbrains.mps.core.xml.C_XmlComment
30+
import jetbrains.mps.core.xml.C_XmlCommentLine
31+
import jetbrains.mps.core.xml.C_XmlDocument
32+
import jetbrains.mps.core.xml.C_XmlFile
2933
import jetbrains.mps.lang.editor.imageGen.C_ImageGenerator
3034
import jetbrains.mps.lang.editor.imageGen.ImageGenerator
3135
import org.modelix.apigen.test.ApigenTestLanguages
@@ -131,6 +135,12 @@ class TypedModelQLTest {
131135
rootNode.addNewChild("imageGen", -1, C_ImageGenerator.untyped())
132136
.typed<ImageGenerator>()
133137
.apply { node = cls1 }
138+
139+
// Example for single non-abstract child
140+
rootNode.addNewChild("xmlFile", -1, C_XmlFile.untyped())
141+
142+
// Example for mulitple non-abstract child
143+
rootNode.addNewChild("xmlComment", -1, C_XmlComment.untyped())
134144
}
135145
}
136146

@@ -370,4 +380,22 @@ class TypedModelQLTest {
370380
assertNotNull(actual)
371381
assertTrue(actual.instanceOf(C_MinusExpression))
372382
}
383+
384+
@Test
385+
fun `set child - default concept`() = runTest { httpClient ->
386+
val client = ModelQLClient.builder().url("http://localhost/query").httpClient(httpClient).build()
387+
client.query { root ->
388+
root.descendants().ofConcept(C_XmlFile)
389+
.first()
390+
.setDocument()
391+
}
392+
393+
val actual = client.query { root ->
394+
root.descendants().ofConcept(C_XmlFile)
395+
.first()
396+
.document
397+
}
398+
399+
assertTrue { actual.instanceOf(C_XmlDocument) }
400+
}
373401
}

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -466,12 +466,18 @@ class MetaModelGenerator(
466466
)
467467
val returnType = IMonoStep::class.asTypeName().parameterizedBy(targetType)
468468
val receiverType = IMonoStep::class.asTypeName().parameterizedBy(concept.nodeWrapperInterfaceType())
469+
val conceptParameter = ParameterSpec.builder("concept", ITypedConcept::class.asTypeName()).apply {
470+
if (!feature.type.resolved.abstract) {
471+
defaultValue("%T", feature.type.resolved.conceptWrapperInterfaceClass())
472+
}
473+
}.build()
474+
469475
if (feature.multiple) {
470476
addFunction(
471477
FunSpec.builder(feature.adderMethodName())
472478
.returns(returnType)
473479
.receiver(receiverType)
474-
.addParameter("concept", ITypedConcept::class.asTypeName())
480+
.addParameter(conceptParameter)
475481
.addParameter(
476482
ParameterSpec.builder("index", Int::class.asTypeName())
477483
.defaultValue("-1")
@@ -490,7 +496,7 @@ class MetaModelGenerator(
490496
FunSpec.builder(feature.setterName())
491497
.returns(returnType)
492498
.receiver(receiverType)
493-
.addParameter("concept", ITypedConcept::class.asTypeName())
499+
.addParameter(conceptParameter)
494500
.addStatement(
495501
"return %T.setChild(this, %T.%N, concept)",
496502
TypedModelQL::class.asTypeName(),

0 commit comments

Comments
 (0)