From f6c4ec153336c2e46383631929793264c0be4654 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 6 Jul 2015 15:34:23 +0300 Subject: [PATCH] Move creation of enhanced ValueParameterDescriptor to JavaCallableMemberDescriptor It's needed because new parameter owner is not created while enhacing types (It was containing declaration of old value parameter that is wrong) Also simplified SignatureParts' logic: `replaceType` is always an identity function --- .../JavaCallableMemberDescriptor.java | 2 +- .../JavaConstructorDescriptor.java | 4 +- .../descriptors/JavaMethodDescriptor.java | 4 +- .../descriptors/JavaPropertyDescriptor.java | 2 +- .../kotlin/load/java/descriptors/util.kt | 50 +++++++++++++ .../typeEnhacement/signatureEnhancement.kt | 70 +++++-------------- 6 files changed, 73 insertions(+), 59 deletions(-) create mode 100644 core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/util.kt 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