Fix substition of inner classes constructors

It should have substituted class as containing declaration
This commit is contained in:
Denis Zharkov
2015-11-05 20:39:36 +03:00
parent c5103f9ac4
commit c57dbcc602
5 changed files with 34 additions and 4 deletions
@@ -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),
@@ -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();
}
@@ -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, D> R accept(DeclarationDescriptorVisitor<R, D> 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
);
}
}
@@ -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;
}
@@ -157,7 +157,9 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor {
Collection<ConstructorDescriptor> originalConstructors = original.getConstructors();
Collection<ConstructorDescriptor> result = new ArrayList<ConstructorDescriptor>(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;
}