Skip to content

Commit 5ae4f1a

Browse files
committed
feat(mps-model-adapters): migrate MPSModelAsNode
1 parent 039379e commit 5ae4f1a

File tree

1 file changed

+56
-62
lines changed

1 file changed

+56
-62
lines changed

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

Lines changed: 56 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -13,44 +13,57 @@
1313
*/
1414
package org.modelix.model.mpsadapters
1515

16+
import jetbrains.mps.extapi.model.SModelDescriptorStub
17+
import jetbrains.mps.smodel.ModelImports
18+
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory
1619
import org.jetbrains.mps.openapi.model.SModel
1720
import org.modelix.model.api.BuiltinLanguages
1821
import org.modelix.model.api.IChildLink
1922
import org.modelix.model.api.IConcept
20-
import org.modelix.model.api.IConceptReference
21-
import org.modelix.model.api.IDeprecatedNodeDefaults
2223
import org.modelix.model.api.INode
2324
import org.modelix.model.api.INodeReference
2425
import org.modelix.model.api.IProperty
25-
import org.modelix.model.api.IReferenceLink
2626
import org.modelix.model.api.NodeReference
2727
import org.modelix.model.api.NullChildLink
2828
import org.modelix.model.area.IArea
29-
import org.modelix.model.data.NodeData
3029

