-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathMPSModelImportAsNode.kt
80 lines (65 loc) · 3.04 KB
/
MPSModelImportAsNode.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package org.modelix.model.mpsadapters
import org.jetbrains.mps.openapi.model.SModel
import org.jetbrains.mps.openapi.model.SModelReference
import org.jetbrains.mps.openapi.module.SRepository
import org.modelix.model.api.BuiltinLanguages
import org.modelix.model.api.IChildLinkReference
import org.modelix.model.api.IConcept
import org.modelix.model.api.INodeReference
import org.modelix.model.api.IPropertyReference
import org.modelix.model.api.IReferenceLinkReference
import org.modelix.model.api.IWritableNode
data class MPSModelImportAsNode(val importedModel: SModelReference, val importingModel: SModel) : MPSGenericNodeAdapter<MPSModelImportAsNode>() {
companion object {
private val referenceAccessors = listOf(
BuiltinLanguages.MPSRepositoryConcepts.ModelReference.model.toReference() to object :
IReferenceAccessor<MPSModelImportAsNode> {
override fun read(element: MPSModelImportAsNode): IWritableNode? {
// Broken references are a common thing and MPS also just returns null.
// readRef can be used to distinguish a broken reference from one that isn't set.
return element.importedModel.resolve(element.importingModel.repository)
?.let { MPSModelAsNode(it) }
}
override fun readRef(element: MPSModelImportAsNode): INodeReference? {
return MPSModelReference(element.importedModel)
}
override fun write(element: MPSModelImportAsNode, value: IWritableNode?) {
throw UnsupportedOperationException("read only")
}
override fun write(element: MPSModelImportAsNode, value: INodeReference?) {
throw UnsupportedOperationException("read only")
}
},
)
}
override fun getElement(): MPSModelImportAsNode {
return this
}
override fun getRepository(): SRepository? {
return importingModel.repository
}
override fun getPropertyAccessors(): List<Pair<IPropertyReference, IPropertyAccessor<MPSModelImportAsNode>>> {
return emptyList()
}
override fun getReferenceAccessors(): List<Pair<IReferenceLinkReference, IReferenceAccessor<MPSModelImportAsNode>>> {
return referenceAccessors
}
override fun getChildAccessors(): List<Pair<IChildLinkReference, IChildAccessor<MPSModelImportAsNode>>> {
return emptyList()
}
override fun getParent(): IWritableNode? {
return MPSModelAsNode(importingModel)
}
override fun getNodeReference(): INodeReference {
return MPSModelImportReference(
importedModel = importedModel,
importingModel = importingModel.reference,
)
}
override fun getConcept(): IConcept {
return BuiltinLanguages.MPSRepositoryConcepts.ModelReference
}
override fun getContainmentLink(): IChildLinkReference {
return BuiltinLanguages.MPSRepositoryConcepts.Model.modelImports.toReference()
}
}