Skip to content

Commit 008fe1e

Browse files
committed
feat(mps-model-adapters): migrate MPSModuleAsNode
1 parent 5ae4f1a commit 008fe1e

File tree

1 file changed

+81
-55
lines changed

1 file changed

+81
-55
lines changed

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

Lines changed: 81 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -13,119 +13,145 @@
1313
*/
1414
package org.modelix.model.mpsadapters
1515

16+
import jetbrains.mps.project.AbstractModule
17+
import jetbrains.mps.project.DevKit
1618
import jetbrains.mps.project.ProjectBase
1719
import jetbrains.mps.project.ProjectManager
20+
import jetbrains.mps.project.Solution
21+
import jetbrains.mps.project.facets.JavaModuleFacet
1822
import jetbrains.mps.smodel.MPSModuleRepository
23+
import org.jetbrains.mps.openapi.module.SDependencyScope
1924
import org.jetbrains.mps.openapi.module.SModule
25+
import org.jetbrains.mps.openapi.module.SModuleId
2026
import org.modelix.model.api.BuiltinLanguages
2127
import org.modelix.model.api.IChildLink
2228
import org.modelix.model.api.IConcept
23-
import org.modelix.model.api.IConceptReference
24-
import org.modelix.model.api.IDeprecatedNodeDefaults
2529
import org.modelix.model.api.INode
2630
import org.modelix.model.api.INodeReference
2731
import org.modelix.model.api.IProperty
28-
import org.modelix.model.api.IReferenceLink
29-
import org.modelix.model.api.NodeReference
3032
import org.modelix.model.area.IArea
3133

