From cb6fbe990a5268610bd2acf4c1d82935cb828fa3 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 12 Oct 2011 21:14:37 +0400 Subject: [PATCH] Callable descriptors store expected this object --- .../resolve/java/JavaDescriptorResolver.java | 3 ++ .../lang/descriptors/CallableDescriptor.java | 3 ++ .../ConstructorDescriptorImpl.java | 19 +++++++++-- .../descriptors/FunctionDescriptorImpl.java | 21 ++++++++++++ .../PropertyAccessorDescriptor.java | 13 ++++++++ .../lang/descriptors/PropertyDescriptor.java | 32 ++++++++++++++++--- .../descriptors/PropertyGetterDescriptor.java | 6 ---- .../descriptors/PropertySetterDescriptor.java | 7 ---- .../VariableAsFunctionDescriptor.java | 3 +- .../lang/descriptors/VariableDescriptor.java | 1 - .../descriptors/VariableDescriptorImpl.java | 6 ++++ .../lang/resolve/ClassDescriptorResolver.java | 4 +++ .../jet/lang/resolve/DescriptorUtils.java | 8 +---- .../jet/lang/resolve/calls/CallResolver.java | 2 +- .../jet/lang/resolve/calls/ResolvedCall.java | 10 ++---- .../lang/resolve/calls/TaskPrioritizer.java | 9 +++--- .../ValueArgumentsToParametersMapper.java | 2 +- .../scopes/receivers/ClassReceiver.java | 20 ++++++++++-- .../jet/lang/types/DataFlowInfo.java | 4 +++ .../jetbrains/jet/lang/types/ErrorUtils.java | 3 ++ .../jet/lang/types/JetTypeInferrer.java | 2 +- 21 files changed, 132 insertions(+), 46 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index c1f13019111..fc591498479 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -12,6 +12,7 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingTrace; +import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.types.*; import java.util.*; @@ -327,6 +328,7 @@ public class JavaDescriptorResolver { resolveVisibilityFromPsiModifiers(semanticServices.getTrace(), field), !isFinal, null, + DescriptorUtils.getExpectedThisObjectIfNeeded(containingDeclaration), field.getName(), isFinal ? null : type, type); @@ -401,6 +403,7 @@ public class JavaDescriptorResolver { methodDescriptorCache.put(method, functionDescriptorImpl); functionDescriptorImpl.initialize( null, + DescriptorUtils.getExpectedThisObjectIfNeeded(owner), resolveTypeParameters(functionDescriptorImpl, method.getTypeParameters()), semanticServices.getDescriptorResolver().resolveParameterDescriptors(functionDescriptorImpl, parameters), semanticServices.getTypeTransformer().transformToType(returnType), diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/CallableDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/CallableDescriptor.java index c69a68f4d69..4e78d2c81f5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/CallableDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/CallableDescriptor.java @@ -15,6 +15,9 @@ public interface CallableDescriptor extends DeclarationDescriptor { @NotNull ReceiverDescriptor getReceiverParameter(); + @NotNull + ReceiverDescriptor getExpectedThisObject(); + @NotNull List getTypeParameters(); 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 5afac7ed85c..084e5004cdf 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ConstructorDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ConstructorDescriptorImpl.java @@ -3,6 +3,8 @@ package org.jetbrains.jet.lang.descriptors; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; +import org.jetbrains.jet.lang.resolve.DescriptorUtils; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.JetType; import java.util.Collections; @@ -28,16 +30,27 @@ public class ConstructorDescriptorImpl extends FunctionDescriptorImpl implements @Override @Deprecated - public FunctionDescriptorImpl initialize(@Nullable JetType receiverType, @NotNull List typeParameters, @NotNull List unsubstitutedValueParameters, @Nullable JetType unsubstitutedReturnType, Modality modality, @NotNull Visibility visibility) { + public FunctionDescriptorImpl initialize(@Nullable JetType receiverType, @NotNull ReceiverDescriptor expectedThisObject, @NotNull List typeParameters, @NotNull List unsubstitutedValueParameters, @Nullable JetType unsubstitutedReturnType, Modality modality, @NotNull Visibility visibility) { assert receiverType == null; - return super.initialize(null, typeParameters, unsubstitutedValueParameters, unsubstitutedReturnType, modality, visibility); + return super.initialize(null, expectedThisObject, typeParameters, unsubstitutedValueParameters, unsubstitutedReturnType, modality, visibility); } public ConstructorDescriptorImpl initialize(@NotNull List typeParameters, @NotNull List unsubstitutedValueParameters, Modality modality, Visibility visibility) { - super.initialize(null, typeParameters, unsubstitutedValueParameters, null, modality, visibility); + super.initialize(null, getExpectedThisObject(getContainingDeclaration()), typeParameters, unsubstitutedValueParameters, null, modality, visibility); return this; } + @NotNull + private static ReceiverDescriptor getExpectedThisObject(@NotNull DeclarationDescriptor descriptor) { + if (descriptor instanceof ConstructorDescriptor) { + ConstructorDescriptor constructorDescriptor = (ConstructorDescriptor) descriptor; + ClassDescriptor classDescriptor = constructorDescriptor.getContainingDeclaration(); + return getExpectedThisObject(classDescriptor); + } + DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); + return DescriptorUtils.getExpectedThisObjectIfNeeded(containingDeclaration); + } + @NotNull @Override public ClassDescriptor getContainingDeclaration() { 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 21864c09dfa..70055e48e39 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java @@ -8,6 +8,7 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExtensionReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; +import org.jetbrains.jet.lang.resolve.scopes.receivers.TransientReceiver; import org.jetbrains.jet.lang.types.DescriptorSubstitutor; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.TypeSubstitutor; @@ -27,6 +28,7 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements private List unsubstitutedValueParameters; private JetType unsubstitutedReturnType; private ReceiverDescriptor receiver; + private ReceiverDescriptor expectedThisObject; private Modality modality; private Visibility visibility; @@ -51,6 +53,7 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements public FunctionDescriptorImpl initialize( @Nullable JetType receiverType, + @NotNull ReceiverDescriptor expectedThisObject, @NotNull List typeParameters, @NotNull List unsubstitutedValueParameters, @Nullable JetType unsubstitutedReturnType, @@ -62,6 +65,7 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements this.modality = modality; this.visibility = visibility; this.receiver = receiverType == null ? NO_RECEIVER : new ExtensionReceiver(this, receiverType); + this.expectedThisObject = expectedThisObject; return this; } @@ -75,6 +79,12 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements return receiver; } + @NotNull + @Override + public ReceiverDescriptor getExpectedThisObject() { + return expectedThisObject; + } + @NotNull @Override public Set getOverriddenDescriptors() { @@ -138,6 +148,15 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements return null; } } + + ReceiverDescriptor substitutedExpectedThis = NO_RECEIVER; + if (expectedThisObject.exists()) { + JetType substitutedType = substitutor.substitute(expectedThisObject.getType(), Variance.IN_VARIANCE); + if (substitutedType == null) { + return null; + } + substitutedExpectedThis = new TransientReceiver(substitutedType); + } List substitutedValueParameters = FunctionDescriptorUtil.getSubstitutedValueParameters(substitutedDescriptor, this, substitutor); if (substitutedValueParameters == null) { @@ -151,6 +170,7 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements substitutedDescriptor.initialize( substitutedReceiverType, + substitutedExpectedThis, substitutedTypeParameters, substitutedValueParameters, substitutedReturnType, @@ -182,6 +202,7 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements FunctionDescriptorImpl copy = new FunctionDescriptorImpl(newOwner, Lists.newArrayList(getAnnotations()), getName()); copy.initialize( getReceiverParameter().exists() ? getReceiverParameter().getType() : null, + expectedThisObject, DescriptorUtils.copyTypeParameters(copy, typeParameters), DescriptorUtils.copyValueParameters(copy, unsubstitutedValueParameters), unsubstitutedReturnType, diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java index 023a235c3d8..cf0a0c8be05 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyAccessorDescriptor.java @@ -2,6 +2,7 @@ package org.jetbrains.jet.lang.descriptors; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.TypeSubstitutor; import java.util.Collections; @@ -77,6 +78,18 @@ public abstract class PropertyAccessorDescriptor extends DeclarationDescriptorIm return correspondingProperty; } + @NotNull + @Override + public ReceiverDescriptor getReceiverParameter() { + return getCorrespondingProperty().getReceiverParameter(); + } + + @NotNull + @Override + public ReceiverDescriptor getExpectedThisObject() { + return getCorrespondingProperty().getExpectedThisObject(); + } + @NotNull @Override public PropertyAccessorDescriptor copy(DeclarationDescriptor newOwner, boolean makeNonAbstract) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java index 77582ab8e92..354979ecac9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyDescriptor.java @@ -8,6 +8,7 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExtensionReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; +import org.jetbrains.jet.lang.resolve.scopes.receivers.TransientReceiver; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.TypeSubstitutor; import org.jetbrains.jet.lang.types.Variance; @@ -24,6 +25,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab private final Visibility visibility; private final boolean isVar; private final ReceiverDescriptor receiver; + private final ReceiverDescriptor expectedThisObject; private final Set overriddenProperties = Sets.newLinkedHashSet(); private final List typeParemeters = Lists.newArrayListWithCapacity(0); private final PropertyDescriptor original; @@ -38,6 +40,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab @NotNull Visibility visibility, boolean isVar, @Nullable JetType receiverType, + @NotNull ReceiverDescriptor expectedThisObject, @NotNull String name, @Nullable JetType inType, @NotNull JetType outType) { @@ -48,6 +51,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab this.modality = modality; this.visibility = visibility; this.receiver = receiverType == null ? ReceiverDescriptor.NO_RECEIVER : new ExtensionReceiver(this, receiverType); + this.expectedThisObject = expectedThisObject; this.original = original == null ? this : original.getOriginal(); } @@ -58,15 +62,17 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab @NotNull Visibility visibility, boolean isVar, @Nullable JetType receiverType, + @NotNull ReceiverDescriptor expectedThisObject, @NotNull String name, @Nullable JetType inType, @NotNull JetType outType) { - this(null, containingDeclaration, annotations, modality, visibility, isVar, receiverType, name, inType, outType); + this(null, containingDeclaration, annotations, modality, visibility, isVar, receiverType, expectedThisObject, name, inType, outType); } private PropertyDescriptor( @NotNull PropertyDescriptor original, @Nullable JetType receiverType, + @NotNull ReceiverDescriptor expectedThisObject, @Nullable JetType inType, @NotNull JetType outType) { this( @@ -77,6 +83,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab original.getVisibility(), original.isVar, receiverType, + expectedThisObject, original.getName(), inType, outType); @@ -99,6 +106,12 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab return receiver; } + @NotNull + @Override + public ReceiverDescriptor getExpectedThisObject() { + return expectedThisObject; + } + @NotNull @Override public JetType getReturnType() { @@ -132,7 +145,6 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab return setter; } - @NotNull @Override public PropertyDescriptor substitute(TypeSubstitutor substitutor) { JetType originalInType = getInType(); @@ -142,9 +154,18 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab if (inType == null && outType == null) { return null; // TODO : tell the user that the property was projected out } + JetType substitutedReceiverType; + if (receiver.exists()) { + substitutedReceiverType = substitutor.substitute(receiver.getType(), Variance.IN_VARIANCE); + if (substitutedReceiverType == null) return null; + } + else { + substitutedReceiverType = null; + } return new PropertyDescriptor( this, - receiver.exists() ? substitutor.substitute(receiver.getType(), Variance.IN_VARIANCE) : null, + substitutedReceiverType, + expectedThisObject.exists() ? new TransientReceiver(substitutor.substitute(expectedThisObject.getType(), Variance.IN_VARIANCE)) : expectedThisObject, inType, outType ); @@ -171,6 +192,7 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab return overriddenProperties; } + @NotNull @Override public PropertyDescriptor copy(DeclarationDescriptor newOwner, boolean makeNonAbstract) { @@ -178,7 +200,9 @@ public class PropertyDescriptor extends VariableDescriptorImpl implements Callab newOwner, Lists.newArrayList(getAnnotations()), DescriptorUtils.convertModality(modality, makeNonAbstract), visibility, isVar, - receiver.exists() ? receiver.getType() : null, getName(), getInType(), getOutType()); + receiver.exists() ? receiver.getType() : null, + expectedThisObject, + getName(), getInType(), getOutType()); PropertyGetterDescriptor newGetter = getter == null ? null : new PropertyGetterDescriptor( propertyDescriptor, Lists.newArrayList(getter.getAnnotations()), DescriptorUtils.convertModality(getter.getModality(), makeNonAbstract), getter.getVisibility(), diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java index 6a1590cb807..01bde2bf062 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java @@ -33,12 +33,6 @@ public class PropertyGetterDescriptor extends PropertyAccessorDescriptor { overriddenGetters.add(overriddenGetter); } - @NotNull - @Override - public ReceiverDescriptor getReceiverParameter() { - return getCorrespondingProperty().getReceiverParameter(); - } - @NotNull @Override public List getValueParameters() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertySetterDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertySetterDescriptor.java index e6147696f67..d5f2038a282 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertySetterDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/PropertySetterDescriptor.java @@ -3,7 +3,6 @@ package org.jetbrains.jet.lang.descriptors; import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; -import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.JetStandardClasses; import org.jetbrains.jet.lang.types.JetType; @@ -42,12 +41,6 @@ public class PropertySetterDescriptor extends PropertyAccessorDescriptor { overriddenSetters.add(overriddenSetter); } - @NotNull - @Override - public ReceiverDescriptor getReceiverParameter() { - return getCorrespondingProperty().getReceiverParameter(); - } - @NotNull @Override public List getValueParameters() { 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 88462653cfc..25b713cd607 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/VariableAsFunctionDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/VariableAsFunctionDescriptor.java @@ -2,6 +2,7 @@ package org.jetbrains.jet.lang.descriptors; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.JetStandardClasses; import org.jetbrains.jet.lang.types.JetType; @@ -16,7 +17,7 @@ public class VariableAsFunctionDescriptor extends FunctionDescriptorImpl { assert outType != null; assert JetStandardClasses.isFunctionType(outType); VariableAsFunctionDescriptor result = new VariableAsFunctionDescriptor(variableDescriptor); - result.initialize(JetStandardClasses.getReceiverType(outType), Collections.emptyList(), JetStandardClasses.getValueParameters(result, outType), JetStandardClasses.getReturnType(outType), Modality.FINAL, Visibility.LOCAL); + result.initialize(JetStandardClasses.getReceiverType(outType), ReceiverDescriptor.NO_RECEIVER, Collections.emptyList(), JetStandardClasses.getValueParameters(result, outType), JetStandardClasses.getReturnType(outType), Modality.FINAL, Visibility.LOCAL); return result; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/VariableDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/VariableDescriptor.java index fc883d59508..4490b83fc96 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/VariableDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/VariableDescriptor.java @@ -26,7 +26,6 @@ public interface VariableDescriptor extends CallableDescriptor { @NotNull DeclarationDescriptor getContainingDeclaration(); - @NotNull @Override VariableDescriptor substitute(TypeSubstitutor substitutor); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/VariableDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/VariableDescriptorImpl.java index c18d8293a4b..6daefbce285 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/VariableDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/VariableDescriptorImpl.java @@ -78,6 +78,12 @@ public abstract class VariableDescriptorImpl extends DeclarationDescriptorImpl i return ReceiverDescriptor.NO_RECEIVER; } + @NotNull + @Override + public ReceiverDescriptor getExpectedThisObject() { + return ReceiverDescriptor.NO_RECEIVER; + } + @NotNull @Override public JetType getReturnType() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java index 49f3ab24bc3..9e719980f40 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java @@ -195,6 +195,7 @@ public class ClassDescriptorResolver { Visibility visibility = resolveVisibilityFromModifiers(function.getModifierList()); functionDescriptor.initialize( receiverType, + DescriptorUtils.getExpectedThisObjectIfNeeded(containingDescriptor), typeParameterDescriptors, valueParameterDescriptors, returnType, @@ -438,6 +439,7 @@ public class ClassDescriptorResolver { resolveVisibilityFromModifiers(objectDeclaration.getModifierList()), false, null, + DescriptorUtils.getExpectedThisObjectIfNeeded(containingDeclaration), JetPsiUtil.safeName(objectDeclaration.getName()), null, classDescriptor.getDefaultType()); @@ -490,6 +492,7 @@ public class ClassDescriptorResolver { resolveVisibilityFromModifiers(property.getModifierList()), isVar, receiverType, + DescriptorUtils.getExpectedThisObjectIfNeeded(containingDeclaration), JetPsiUtil.safeName(property.getName()), isVar ? type : null, type); @@ -761,6 +764,7 @@ public class ClassDescriptorResolver { resolveVisibilityFromModifiers(parameter.getModifierList()), isMutable, null, + DescriptorUtils.getExpectedThisObjectIfNeeded(classDescriptor), name == null ? "" : name, isMutable ? type : null, type); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java index 48dd916e6c7..ba492a83cde 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java @@ -116,13 +116,7 @@ public class DescriptorUtils { } @NotNull - public static ReceiverDescriptor getExpectedThisObject(@NotNull DeclarationDescriptor descriptor) { - if (descriptor instanceof ConstructorDescriptor) { - ConstructorDescriptor constructorDescriptor = (ConstructorDescriptor) descriptor; - ClassDescriptor classDescriptor = constructorDescriptor.getContainingDeclaration(); - return getExpectedThisObject(classDescriptor); - } - DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); + public static ReceiverDescriptor getExpectedThisObjectIfNeeded(@NotNull DeclarationDescriptor containingDeclaration) { if (containingDeclaration instanceof ClassDescriptor) { ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration; return classDescriptor.getImplicitReceiver(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index f63b861f707..382a2debb12 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -557,7 +557,7 @@ public class CallResolver { boolean result = checkValueArgumentTypes(scope, candidateCall); result &= checkReceiver(tracing, candidateCall, candidateCall.getResultingDescriptor().getReceiverParameter(), candidateCall.getReceiverArgument(), task); - result &= checkReceiver(tracing, candidateCall, DescriptorUtils.getExpectedThisObject(candidateCall.getResultingDescriptor()), candidateCall.getThisObject(), task); + result &= checkReceiver(tracing, candidateCall, candidateCall.getResultingDescriptor().getExpectedThisObject(), candidateCall.getThisObject(), task); return result; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ResolvedCall.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ResolvedCall.java index fa28e6ccef4..a180750d356 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ResolvedCall.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ResolvedCall.java @@ -4,8 +4,9 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.intellij.util.Function; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.resolve.DescriptorUtils; +import org.jetbrains.jet.lang.descriptors.CallableDescriptor; +import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; +import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.resolve.TemporaryBindingTrace; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.JetType; @@ -132,9 +133,4 @@ public class ResolvedCall { public boolean isDirty() { return someArgumentHasNoType; } - - @NotNull - public ReceiverDescriptor getExpectedThisObject() { - return DescriptorUtils.getExpectedThisObject(getResultingDescriptor()); - } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TaskPrioritizer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TaskPrioritizer.java index e622bcd6cf8..2711c751b4f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TaskPrioritizer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/TaskPrioritizer.java @@ -2,10 +2,12 @@ package org.jetbrains.jet.lang.resolve.calls; import com.google.common.collect.Lists; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.descriptors.CallableDescriptor; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; +import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.psi.Call; import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.DataFlowInfo; @@ -89,7 +91,6 @@ import static org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor DataFlowInfo dataFlowInfo = autoCastService.getDataFlowInfo(); List implicitReceivers = Lists.newArrayList(); scope.getImplicitReceiversHierarchy(implicitReceivers); - // AutoCastUtils.getAutoCastVariants(bindingContext, dataFlowInfo, receiverToCast) if (receiver.exists()) { List variantsForExplicitReceiver = autoCastService.getVariantsForReceiver(receiver); @@ -170,7 +171,7 @@ import static org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor } private static boolean setImpliedThis(@NotNull JetScope scope, ResolvedCall resolvedCall) { - ReceiverDescriptor expectedThisObject = DescriptorUtils.getExpectedThisObject(resolvedCall.getCandidateDescriptor()); + ReceiverDescriptor expectedThisObject = resolvedCall.getCandidateDescriptor().getExpectedThisObject(); if (!expectedThisObject.exists()) return true; List receivers = Lists.newArrayList(); scope.getImplicitReceiversHierarchy(receivers); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java index 6fff221d1e1..9d0da1df69d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java @@ -177,7 +177,7 @@ import static org.jetbrains.jet.lang.resolve.BindingContext.REFERENCE_TARGET; error = true; } - assert candidateCall.getThisObject().exists() == candidateCall.getExpectedThisObject().exists() : "Shouldn't happen because of TaskPrioritizer: " + candidateCall.getCandidateDescriptor(); + assert candidateCall.getThisObject().exists() == candidateCall.getResultingDescriptor().getExpectedThisObject().exists() : "Shouldn't happen because of TaskPrioritizer: " + candidateCall.getCandidateDescriptor(); return error; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ClassReceiver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ClassReceiver.java index 85be4e2f593..ac1ac9c5b4a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ClassReceiver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ClassReceiver.java @@ -2,14 +2,28 @@ package org.jetbrains.jet.lang.resolve.scopes.receivers; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; +import org.jetbrains.jet.lang.types.JetType; /** * @author abreslav */ -public class ClassReceiver extends ImplicitReceiverDescriptor { +public class ClassReceiver implements ReceiverDescriptor { - public ClassReceiver(ClassDescriptor classDescriptor) { - super(classDescriptor, classDescriptor.getDefaultType()); + private final ClassDescriptor classDescriptor; + + public ClassReceiver(@NotNull ClassDescriptor classDescriptor) { + this.classDescriptor = classDescriptor; + } + + @Override + public boolean exists() { + return true; + } + + @NotNull + @Override + public JetType getType() { + return classDescriptor.getDefaultType(); } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/DataFlowInfo.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/DataFlowInfo.java index 150fb7378f1..c4981048ece 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/DataFlowInfo.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/DataFlowInfo.java @@ -185,6 +185,10 @@ public class DataFlowInfo { return new DataFlowInfo(ImmutableMap.copyOf(builder), newTypeInfo); } + + public DataFlowInfo nullabilityOnly() { + return new DataFlowInfo(nullabilityInfo, EMPTY.copyTypeInfo()); + } private static class NullabilityFlags { private final boolean canBeNull; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java index 6e5761683d0..394d310c7c1 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java @@ -105,6 +105,7 @@ public class ErrorUtils { Visibility.INTERNAL, true, null, + ReceiverDescriptor.NO_RECEIVER, "", ERROR_PROPERTY_TYPE, ERROR_PROPERTY_TYPE); @@ -112,6 +113,7 @@ public class ErrorUtils { FunctionDescriptorImpl functionDescriptor = new FunctionDescriptorImpl(ERROR_CLASS, Collections.emptyList(), ""); return functionDescriptor.initialize( null, + ReceiverDescriptor.NO_RECEIVER, typeParameters, getValueParameters(functionDescriptor, positionedValueArgumentTypes), createErrorType(""), @@ -123,6 +125,7 @@ public class ErrorUtils { public static FunctionDescriptor createErrorFunction(int typeParameterCount, List positionedValueParameterTypes) { return new FunctionDescriptorImpl(ERROR_CLASS, Collections.emptyList(), "").initialize( null, + ReceiverDescriptor.NO_RECEIVER, Collections.emptyList(), // TODO Collections.emptyList(), // TODO createErrorType(""), diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index 342f6a9dc3d..96bd1efce29 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -1014,7 +1014,7 @@ public class JetTypeInferrer { else { effectiveReceiverType = receiverType; } - functionDescriptor.initialize(effectiveReceiverType, Collections.emptyList(), valueParameterDescriptors, null, Modality.FINAL, Visibility.LOCAL); + functionDescriptor.initialize(effectiveReceiverType, NO_RECEIVER, Collections.emptyList(), valueParameterDescriptors, null, Modality.FINAL, Visibility.LOCAL); context.trace.record(BindingContext.FUNCTION, expression, functionDescriptor); JetType returnType = NO_EXPECTED_TYPE;