From c57dbcc602c71ccf09f612a9175ad998ce42bc01 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 5 Nov 2015 20:39:36 +0300 Subject: [PATCH] Fix substition of inner classes constructors It should have substituted class as containing declaration --- .../codegen/AccessorForConstructorDescriptor.kt | 3 +++ .../kotlin/descriptors/ConstructorDescriptor.java | 15 +++++++++++++++ .../impl/ConstructorDescriptorImpl.java | 14 ++++++++++++-- .../descriptors/impl/FunctionDescriptorImpl.java | 2 +- .../impl/LazySubstitutingClassDescriptor.java | 4 +++- 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt index b4c6cd2418f..95b8ff049a7 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForConstructorDescriptor.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.TypeSubstitutor public class AccessorForConstructorDescriptor( private val calleeDescriptor: ConstructorDescriptor, @@ -38,6 +39,8 @@ public class AccessorForConstructorDescriptor( override fun getSuperCallTarget(): ClassDescriptor? = superCallTarget + override fun substitute(substitutor: TypeSubstitutor) = super.substitute(substitutor) as ConstructorDescriptor + init { initialize( DescriptorUtils.getReceiverParameterType(extensionReceiverParameter), diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ConstructorDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ConstructorDescriptor.java index 2fed0c495d6..3cad1a7af61 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ConstructorDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ConstructorDescriptor.java @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.descriptors; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.types.KotlinType; +import org.jetbrains.kotlin.types.TypeSubstitutor; import java.util.List; @@ -39,6 +40,10 @@ public interface ConstructorDescriptor extends FunctionDescriptor { @Override ConstructorDescriptor getOriginal(); + @NotNull + @Override + ConstructorDescriptor substitute(@NotNull TypeSubstitutor substitutor); + /** * @return "<init>" -- name is not stored for constructors */ @@ -46,5 +51,15 @@ public interface ConstructorDescriptor extends FunctionDescriptor { @Override Name getName(); + @NotNull + @Override + ConstructorDescriptor copy( + DeclarationDescriptor newOwner, + Modality modality, + Visibility visibility, + Kind kind, + boolean copyOverrides + ); + boolean isPrimary(); } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ConstructorDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ConstructorDescriptorImpl.java index c342064c1d3..af8d11553d1 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ConstructorDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ConstructorDescriptorImpl.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.name.Name; +import org.jetbrains.kotlin.types.TypeSubstitutor; import java.util.Collection; import java.util.Collections; @@ -90,6 +91,12 @@ public class ConstructorDescriptorImpl extends FunctionDescriptorImpl implements return (ConstructorDescriptor) super.getOriginal(); } + @NotNull + @Override + public ConstructorDescriptor substitute(@NotNull TypeSubstitutor originalSubstitutor) { + return (ConstructorDescriptor) super.substitute(originalSubstitutor); + } + @Override public R accept(DeclarationDescriptorVisitor visitor, D data) { return visitor.visitConstructorDescriptor(this, data); @@ -126,7 +133,6 @@ public class ConstructorDescriptorImpl extends FunctionDescriptorImpl implements "newOwner: " + newOwner + "\n" + "kind: " + kind); } - assert original != null : "Attempt to create copy of constructor without preserving original: " + this; assert newName == null : "Attempt to rename constructor: " + this; return new ConstructorDescriptorImpl( (ClassDescriptor) newOwner, @@ -141,6 +147,10 @@ public class ConstructorDescriptorImpl extends FunctionDescriptorImpl implements @NotNull @Override public ConstructorDescriptor copy(DeclarationDescriptor newOwner, Modality modality, Visibility visibility, Kind kind, boolean copyOverrides) { - throw new UnsupportedOperationException("Constructors should not be copied for overriding"); + return (ConstructorDescriptor) doSubstitute( + TypeSubstitutor.EMPTY, newOwner, modality, visibility, + isOperator(), isInfix(), isExternal(), isInline(), isTailrec(), + null, copyOverrides, kind + ); } } 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 207b6277760..4851d7379d8 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java @@ -247,7 +247,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo } @Override - public final FunctionDescriptor substitute(@NotNull TypeSubstitutor originalSubstitutor) { + public FunctionDescriptor substitute(@NotNull TypeSubstitutor originalSubstitutor) { if (originalSubstitutor.isEmpty()) { return this; } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java index 25f8ee43ba4..4f99aebbfb0 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java @@ -157,7 +157,9 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor { Collection originalConstructors = original.getConstructors(); Collection result = new ArrayList(originalConstructors.size()); for (ConstructorDescriptor constructor : originalConstructors) { - result.add((ConstructorDescriptor) constructor.substitute(getSubstitutor())); + ConstructorDescriptor copy = + constructor.copy(this, constructor.getModality(), constructor.getVisibility(), constructor.getKind(), false); + result.add(copy.substitute(getSubstitutor())); } return result; }