13
13
*/
14
14
package org.modelix.model.mpsadapters
15
15
16
+ import jetbrains.mps.extapi.model.SModelDescriptorStub
17
+ import jetbrains.mps.smodel.ModelImports
18
+ import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory
16
19
import org.jetbrains.mps.openapi.model.SModel
17
20
import org.modelix.model.api.BuiltinLanguages
18
21
import org.modelix.model.api.IChildLink
19
22
import org.modelix.model.api.IConcept
20
- import org.modelix.model.api.IConceptReference
21
- import org.modelix.model.api.IDeprecatedNodeDefaults
22
23
import org.modelix.model.api.INode
23
24
import org.modelix.model.api.INodeReference
24
25
import org.modelix.model.api.IProperty
25
- import org.modelix.model.api.IReferenceLink
26
26
import org.modelix.model.api.NodeReference
27
27
import org.modelix.model.api.NullChildLink
28
28
import org.modelix.model.area.IArea
29
- import org.modelix.model.data.NodeData
30
29
31
- data class MPSModelAsNode (val model : SModel ) : IDeprecatedNodeDefaults {
30
+ data class MPSModelAsNode (val model : SModel ) : IDefaultNodeAdapter {
31
+
32
32
override fun getArea (): IArea {
33
33
return MPSArea (model.repository)
34
34
}
35
35
36
- override val isValid: Boolean
37
- get() = TODO (" Not yet implemented" )
38
36
override val reference: INodeReference
39
37
get() = NodeReference (" mps-model:" + model.reference.toString())
40
38
override val concept: IConcept
41
- get() = RepositoryLanguage .Model
39
+ get() = BuiltinLanguages . MPSRepositoryConcepts .Model
42
40
override val parent: INode
43
41
get() = MPSModuleAsNode (model.module)
44
42
45
- override fun getConceptReference (): IConceptReference {
46
- return concept.getReference()
47
- }
48
-
49
43
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
+ }
51
52
52
53
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)
54
67
}
55
68
56
69
override fun getContainmentLink (): IChildLink {
@@ -60,68 +73,49 @@ data class MPSModelAsNode(val model: SModel) : IDeprecatedNodeDefaults {
60
73
override fun getChildren (link : IChildLink ): Iterable <INode > {
61
74
return if (link is NullChildLink ) {
62
75
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)) {
67
77
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()
68
84
} else {
69
85
emptyList()
70
86
}
71
87
}
72
88
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()
92
91
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
99
106
}
100
107
101
108
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)) {
106
110
model.name.value
107
- } else if (property.getSimpleName() == NodeData .idPropertyKey ) {
111
+ } else if (property.conformsTo( BuiltinLanguages . MPSRepositoryConcepts . Model .id) ) {
108
112
model.modelId.toString()
113
+ } else if (property.isIdProperty()) {
114
+ reference.serialize()
115
+ } else if (property.conformsTo(BuiltinLanguages .MPSRepositoryConcepts .Model .stereotype)) {
116
+ model.name.stereotype
109
117
} else {
110
118
null
111
119
}
112
120
}
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
- }
127
121
}
0 commit comments