31-
data class MPSModelAsNode(val model: SModel) : IDeprecatedNodeDefaults {
30+
data class MPSModelAsNode(val model: SModel) : IDefaultNodeAdapter {
31+
3232
override fun getArea(): IArea {
3333
return MPSArea(model.repository)
3434
}
3535

36-
override val isValid: Boolean
37-
get() = TODO("Not yet implemented")
3836
override val reference: INodeReference
3937
get() = NodeReference("mps-model:" + model.reference.toString())
4038
override val concept: IConcept
41-
get() = RepositoryLanguage.Model
39+
get() = BuiltinLanguages.MPSRepositoryConcepts.Model
4240
override val parent: INode
4341
get() = MPSModuleAsNode(model.module)
4442

45-
override fun getConceptReference(): IConceptReference {
46-
return concept.getReference()
47-
}
48-
4943
override val allChildren: Iterable<INode>
50-
get() = model.rootNodes.map { MPSNode(it) }
44+
get() {
45+
val childLinks = listOf(
46+
BuiltinLanguages.MPSRepositoryConcepts.Model.rootNodes,
47+
BuiltinLanguages.MPSRepositoryConcepts.Model.modelImports,
48+
BuiltinLanguages.MPSRepositoryConcepts.Model.usedLanguages,
49+
)
50+
return childLinks.flatMap { getChildren(it) }
51+
}
5152

5253
override fun removeChild(child: INode) {
53-
TODO("Not yet implemented")
54+
val link = child.getContainmentLink() ?: throw RuntimeException("ContainmentLink not found for node $child")
55+
if (link.conformsTo(BuiltinLanguages.MPSRepositoryConcepts.Model.usedLanguages)) {
56+
removeUsedLanguage(child)
57+
}
58+
super.removeChild(child)
59+
}
60+
61+
private fun removeUsedLanguage(languageNode: INode) {
62+
check(model is SModelDescriptorStub) { "Model '$model' is not a SModelDescriptor." }
63+
check(languageNode is MPSSingleLanguageDependencyAsNode) { "Node $languageNode to be removed is not a single language dependency." }
64+
65+
val languageToRemove = MetaAdapterFactory.getLanguage(languageNode.moduleReference)
66+
model.deleteLanguageId(languageToRemove)
5467
}
5568

5669
override fun getContainmentLink(): IChildLink {
@@ -60,68 +73,49 @@ data class MPSModelAsNode(val model: SModel) : IDeprecatedNodeDefaults {
6073
override fun getChildren(link: IChildLink): Iterable<INode> {
6174
return if (link is NullChildLink) {
6275
emptyList()
63-
} else if (link.getUID().endsWith(BuiltinLanguages.MPSRepositoryConcepts.Model.rootNodes.getUID()) ||
64-
link.getUID().contains("rootNodes") ||
65-
link.getSimpleName() == "rootNodes"
66-
) {
76+
} else if (link.conformsTo(BuiltinLanguages.MPSRepositoryConcepts.Model.rootNodes)) {
6777
model.rootNodes.map { MPSNode(it) }
78+
} else if (link.conformsTo(BuiltinLanguages.MPSRepositoryConcepts.Model.modelImports)) {
79+
ModelImports(model).importedModels.mapNotNull {
80+
MPSModelImportAsNode(it.resolve(model.repository), model)
81+
}
82+
} else if (link.conformsTo(BuiltinLanguages.MPSRepositoryConcepts.Model.usedLanguages)) {
83+
getImportedLanguagesAndDevKits()
6884
} else {
6985
emptyList()
7086
}
7187
}
7288

73-
override fun moveChild(role: IChildLink, index: Int, child: INode) {
74-
TODO("Not yet implemented")
75-
}
76-
77-
override fun addNewChild(role: IChildLink, index: Int, concept: IConcept?): INode {
78-
TODO("Not yet implemented")
79-
}
80-
81-
override fun addNewChild(role: IChildLink, index: Int, concept: IConceptReference?): INode {
82-
TODO("Not yet implemented")
83-
}
84-
85-
override fun getReferenceTarget(link: IReferenceLink): INode? {
86-
TODO("Not yet implemented")
87-
}
88-
89-
override fun setReferenceTarget(link: IReferenceLink, target: INode?) {
90-
TODO("Not yet implemented")
91-
}
89+
private fun getImportedLanguagesAndDevKits(): List<INode> {
90+
if (model !is SModelDescriptorStub) return emptyList()
9291

93-
override fun setReferenceTarget(role: IReferenceLink, target: INodeReference?) {
94-
TODO("Not yet implemented")
95-
}
96-
97-
override fun getReferenceTargetRef(role: IReferenceLink): INodeReference? {
98-
TODO("Not yet implemented")
92+
val importedLanguagesAndDevKits = mutableListOf<INode>()
93+
importedLanguagesAndDevKits.addAll(
94+
model.importedLanguageIds().filter { it.sourceModuleReference != null }.map {
95+
MPSSingleLanguageDependencyAsNode(
96+
it.sourceModuleReference,
97+
model.getLanguageImportVersion(it),
98+
modelImporter = model,
99+
)
100+
},
101+
)
102+
importedLanguagesAndDevKits.addAll(
103+
model.importedDevkits().map { MPSDevKitDependencyAsNode(it, modelImporter = model) },
104+
)
105+
return importedLanguagesAndDevKits
99106
}
100107

101108
override fun getPropertyValue(property: IProperty): String? {
102-
return if (property.getUID().endsWith(BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name.getUID()) ||
103-
property.getUID().contains("name") ||
104-
property.getSimpleName() == "name"
105-
) {
109+
return if (property.conformsTo(BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name)) {
106110
model.name.value
107-
} else if (property.getSimpleName() == NodeData.idPropertyKey) {
111+
} else if (property.conformsTo(BuiltinLanguages.MPSRepositoryConcepts.Model.id)) {
108112
model.modelId.toString()
113+
} else if (property.isIdProperty()) {
114+
reference.serialize()
115+
} else if (property.conformsTo(BuiltinLanguages.MPSRepositoryConcepts.Model.stereotype)) {
116+
model.name.stereotype
109117
} else {
110118
null
111119
}
112120
}
113-
114-
override fun setPropertyValue(property: IProperty, value: String?) {
115-
if (getPropertyValue(property) != value) {
116-
throw UnsupportedOperationException("Property $property of $concept is read-only")
117-
}
118-
}
119-
120-
override fun getPropertyLinks(): List<IProperty> {
121-
return concept.getAllProperties()
122-
}
123-
124-
override fun getReferenceLinks(): List<IReferenceLink> {
125-
return concept.getAllReferenceLinks()
126-
}
127121
}

0 commit comments

Comments
 (0)