From 291f0e57d1f02bfc282ea7c8ad8145cefe402f54 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 29 Oct 2015 18:51:24 +0300 Subject: [PATCH] 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. --- .../kotlin/codegen/state/JetTypeMapper.java | 14 +++++------ .../synthetic/SamAdapterFunctionsScope.kt | 6 +++-- .../descriptors/JavaMethodDescriptor.java | 2 +- .../descriptors/JavaPropertyDescriptor.java | 2 ++ .../descriptors/LazyJavaClassMemberScope.kt | 6 ++++- .../descriptors/FunctionDescriptor.java | 4 ++++ .../impl/FunctionDescriptorImpl.java | 23 +++++++++++++++++-- .../impl/PropertyAccessorDescriptorImpl.java | 12 ++++++++++ .../impl/PropertyDescriptorImpl.java | 17 ++++++++++++-- .../impl/SimpleFunctionDescriptorImpl.java | 4 ++-- 10 files changed, 72 insertions(+), 18 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java index 8e81c1c1e5d..be4cd3bab11 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java @@ -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.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()); } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt index b9f687a33f1..8375783c0ca 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt @@ -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) { diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java index 07cfc5c3f17..5747d2940eb 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaMethodDescriptor.java @@ -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; diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java index 0aa15d5937d..41bf42e8ebe 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/descriptors/JavaPropertyDescriptor.java @@ -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)); } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt index 6caf99b3046..efda8105e7c 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt @@ -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) } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java index 320fb1a4331..257a5778c14 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java @@ -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 getOverriddenDescriptors(); + @Nullable + FunctionDescriptor getInitialSignatureDescriptor(); + @NotNull @Override FunctionDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java index 995f4e89878..207b6277760 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java @@ -50,6 +50,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo private final Set 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; + } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyAccessorDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyAccessorDescriptorImpl.java index fbd1571d4ea..71cb0e98686 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyAccessorDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyAccessorDescriptorImpl.java @@ -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; + } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java index 08c4a1dc8d3..008aa17ab61 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyDescriptorImpl.java @@ -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 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, diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SimpleFunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SimpleFunctionDescriptorImpl.java index 669f6b8d492..565c0e7fd2c 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SimpleFunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/SimpleFunctionDescriptorImpl.java @@ -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); } }