From 38e1ac12e37efa391d3afb2b366cc334a1677ff2 Mon Sep 17 00:00:00 2001 From: Bastian Kruck Date: Tue, 19 Aug 2025 17:37:14 +0200 Subject: [PATCH] feat(metamodel-export): serialize annotations on concept nodes into the metamodel json --- .../metamodel/export/MPSMetaModelExporter.kt | 11 +++++++ .../metamodel/export/MPSModelExporter.kt | 30 ++++++++++--------- .../org/modelix/model/data/MetaModelData.kt | 1 + 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/metamodel-export/src/main/kotlin/org/modelix/metamodel/export/MPSMetaModelExporter.kt b/metamodel-export/src/main/kotlin/org/modelix/metamodel/export/MPSMetaModelExporter.kt index 42db0305dd..8db9da2fd7 100644 --- a/metamodel-export/src/main/kotlin/org/modelix/metamodel/export/MPSMetaModelExporter.kt +++ b/metamodel-export/src/main/kotlin/org/modelix/metamodel/export/MPSMetaModelExporter.kt @@ -113,6 +113,9 @@ class MPSMetaModelExporter(private val outputFolder: File) { } fqName(it) } + val smodelAttributes = SNodeOperations + .getChildren(concept, LINKS.smodelAttribute) + .map(MPSModelExporter::exportNode) val metaProperties: MutableMap = HashMap() if (SPropertyOperations.getString(concept, PROPS.conceptAlias) != null) { metaProperties[ConceptData.ALIAS_KEY] = @@ -127,6 +130,7 @@ class MPSMetaModelExporter(private val outputFolder: File) { referenceLinks, superConcepts, deprecationMsg(concept), + smodelAttributes, metaProperties, ) } @@ -295,6 +299,13 @@ class MPSMetaModelExporter(private val outputFolder: File) { 0xeeb344f63fe016cL, "defaultMember", ) + val smodelAttribute: SContainmentLink = MetaAdapterFactory.getContainmentLink( + -0x3154ae6ada15b0deL, + -0x646defc46a3573f4L, + 0x10802efe25aL, + 0x47bf8397520e5942L, + "smodelAttribute", + ) } private object PROPS { diff --git a/metamodel-export/src/main/kotlin/org/modelix/metamodel/export/MPSModelExporter.kt b/metamodel-export/src/main/kotlin/org/modelix/metamodel/export/MPSModelExporter.kt index 5a874624a6..df63ddc7ef 100644 --- a/metamodel-export/src/main/kotlin/org/modelix/metamodel/export/MPSModelExporter.kt +++ b/metamodel-export/src/main/kotlin/org/modelix/metamodel/export/MPSModelExporter.kt @@ -95,21 +95,23 @@ class MPSModelExporter(private val outputFolder: File) { return data } - private fun exportNode(node: SNode): NodeData { - val id: String = node.reference.toString() - val concept: String = "mps:" + MetaIdHelper.getConcept(SNodeOperations.getConcept(node)).serialize() - val role = node.containmentLink?.name ?: "rootNodes" - val children: List = SNodeOperations.getChildren(node).map { exportNode(it) } - val properties: MutableMap = LinkedHashMap() - val references: MutableMap = LinkedHashMap() - properties["#mpsNodeId#"] = node.nodeId.toString() - for (property: SProperty in node.properties) { - properties[property.name] = node.getProperty(property) ?: continue - } - for (reference: SReference in node.references) { - references[reference.link.name] = reference.targetNodeReference.toString() + companion object { + fun exportNode(node: SNode): NodeData { + val id: String = node.reference.toString() + val concept: String = "mps:" + MetaIdHelper.getConcept(SNodeOperations.getConcept(node)).serialize() + val role = node.containmentLink?.name ?: "rootNodes" + val children: List = SNodeOperations.getChildren(node).map { exportNode(it) } + val properties: MutableMap = LinkedHashMap() + val references: MutableMap = LinkedHashMap() + properties["#mpsNodeId#"] = node.nodeId.toString() + for (property: SProperty in node.properties) { + properties[property.name] = node.getProperty(property) ?: continue + } + for (reference: SReference in node.references) { + references[reference.link.name] = reference.targetNodeReference.toString() + } + return NodeData(id, concept, role, children, properties, references) } - return NodeData(id, concept, role, children, properties, references) } private object CONCEPTS { diff --git a/model-api/src/commonMain/kotlin/org/modelix/model/data/MetaModelData.kt b/model-api/src/commonMain/kotlin/org/modelix/model/data/MetaModelData.kt index df4a11a140..21077dce9f 100644 --- a/model-api/src/commonMain/kotlin/org/modelix/model/data/MetaModelData.kt +++ b/model-api/src/commonMain/kotlin/org/modelix/model/data/MetaModelData.kt @@ -43,6 +43,7 @@ data class ConceptData( val references: List = emptyList(), val extends: List = emptyList(), override val deprecationMessage: String? = null, + val smodelAttributes: List = emptyList(), val metaProperties: MutableMap = mutableMapOf(), ) : IDeprecatable { companion object {