From f4ffbd3360baae896afab0dc2adf62726c08522a Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Mon, 6 Feb 2012 20:51:25 +0400 Subject: [PATCH] properly rewrite *Descriptor owner in FunctionDescriptorImpl.copy() --- .../ConstructorDescriptorImpl.java | 7 ++-- .../descriptors/FunctionDescriptorImpl.java | 13 ++++--- .../NamedFunctionDescriptorImpl.java | 35 +++++++++---------- .../VariableAsFunctionDescriptor.java | 4 +-- .../calls/ExpressionAsFunctionDescriptor.java | 2 +- .../NamedFunctionDescriptorErrorImpl.java | 2 +- 6 files changed, 34 insertions(+), 29 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ConstructorDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ConstructorDescriptorImpl.java index 014da666a95..01a44fa52d5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ConstructorDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ConstructorDescriptorImpl.java @@ -23,8 +23,8 @@ public class ConstructorDescriptorImpl extends FunctionDescriptorImpl implements this.isPrimary = isPrimary; } - public ConstructorDescriptorImpl(@NotNull ConstructorDescriptor original, @NotNull List annotations, boolean isPrimary) { - super(original.getContainingDeclaration(), original, annotations, ""); + public ConstructorDescriptorImpl(@NotNull ClassDescriptor containingDeclaration, @NotNull ConstructorDescriptor original, @NotNull List annotations, boolean isPrimary) { + super(containingDeclaration, original, annotations, ""); this.isPrimary = isPrimary; } @@ -85,8 +85,9 @@ public class ConstructorDescriptorImpl extends FunctionDescriptorImpl implements } @Override - protected FunctionDescriptorImpl createSubstitutedCopy() { + protected FunctionDescriptorImpl createSubstitutedCopy(DeclarationDescriptor newOwner, boolean preserveOriginal) { return new ConstructorDescriptorImpl( + (ClassDescriptor) newOwner, this, Collections.emptyList(), // TODO isPrimary); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java index 6f2129a2d7b..6d63fb91719 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java @@ -135,7 +135,12 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorImpl i if (originalSubstitutor.isEmpty()) { return this; } - FunctionDescriptorImpl substitutedDescriptor = createSubstitutedCopy(); + return doSubstitute(originalSubstitutor, getContainingDeclaration(), modality, true); + } + + protected FunctionDescriptor doSubstitute(TypeSubstitutor originalSubstitutor, + DeclarationDescriptor newOwner, Modality newModality, boolean preserveOriginal) { + FunctionDescriptorImpl substitutedDescriptor = createSubstitutedCopy(newOwner, preserveOriginal); List substitutedTypeParameters = Lists.newArrayList(); TypeSubstitutor substitutor = DescriptorSubstitutor.substituteTypeParameters(getTypeParameters(), originalSubstitutor, substitutedDescriptor, substitutedTypeParameters); @@ -147,7 +152,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorImpl i return null; } } - + ReceiverDescriptor substitutedExpectedThis = NO_RECEIVER; if (expectedThisObject.exists()) { JetType substitutedType = substitutor.substitute(expectedThisObject.getType(), Variance.INVARIANT); @@ -173,7 +178,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorImpl i substitutedTypeParameters, substitutedValueParameters, substitutedReturnType, - modality, + newModality, visibility ); for (FunctionDescriptor overriddenFunction : overriddenFunctions) { @@ -182,7 +187,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorImpl i return substitutedDescriptor; } - protected abstract FunctionDescriptorImpl createSubstitutedCopy(); + protected abstract FunctionDescriptorImpl createSubstitutedCopy(DeclarationDescriptor newOwner, boolean preserveOriginal); @Override public R accept(DeclarationDescriptorVisitor visitor, D data) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamedFunctionDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamedFunctionDescriptorImpl.java index 3119d586fbe..9e8b89c41bc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamedFunctionDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamedFunctionDescriptorImpl.java @@ -4,6 +4,7 @@ import com.google.common.collect.Lists; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.resolve.DescriptorUtils; +import org.jetbrains.jet.lang.types.TypeSubstitutor; import java.util.List; @@ -27,28 +28,26 @@ public class NamedFunctionDescriptorImpl extends FunctionDescriptorImpl implemen } @Override - protected FunctionDescriptorImpl createSubstitutedCopy() { - return new NamedFunctionDescriptorImpl( - getContainingDeclaration(), - this, - // TODO : safeSubstitute - getAnnotations(), - getName()); + protected FunctionDescriptorImpl createSubstitutedCopy(DeclarationDescriptor newOwner, boolean preserveOriginal) { + if (preserveOriginal) { + return new NamedFunctionDescriptorImpl( + newOwner, + getOriginal(), + // TODO : safeSubstitute + getAnnotations(), + getName()); + } else { + return new NamedFunctionDescriptorImpl( + newOwner, + // TODO : safeSubstitute + getAnnotations(), + getName()); + } } @NotNull @Override public NamedFunctionDescriptor copy(DeclarationDescriptor newOwner, boolean makeNonAbstract) { - NamedFunctionDescriptorImpl copy = new NamedFunctionDescriptorImpl(newOwner, Lists.newArrayList(getAnnotations()), getName()); - copy.initialize( - getReceiverParameter().exists() ? getReceiverParameter().getType() : null, - expectedThisObject, - DescriptorUtils.copyTypeParameters(copy, typeParameters), - DescriptorUtils.copyValueParameters(copy, unsubstitutedValueParameters), - unsubstitutedReturnType, - DescriptorUtils.convertModality(modality, makeNonAbstract), - visibility - ); - return copy; + return (NamedFunctionDescriptor) doSubstitute(TypeSubstitutor.EMPTY, newOwner, DescriptorUtils.convertModality(modality, makeNonAbstract), false); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/VariableAsFunctionDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/VariableAsFunctionDescriptor.java index 744bb7729f0..a17dae91e33 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/VariableAsFunctionDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/VariableAsFunctionDescriptor.java @@ -36,7 +36,7 @@ public class VariableAsFunctionDescriptor extends FunctionDescriptorImpl { } @Override - protected FunctionDescriptorImpl createSubstitutedCopy() { + protected FunctionDescriptorImpl createSubstitutedCopy(DeclarationDescriptor newOwner, boolean preserveOriginal) { throw new IllegalStateException(); } -} \ No newline at end of file +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ExpressionAsFunctionDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ExpressionAsFunctionDescriptor.java index 9b38282eb41..c9fb9a3062d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ExpressionAsFunctionDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ExpressionAsFunctionDescriptor.java @@ -20,7 +20,7 @@ public class ExpressionAsFunctionDescriptor extends FunctionDescriptorImpl { } @Override - protected FunctionDescriptorImpl createSubstitutedCopy() { + protected FunctionDescriptorImpl createSubstitutedCopy(DeclarationDescriptor newOwner, boolean preserveOriginal) { throw new IllegalStateException(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/error/NamedFunctionDescriptorErrorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/error/NamedFunctionDescriptorErrorImpl.java index 4ebb4249b98..a831b6cf766 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/error/NamedFunctionDescriptorErrorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/error/NamedFunctionDescriptorErrorImpl.java @@ -25,7 +25,7 @@ public class NamedFunctionDescriptorErrorImpl extends NamedFunctionDescriptorImp } @Override - protected FunctionDescriptorImpl createSubstitutedCopy() { + protected FunctionDescriptorImpl createSubstitutedCopy(DeclarationDescriptor newOwner, boolean preserveOriginal) { return this; }