|
13 | 13 | */
|
14 | 14 | package org.modelix.model.mpsadapters
|
15 | 15 |
|
| 16 | +import jetbrains.mps.project.AbstractModule |
| 17 | +import jetbrains.mps.project.DevKit |
16 | 18 | import jetbrains.mps.project.ProjectBase
|
17 | 19 | import jetbrains.mps.project.ProjectManager
|
| 20 | +import jetbrains.mps.project.Solution |
| 21 | +import jetbrains.mps.project.facets.JavaModuleFacet |
18 | 22 | import jetbrains.mps.smodel.MPSModuleRepository
|
| 23 | +import org.jetbrains.mps.openapi.module.SDependencyScope |
19 | 24 | import org.jetbrains.mps.openapi.module.SModule
|
| 25 | +import org.jetbrains.mps.openapi.module.SModuleId |
20 | 26 | import org.modelix.model.api.BuiltinLanguages
|
21 | 27 | import org.modelix.model.api.IChildLink
|
22 | 28 | import org.modelix.model.api.IConcept
|
23 |
| -import org.modelix.model.api.IConceptReference |
24 |
| -import org.modelix.model.api.IDeprecatedNodeDefaults |
25 | 29 | import org.modelix.model.api.INode
|
26 | 30 | import org.modelix.model.api.INodeReference
|
27 | 31 | import org.modelix.model.api.IProperty
|
28 |
| -import org.modelix.model.api.IReferenceLink |
29 |
| -import org.modelix.model.api.NodeReference |
30 | 32 | import org.modelix.model.area.IArea
|
31 | 33 |
|
32 |
| -data class MPSModuleAsNode(val module: SModule) : IDeprecatedNodeDefaults { |
| 34 | +data class MPSModuleAsNode(val module: SModule) : IDefaultNodeAdapter { |
| 35 | + |
33 | 36 | override fun getArea(): IArea {
|
34 | 37 | return MPSArea(module.repository ?: MPSModuleRepository.getInstance())
|
35 | 38 | }
|
36 | 39 |
|
37 |
| - override val isValid: Boolean |
38 |
| - get() = TODO("Not yet implemented") |
39 | 40 | override val reference: INodeReference
|
40 |
| - get() = NodeReference("mps-module:" + module.moduleReference.toString()) |
| 41 | + get() = MPSModuleReference(module.moduleReference) |
41 | 42 | override val concept: IConcept
|
42 | 43 | get() = BuiltinLanguages.MPSRepositoryConcepts.Module
|
43 | 44 | override val parent: INode?
|
44 | 45 | get() = module.repository?.let { MPSRepositoryAsNode(it) }
|
45 | 46 |
|
46 |
| - override fun getConceptReference(): IConceptReference { |
47 |
| - return concept.getReference() |
48 |
| - } |
49 |
| - |
50 | 47 | override val allChildren: Iterable<INode>
|
51 | 48 | get() = module.models.map { MPSModelAsNode(it) }
|
52 | 49 |
|
53 |
| - override fun removeChild(child: INode) { |
54 |
| - TODO("Not yet implemented") |
55 |
| - } |
56 |
| - |
57 | 50 | override fun getContainmentLink(): IChildLink {
|
58 |
| - return RepositoryLanguage.Repository.modules |
| 51 | + return BuiltinLanguages.MPSRepositoryConcepts.Repository.modules |
59 | 52 | }
|
60 | 53 |
|
61 | 54 | 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)) { |
66 | 56 | 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() |
67 | 63 | } else {
|
68 | 64 | emptyList()
|
69 | 65 | }
|
70 | 66 | }
|
71 | 67 |
|
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() |
75 | 70 |
|
76 |
| - override fun addNewChild(role: IChildLink, index: Int, concept: IConcept?): INode { |
77 |
| - TODO("Not yet implemented") |
78 |
| - } |
| 71 | + val moduleDescriptor = module.moduleDescriptor ?: return emptyList() |
79 | 72 |
|
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 | + } |
82 | 83 | }
|
83 | 84 |
|
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 |
86 | 102 | }
|
87 | 103 |
|
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 } |
90 | 109 | }
|
91 | 110 |
|
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 |
94 | 114 | }
|
95 | 115 |
|
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 |
98 | 122 | }
|
99 | 123 |
|
100 | 124 | 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)) { |
105 | 126 | 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)) { |
110 | 128 | ProjectManager.getInstance().openedProjects.asSequence()
|
111 | 129 | .filterIsInstance<ProjectBase>()
|
112 | 130 | .mapNotNull { it.getPath(module) }
|
113 | 131 | .firstOrNull()
|
114 | 132 | ?.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() |
115 | 142 | } else {
|
116 | 143 | null
|
117 | 144 | }
|
118 | 145 | }
|
119 | 146 |
|
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 | + } |
130 | 156 | }
|
131 | 157 | }
|
0 commit comments