@@ -81,8 +81,8 @@ class MetaModelGenerator(val outputDir: Path) {
81
81
builder.superclass(GeneratedLanguage ::class )
82
82
builder.addSuperclassConstructorParameter(" \" ${language.name} \" " )
83
83
for (concept in language.getConceptsInLanguage()) {
84
- builder.addProperty(PropertySpec .builder(concept.simpleName, concept.conceptObjectType ())
85
- .initializer(" %T" , concept.conceptObjectType ())
84
+ builder.addProperty(PropertySpec .builder(concept.simpleName, concept.conceptWrapperInterfaceType ())
85
+ .initializer(" %T" , concept.conceptWrapperInterfaceClass ())
86
86
.build())
87
87
}
88
88
return builder.build()
@@ -92,6 +92,7 @@ class MetaModelGenerator(val outputDir: Path) {
92
92
FileSpec .builder(concept.language.name, concept.concept.name)
93
93
.addFileComment(headerComment)
94
94
.addType(generateConceptObject(concept))
95
+ .addTypeAlias(TypeAliasSpec .builder(" CN_" + concept.simpleName, concept.conceptWrapperInterfaceType()).build())
95
96
.addType(generateConceptWrapperInterface(concept))
96
97
// .addType(generateConceptWrapperImpl(concept))
97
98
.addType(generateNodeWrapperInterface(concept))
@@ -151,7 +152,7 @@ class MetaModelGenerator(val outputDir: Path) {
151
152
.build())
152
153
addFunction(FunSpec .builder(GeneratedConcept <* , * >::typed.name)
153
154
.addModifiers(KModifier .OVERRIDE )
154
- .addStatement(""" return %T""" , concept.conceptWrapperInterfaceType ())
155
+ .addStatement(""" return %T""" , concept.conceptWrapperInterfaceClass ())
155
156
.build())
156
157
addProperty(PropertySpec .builder(IConcept ::language.name, ILanguage ::class , KModifier .OVERRIDE )
157
158
.initializer(concept.language.generatedClassName().simpleName)
@@ -219,10 +220,12 @@ class MetaModelGenerator(val outputDir: Path) {
219
220
}
220
221
221
222
private fun generateConceptWrapperInterface (concept : LanguageSet .ConceptInLanguage ): TypeSpec {
222
- return TypeSpec .interfaceBuilder(concept.conceptWrapperInterfaceType()).apply {
223
- addSuperinterface(ITypedConcept ::class )
223
+ return TypeSpec .interfaceBuilder(concept.conceptWrapperInterfaceClass()).apply {
224
+ val nodeT = TypeVariableName (" NodeT" , ITypedNode ::class , variance = KModifier .OUT )
225
+ addTypeVariable(nodeT)
226
+ addSuperinterface(IConceptOfTypedNode ::class .asTypeName().parameterizedBy(nodeT))
224
227
for (extended in concept.extended()) {
225
- addSuperinterface(extended.conceptWrapperInterfaceType( ))
228
+ addSuperinterface(extended.conceptWrapperInterfaceClass().parameterizedBy(nodeT ))
226
229
}
227
230
for (feature in concept.directFeatures()) {
228
231
when (val data = feature.data) {
@@ -260,7 +263,7 @@ class MetaModelGenerator(val outputDir: Path) {
260
263
return TypeSpec .classBuilder(concept.nodeWrapperImplType()).apply {
261
264
addModifiers(KModifier .OPEN )
262
265
addProperty(PropertySpec .builder(TypedNodeImpl ::_concept .name, concept.conceptWrapperInterfaceType(), KModifier .OVERRIDE )
263
- .getter(FunSpec .getterBuilder().addStatement(""" return %T""" , concept.conceptWrapperInterfaceType ()).build())
266
+ .getter(FunSpec .getterBuilder().addStatement(""" return %T""" , concept.conceptWrapperInterfaceClass ()).build())
264
267
.build())
265
268
266
269
if (concept.extends().size > 1 ) {
@@ -404,7 +407,8 @@ fun PropertyType.asKotlinType(): TypeName {
404
407
}
405
408
fun String.parseClassName () = ClassName (substringBeforeLast(" ." ), substringAfterLast(" ." ))
406
409
// fun ConceptRef.conceptWrapperImplType() = ClassName(languageName, conceptName.conceptWrapperImplName())
407
- fun ConceptRef.conceptWrapperInterfaceType () = ClassName (languageName, conceptName.conceptWrapperInterfaceName())
410
+ fun ConceptRef.conceptWrapperInterfaceType () = conceptWrapperInterfaceClass().parameterizedBy(nodeWrapperInterfaceType())
411
+ fun ConceptRef.conceptWrapperInterfaceClass () = ClassName (languageName, conceptName.conceptWrapperInterfaceName())
408
412
fun ConceptRef.nodeWrapperImplType () = ClassName (languageName, conceptName.nodeWrapperImplName())
409
413
fun ConceptRef.nodeWrapperInterfaceType () = ClassName (languageName, conceptName.nodeWrapperInterfaceName())
410
414
@@ -436,7 +440,8 @@ fun LanguageSet.ConceptInLanguage.nodeWrapperImplName() = concept.nodeWrapperImp
436
440
fun LanguageSet.ConceptInLanguage.nodeWrapperImplType () = ClassName (language.name, concept.nodeWrapperImplName())
437
441
fun LanguageSet.ConceptInLanguage.nodeWrapperInterfaceType () = ClassName (language.name, concept.nodeWrapperInterfaceName())
438
442
// fun LanguageSet.ConceptInLanguage.conceptWrapperImplType() = ClassName(language.name, concept.conceptWrapperImplName())
439
- fun LanguageSet.ConceptInLanguage.conceptWrapperInterfaceType () = ClassName (language.name, concept.conceptWrapperInterfaceName())
443
+ fun LanguageSet.ConceptInLanguage.conceptWrapperInterfaceType () = ref().conceptWrapperInterfaceType()
444
+ fun LanguageSet.ConceptInLanguage.conceptWrapperInterfaceClass () = ref().conceptWrapperInterfaceClass()
440
445
441
446
fun FeatureInConcept.kotlinRef () = CodeBlock .of(" %T.%N" , concept.conceptObjectType(), validName)
442
447
fun FeatureInConcept.returnKotlinRef () = CodeBlock .of(" return %T.%N" , concept.conceptObjectType(), validName)
0 commit comments