in dnq/src/main/kotlin/kotlinx/dnq/util/XdHierarchyNode.kt [127:158]
fun process(property: KProperty1<*, *>, delegate: Any): Any? {
when (delegate) {
is XdConstrainedProperty<*, *> -> simpleProperties[property.name] = SimpleProperty(property, delegate)
is XdLink<*, *> -> {
val oppositeField = delegate.oppositeField
oppositeField?.let {
if (it.isAbstract) {
val xdEntityClass = this.entityType.javaClass.enclosingClass
throw UnsupportedOperationException("Property ${xdEntityClass.simpleName}#${property.name} " +
"has abstract opposite field ${delegate.oppositeEntityType.enclosingEntityClass.simpleName}::${it.name}")
}
}
linkProperties[property.name] = LinkProperty(property, delegate)
oppositeField?.let {
// is bidirected
val extensionDelegate = try {
oppositeField.apply { isAccessible = true }.getExtensionDelegate()
} catch (e: Exception) {
null
}
if (extensionDelegate != null && extensionDelegate is XdLink<*, *>) {
val presented = XdModel[delegate.oppositeEntityType]
?: XdModel.registerNode(delegate.oppositeEntityType)
presented.linkProperties[oppositeField.name] = LinkProperty(oppositeField, extensionDelegate)
}
}
}
else -> return null
}
return delegate
}