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:
Denis Zharkov
2015-10-29 18:51:24 +03:00
parent 95d12260c1
commit 291f0e57d1
10 changed files with 72 additions and 18 deletions
@@ -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());
} }
@@ -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) {
@@ -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;
@@ -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));
} }
@@ -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);
@@ -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;
}
} }
@@ -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;
}
} }
@@ -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,
@@ -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);
} }
} }