diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaCallableMemberDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaCallableMemberDescriptor.java index 5970da42013..c64326a2bf3 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaCallableMemberDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaCallableMemberDescriptor.java @@ -28,7 +28,7 @@ public interface JavaCallableMemberDescriptor extends CallableMemberDescriptor { @NotNull JavaCallableMemberDescriptor enhance( @Nullable JetType enhancedReceiverType, - @NotNull List enhancedValueParameters, + @NotNull List enhancedValueParametersTypes, @NotNull JetType enhancedReturnType ); } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaConstructorDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaConstructorDescriptor.java index 6afd38862bb..44090e6b210 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaConstructorDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaConstructorDescriptor.java @@ -97,7 +97,7 @@ public class JavaConstructorDescriptor extends ConstructorDescriptorImpl impleme @NotNull public JavaConstructorDescriptor enhance( @Nullable JetType enhancedReceiverType, - @NotNull List enhancedValueParameters, + @NotNull List enhancedValueParametersTypes, @NotNull JetType enhancedReturnType ) { JavaConstructorDescriptor enhanced = createSubstitutedCopy(getContainingDeclaration(), getOriginal(), getKind()); @@ -105,7 +105,7 @@ public class JavaConstructorDescriptor extends ConstructorDescriptorImpl impleme enhancedReceiverType, getDispatchReceiverParameter(), getTypeParameters(), - enhancedValueParameters, + DescriptorsPackage.createEnhancedValueParameters(enhancedValueParametersTypes, getValueParameters(), enhanced), enhancedReturnType, getModality(), getVisibility() diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java index 22435b63b09..e999b400cd5 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java @@ -97,7 +97,7 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement @NotNull public JavaMethodDescriptor enhance( @Nullable JetType enhancedReceiverType, - @NotNull List enhancedValueParameters, + @NotNull List enhancedValueParametersTypes, @NotNull JetType enhancedReturnType ) { JavaMethodDescriptor enhancedMethod = createSubstitutedCopy(getContainingDeclaration(), getOriginal(), getKind()); @@ -105,7 +105,7 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement enhancedReceiverType, getDispatchReceiverParameter(), getTypeParameters(), - enhancedValueParameters, + DescriptorsPackage.createEnhancedValueParameters(enhancedValueParametersTypes, getValueParameters(), enhancedMethod), enhancedReturnType, getModality(), getVisibility() diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java index 9ad24f14cdc..1b15a7b1ddf 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java @@ -47,7 +47,7 @@ public class JavaPropertyDescriptor extends PropertyDescriptorImpl implements Ja @Override public JavaCallableMemberDescriptor enhance( @Nullable JetType enhancedReceiverType, - @NotNull List enhancedValueParameters, + @NotNull List enhancedValueParametersTypes, @NotNull JetType enhancedReturnType ) { JavaPropertyDescriptor enhanced = new JavaPropertyDescriptor( diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/util.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/util.kt new file mode 100644 index 00000000000..5d11301f7ef --- /dev/null +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/util.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.load.java.descriptors + +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor +import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl +import org.jetbrains.kotlin.resolve.descriptorUtil.module +import org.jetbrains.kotlin.types.JetType + +fun createEnhancedValueParameters( + enhancedTypes: Collection, + oldValueParameters: Collection, + newOwner: DeclarationDescriptor +): List { + assert(enhancedTypes.size() == oldValueParameters.size()) { + "Different value parameters sizes: Enhanced = ${enhancedTypes.size()}, Old = ${oldValueParameters.size()}" + } + + return enhancedTypes.zip(oldValueParameters).map { + pair -> + val (newType, oldParameter) = pair + ValueParameterDescriptorImpl( + newOwner, + null, + oldParameter.getIndex(), + oldParameter.getAnnotations(), + oldParameter.getName(), + newType, + oldParameter.declaresDefaultValue(), + if (oldParameter.getVarargElementType() != null) newOwner.module.builtIns.getArrayElementType(newType) else null, + oldParameter.getSource() + ) + } +} diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhacement/signatureEnhancement.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhacement/signatureEnhancement.kt index 0e0c87d1f2b..fdce10f2176 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhacement/signatureEnhancement.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhacement/signatureEnhancement.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.load.java.typeEnhacement import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor +import org.jetbrains.kotlin.descriptors.ParameterDescriptor import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl @@ -38,78 +39,41 @@ private fun D.enhance(): D { val enhancedReceiverType = if (getExtensionReceiverParameter() != null) - parts { it.getExtensionReceiverParameter()!!.toPart() }.enhance() + parts(isCovariant = false) { it.getExtensionReceiverParameter()!!.getType() }.enhance() else null - val enhancedValueParameters = getValueParameters().map { - p -> parts { it.getValueParameters()[p.getIndex()]!!.toPart() }.enhance() + val enhancedValueParametersTypes = getValueParameters().map { + p -> parts(isCovariant = false) { it.getValueParameters()[p.getIndex()].getType() }.enhance() } - val enhancedReturnType = parts { it.getReturnType()!!.toReturnTypePart() }.enhance() + val enhancedReturnType = parts(isCovariant = true) { it.getReturnType()!! }.enhance() if (this is JavaCallableMemberDescriptor) { @suppress("UNCHECKED_CAST") - return this.enhance(enhancedReceiverType, enhancedValueParameters, enhancedReturnType) as D + return this.enhance(enhancedReceiverType, enhancedValueParametersTypes, enhancedReturnType) as D } return this } -fun > SignatureParts.enhance(): T { - val qualifiers = fromOverride.type.computeIndexedQualifiersForOverride(this.fromOverridden.map { it.type }, fromOverride.isCovariant) - return fromOverride.replaceType(fromOverride.type.enhance(qualifiers)) -} - -class SignatureParts>( - val fromOverride: P, - val fromOverridden: Collection

-) - -interface SignaturePart { +private class SignatureParts( + val fromOverride: JetType, + val fromOverridden: Collection, val isCovariant: Boolean - get() = false - - val type: JetType - - fun replaceType(newType: JetType): T +) { + fun enhance(): JetType { + val qualifiers = fromOverride.computeIndexedQualifiersForOverride(this.fromOverridden, isCovariant) + return fromOverride.enhance(qualifiers) + } } -private fun ReceiverParameterDescriptor.toPart() = object : SignaturePart { - override val type = this@toPart.getType() // workaround for KT-7557 - - override fun replaceType(newType: JetType) = newType -} - -private fun ValueParameterDescriptor.toPart() = object : SignaturePart { - override val type = this@toPart.getType() // workaround for KT-7557 - - override fun replaceType(newType: JetType) = ValueParameterDescriptorImpl( - getContainingDeclaration(), - null, - getIndex(), - getAnnotations(), - getName(), - newType, - declaresDefaultValue(), - if (getVarargElementType() != null) KotlinBuiltIns.getInstance().getArrayElementType(newType) else null, - getSource() - ) -} - -private fun JetType.toReturnTypePart() = object : SignaturePart { - override val type = this@toReturnTypePart - - override val isCovariant: Boolean = true - - override fun replaceType(newType: JetType) = newType -} - -private fun > D.parts(collector: (D) -> P): SignatureParts { +private fun D.parts(isCovariant: Boolean, collector: (D) -> JetType): SignatureParts { return SignatureParts( collector(this), this.getOverriddenDescriptors().map { @suppress("UNCHECKED_CAST") collector(it as D) - } + }, + isCovariant ) } \ No newline at end of file