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:
+1
-1
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
+2
-2
@@ -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()
|
||||
|
||||
+2
-2
@@ -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()
|
||||
|
||||
+1
-1
@@ -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()
|
||||
)
|
||||
}
|
||||
}
|
||||
+17
-53
@@ -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
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user