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
This commit is contained in:
Denis Zharkov
2015-07-06 15:34:23 +03:00
parent 4710168c5a
commit f6c4ec1533
6 changed files with 73 additions and 59 deletions
@@ -28,7 +28,7 @@ public interface JavaCallableMemberDescriptor extends CallableMemberDescriptor {
@NotNull
JavaCallableMemberDescriptor enhance(
@Nullable JetType enhancedReceiverType,
@NotNull List<ValueParameterDescriptor> enhancedValueParameters,
@NotNull List<JetType> enhancedValueParametersTypes,
@NotNull JetType enhancedReturnType
);
}
@@ -97,7 +97,7 @@ public class JavaConstructorDescriptor extends ConstructorDescriptorImpl impleme
@NotNull
public JavaConstructorDescriptor enhance(
@Nullable JetType enhancedReceiverType,
@NotNull List<ValueParameterDescriptor> enhancedValueParameters,
@NotNull List<JetType> 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()
@@ -97,7 +97,7 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement
@NotNull
public JavaMethodDescriptor enhance(
@Nullable JetType enhancedReceiverType,
@NotNull List<ValueParameterDescriptor> enhancedValueParameters,
@NotNull List<JetType> 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()
@@ -47,7 +47,7 @@ public class JavaPropertyDescriptor extends PropertyDescriptorImpl implements Ja
@Override
public JavaCallableMemberDescriptor enhance(
@Nullable JetType enhancedReceiverType,
@NotNull List<ValueParameterDescriptor> enhancedValueParameters,
@NotNull List<JetType> enhancedValueParametersTypes,
@NotNull JetType enhancedReturnType
) {
JavaPropertyDescriptor enhanced = new JavaPropertyDescriptor(
@@ -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<JetType>,
oldValueParameters: Collection<ValueParameterDescriptor>,
newOwner: DeclarationDescriptor
): List<ValueParameterDescriptor> {
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()
)
}
}
@@ -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 : CallableMemberDescriptor> 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 <T, P : SignaturePart<T>> SignatureParts<T, P>.enhance(): T {
val qualifiers = fromOverride.type.computeIndexedQualifiersForOverride(this.fromOverridden.map { it.type }, fromOverride.isCovariant)
return fromOverride.replaceType(fromOverride.type.enhance(qualifiers))
}
class SignatureParts<T, P: SignaturePart<T>>(
val fromOverride: P,
val fromOverridden: Collection<P>
)
interface SignaturePart<out T> {
private class SignatureParts(
val fromOverride: JetType,
val fromOverridden: Collection<JetType>,
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<JetType> {
override val type = this@toPart.getType() // workaround for KT-7557
override fun replaceType(newType: JetType) = newType
}
private fun ValueParameterDescriptor.toPart() = object : SignaturePart<ValueParameterDescriptor> {
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<JetType> {
override val type = this@toReturnTypePart
override val isCovariant: Boolean = true
override fun replaceType(newType: JetType) = newType
}
private fun <D : CallableMemberDescriptor, T, P : SignaturePart<T>> D.parts(collector: (D) -> P): SignatureParts<T, P> {
private fun <D : CallableMemberDescriptor> D.parts(isCovariant: Boolean, collector: (D) -> JetType): SignatureParts {
return SignatureParts(
collector(this),
this.getOverriddenDescriptors().map {
@suppress("UNCHECKED_CAST")
collector(it as D)
}
},
isCovariant
)
}