32-
data class MPSModuleAsNode(val module: SModule) : IDeprecatedNodeDefaults {
34+
data class MPSModuleAsNode(val module: SModule) : IDefaultNodeAdapter {
35+
3336
override fun getArea(): IArea {
3437
return MPSArea(module.repository ?: MPSModuleRepository.getInstance())
3538
}
3639

37-
override val isValid: Boolean
38-
get() = TODO("Not yet implemented")
3940
override val reference: INodeReference
40-
get() = NodeReference("mps-module:" + module.moduleReference.toString())
41+
get() = MPSModuleReference(module.moduleReference)
4142
override val concept: IConcept
4243
get() = BuiltinLanguages.MPSRepositoryConcepts.Module
4344
override val parent: INode?
4445
get() = module.repository?.let { MPSRepositoryAsNode(it) }
4546

46-
override fun getConceptReference(): IConceptReference {
47-
return concept.getReference()
48-
}
49-
5047
override val allChildren: Iterable<INode>
5148
get() = module.models.map { MPSModelAsNode(it) }
5249

53-
override fun removeChild(child: INode) {
54-
TODO("Not yet implemented")
55-
}
56-
5750
override fun getContainmentLink(): IChildLink {
58-
return RepositoryLanguage.Repository.modules
51+
return BuiltinLanguages.MPSRepositoryConcepts.Repository.modules
5952
}
6053

6154
override fun getChildren(link: IChildLink): Iterable<INode> {
62-
return if (link.getUID().endsWith("0a7577d1-d4e5-431d-98b1-fae38f9aee80/474657388638618895/474657388638618898") ||
63-
link.getUID().contains("models") ||
64-
link.getSimpleName() == "models"
65-
) {
55+
return if (link.conformsTo(BuiltinLanguages.MPSRepositoryConcepts.Module.models)) {
6656
module.models.map { MPSModelAsNode(it) }
57+
} else if (link.conformsTo(BuiltinLanguages.MPSRepositoryConcepts.Module.facets)) {
58+
module.facets.filterIsInstance<JavaModuleFacet>().map { MPSJavaModuleFacetAsNode(it) }
59+
} else if (link.conformsTo(BuiltinLanguages.MPSRepositoryConcepts.Module.dependencies)) {
60+
getDependencies()
61+
} else if (link.conformsTo(BuiltinLanguages.MPSRepositoryConcepts.Module.languageDependencies)) {
62+
getLanguageDependencies()
6763
} else {
6864
emptyList()
6965
}
7066
}
7167

72-
override fun moveChild(role: IChildLink, index: Int, child: INode) {
73-
TODO("Not yet implemented")
74-
}
68+
private fun getDependencies(): Iterable<INode> {
69+
if (module !is AbstractModule) return emptyList()
7570

76-
override fun addNewChild(role: IChildLink, index: Int, concept: IConcept?): INode {
77-
TODO("Not yet implemented")
78-
}
71+
val moduleDescriptor = module.moduleDescriptor ?: return emptyList()
7972

80-
override fun addNewChild(role: IChildLink, index: Int, concept: IConceptReference?): INode {
81-
TODO("Not yet implemented")
73+
return moduleDescriptor.dependencyVersions.map { (ref, version) ->
74+
MPSModuleDependencyAsNode(
75+
moduleReference = ref,
76+
moduleVersion = version,
77+
explicit = isDirectDependency(module, ref.moduleId),
78+
reexport = isReexport(module, ref.moduleId),
79+
importer = module,
80+
dependencyScope = getDependencyScope(module, ref.moduleId),
81+
)
82+
}
8283
}
8384

84-
override fun getReferenceTarget(link: IReferenceLink): INode? {
85-
TODO("Not yet implemented")
85+
private fun getLanguageDependencies(): Iterable<INode> {
86+
if (module !is AbstractModule) return emptyList()
87+
88+
val moduleDescriptor = module.moduleDescriptor ?: return emptyList()
89+
val dependencies = mutableListOf<INode>()
90+
91+
for ((language, version) in moduleDescriptor.languageVersions) {
92+
dependencies.add(
93+
MPSSingleLanguageDependencyAsNode(language.sourceModuleReference, version, moduleImporter = module),
94+
)
95+
}
96+
97+
for (devKit in moduleDescriptor.usedDevkits) {
98+
dependencies.add(MPSDevKitDependencyAsNode(devKit, module))
99+
}
100+
101+
return dependencies
86102
}
87103

88-
override fun setReferenceTarget(link: IReferenceLink, target: INode?) {
89-
TODO("Not yet implemented")
104+
private fun isDirectDependency(module: SModule, moduleId: SModuleId): Boolean {
105+
if (module is Solution) {
106+
return module.moduleDescriptor.dependencies.any { it.moduleRef.moduleId == moduleId }
107+
}
108+
return module.declaredDependencies.any { it.targetModule.moduleId == moduleId }
90109
}
91110

92-
override fun setReferenceTarget(role: IReferenceLink, target: INodeReference?) {
93-
TODO("Not yet implemented")
111+
private fun isReexport(module: SModule, moduleId: SModuleId): Boolean {
112+
return module.declaredDependencies
113+
.firstOrNull { it.targetModule.moduleId == moduleId }?.isReexport ?: false
94114
}
95115

96-
override fun getReferenceTargetRef(role: IReferenceLink): INodeReference? {
97-
TODO("Not yet implemented")
116+
private fun getDependencyScope(module: SModule, moduleId: SModuleId): SDependencyScope? {
117+
if (module is Solution) {
118+
return module.moduleDescriptor.dependencies
119+
.firstOrNull { it.moduleRef.moduleId == moduleId }?.scope
120+
}
121+
return module.declaredDependencies.firstOrNull { it.targetModule.moduleId == moduleId }?.scope
98122
}
99123

100124
override fun getPropertyValue(property: IProperty): String? {
101-
return if (property.getUID().endsWith(BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name.getUID()) ||
102-
property.getUID().contains("name") ||
103-
property.getSimpleName() == "name"
104-
) {
125+
return if (property.conformsTo(BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name)) {
105126
module.moduleName
106-
} else if (property.getUID().endsWith(BuiltinLanguages.jetbrains_mps_lang_core.BaseConcept.virtualPackage.getUID()) ||
107-
property.getUID().contains("virtualPackage") ||
108-
property.getSimpleName() == "virtualPackage"
109-
) {
127+
} else if (property.conformsTo(BuiltinLanguages.jetbrains_mps_lang_core.BaseConcept.virtualPackage)) {
110128
ProjectManager.getInstance().openedProjects.asSequence()
111129
.filterIsInstance<ProjectBase>()
112130
.mapNotNull { it.getPath(module) }
113131
.firstOrNull()
114132
?.virtualFolder
133+
} else if (property.conformsTo(BuiltinLanguages.MPSRepositoryConcepts.Module.id)) {
134+
module.moduleId.toString()
135+
} else if (property.conformsTo(BuiltinLanguages.MPSRepositoryConcepts.Module.moduleVersion)) {
136+
val version = (module as? AbstractModule)?.moduleDescriptor?.moduleVersion ?: 0
137+
version.toString()
138+
} else if (property.conformsTo(BuiltinLanguages.MPSRepositoryConcepts.Module.compileInMPS)) {
139+
getCompileInMPS().toString()
140+
} else if (property.isIdProperty()) {
141+
reference.serialize()
115142
} else {
116143
null
117144
}
118145
}
119146

120-
override fun setPropertyValue(property: IProperty, value: String?) {
121-
// TODO("Not yet implemented")
122-
}
123-
124-
override fun getPropertyLinks(): List<IProperty> {
125-
return concept.getAllProperties()
126-
}
127-
128-
override fun getReferenceLinks(): List<IReferenceLink> {
129-
return concept.getAllReferenceLinks()
147+
private fun getCompileInMPS(): Boolean {
148+
if (module is DevKit || module !is AbstractModule) {
149+
return false
150+
}
151+
return try {
152+
module.moduleDescriptor?.compileInMPS ?: false
153+
} catch (ex: UnsupportedOperationException) {
154+
false
155+
}
130156
}
131157
}

0 commit comments

Comments
 (0)