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 8d82db88eff..014da666a95 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 ClassDescriptor containingDeclaration, @NotNull ConstructorDescriptor original, @NotNull List annotations, boolean isPrimary) { - super(containingDeclaration, original, annotations, ""); + public ConstructorDescriptorImpl(@NotNull ConstructorDescriptor original, @NotNull List annotations, boolean isPrimary) { + super(original.getContainingDeclaration(), original, annotations, ""); this.isPrimary = isPrimary; } @@ -85,9 +85,8 @@ public class ConstructorDescriptorImpl extends FunctionDescriptorImpl implements } @Override - protected FunctionDescriptorImpl createSubstitutedCopy(DeclarationDescriptor newOwner) { + protected FunctionDescriptorImpl createSubstitutedCopy() { 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 671e99bdd38..6f2129a2d7b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java @@ -135,12 +135,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorImpl i if (originalSubstitutor.isEmpty()) { return this; } - return doSubstitute(originalSubstitutor, getContainingDeclaration(), modality); - } - - protected FunctionDescriptor doSubstitute(TypeSubstitutor originalSubstitutor, - DeclarationDescriptor newOwner, Modality newModality) { - FunctionDescriptorImpl substitutedDescriptor = createSubstitutedCopy(newOwner); + FunctionDescriptorImpl substitutedDescriptor = createSubstitutedCopy(); List substitutedTypeParameters = Lists.newArrayList(); TypeSubstitutor substitutor = DescriptorSubstitutor.substituteTypeParameters(getTypeParameters(), originalSubstitutor, substitutedDescriptor, substitutedTypeParameters); @@ -152,7 +147,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); @@ -178,7 +173,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorImpl i substitutedTypeParameters, substitutedValueParameters, substitutedReturnType, - newModality, + modality, visibility ); for (FunctionDescriptor overriddenFunction : overriddenFunctions) { @@ -187,7 +182,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorImpl i return substitutedDescriptor; } - protected abstract FunctionDescriptorImpl createSubstitutedCopy(DeclarationDescriptor newOwner); + protected abstract FunctionDescriptorImpl createSubstitutedCopy(); @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 c6e5a87d2e8..2bcd2613d4c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamedFunctionDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamedFunctionDescriptorImpl.java @@ -4,7 +4,6 @@ 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; @@ -28,9 +27,9 @@ public class NamedFunctionDescriptorImpl extends FunctionDescriptorImpl implemen } @Override - protected FunctionDescriptorImpl createSubstitutedCopy(DeclarationDescriptor newOwner) { + protected FunctionDescriptorImpl createSubstitutedCopy() { return new NamedFunctionDescriptorImpl( - newOwner, + getContainingDeclaration(), this, // TODO : safeSubstitute getAnnotations(), @@ -40,6 +39,16 @@ public class NamedFunctionDescriptorImpl extends FunctionDescriptorImpl implemen @NotNull @Override public NamedFunctionDescriptor copy(DeclarationDescriptor newOwner, boolean makeNonAbstract) { - return (NamedFunctionDescriptor) doSubstitute(TypeSubstitutor.EMPTY, newOwner, DescriptorUtils.convertModality(modality, 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; } } 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 f2a3a4b816e..744bb7729f0 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(DeclarationDescriptor newOwner) { + protected FunctionDescriptorImpl createSubstitutedCopy() { 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 1ccd711ff15..9b38282eb41 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(DeclarationDescriptor newOwner) { + protected FunctionDescriptorImpl createSubstitutedCopy() { 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 b3e07225c1d..4ebb4249b98 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(DeclarationDescriptor newOwner) { + protected FunctionDescriptorImpl createSubstitutedCopy() { return this; }