Skip to content

Commit 3f1765c

Browse files
committed
.typed() function also does a cast
You can now write this: val a: N_MyConcept = node.typed() instead of: val a = node.typed() as N_MyConcept It provides the additional benefit of the typesystem checking that N_MyConcept is an ITypedNode
1 parent 9442b54 commit 3f1765c

File tree

3 files changed

+10
-4
lines changed

3 files changed

+10
-4
lines changed

editor-runtime/src/commonMain/kotlin/org/modelix/editor/CellTemplate.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class ReferenceCellTemplate<NodeT : ITypedNode, ConceptT : ITypedConcept, Target
8080
override fun createCell(editor: EditorEngine, node: NodeT): CellData = TextCellData(getText(node), "<no ${link.name}>")
8181
private fun getText(node: NodeT): String = getTargetNode(node)?.let(presentation) ?: ""
8282
private fun getTargetNode(sourceNode: NodeT): TargetNodeT? {
83-
return sourceNode.unwrap().getReferenceTarget(link)?.typed() as TargetNodeT?
83+
return sourceNode.unwrap().getReferenceTarget(link)?.typedUnsafe()
8484
}
8585
}
8686

metamodel-runtime/src/commonMain/kotlin/org/modelix/metamodel/ChildAccessor.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@ abstract class ChildAccessor<ChildT : ITypedNode>(
1919

2020
override fun iterator(): Iterator<ChildT> {
2121
return parent.getChildren(role).map {
22-
val wrapped = when (childConcept) {
23-
is GeneratedConcept<*, *> -> it.typed()
22+
when (childConcept) {
23+
is GeneratedConcept<*, *> -> it.typed(childType)
2424
else -> throw RuntimeException("Unsupported concept type: ${childConcept::class} (${childConcept.getLongName()})")
2525
}
26-
childType.cast(wrapped)
2726
}.iterator()
2827
}
2928

metamodel-runtime/src/commonMain/kotlin/org/modelix/metamodel/TypedLanguagesRegistry.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ package org.modelix.metamodel
33
import org.modelix.model.api.ILanguageRepository
44
import org.modelix.model.api.INode
55
import org.modelix.model.api.resolve
6+
import kotlin.jvm.JvmName
7+
import kotlin.reflect.KClass
8+
import kotlin.reflect.cast
69

710
object TypedLanguagesRegistry : ILanguageRepository {
811
private var languages: Map<String, GeneratedLanguage> = emptyMap()
@@ -39,4 +42,8 @@ object TypedLanguagesRegistry : ILanguageRepository {
3942
}
4043
}
4144

45+
fun <NodeT : ITypedNode> INode.typed(nodeClass: KClass<NodeT>): NodeT = nodeClass.cast(TypedLanguagesRegistry.wrapNode(this))
46+
inline fun <reified NodeT : ITypedNode> INode.typed(): NodeT = TypedLanguagesRegistry.wrapNode(this) as NodeT
47+
fun <NodeT : ITypedNode> INode.typedUnsafe(): NodeT = TypedLanguagesRegistry.wrapNode(this) as NodeT
48+
@JvmName("asITypedNode")
4249
fun INode.typed(): ITypedNode = TypedLanguagesRegistry.wrapNode(this)

0 commit comments

Comments
 (0)