Skip to content

Commit 73402ad

Browse files
author
Oleksandr Dzhychko
authored
Merge pull request #728 from modelix/fix-set-null-references
fix(mps-model-adapters): allow removing references on node
2 parents a6a814e + 2b19264 commit 73402ad

File tree

2 files changed

+65
-2
lines changed
  • mps-model-adapters-plugin/src/test/kotlin/org/modelix/model/mpsadapters
  • mps-model-adapters/src/main/kotlin/org/modelix/model/mpsadapters

2 files changed

+65
-2
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package org.modelix.model.mpsadapters
2+
3+
import org.modelix.model.api.BuiltinLanguages
4+
import org.modelix.model.api.INode
5+
6+
/*
7+
* Copyright (c) 2023.
8+
*
9+
* Licensed under the Apache License, Version 2.0 (the "License");
10+
* you may not use this file except in compliance with the License.
11+
* You may obtain a copy of the License at
12+
*
13+
* http://www.apache.org/licenses/LICENSE-2.0
14+
*
15+
* Unless required by applicable law or agreed to in writing, software
16+
* distributed under the License is distributed on an "AS IS" BASIS,
17+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18+
* See the License for the specific language governing permissions and
19+
* limitations under the License.
20+
*/
21+
22+
class ChangeReferenceTest : MpsAdaptersTestBase("SimpleProject") {
23+
24+
fun testCanRemoveReference() {
25+
// This is some reference link that is technically not part of the concept of the node it is used with.
26+
// But for this test, this is fine because nodes might have invalid references.
27+
val referenceLink = BuiltinLanguages.MPSRepositoryConcepts.ModelReference.model
28+
val repositoryNode: INode = MPSRepositoryAsNode(mpsProject.repository)
29+
runCommandOnEDT {
30+
val module = repositoryNode.getChildren(BuiltinLanguages.MPSRepositoryConcepts.Repository.modules)
31+
.single { it.getPropertyValue(BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name) == "Solution1" }
32+
val model = module.getChildren(BuiltinLanguages.MPSRepositoryConcepts.Module.models)
33+
.single { it.getPropertyValue(BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name) == "Solution1.model1" }
34+
val rootNode = model.getChildren(BuiltinLanguages.MPSRepositoryConcepts.Model.rootNodes).single()
35+
rootNode.setReferenceTarget(referenceLink, rootNode)
36+
assertEquals(rootNode, rootNode.getReferenceTarget(referenceLink))
37+
38+
rootNode.setReferenceTarget(referenceLink, null as INode?)
39+
40+
assertEquals(null, rootNode.getReferenceTarget(referenceLink))
41+
}
42+
}
43+
44+
fun testCanNotSetNonMPSNodeAsReferenceTarget() {
45+
val referenceLink = BuiltinLanguages.MPSRepositoryConcepts.ModelReference.model
46+
val repositoryNode: INode = MPSRepositoryAsNode(mpsProject.repository)
47+
runCommandOnEDT {
48+
val module = repositoryNode.getChildren(BuiltinLanguages.MPSRepositoryConcepts.Repository.modules)
49+
.single { it.getPropertyValue(BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name) == "Solution1" }
50+
val model = module.getChildren(BuiltinLanguages.MPSRepositoryConcepts.Module.models)
51+
.single { it.getPropertyValue(BuiltinLanguages.jetbrains_mps_lang_core.INamedConcept.name) == "Solution1.model1" }
52+
val rootNode = model.getChildren(BuiltinLanguages.MPSRepositoryConcepts.Model.rootNodes).single()
53+
54+
try {
55+
rootNode.setReferenceTarget(referenceLink, model)
56+
fail("Expected exception")
57+
} catch (e: IllegalArgumentException) {
58+
assertEquals(e.message, "`target` has to be an `MPSNode` or `null`.")
59+
}
60+
}
61+
}
62+
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,15 +213,16 @@ data class MPSNode(val node: SNode) : IDefaultNodeAdapter, IReplaceableNode {
213213
}
214214

215215
override fun setReferenceTarget(link: IReferenceLink, target: INode?) {
216+
require(target is MPSNode?) { "`target` has to be an `MPSNode` or `null`." }
217+
216218
val refLink = when (link) {
217219
is MPSReferenceLink -> link.link
218220
else -> node.references.find { MPSReferenceLink(it.link).getUID() == link.getUID() }?.link
219221
?: node.concept.referenceLinks.find { MPSReferenceLink(it).getUID() == link.getUID() }
220222
?: SReferenceLinkAdapterById(SReferenceLinkId.deserialize(link.getUID()), "")
221223
}
222224

223-
val targetNode = target?.let { getArea().resolveNode(it.reference) } as MPSNode
224-
node.setReferenceTarget(refLink, targetNode.node)
225+
node.setReferenceTarget(refLink, target?.node)
225226
}
226227

227228
override fun setReferenceTarget(role: IReferenceLink, target: INodeReference?) {

0 commit comments

Comments
 (0)