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..8d82db88eff 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) { 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..671e99bdd38 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); + } + + protected FunctionDescriptor doSubstitute(TypeSubstitutor originalSubstitutor, + DeclarationDescriptor newOwner, Modality newModality) { + FunctionDescriptorImpl substitutedDescriptor = createSubstitutedCopy(newOwner); 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); @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 2bcd2613d4c..c6e5a87d2e8 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,9 +28,9 @@ public class NamedFunctionDescriptorImpl extends FunctionDescriptorImpl implemen } @Override - protected FunctionDescriptorImpl createSubstitutedCopy() { + protected FunctionDescriptorImpl createSubstitutedCopy(DeclarationDescriptor newOwner) { return new NamedFunctionDescriptorImpl( - getContainingDeclaration(), + newOwner, this, // TODO : safeSubstitute getAnnotations(), @@ -39,16 +40,6 @@ public class NamedFunctionDescriptorImpl extends FunctionDescriptorImpl implemen @NotNull @Override public NamedFunctionDescriptor copy(DeclarationDescriptor newOwner, boolean makeNonAbstract) { - NamedFunctionDescriptorImpl copy = new NamedFunctionDescriptorImpl(newOwner, getOriginal(), 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)); } } 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..f2a3a4b816e 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) { 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..1ccd711ff15 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) { 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..b3e07225c1d 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) { return this; }