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