fun process()

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
    }