Skip to content

Commit 24b1e39

Browse files
committed
feat(mps-model-adapters): add references and their serialization logic
1 parent 3723b9d commit 24b1e39

11 files changed

+148
-114
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ data class MPSDevKitDependencyAsNode(
4040
}
4141

4242
override val reference: INodeReference
43-
get() = MPSModuleReference(moduleReference)
43+
get() = MPSDevKitDependencyReference(
44+
moduleReference.moduleId,
45+
userModule = moduleImporter?.moduleReference,
46+
userModel = modelImporter?.reference,
47+
)
4448
override val concept: IConcept
4549
get() = BuiltinLanguages.MPSRepositoryConcepts.DevkitDependency
4650
override val parent: INode

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ data class MPSJavaModuleFacetAsNode(val facet: JavaModuleFacet) : IDefaultNodeAd
3434
}
3535

3636
override val reference: INodeReference
37-
get() = TODO("Not yet implemented")
37+
get() {
38+
val module = checkNotNull(facet.module) { "Module of facet $facet not found" }
39+
return MPSJavaModuleFacetReference(module.moduleReference)
40+
}
3841
override val concept: IConcept
3942
get() = BuiltinLanguages.MPSRepositoryConcepts.JavaModuleFacet
4043
override val parent: INode?

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import org.modelix.model.api.IConcept
2323
import org.modelix.model.api.INode
2424
import org.modelix.model.api.INodeReference
2525
import org.modelix.model.api.IProperty
26-
import org.modelix.model.api.NodeReference
2726
import org.modelix.model.api.NullChildLink
2827
import org.modelix.model.area.IArea
2928

@@ -34,7 +33,7 @@ data class MPSModelAsNode(val model: SModel) : IDefaultNodeAdapter {
3433
}
3534

