Introduce FunctionDescriptor.initialSignatureDescriptor
Mostly it's needed for backend to extract descriptor with initial signature
For example:
class A implements CharSequence {
char charAt(int index) {}
}
We see `charAt` this method as `fun get(index: Int): Char`, but in backend it
matters what signature had this descriptor before.
This commit is contained in:
@@ -42,7 +42,6 @@ import org.jetbrains.kotlin.load.java.SpecialBuiltinMembers;
|
||||
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor;
|
||||
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor;
|
||||
import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaPackageScope;
|
||||
import org.jetbrains.kotlin.load.java.sources.JavaSourceElement;
|
||||
import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackageFragmentProvider;
|
||||
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache;
|
||||
import org.jetbrains.kotlin.name.*;
|
||||
@@ -955,15 +954,14 @@ public class JetTypeMapper {
|
||||
|
||||
@NotNull
|
||||
public JvmMethodSignature mapSignature(@NotNull FunctionDescriptor f, @NotNull OwnerKind kind) {
|
||||
if (f.getOriginal().getSource() instanceof JavaSourceElement) {
|
||||
FunctionDescriptor overridden = SpecialBuiltinMembers.<FunctionDescriptor>getOverriddenBuiltinWithDifferentJvmDescriptor(f);
|
||||
if (overridden != null
|
||||
&& !SpecialBuiltinMembers.hasRealKotlinSuperClassWithOverrideOf(
|
||||
(ClassDescriptor) f.getContainingDeclaration(), overridden)
|
||||
) {
|
||||
return mapSignature(overridden, kind, overridden.getValueParameters());
|
||||
if (f.getInitialSignatureDescriptor() != null && f != f.getInitialSignatureDescriptor()) {
|
||||
// Overrides of special builtin in Kotlin classes always have special signature
|
||||
if (SpecialBuiltinMembers.getOverriddenBuiltinWithDifferentJvmDescriptor(f) == null ||
|
||||
f.getContainingDeclaration().getOriginal() instanceof JavaClassDescriptor) {
|
||||
return mapSignature(f.getInitialSignatureDescriptor(), kind);
|
||||
}
|
||||
}
|
||||
|
||||
if (f instanceof ConstructorDescriptor) {
|
||||
return mapSignature(f, kind, f.getOriginal().getValueParameters());
|
||||
}
|
||||
|
||||
+4
-2
@@ -173,12 +173,14 @@ class SamAdapterFunctionsScope(storageManager: StorageManager) : BaseImportingSc
|
||||
newExtensionReceiverParameterType: KotlinType?,
|
||||
newReturnType: KotlinType,
|
||||
name: Name?,
|
||||
preserveSource: Boolean
|
||||
preserveSource: Boolean,
|
||||
signatureChange: Boolean
|
||||
): FunctionDescriptor? {
|
||||
val descriptor = super.doSubstitute(
|
||||
originalSubstitutor, newOwner, newModality, newVisibility,
|
||||
newIsOperator, newIsInfix, newIsExternal, newIsInline, newIsTailrec, original,
|
||||
copyOverrides, kind, newValueParameterDescriptors, newExtensionReceiverParameterType, newReturnType, name, preserveSource)
|
||||
copyOverrides, kind, newValueParameterDescriptors, newExtensionReceiverParameterType, newReturnType, name,
|
||||
preserveSource, signatureChange)
|
||||
as MyFunctionDescriptor? ?: return null
|
||||
|
||||
if (original == null) {
|
||||
|
||||
+1
-1
@@ -147,7 +147,7 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement
|
||||
isOperator(), isInfix(), isExternal(), isInline(), isTailrec(), getOriginal(),
|
||||
/* copyOverrides = */ true, getKind(),
|
||||
enhancedValueParameters, enhancedReceiverType, enhancedReturnType,
|
||||
null, false);
|
||||
null, /* preserveSource */false, /* signatureChange = */ false);
|
||||
|
||||
assert enhancedMethod != null : "null after substitution while enhancing " + toString();
|
||||
return enhancedMethod;
|
||||
|
||||
+2
@@ -77,6 +77,7 @@ public class JavaPropertyDescriptor extends PropertyDescriptorImpl implements Ja
|
||||
newGetter = new PropertyGetterDescriptorImpl(
|
||||
enhanced, getter.getAnnotations(), getter.getModality(), getter.getVisibility(),
|
||||
getter.hasBody(), getter.isDefault(), getter.isExternal(), getKind(), getter, getter.getSource());
|
||||
newGetter.setInitialSignatureDescriptor(getter.getInitialSignatureDescriptor());
|
||||
newGetter.initialize(enhancedReturnType);
|
||||
}
|
||||
|
||||
@@ -86,6 +87,7 @@ public class JavaPropertyDescriptor extends PropertyDescriptorImpl implements Ja
|
||||
newSetter = new PropertySetterDescriptorImpl(
|
||||
enhanced, setter.getAnnotations(), setter.getModality(), setter.getVisibility(),
|
||||
setter.hasBody(), setter.isDefault(), setter.isExternal(), getKind(), setter, setter.getSource());
|
||||
newSetter.setInitialSignatureDescriptor(newSetter.getInitialSignatureDescriptor());
|
||||
newSetter.initialize(setter.getValueParameters().get(0));
|
||||
}
|
||||
|
||||
|
||||
+5
-1
@@ -396,12 +396,16 @@ public class LazyJavaClassMemberScope(
|
||||
propertyDescriptor, getterMethod.annotations, /* isDefault = */false,
|
||||
/* isExternal = */ false, getterMethod.source
|
||||
).apply {
|
||||
initialSignatureDescriptor = getterMethod
|
||||
initialize(propertyDescriptor.type)
|
||||
}
|
||||
|
||||
val setter = setterMethod?.let { setterMethod ->
|
||||
DescriptorFactory.createSetter(propertyDescriptor, setterMethod.annotations, /* isDefault = */false,
|
||||
/* isExternal = */ false, setterMethod.visibility, setterMethod.source)
|
||||
/* isExternal = */ false, setterMethod.visibility, setterMethod.source
|
||||
).apply {
|
||||
initialSignatureDescriptor = setterMethod
|
||||
}
|
||||
}
|
||||
|
||||
return propertyDescriptor.apply { initialize(getter, setter) }
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package org.jetbrains.kotlin.descriptors;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.kotlin.types.TypeSubstitutor;
|
||||
|
||||
import java.util.Collection;
|
||||
@@ -38,6 +39,9 @@ public interface FunctionDescriptor extends CallableMemberDescriptor {
|
||||
@NotNull
|
||||
Collection<? extends FunctionDescriptor> getOverriddenDescriptors();
|
||||
|
||||
@Nullable
|
||||
FunctionDescriptor getInitialSignatureDescriptor();
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
FunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides);
|
||||
|
||||
+21
-2
@@ -50,6 +50,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
|
||||
private final Set<FunctionDescriptor> overriddenFunctions = SmartSet.create();
|
||||
private final FunctionDescriptor original;
|
||||
private final Kind kind;
|
||||
@Nullable
|
||||
private FunctionDescriptor initialSignatureDescriptor = null;
|
||||
|
||||
protected FunctionDescriptorImpl(
|
||||
@NotNull DeclarationDescriptor containingDeclaration,
|
||||
@@ -271,7 +273,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
|
||||
return doSubstitute(originalSubstitutor,
|
||||
newOwner, newModality, newVisibility, isOperator, isInfix, isExternal, isInline, isTailrec, original, copyOverrides, kind,
|
||||
getValueParameters(), getExtensionReceiverParameterType(), getReturnType(),
|
||||
null, false);
|
||||
null, /* preserveSource = */ false, /* signatureChange */ false);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@@ -299,7 +301,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
|
||||
@Nullable KotlinType newExtensionReceiverParameterType,
|
||||
@NotNull KotlinType newReturnType,
|
||||
@Nullable Name name,
|
||||
boolean preserveSource
|
||||
boolean preserveSource,
|
||||
boolean signatureChange
|
||||
) {
|
||||
FunctionDescriptorImpl substitutedDescriptor = createSubstitutedCopy(newOwner, original, kind, name, preserveSource);
|
||||
|
||||
@@ -362,6 +365,12 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
|
||||
substitutedDescriptor.setInline(isInline);
|
||||
substitutedDescriptor.setTailrec(isTailrec);
|
||||
|
||||
if (signatureChange || getInitialSignatureDescriptor() != null) {
|
||||
FunctionDescriptor initialSignature = (getInitialSignatureDescriptor() != null ? getInitialSignatureDescriptor() : this);
|
||||
FunctionDescriptor initialSignatureSubstituted = initialSignature.substitute(substitutor);
|
||||
substitutedDescriptor.setInitialSignatureDescriptor(initialSignatureSubstituted);
|
||||
}
|
||||
|
||||
if (copyOverrides) {
|
||||
for (FunctionDescriptor overriddenFunction : overriddenFunctions) {
|
||||
substitutedDescriptor.addOverriddenDescriptor(overriddenFunction.substitute(substitutor));
|
||||
@@ -424,4 +433,14 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public FunctionDescriptor getInitialSignatureDescriptor() {
|
||||
return initialSignatureDescriptor;
|
||||
}
|
||||
|
||||
public void setInitialSignatureDescriptor(@Nullable FunctionDescriptor initialSignatureDescriptor) {
|
||||
this.initialSignatureDescriptor = initialSignatureDescriptor;
|
||||
}
|
||||
}
|
||||
|
||||
+12
@@ -37,6 +37,8 @@ public abstract class PropertyAccessorDescriptorImpl extends DeclarationDescript
|
||||
private final PropertyDescriptor correspondingProperty;
|
||||
private final Kind kind;
|
||||
private Visibility visibility;
|
||||
@Nullable
|
||||
private FunctionDescriptor initialSignatureDescriptor = null;
|
||||
|
||||
public PropertyAccessorDescriptorImpl(
|
||||
@NotNull Modality modality,
|
||||
@@ -189,4 +191,14 @@ public abstract class PropertyAccessorDescriptorImpl extends DeclarationDescript
|
||||
@NotNull
|
||||
@Override
|
||||
public abstract PropertyAccessorDescriptor getOriginal();
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public FunctionDescriptor getInitialSignatureDescriptor() {
|
||||
return initialSignatureDescriptor;
|
||||
}
|
||||
|
||||
public void setInitialSignatureDescriptor(@Nullable FunctionDescriptor initialSignatureDescriptor) {
|
||||
this.initialSignatureDescriptor = initialSignatureDescriptor;
|
||||
}
|
||||
}
|
||||
|
||||
+15
-2
@@ -257,15 +257,18 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
|
||||
|
||||
PropertyGetterDescriptorImpl newGetter = getter == null ? null : new PropertyGetterDescriptorImpl(
|
||||
substitutedDescriptor, getter.getAnnotations(), newModality, getter.getVisibility(),
|
||||
getter.hasBody(), getter.isDefault(), getter.isExternal(), kind, original == null ? null : original.getGetter(), SourceElement.NO_SOURCE
|
||||
getter.hasBody(), getter.isDefault(), getter.isExternal(), kind, original == null ? null : original.getGetter(),
|
||||
SourceElement.NO_SOURCE
|
||||
);
|
||||
if (newGetter != null) {
|
||||
KotlinType returnType = getter.getReturnType();
|
||||
newGetter.setInitialSignatureDescriptor(getSubstitutedInitialSignatureDescriptor(substitutor, getter));
|
||||
newGetter.initialize(returnType != null ? substitutor.substitute(returnType, Variance.OUT_VARIANCE) : null);
|
||||
}
|
||||
PropertySetterDescriptorImpl newSetter = setter == null ? null : new PropertySetterDescriptorImpl(
|
||||
substitutedDescriptor, setter.getAnnotations(), newModality, setter.getVisibility(),
|
||||
setter.hasBody(), setter.isDefault(), setter.isExternal(), kind, original == null ? null : original.getSetter(), SourceElement.NO_SOURCE
|
||||
setter.hasBody(), setter.isDefault(), setter.isExternal(), kind, original == null ? null : original.getSetter(),
|
||||
SourceElement.NO_SOURCE
|
||||
);
|
||||
if (newSetter != null) {
|
||||
List<ValueParameterDescriptor> substitutedValueParameters = FunctionDescriptorImpl.getSubstitutedValueParameters(
|
||||
@@ -285,6 +288,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
|
||||
if (substitutedValueParameters.size() != 1) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
newSetter.setInitialSignatureDescriptor(getSubstitutedInitialSignatureDescriptor(substitutor, setter));
|
||||
newSetter.initialize(substitutedValueParameters.get(0));
|
||||
}
|
||||
|
||||
@@ -299,6 +303,15 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
|
||||
return substitutedDescriptor;
|
||||
}
|
||||
|
||||
private static FunctionDescriptor getSubstitutedInitialSignatureDescriptor(
|
||||
@NotNull TypeSubstitutor substitutor,
|
||||
@NotNull PropertyAccessorDescriptor accessorDescriptor
|
||||
) {
|
||||
return accessorDescriptor.getInitialSignatureDescriptor() != null
|
||||
? accessorDescriptor.getInitialSignatureDescriptor().substitute(substitutor)
|
||||
: null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
protected PropertyDescriptorImpl createSubstitutedCopy(
|
||||
@NotNull DeclarationDescriptor newOwner,
|
||||
|
||||
+2
-2
@@ -115,7 +115,7 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
|
||||
TypeSubstitutor.EMPTY, getContainingDeclaration(), getModality(), getVisibility(),
|
||||
isOperator(), isInfix(), isExternal(), isInline(), isTailrec(),
|
||||
null, /* copyOverrides = */ true, getKind(), getValueParameters(), getExtensionReceiverParameterType(), getReturnType(), name,
|
||||
/* preserveSource = */ true);
|
||||
/* preserveSource = */ true, /* signatureChange = */ true);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -126,6 +126,6 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
|
||||
TypeSubstitutor.EMPTY, getContainingDeclaration(), getModality(), getVisibility(),
|
||||
isOperator(), isInfix(), isExternal(), isInline(), isTailrec(),
|
||||
null, /* copyOverrides = */ true, getKind(), valueParameters, getExtensionReceiverParameterType(), getReturnType(), null,
|
||||
/* preserveSource = */ true);
|
||||
/* preserveSource = */ true, /* signatureChange = */ true);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user