diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/signatureEnhancement.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/signatureEnhancement.kt index faac03716e7..84ea8d8fdc8 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/signatureEnhancement.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/components/signatureEnhancement.kt @@ -16,9 +16,123 @@ package org.jetbrains.kotlin.load.java.components +import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor +import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor +import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor +import org.jetbrains.kotlin.descriptors.impl.ReceiverParameterDescriptorImpl +import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl +import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor +import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver +import org.jetbrains.kotlin.types.JetType fun enhanceSignatures(platformSignatures: Collection): Collection { - // TODO: implement - return platformSignatures + return platformSignatures.map { + it.enhance() + } +} + +fun D.enhance(): D { + // TODO type parameters + // TODO use new type parameters while enhancing other types + // TODO Propagation into generic type arguments + + val enhancedReceiverType = + if (getExtensionReceiverParameter() != null) + parts { it.getExtensionReceiverParameter()!!.toPart() }.enhance() + else null + + val enhancedValueParameters = getValueParameters().map { + p -> parts { it.getValueParameters()[p.getIndex()]!!.toPart() }.enhance() + } + + val enhancedReturnType = parts { it.getReturnType()!!.toReturnTypePart() }.enhance() + + if (this is JavaMethodDescriptor) { + val enhancedFunction = JavaMethodDescriptor.createJavaMethod( + getContainingDeclaration()!!, + getAnnotations(), + getName(), + getSource() + ) + enhancedFunction.initialize( + enhancedReceiverType, + getDispatchReceiverParameter(), + getTypeParameters(), + enhancedValueParameters, + enhancedReturnType, + getModality(), + getVisibility() + ) + enhancedFunction.setHasStableParameterNames(hasStableParameterNames()) + enhancedFunction.setHasSynthesizedParameterNames(hasSynthesizedParameterNames()) + + for (overridden in getOverriddenDescriptors()) { + enhancedFunction.addOverriddenDescriptor(overridden) + } + + @suppress("UNCHECKED_CAST") + return enhancedFunction as D + } + + return this +} + +fun > SignatureParts.enhance(): T { + val qualifiers = fromOverride.type.computeQualifiersForOverride(this.fromOverridden.map { it.type }, fromOverride.isCovariant) + return fromOverride.replaceType(fromOverride.type.enhance(qualifiers)) +} + +class SignatureParts>( + val fromOverride: P, + val fromOverridden: Collection

+) + +interface SignaturePart { + val isCovariant: Boolean + get() = false + + val type: JetType + + fun replaceType(newType: JetType): T +} + +fun ReceiverParameterDescriptor.toPart() = object : SignaturePart { + override val type = getType() + + override fun replaceType(newType: JetType) = newType +} + +fun ValueParameterDescriptor.toPart() = object : SignaturePart { + override val type = getType() + + override fun replaceType(newType: JetType) = ValueParameterDescriptorImpl( + getContainingDeclaration(), + null, + getIndex(), + getAnnotations(), + getName(), + newType, + declaresDefaultValue(), + if (getVarargElementType() != null) newType.getArguments()[0].getType() else null, + getSource() + ) +} + +fun JetType.toReturnTypePart() = object : SignaturePart { + override val type = this@toReturnTypePart + + override val isCovariant: Boolean = true + + override fun replaceType(newType: JetType) = newType +} + +fun > D.parts(collector: (D) -> P): SignatureParts { + return SignatureParts( + collector(this), + this.getOverriddenDescriptors().map { + @suppress("UNCHECKED_CAST") + collector(it as D) + } + ) } \ No newline at end of file