3635
override val reference: INodeReference
37-
get() = NodeReference("mps-model:" + model.reference.toString())
36+
get() = MPSModelReference(model.reference)
3837
override val concept: IConcept
3938
get() = BuiltinLanguages.MPSRepositoryConcepts.Model
4039
override val parent: INode

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@ class MPSModelImportAsNode(val importedModel: SModel, val importingModel: SModel
3131
MPSArea(importingModel.repository)
3232

3333
override val reference: INodeReference
34-
get() = TODO("Not yet implemented")
34+
get() = MPSModelImportReference(
35+
importedModel = importedModel.reference,
36+
importingModel = importingModel.reference,
37+
)
3538
override val concept: IConcept
3639
get() = BuiltinLanguages.MPSRepositoryConcepts.ModelReference
3740
override val parent: INode

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@ data class MPSModuleDependencyAsNode(
4646
}
4747

4848
override val reference: INodeReference
49-
get() = TODO("Not yet implemented")
49+
get() = MPSModuleDependencyReference(
50+
usedModuleId = moduleReference.moduleId,
51+
userModuleReference = importer.moduleReference,
52+
)
5053
override val concept: IConcept
5154
get() = BuiltinLanguages.MPSRepositoryConcepts.ModuleDependency
5255
override val parent: INode

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

Lines changed: 0 additions & 45 deletions
This file was deleted.

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

Lines changed: 0 additions & 60 deletions
This file was deleted.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import org.modelix.model.area.IArea
2929
data class MPSProjectAsNode(val project: ProjectBase) : IDefaultNodeAdapter {
3030

3131
override val reference: INodeReference
32-
get() = TODO("Not yet implemented")
32+
get() = MPSProjectReference(project.name)
3333
override val concept: IConcept
3434
get() = BuiltinLanguages.MPSRepositoryConcepts.Project
3535
override val parent: INode

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@ import org.modelix.model.area.IArea
3030
data class MPSProjectModuleAsNode(val project: ProjectBase, val module: SModule) : IDefaultNodeAdapter {
3131

3232
override val reference: INodeReference
33-
get() = TODO("Not yet implemented")
33+
get() = MPSProjectModuleReference(
34+
projectRef = parent.reference as MPSProjectReference,
35+
moduleRef = module.moduleReference,
36+
)
3437
override val concept: IConcept
3538
get() = BuiltinLanguages.MPSRepositoryConcepts.ProjectModule
3639
override val parent: INode
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/*
2+
* Copyright (c) 2023.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.modelix.model.mpsadapters
18+
19+
import jetbrains.mps.smodel.SNodePointer
20+
import org.jetbrains.mps.openapi.model.SModelReference
21+
import org.jetbrains.mps.openapi.model.SNodeReference
22+
import org.jetbrains.mps.openapi.module.SModuleId
23+
import org.jetbrains.mps.openapi.module.SModuleReference
24+
import org.modelix.model.api.INodeReference
25+
26+
data class MPSModuleReference(val moduleReference: SModuleReference) : INodeReference {
27+
override fun serialize(): String {
28+
return "mps-module:$moduleReference"
29+
}
30+
}
31+
32+
data class MPSModelReference(val modelReference: SModelReference) : INodeReference {
33+
override fun serialize(): String {
34+
return "mps-model:$modelReference"
35+
}
36+
}
37+
38+
data class MPSNodeReference(val ref: SNodeReference) : INodeReference {
39+
companion object {
40+
@Deprecated("INodeResolutionScope.resolveNode(INodeReference) is now responsible for deserializing supported references")
41+
fun tryConvert(ref: INodeReference): MPSNodeReference? {
42+
if (ref is MPSNodeReference) return ref
43+
val serialized = ref.serialize()
44+
val serializedMPSRef = when {
45+
serialized.startsWith("mps-node:") -> serialized.substringAfter("mps-node:")
46+
serialized.startsWith("mps:") -> serialized.substringAfter("mps:")
47+
else -> return null
48+
}
49+
return MPSNodeReference(SNodePointer.deserialize(serializedMPSRef))
50+
}
51+
}
52+
53+
override fun serialize(): String {
54+
return "mps:$ref"
55+
}
56+
}
57+
58+
data class MPSDevKitDependencyReference(
59+
val usedModuleId: SModuleId,
60+
val userModule: SModuleReference? = null,
61+
val userModel: SModelReference? = null,
62+
) : INodeReference {
63+
override fun serialize(): String {
64+
val importer = userModule?.let { "mps-module:$it" }
65+
?: userModel?.let { "mps-model:$it" }
66+
?: throw IllegalStateException("importer not found")
67+
68+
return "mps-devkit:$usedModuleId#IN#$importer"
69+
}
70+
}
71+
72+
data class MPSJavaModuleFacetReference(val moduleReference: SModuleReference) : INodeReference {
73+
override fun serialize(): String {
74+
return "mps-java-facet:$moduleReference"
75+
}
76+
}
77+
78+
data class MPSModelImportReference(
79+
val importedModel: SModelReference,
80+
val importingModel: SModelReference,
81+
) : INodeReference {
82+
override fun serialize(): String {
83+
return "mps-model-import:$importedModel#IN#$importingModel"
84+
}
85+
}
86+
87+
data class MPSModuleDependencyReference(
88+
val usedModuleId: SModuleId,
89+
val userModuleReference: SModuleReference,
90+
) : INodeReference {
91+
override fun serialize(): String {
92+
return "mps-module-dependency:$usedModuleId#IN#$userModuleReference"
93+
}
94+
}
95+
96+
data class MPSProjectReference(val projectName: String) : INodeReference {
97+
override fun serialize(): String {
98+
return "mps-project:$projectName"
99+
}
100+
}
101+
102+
data class MPSProjectModuleReference(val moduleRef: SModuleReference, val projectRef: MPSProjectReference) : INodeReference {
103+
override fun serialize(): String {
104+
return "mps-project-module:$moduleRef#IN#${projectRef.serialize()}"
105+
}
106+
}
107+
108+
data class MPSSingleLanguageDependencyReference(
109+
val usedModuleId: SModuleId,
110+
val userModule: SModuleReference? = null,
111+
val userModel: SModelReference? = null,
112+
) : INodeReference {
113+
override fun serialize(): String {
114+
val importer = userModule?.let { "mps-module:$it" }
115+
?: userModel?.let { "mps-model:$it" }
116+
?: throw IllegalStateException("importer not found")
117+
118+
return "mps-lang:$usedModuleId#IN#$importer"
119+
}
120+
}

0 commit comments

Comments
 (0)