Skip to content

Commit 1c12fbe

Browse files
committed
fix(mps-sync-plugin): model imports of target models not part of the synchronization
1 parent f3b7194 commit 1c12fbe

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters/MPSModelAsNode.kt

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import org.jetbrains.mps.openapi.model.EditableSModel
1111
import org.jetbrains.mps.openapi.model.SModel
1212
import org.jetbrains.mps.openapi.model.SModelId
1313
import org.jetbrains.mps.openapi.model.SModelName
14+
import org.jetbrains.mps.openapi.model.SModelReference
1415
import org.jetbrains.mps.openapi.module.SModuleId
1516
import org.jetbrains.mps.openapi.module.SRepository
1617
import org.jetbrains.mps.openapi.persistence.PersistenceFacade
@@ -19,9 +20,11 @@ import org.modelix.model.api.IChildLinkReference
1920
import org.modelix.model.api.IConcept
2021
import org.modelix.model.api.INodeReference
2122
import org.modelix.model.api.IPropertyReference
23+
import org.modelix.model.api.IReadableNode
2224
import org.modelix.model.api.IReferenceLinkReference
2325
import org.modelix.model.api.IWritableNode
2426
import org.modelix.model.data.asData
27+
import org.modelix.mps.multiplatform.model.MPSModelReference
2528

2629
data class MPSModelAsNode(val model: SModel) : MPSGenericNodeAdapter<SModel>() {
2730

@@ -82,10 +85,24 @@ data class MPSModelAsNode(val model: SModel) : MPSGenericNodeAdapter<SModel>() {
8285
sourceNode: SpecWithResolvedConcept,
8386
): IWritableNode {
8487
require(sourceNode.getConceptReference() == BuiltinLanguages.MPSRepositoryConcepts.ModelReference.getReference())
88+
val modelRef = getTargetModelRef(sourceNode.getNode())
89+
ModelImports(element).addModelImport(modelRef)
90+
return MPSModelImportAsNode(modelRef, element)
91+
}
8592

86-
val importedModel = checkNotNull(sourceNode.getNode().getReferenceTarget(BuiltinLanguages.MPSRepositoryConcepts.ModelReference.model.toReference())) {
87-
"Model reference not set: ${sourceNode.getNode().asLegacyNode().asData().toJson()}"
93+
private fun getTargetModelRef(modelReferenceNode: IReadableNode): SModelReference {
94+
val importedModel = modelReferenceNode.getReferenceTarget(BuiltinLanguages.MPSRepositoryConcepts.ModelReference.model.toReference())
95+
96+
if (importedModel == null) {
97+
val targetId = checkNotNull(modelReferenceNode.getReferenceTargetRef(BuiltinLanguages.MPSRepositoryConcepts.ModelReference.model.toReference())) {
98+
"Model reference not set: ${modelReferenceNode.asLegacyNode().asData().toJson()}"
99+
}
100+
val refFromId = checkNotNull(MPSModelReference.tryConvert(targetId)) {
101+
"Target model not resolvable and also has no MPS compatible ID: ${modelReferenceNode.asLegacyNode().asData().toJson()}"
102+
}
103+
return refFromId.toMPS()
88104
}
105+
89106
val modelId = checkNotNull(importedModel.getPropertyValue(BuiltinLanguages.MPSRepositoryConcepts.Model.id.toReference())) {
90107
"Target model has no ID: $importedModel"
91108
}
@@ -101,8 +118,7 @@ data class MPSModelAsNode(val model: SModel) : MPSGenericNodeAdapter<SModel>() {
101118
smodelId,
102119
modelName,
103120
)
104-
ModelImports(element).addModelImport(modelRef)
105-
return MPSModelImportAsNode(modelRef, element)
121+
return modelRef
106122
}
107123

108124
override fun remove(

0 commit comments

Comments
 (0)