Skip to content

Commit a221c87

Browse files
slissonmhuster23
authored andcommitted
fix(model-api): serialized referenced failed to resolve in PArea
The responsibility of deserializing references changed and PArea wasn't adjusted to that yet.
1 parent 9a7f5ec commit a221c87

File tree

3 files changed

+24
-17
lines changed

3 files changed

+24
-17
lines changed

model-api/src/commonMain/kotlin/org/modelix/model/api/INodeReference.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,16 @@ fun INodeReference.resolveInCurrentContext(): INode? {
4949
}
5050

5151
fun INodeReference.resolveIn(scope: INodeResolutionScope): INode? {
52-
if (this is NodeReference) {
53-
val deserialized = INodeReferenceSerializer.tryDeserialize(serialized)
54-
if (deserialized != null) return deserialized.resolveIn(scope)
52+
try {
53+
if (this is NodeReference) {
54+
val deserialized = INodeReferenceSerializer.tryDeserialize(serialized)
55+
if (deserialized != null) return deserialized.resolveIn(scope)
56+
}
57+
@Suppress("DEPRECATION")
58+
return scope.resolveNode(this)
59+
} catch (ex: Exception) {
60+
throw RuntimeException("Failed to resolve $this", ex)
5561
}
56-
@Suppress("DEPRECATION")
57-
return scope.resolveNode(this)
5862
}
5963

6064
class NodeReferenceKSerializer : KSerializer<INodeReference> {

model-api/src/commonMain/kotlin/org/modelix/model/api/PNodeAdapter.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,9 @@ open class PNodeAdapter(val nodeId: Long, val branch: IBranch) : INode, INodeEx
136136
}
137137

138138
private fun tryResolveNodeRef(targetRef: INodeReference): INode? {
139-
(targetRef as? PNodeReference)
140-
?.takeIf { it.branchId == branch.getId() }
141-
?.resolveIn(PArea(branch))
142-
?.let { return it }
143-
return targetRef.resolveInCurrentContext()
139+
return INodeResolutionScope.runWithAdditionalScope(getArea()) {
140+
targetRef.resolveInCurrentContext()
141+
}
144142
}
145143

146144
private suspend fun resolveNodeRefInCoroutine(targetRef: INodeReference): INode {

model-api/src/commonMain/kotlin/org/modelix/model/area/PArea.kt

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,11 @@ import org.modelix.model.api.INode
2020
import org.modelix.model.api.INodeReference
2121
import org.modelix.model.api.INodeResolutionScope
2222
import org.modelix.model.api.ITree
23+
import org.modelix.model.api.LocalPNodeReference
24+
import org.modelix.model.api.NodeReference
2325
import org.modelix.model.api.PNodeAdapter
2426
import org.modelix.model.api.PNodeReference
27+
import org.modelix.model.api.getNode
2528

2629
data class PArea(val branch: IBranch) : IArea {
2730

@@ -36,14 +39,16 @@ data class PArea(val branch: IBranch) : IArea {
3639
}
3740

3841
override fun resolveOriginalNode(ref: INodeReference): INode? {
39-
return if (ref is PNodeReference &&
40-
branch.getId() == ref.branchId &&
41-
containsNode(ref.id)
42-
) {
43-
PNodeAdapter(ref.id, branch)
44-
} else {
45-
null
42+
val pref = when (ref) {
43+
is NodeReference -> PNodeReference.tryDeserialize(ref.serialized)
44+
else -> ref
4645
}
46+
val nodeId = when (pref) {
47+
is PNodeReference -> if (pref.branchId == branch.getId()) pref.id else return null
48+
is LocalPNodeReference -> pref.id
49+
else -> return null
50+
}
51+
return if (containsNode(nodeId)) branch.getNode(nodeId) else null
4752
}
4853

4954
override fun resolveBranch(id: String): IBranch? {

0 commit comments

Comments
 (0)