From 8d42f4b26762b3559f73467ab8b64631cfadc6a7 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Sun, 18 Sep 2011 17:26:17 +0400 Subject: [PATCH] Receivers introduced. --- .../codegen/intrinsics/IntrinsicMethods.java | 2 +- .../resolve/java/JavaClassDescriptor.java | 4 +- .../resolve/java/JavaClassMembersScope.java | 17 ++++-- .../lang/resolve/java/JavaDefaultImports.java | 2 +- .../resolve/java/JavaNamespaceDescriptor.java | 2 +- .../lang/resolve/java/JavaPackageScope.java | 2 +- .../jet/lang/descriptors/ClassDescriptor.java | 2 +- .../lang/descriptors/ClassDescriptorImpl.java | 4 +- .../descriptors/FunctionDescriptorUtil.java | 6 +- .../LazySubstitutingClassDescriptor.java | 4 +- .../descriptors/MutableClassDescriptor.java | 7 ++- .../lang/descriptors/NamespaceDescriptor.java | 2 +- .../descriptors/NamespaceDescriptorImpl.java | 2 +- .../descriptors/TypeParameterDescriptor.java | 4 +- .../lang/resolve/AbstractScopeAdapter.java | 14 ++++- .../jet/lang/resolve/AnalyzingUtils.java | 3 + .../jet/lang/resolve/AnnotationResolver.java | 1 + .../jet/lang/resolve/BindingContext.java | 1 + .../jet/lang/resolve/BodyResolver.java | 9 ++- .../lang/resolve/ClassDescriptorResolver.java | 3 + .../jet/lang/resolve/DeclarationResolver.java | 2 + .../jet/lang/resolve/ImportingStrategy.java | 1 + .../jet/lang/resolve/JetModuleUtil.java | 1 + .../lang/resolve/TopDownAnalysisContext.java | 2 + .../jet/lang/resolve/TopDownAnalyzer.java | 2 + .../TraceBasedRedeclarationHandler.java | 1 + .../lang/resolve/TypeHierarchyResolver.java | 3 + .../jet/lang/resolve/TypeResolver.java | 2 + .../jet/lang/resolve/calls/CallResolver.java | 58 ++++++------------- .../lang/resolve/calls/TaskPrioritizer.java | 24 ++++++-- .../resolve/{ => scopes}/ChainedScope.java | 16 ++++- .../lang/resolve/{ => scopes}/JetScope.java | 23 ++++++-- .../resolve/{ => scopes}/JetScopeAdapter.java | 3 +- .../resolve/{ => scopes}/JetScopeImpl.java | 14 +++-- .../{ => scopes}/LazyScopeAdapter.java | 3 +- .../{ => scopes}/RedeclarationHandler.java | 2 +- .../{ => scopes}/SubstitutingScope.java | 13 ++++- .../resolve/{ => scopes}/WritableScope.java | 6 +- .../{ => scopes}/WritableScopeImpl.java | 50 ++++++++++------ .../WritableScopeWithImports.java | 4 +- .../{ => scopes}/WriteThroughScope.java | 14 +++-- .../scopes/receivers/ClassReceiver.java | 13 +++++ .../scopes/receivers/ExplicitReceiver.java | 22 +++++++ .../receivers/ExtensionCallableReceiver.java | 13 +++++ .../receivers/ImplicitReceiverDescriptor.java | 32 ++++++++++ .../scopes/receivers/ReceiverDescriptor.java | 27 +++++++++ .../jet/lang/types/DeferredType.java | 2 +- .../jetbrains/jet/lang/types/ErrorUtils.java | 12 +++- .../jet/lang/types/JetStandardClasses.java | 2 +- .../jet/lang/types/JetStandardLibrary.java | 3 + .../org/jetbrains/jet/lang/types/JetType.java | 2 +- .../jetbrains/jet/lang/types/JetTypeImpl.java | 2 +- .../jet/lang/types/JetTypeInferrer.java | 7 ++- .../jet/lang/types/NamespaceType.java | 2 +- .../jet/lang/types/TypeSubstitutor.java | 2 +- .../jetbrains/jet/lang/types/TypeUtils.java | 4 +- .../plugin/references/JetPsiReference.java | 2 +- .../references/JetSimpleNameReference.java | 2 +- .../jet/types/JetTypeCheckerTest.java | 7 ++- 59 files changed, 354 insertions(+), 137 deletions(-) rename compiler/frontend/src/org/jetbrains/jet/lang/resolve/{ => scopes}/ChainedScope.java (88%) rename compiler/frontend/src/org/jetbrains/jet/lang/resolve/{ => scopes}/JetScope.java (68%) rename compiler/frontend/src/org/jetbrains/jet/lang/resolve/{ => scopes}/JetScopeAdapter.java (77%) rename compiler/frontend/src/org/jetbrains/jet/lang/resolve/{ => scopes}/JetScopeImpl.java (77%) rename compiler/frontend/src/org/jetbrains/jet/lang/resolve/{ => scopes}/LazyScopeAdapter.java (79%) rename compiler/frontend/src/org/jetbrains/jet/lang/resolve/{ => scopes}/RedeclarationHandler.java (94%) rename compiler/frontend/src/org/jetbrains/jet/lang/resolve/{ => scopes}/SubstitutingScope.java (90%) rename compiler/frontend/src/org/jetbrains/jet/lang/resolve/{ => scopes}/WritableScope.java (83%) rename compiler/frontend/src/org/jetbrains/jet/lang/resolve/{ => scopes}/WritableScopeImpl.java (89%) rename compiler/frontend/src/org/jetbrains/jet/lang/resolve/{ => scopes}/WritableScopeWithImports.java (95%) rename compiler/frontend/src/org/jetbrains/jet/lang/resolve/{ => scopes}/WriteThroughScope.java (91%) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ClassReceiver.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ExplicitReceiver.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ExtensionCallableReceiver.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ImplicitReceiverDescriptor.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ReceiverDescriptor.java diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java index 402a6db487b..c1817e67cc1 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java @@ -7,7 +7,7 @@ import com.intellij.psi.PsiClass; import com.intellij.psi.PsiMethod; import com.intellij.psi.search.ProjectScope; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.resolve.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.JetStandardClasses; import org.jetbrains.jet.lang.types.JetStandardLibrary; import org.jetbrains.jet.lang.types.TypeProjection; diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java index 4d0ae312517..680d984b1e7 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java @@ -3,8 +3,8 @@ package org.jetbrains.jet.lang.resolve.java; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; -import org.jetbrains.jet.lang.resolve.JetScope; -import org.jetbrains.jet.lang.resolve.SubstitutingScope; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.SubstitutingScope; import org.jetbrains.jet.lang.types.*; import java.util.Collections; diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java index 4fb1ef331d1..23fbbacaa7b 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java @@ -5,11 +5,12 @@ import com.google.common.collect.Sets; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.resolve.JetScope; -import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.TypeSubstitutor; import java.util.Collection; +import java.util.List; import java.util.Map; /** @@ -64,6 +65,7 @@ public class JavaClassMembersScope implements JetScope { return classifierDescriptor; } + @NotNull @Override public Collection getAllDescriptors() { if (allDescriptors == null) { @@ -123,7 +125,7 @@ public class JavaClassMembersScope implements JetScope { return null; } - return semanticServices.getDescriptorResolver().resolveFieldToVariableDescriptor((ClassDescriptor) containingDeclaration, field); + return semanticServices.getDescriptorResolver().resolveFieldToVariableDescriptor(containingDeclaration, field); } @NotNull @@ -149,7 +151,12 @@ public class JavaClassMembersScope implements JetScope { @NotNull @Override - public JetType getThisType() { - return null; + public ReceiverDescriptor getImplicitReceiver() { + throw new UnsupportedOperationException(); // Should never occur, we don't sit in a Java class... + } + + @Override + public void getImplicitReceiversHierarchy(@NotNull List result) { + throw new UnsupportedOperationException(); // Should never occur, we don't sit in a Java class... } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDefaultImports.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDefaultImports.java index 47544d6f20b..f6d6f2f001d 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDefaultImports.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDefaultImports.java @@ -4,7 +4,7 @@ import com.intellij.openapi.project.Project; import org.jetbrains.jet.lang.JetSemanticServices; import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.ImportingStrategy; -import org.jetbrains.jet.lang.resolve.WritableScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScope; /** * @author abreslav diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaNamespaceDescriptor.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaNamespaceDescriptor.java index 7868f2a9127..3443ebf0f79 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaNamespaceDescriptor.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaNamespaceDescriptor.java @@ -4,7 +4,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.AbstractNamespaceDescriptorImpl; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.resolve.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import java.util.List; diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPackageScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPackageScope.java index ab56eb57e81..7c43e8a8bba 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPackageScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaPackageScope.java @@ -2,7 +2,7 @@ package org.jetbrains.jet.lang.resolve.java; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.resolve.JetScopeImpl; +import org.jetbrains.jet.lang.resolve.scopes.JetScopeImpl; /** * @author abreslav diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ClassDescriptor.java index 7f5008c9376..efb8efb0995 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ClassDescriptor.java @@ -2,7 +2,7 @@ package org.jetbrains.jet.lang.descriptors; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.resolve.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.TypeProjection; import org.jetbrains.jet.lang.types.TypeSubstitutor; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java index 2e3c73ce671..484382ba987 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java @@ -3,8 +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.JetScope; -import org.jetbrains.jet.lang.resolve.SubstitutingScope; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.SubstitutingScope; import org.jetbrains.jet.lang.types.*; import java.util.Collection; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorUtil.java index b0c3247ef03..00dc4d2f7a3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorUtil.java @@ -6,6 +6,10 @@ import com.google.common.collect.Maps; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.resolve.*; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ExtensionCallableReceiver; import org.jetbrains.jet.lang.types.*; import java.util.*; @@ -95,7 +99,7 @@ public class FunctionDescriptorUtil { WritableScope parameterScope = new WritableScopeImpl(outerScope, descriptor, new TraceBasedRedeclarationHandler(trace)).setDebugName("Function inner scope"); JetType receiverType = descriptor.getReceiverType(); if (receiverType != null) { - parameterScope.setThisType(receiverType); + parameterScope.setImplicitReceiver(new ExtensionCallableReceiver(descriptor)); } for (TypeParameterDescriptor typeParameter : descriptor.getTypeParameters()) { parameterScope.addTypeParameterDescriptor(typeParameter); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java index 7db18637f16..86b70a0dcf5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java @@ -3,8 +3,8 @@ package org.jetbrains.jet.lang.descriptors; 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.JetScope; -import org.jetbrains.jet.lang.resolve.SubstitutingScope; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.SubstitutingScope; import org.jetbrains.jet.lang.types.*; import java.util.Collection; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java index f39d8e11a7b..5768910bd25 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java @@ -6,6 +6,11 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.resolve.*; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.SubstitutingScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.resolve.DescriptorRenderer; @@ -160,7 +165,7 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme getName(), typeParameters, supertypes); - scopeForMemberResolution.setThisType(getDefaultType()); + scopeForMemberResolution.setImplicitReceiver(new ClassReceiver(this)); for (FunctionDescriptor functionDescriptor : constructors.getFunctionDescriptors()) { ((ConstructorDescriptorImpl) functionDescriptor).setReturnType(getDefaultType()); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptor.java index f3d8c867e00..e28ddec1d21 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptor.java @@ -2,7 +2,7 @@ package org.jetbrains.jet.lang.descriptors; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.annotations.Annotated; -import org.jetbrains.jet.lang.resolve.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.NamespaceType; /** diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java index 3c63b6c15e5..16016715a4d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java @@ -3,7 +3,7 @@ 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.WritableScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import java.util.List; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/TypeParameterDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/TypeParameterDescriptor.java index 8c88bad746e..d441e8a3756 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/TypeParameterDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/TypeParameterDescriptor.java @@ -3,8 +3,8 @@ 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.JetScope; -import org.jetbrains.jet.lang.resolve.LazyScopeAdapter; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.LazyScopeAdapter; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.resolve.DescriptorRenderer; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AbstractScopeAdapter.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AbstractScopeAdapter.java index a75b1ed3be4..f9624422740 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AbstractScopeAdapter.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AbstractScopeAdapter.java @@ -2,9 +2,11 @@ package org.jetbrains.jet.lang.resolve; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import java.util.Collection; +import java.util.List; /** * @author abreslav @@ -15,8 +17,13 @@ public abstract class AbstractScopeAdapter implements JetScope { @NotNull @Override - public JetType getThisType() { - return getWorkerScope().getThisType(); + public ReceiverDescriptor getImplicitReceiver() { + return getWorkerScope().getImplicitReceiver(); + } + + @Override + public void getImplicitReceiversHierarchy(@NotNull List result) { + getWorkerScope().getImplicitReceiversHierarchy(result); } @NotNull @@ -62,6 +69,7 @@ public abstract class AbstractScopeAdapter implements JetScope { return getWorkerScope().getDeclarationDescriptorForUnqualifiedThis(); } + @NotNull @Override public Collection getAllDescriptors() { return getWorkerScope().getAllDescriptors(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnalyzingUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnalyzingUtils.java index 1d582977156..94e330a7756 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnalyzingUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnalyzingUtils.java @@ -18,6 +18,9 @@ import org.jetbrains.jet.lang.diagnostics.*; import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetNamespace; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; import java.util.Collections; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java index 20506d72c01..ba70a94aee1 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnnotationResolver.java @@ -10,6 +10,7 @@ import org.jetbrains.jet.lang.psi.JetAnnotationEntry; import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetModifierList; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.ErrorUtils; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetTypeInferrer; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java index 02ea69673d3..b9f7086b750 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java @@ -7,6 +7,7 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.util.slicedmap.*; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java index ee68f236761..333f65d5204 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java @@ -10,6 +10,11 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.cfg.JetFlowInformationProvider; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ExtensionCallableReceiver; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.util.slicedmap.WritableSlice; @@ -505,7 +510,7 @@ public class BodyResolver { constructorScope.addPropertyDescriptorByFieldName("$" + propertyDescriptor.getName(), propertyDescriptor); } - constructorScope.setThisType(descriptor.getContainingDeclaration().getDefaultType()); + constructorScope.setImplicitReceiver(new ClassReceiver(descriptor.getContainingDeclaration())); for (ValueParameterDescriptor valueParameterDescriptor : descriptor.getValueParameters()) { JetParameter parameter = (JetParameter) context.getTrace().getBindingContext().get(BindingContext.DESCRIPTOR_TO_DECLARATION, valueParameterDescriptor); @@ -573,7 +578,7 @@ public class BodyResolver { } JetType receiverType = propertyDescriptor.getReceiverType(); if (receiverType != null) { - result.setThisType(receiverType); + result.setImplicitReceiver(new ExtensionCallableReceiver(propertyDescriptor)); } return result; } 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 e3785895486..d46c0706303 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java @@ -17,6 +17,9 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lexer.JetTokens; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java index 6aca3fe1866..3048ec1503a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java @@ -4,6 +4,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import java.util.List; import java.util.Map; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportingStrategy.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportingStrategy.java index 546545cc36a..1671b51fa74 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportingStrategy.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportingStrategy.java @@ -2,6 +2,7 @@ package org.jetbrains.jet.lang.resolve; import com.intellij.openapi.project.Project; import org.jetbrains.jet.lang.JetSemanticServices; +import org.jetbrains.jet.lang.resolve.scopes.WritableScope; /** * @author abreslav diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/JetModuleUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/JetModuleUtil.java index 83b7b08e240..a23a151f168 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/JetModuleUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/JetModuleUtil.java @@ -1,6 +1,7 @@ package org.jetbrains.jet.lang.resolve; import org.jetbrains.jet.lang.psi.JetElement; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.NamespaceType; /** diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java index 7fc9a95c460..225a7069436 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java @@ -5,6 +5,8 @@ import com.google.common.collect.Sets; import org.jetbrains.jet.lang.JetSemanticServices; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import java.util.Map; import java.util.Set; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index 47d569b259b..ac6a81e01ce 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -5,6 +5,8 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.JetSemanticServices; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import java.util.Collections; import java.util.List; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TraceBasedRedeclarationHandler.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TraceBasedRedeclarationHandler.java index 5b3438de5d9..299b6f63455 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TraceBasedRedeclarationHandler.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TraceBasedRedeclarationHandler.java @@ -3,6 +3,7 @@ package org.jetbrains.jet.lang.resolve; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler; import static org.jetbrains.jet.lang.diagnostics.Errors.REDECLARATION; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java index 89a3940cb28..3bab1a2d111 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java @@ -11,6 +11,9 @@ import org.jetbrains.jet.lang.cfg.JetFlowInformationProvider; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; +import org.jetbrains.jet.lang.resolve.scopes.WriteThroughScope; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lexer.JetTokens; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeResolver.java index ec7da04365a..0b023d82c01 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeResolver.java @@ -9,6 +9,8 @@ import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.LazyScopeAdapter; import org.jetbrains.jet.lang.types.*; import java.util.ArrayList; 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 2d239d6dbaf..5a8af24287b 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 @@ -12,9 +12,9 @@ import org.jetbrains.jet.lang.JetSemanticServices; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.*; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.inference.ConstraintSystem; -import org.jetbrains.jet.resolve.DescriptorRenderer; import java.util.*; @@ -491,7 +491,7 @@ public class CallResolver { } } - private Function createMapFunction(Descriptor substitutedFunctionDescriptor) { + private Function createMapFunction(D substitutedFunctionDescriptor) { assert substitutedFunctionDescriptor != null; final Map parameterMap = Maps.newHashMap(); for (ValueParameterDescriptor valueParameterDescriptor : substitutedFunctionDescriptor.getValueParameters()) { @@ -506,7 +506,7 @@ public class CallResolver { }; } - private boolean checkReceiver(ResolutionTask task, TracingStrategy tracing, Descriptor candidate, TemporaryBindingTrace temporaryTrace) { + private boolean checkReceiver(ResolutionTask task, TracingStrategy tracing, D candidate, TemporaryBindingTrace temporaryTrace) { if (!checkReceiverAbsence(task, tracing, candidate, temporaryTrace)) return false; JetType receiverType = task.getReceiverType(); JetType candidateReceiverType = candidate.getReceiverType(); @@ -519,7 +519,7 @@ public class CallResolver { return true; } - private boolean checkReceiverAbsence(ResolutionTask task, TracingStrategy tracing, Descriptor candidate, TemporaryBindingTrace temporaryTrace) { + private boolean checkReceiverAbsence(ResolutionTask task, TracingStrategy tracing, D candidate, TemporaryBindingTrace temporaryTrace) { JetType receiverType = task.getReceiverType(); JetType candidateReceiverType = candidate.getReceiverType(); if (receiverType != null) { @@ -536,26 +536,26 @@ public class CallResolver { } @NotNull - private OverloadResolutionResult computeResultAndReportErrors(BindingTrace trace, TracingStrategy tracing, Map successfulCandidates, Set failedCandidates, Set dirtyCandidates, Map traces) { + private OverloadResolutionResult computeResultAndReportErrors(BindingTrace trace, TracingStrategy tracing, Map successfulCandidates, Set failedCandidates, Set dirtyCandidates, Map traces) { // TODO : maybe it's better to filter overrides out first, and only then look for the maximally specific if (successfulCandidates.size() > 0) { if (successfulCandidates.size() != 1) { - Map cleanCandidates = Maps.newLinkedHashMap(successfulCandidates); + Map cleanCandidates = Maps.newLinkedHashMap(successfulCandidates); cleanCandidates.keySet().removeAll(dirtyCandidates); if (cleanCandidates.isEmpty()) { cleanCandidates = successfulCandidates; } - Descriptor maximallySpecific = overloadingConflictResolver.findMaximallySpecific(cleanCandidates, traces, false); + D maximallySpecific = overloadingConflictResolver.findMaximallySpecific(cleanCandidates, traces, false); if (maximallySpecific != null) { return OverloadResolutionResult.success(maximallySpecific); } - Descriptor maximallySpecificGenericsDiscriminated = overloadingConflictResolver.findMaximallySpecific(cleanCandidates, traces, true); + D maximallySpecificGenericsDiscriminated = overloadingConflictResolver.findMaximallySpecific(cleanCandidates, traces, true); if (maximallySpecificGenericsDiscriminated != null) { return OverloadResolutionResult.success(maximallySpecificGenericsDiscriminated); } - Set noOverrides = filterOverrides(successfulCandidates.keySet()); + Set noOverrides = filterOverrides(successfulCandidates.keySet()); if (dirtyCandidates.isEmpty()) { // tracing.reportOverallResolutionError(trace, "Overload resolution ambiguity: " // + makeErrorMessageForMultipleDescriptors(noOverrides)); @@ -567,9 +567,9 @@ public class CallResolver { return OverloadResolutionResult.ambiguity(noOverrides); } else { - Map.Entry entry = successfulCandidates.entrySet().iterator().next(); - Descriptor functionDescriptor = entry.getKey(); - Descriptor result = entry.getValue(); + Map.Entry entry = successfulCandidates.entrySet().iterator().next(); + D functionDescriptor = entry.getKey(); + D result = entry.getValue(); TemporaryBindingTrace temporaryTrace = traces.get(functionDescriptor); temporaryTrace.commit(); @@ -578,7 +578,7 @@ public class CallResolver { } else if (!failedCandidates.isEmpty()) { if (failedCandidates.size() != 1) { - Set noOverrides = filterOverrides(failedCandidates); + Set noOverrides = filterOverrides(failedCandidates); if (noOverrides.size() != 1) { // tracing.reportOverallResolutionError(trace, "None of the following functions can be called with the arguments supplied: " // + makeErrorMessageForMultipleDescriptors(noOverrides)); @@ -588,7 +588,7 @@ public class CallResolver { } failedCandidates = noOverrides; } - Descriptor functionDescriptor = failedCandidates.iterator().next(); + D functionDescriptor = failedCandidates.iterator().next(); TemporaryBindingTrace temporaryTrace = traces.get(functionDescriptor); temporaryTrace.commit(); return OverloadResolutionResult.singleFailedCandidate(failedCandidates.iterator().next()); @@ -599,19 +599,11 @@ public class CallResolver { } } - private StringBuilder makeErrorMessageForMultipleDescriptors(Set candidates) { - StringBuilder stringBuilder = new StringBuilder("\n"); - for (Descriptor functionDescriptor : candidates) { - stringBuilder.append(DescriptorRenderer.TEXT.render(functionDescriptor)).append("\n"); - } - return stringBuilder; - } - - private Set filterOverrides(Set candidateSet) { - Set candidates = Sets.newLinkedHashSet(); + private Set filterOverrides(Set candidateSet) { + Set candidates = Sets.newLinkedHashSet(); outerLoop: - for (Descriptor me : candidateSet) { - for (Descriptor other : candidateSet) { + for (D me : candidateSet) { + for (D other : candidateSet) { if (OverloadingConflictResolver.overrides(other, me)) { continue outerLoop; } @@ -719,18 +711,6 @@ public class CallResolver { return found; } - private OverloadResolutionResult listToOverloadResolutionResult(List result) { - if (result.isEmpty()) { - return OverloadResolutionResult.nameNotFound(); - } - else if (result.size() == 1) { - return OverloadResolutionResult.success(result.get(0)); - } - else { - return OverloadResolutionResult.ambiguity(result); - } - } - private boolean findExtensionFunctions(Collection candidates, JetType receiverType, List parameterTypes, List result) { boolean found = false; for (FunctionDescriptor functionDescriptor : candidates) { @@ -756,7 +736,6 @@ public class CallResolver { return true; } - private static TaskPrioritizer FUNCTION_TASK_PRIORITIZER = new TaskPrioritizer() { @NotNull @@ -826,7 +805,6 @@ public class CallResolver { } }; - private static TaskPrioritizer PROPERTY_TASK_PRIORITIZER = new TaskPrioritizer() { @NotNull 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 9d1d56592c7..4a6cc38bfd8 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 @@ -7,7 +7,8 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.psi.Call; -import org.jetbrains.jet.lang.resolve.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.JetType; import java.util.Collection; @@ -59,11 +60,17 @@ import java.util.List; return false; } - public List> computePrioritizedTasks(JetScope scope, JetType receiverType, Call call, String name) { + public List> computePrioritizedTasks(@NotNull JetScope scope, @Nullable JetType receiverType, @NotNull Call call, @NotNull String name) { List> result = Lists.newArrayList(); + doComputeTasks(scope, receiverType, call, name, result); + return result; + } + + private void doComputeTasks(JetScope scope, JetType receiverType, Call call, String name, List> result) { + List receivers = Lists.newArrayList(); + scope.getImplicitReceiversHierarchy(receivers); if (receiverType != null) { Collection extensionFunctions = getExtensionsByName(scope, name); - List nonlocals = Lists.newArrayList(); List locals = Lists.newArrayList(); //noinspection unchecked,RedundantTypeArguments @@ -73,6 +80,12 @@ import java.util.List; addTask(result, receiverType, call, locals); addTask(result, null, call, members); + + for (ReceiverDescriptor receiver : receivers) { + Collection memberExtensions = getExtensionsByName(receiver.getReceiverType().getMemberScope(), name); + addTask(result, receiverType, call, memberExtensions); + } + addTask(result, receiverType, call, nonlocals); } else { @@ -85,9 +98,12 @@ import java.util.List; addTask(result, receiverType, call, locals); + for (ReceiverDescriptor receiver : receivers) { + doComputeTasks(scope, receiver.getReceiverType(), call, name, result); + } + addTask(result, receiverType, call, nonlocals); } - return result; } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ChainedScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.java similarity index 88% rename from compiler/frontend/src/org/jetbrains/jet/lang/resolve/ChainedScope.java rename to compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.java index d1edc538c0d..5b61003165e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ChainedScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.java @@ -1,12 +1,14 @@ -package org.jetbrains.jet.lang.resolve; +package org.jetbrains.jet.lang.resolve.scopes; import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.resolve.DescriptorUtils; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import java.util.Collection; import java.util.Collections; +import java.util.List; /** * @author abreslav @@ -69,10 +71,17 @@ public class ChainedScope implements JetScope { @NotNull @Override - public JetType getThisType() { + public ReceiverDescriptor getImplicitReceiver() { throw new UnsupportedOperationException(); // TODO } + @Override + public void getImplicitReceiversHierarchy(@NotNull List result) { + for (JetScope jetScope : scopeChain) { + jetScope.getImplicitReceiversHierarchy(result); + } + } + @NotNull @Override public DeclarationDescriptor getContainingDeclaration() { @@ -115,6 +124,7 @@ public class ChainedScope implements JetScope { return null; } + @NotNull @Override public Collection getAllDescriptors() { if (allDescriptors == null) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/JetScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java similarity index 68% rename from compiler/frontend/src/org/jetbrains/jet/lang/resolve/JetScope.java rename to compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java index 93dcfa946eb..eb5bfb96890 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/JetScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java @@ -1,11 +1,12 @@ -package org.jetbrains.jet.lang.resolve; +package org.jetbrains.jet.lang.resolve.scopes; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import java.util.Collection; +import java.util.List; /** * @author abreslav @@ -15,7 +16,7 @@ public interface JetScope { @NotNull @Override public DeclarationDescriptor getContainingDeclaration() { - throw new UnsupportedOperationException(); // TODO + throw new UnsupportedOperationException(); } @Override @@ -36,9 +37,6 @@ public interface JetScope { @NotNull FunctionGroup getFunctionGroup(@NotNull String name); - @NotNull - JetType getThisType(); - @NotNull DeclarationDescriptor getContainingDeclaration(); @@ -55,5 +53,18 @@ public interface JetScope { @Nullable DeclarationDescriptor getDeclarationDescriptorForUnqualifiedThis(); + @NotNull Collection getAllDescriptors(); + + /** + * @return EFFECTIVE implicit receiver at this point (may be corresponding to an outer scope) + */ + @NotNull + ReceiverDescriptor getImplicitReceiver(); + + /** + * Adds receivers to the list in order of locality, so that the closest (the most local) receiver goes first + * @param result + */ + void getImplicitReceiversHierarchy(@NotNull List result); } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/JetScopeAdapter.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeAdapter.java similarity index 77% rename from compiler/frontend/src/org/jetbrains/jet/lang/resolve/JetScopeAdapter.java rename to compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeAdapter.java index a3b531bd831..248f00bee77 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/JetScopeAdapter.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeAdapter.java @@ -1,6 +1,7 @@ -package org.jetbrains.jet.lang.resolve; +package org.jetbrains.jet.lang.resolve.scopes; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.resolve.AbstractScopeAdapter; /** * @author abreslav diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/JetScopeImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.java similarity index 77% rename from compiler/frontend/src/org/jetbrains/jet/lang/resolve/JetScopeImpl.java rename to compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.java index fbbe8cf99e8..8eeec10a018 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/JetScopeImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.java @@ -1,11 +1,12 @@ -package org.jetbrains.jet.lang.resolve; +package org.jetbrains.jet.lang.resolve.scopes; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.types.*; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import java.util.Collection; import java.util.Collections; +import java.util.List; /** * @author abreslav @@ -28,8 +29,8 @@ public abstract class JetScopeImpl implements JetScope { @NotNull @Override - public JetType getThisType() { - return JetStandardClasses.getNothingType(); + public ReceiverDescriptor getImplicitReceiver() { + return ReceiverDescriptor.NO_RECEIVER; } @NotNull @@ -54,8 +55,13 @@ public abstract class JetScopeImpl implements JetScope { return null; } + @NotNull @Override public Collection getAllDescriptors() { return Collections.emptyList(); } + + @Override + public void getImplicitReceiversHierarchy(@NotNull List result) { + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/LazyScopeAdapter.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/LazyScopeAdapter.java similarity index 79% rename from compiler/frontend/src/org/jetbrains/jet/lang/resolve/LazyScopeAdapter.java rename to compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/LazyScopeAdapter.java index 40a39ff5ca7..4cd937f0e76 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/LazyScopeAdapter.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/LazyScopeAdapter.java @@ -1,6 +1,7 @@ -package org.jetbrains.jet.lang.resolve; +package org.jetbrains.jet.lang.resolve.scopes; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.resolve.AbstractScopeAdapter; import org.jetbrains.jet.lang.types.LazyValue; /** diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/RedeclarationHandler.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/RedeclarationHandler.java similarity index 94% rename from compiler/frontend/src/org/jetbrains/jet/lang/resolve/RedeclarationHandler.java rename to compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/RedeclarationHandler.java index b2574aaa20d..c123871fa46 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/RedeclarationHandler.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/RedeclarationHandler.java @@ -1,4 +1,4 @@ -package org.jetbrains.jet.lang.resolve; +package org.jetbrains.jet.lang.resolve.scopes; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/SubstitutingScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java similarity index 90% rename from compiler/frontend/src/org/jetbrains/jet/lang/resolve/SubstitutingScope.java rename to compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java index 8d4392eee57..fb7497551f0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/SubstitutingScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java @@ -1,14 +1,15 @@ -package org.jetbrains.jet.lang.resolve; +package org.jetbrains.jet.lang.resolve.scopes; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.TypeSubstitutor; import java.util.Collection; +import java.util.List; import java.util.Map; /** @@ -56,7 +57,12 @@ public class SubstitutingScope implements JetScope { @NotNull @Override - public JetType getThisType() { + public ReceiverDescriptor getImplicitReceiver() { + throw new UnsupportedOperationException(); // TODO + } + + @Override + public void getImplicitReceiversHierarchy(@NotNull List result) { throw new UnsupportedOperationException(); // TODO } @@ -109,6 +115,7 @@ public class SubstitutingScope implements JetScope { return workerScope.getDeclarationDescriptorForUnqualifiedThis(); } + @NotNull @Override public Collection getAllDescriptors() { if (allDescriptors == null) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/WritableScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScope.java similarity index 83% rename from compiler/frontend/src/org/jetbrains/jet/lang/resolve/WritableScope.java rename to compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScope.java index 0e7485b4d2f..c052fb4a23e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/WritableScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScope.java @@ -1,9 +1,9 @@ -package org.jetbrains.jet.lang.resolve; +package org.jetbrains.jet.lang.resolve.scopes; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.types.*; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ImplicitReceiverDescriptor; /** * @author abreslav @@ -30,5 +30,5 @@ public interface WritableScope extends JetScope { void importScope(@NotNull JetScope imported); - void setThisType(@NotNull JetType thisType); + void setImplicitReceiver(@NotNull ImplicitReceiverDescriptor implicitReceiver); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/WritableScopeImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeImpl.java similarity index 89% rename from compiler/frontend/src/org/jetbrains/jet/lang/resolve/WritableScopeImpl.java rename to compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeImpl.java index 48e1e88ae8d..c9155d155ac 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/WritableScopeImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeImpl.java @@ -1,4 +1,4 @@ -package org.jetbrains.jet.lang.resolve; +package org.jetbrains.jet.lang.resolve.scopes; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -6,7 +6,9 @@ import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.resolve.DescriptorUtils; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ImplicitReceiverDescriptor; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import java.util.*; @@ -32,8 +34,9 @@ public class WritableScopeImpl extends WritableScopeWithImports { @Nullable private Map> labelsToDescriptors; + @Nullable - private JetType thisType; + private ImplicitReceiverDescriptor implicitReceiver; private List variableDescriptors; @@ -67,6 +70,7 @@ public class WritableScopeImpl extends WritableScopeWithImports { super.importClassifierAlias(importedClassifierName, classifierDescriptor); } + @NotNull @Override public Collection getAllDescriptors() { if (!allDescriptorsDone) { @@ -153,12 +157,12 @@ public class WritableScopeImpl extends WritableScopeWithImports { return (VariableDescriptor) descriptor; } - if (thisType != null) { - VariableDescriptor variable = getThisType().getMemberScope().getVariable(name); - if (variable != null) { - return variable; - } - } +// if (implicitReceiver != null) { +// VariableDescriptor variable = getImplicitReceiver().getMemberScope().getVariable(name); +// if (variable != null) { +// return variable; +// } +// } VariableDescriptor variableDescriptor = getWorkerScope().getVariable(name); if (variableDescriptor != null) { @@ -200,9 +204,9 @@ public class WritableScopeImpl extends WritableScopeWithImports { result.addAllFunctions(functionGroup); } - if (thisType != null) { - result.addAllFunctions(getThisType().getMemberScope().getFunctionGroup(name)); - } +// if (implicitReceiver != null) { +// result.addAllFunctions(getImplicitReceiver().getMemberScope().getFunctionGroup(name)); +// } result.addAllFunctions(getWorkerScope().getFunctionGroup(name)); @@ -247,11 +251,11 @@ public class WritableScopeImpl extends WritableScopeWithImports { @NotNull @Override - public JetType getThisType() { - if (thisType == null) { - return super.getThisType(); + public ReceiverDescriptor getImplicitReceiver() { + if (implicitReceiver == null) { + return super.getImplicitReceiver(); } - return thisType; + return implicitReceiver; } @Override @@ -283,11 +287,19 @@ public class WritableScopeImpl extends WritableScopeWithImports { } @Override - public void setThisType(@NotNull JetType thisType) { - if (this.thisType != null) { + public void setImplicitReceiver(@NotNull ImplicitReceiverDescriptor implicitReceiver) { + if (this.implicitReceiver != null) { throw new UnsupportedOperationException("Receiver redeclared"); } - this.thisType = thisType; + this.implicitReceiver = implicitReceiver; + } + + @Override + public void getImplicitReceiversHierarchy(@NotNull List result) { + if (implicitReceiver != null && implicitReceiver != ReceiverDescriptor.NO_RECEIVER) { + result.add(implicitReceiver); + } + super.getImplicitReceiversHierarchy(result); } @SuppressWarnings({"NullableProblems"}) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/WritableScopeWithImports.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeWithImports.java similarity index 95% rename from compiler/frontend/src/org/jetbrains/jet/lang/resolve/WritableScopeWithImports.java rename to compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeWithImports.java index 1a03d1e5d46..00dee3bc289 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/WritableScopeWithImports.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeWithImports.java @@ -1,4 +1,4 @@ -package org.jetbrains.jet.lang.resolve; +package org.jetbrains.jet.lang.resolve.scopes; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -96,7 +96,7 @@ public abstract class WritableScopeWithImports extends JetScopeAdapter implement public void importClassifierAlias(@NotNull String importedClassifierName, @NotNull ClassifierDescriptor classifierDescriptor) { if (currentIndividualImportScope == null) { - WritableScopeImpl writableScope = new WritableScopeImpl(JetScope.EMPTY, getContainingDeclaration(), RedeclarationHandler.DO_NOTHING).setDebugName("Individual import scope"); + WritableScopeImpl writableScope = new WritableScopeImpl(EMPTY, getContainingDeclaration(), RedeclarationHandler.DO_NOTHING).setDebugName("Individual import scope"); importScope(writableScope); currentIndividualImportScope = writableScope; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/WriteThroughScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WriteThroughScope.java similarity index 91% rename from compiler/frontend/src/org/jetbrains/jet/lang/resolve/WriteThroughScope.java rename to compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WriteThroughScope.java index 74c029e7b43..4c36fd0949e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/WriteThroughScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WriteThroughScope.java @@ -1,10 +1,11 @@ -package org.jetbrains.jet.lang.resolve; +package org.jetbrains.jet.lang.resolve.scopes; import com.google.common.collect.Lists; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ImplicitReceiverDescriptor; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import java.util.Collection; @@ -40,8 +41,8 @@ public class WriteThroughScope extends WritableScopeWithImports { @Override @NotNull - public JetType getThisType() { - return writableWorker.getThisType(); + public ReceiverDescriptor getImplicitReceiver() { + return writableWorker.getImplicitReceiver(); } @Override @@ -146,10 +147,11 @@ public class WriteThroughScope extends WritableScopeWithImports { } @Override - public void setThisType(@NotNull JetType thisType) { - writableWorker.setThisType(thisType); + public void setImplicitReceiver(@NotNull ImplicitReceiverDescriptor implicitReceiver) { + writableWorker.setImplicitReceiver(implicitReceiver); } + @NotNull @Override public Collection getAllDescriptors() { if (allDescriptors == null) { 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 new file mode 100644 index 00000000000..53cd89136e2 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ClassReceiver.java @@ -0,0 +1,13 @@ +package org.jetbrains.jet.lang.resolve.scopes.receivers; + +import org.jetbrains.jet.lang.descriptors.ClassDescriptor; + +/** + * @author abreslav + */ +public class ClassReceiver extends ImplicitReceiverDescriptor { + + public ClassReceiver(ClassDescriptor classDescriptor) { + super(classDescriptor, classDescriptor.getDefaultType()); + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ExplicitReceiver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ExplicitReceiver.java new file mode 100644 index 00000000000..2b58bf569c8 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ExplicitReceiver.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.lang.resolve.scopes.receivers; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.types.JetType; + +/** + * @author abreslav + */ +public class ExplicitReceiver implements ReceiverDescriptor { + + private final JetType type; + + public ExplicitReceiver(@NotNull JetType type) { + this.type = type; + } + + @NotNull + @Override + public JetType getReceiverType() { + return type; + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ExtensionCallableReceiver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ExtensionCallableReceiver.java new file mode 100644 index 00000000000..2828c2c39b8 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ExtensionCallableReceiver.java @@ -0,0 +1,13 @@ +package org.jetbrains.jet.lang.resolve.scopes.receivers; + +import org.jetbrains.jet.lang.descriptors.CallableDescriptor; + +/** + * @author abreslav + */ +public class ExtensionCallableReceiver extends ImplicitReceiverDescriptor { + + public ExtensionCallableReceiver(CallableDescriptor callableDescriptor) { + super(callableDescriptor, callableDescriptor.getReceiverType()); + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ImplicitReceiverDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ImplicitReceiverDescriptor.java new file mode 100644 index 00000000000..8910ce1810a --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ImplicitReceiverDescriptor.java @@ -0,0 +1,32 @@ +package org.jetbrains.jet.lang.resolve.scopes.receivers; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.types.JetType; + +/** + * Describes a "this" receiver + * + * @author abreslav + */ +public abstract class ImplicitReceiverDescriptor implements ReceiverDescriptor { + private final JetType receiverType; + private final DeclarationDescriptor declarationDescriptor; + + protected ImplicitReceiverDescriptor(DeclarationDescriptor declarationDescriptor, JetType receiverType) { + this.receiverType = receiverType; + this.declarationDescriptor = declarationDescriptor; + } + + @Override + @NotNull + public JetType getReceiverType() { + return receiverType; + } + + @NotNull + public DeclarationDescriptor getDeclarationDescriptor() { + return declarationDescriptor; + } +} + diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ReceiverDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ReceiverDescriptor.java new file mode 100644 index 00000000000..c909cd5125a --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ReceiverDescriptor.java @@ -0,0 +1,27 @@ +package org.jetbrains.jet.lang.resolve.scopes.receivers; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.types.JetStandardClasses; +import org.jetbrains.jet.lang.types.JetType; + +/** + * @author abreslav + */ +public interface ReceiverDescriptor { + + ReceiverDescriptor NO_RECEIVER = new ReceiverDescriptor() { + @NotNull + @Override + public JetType getReceiverType() { + return JetStandardClasses.getNothingType(); + } + + @Override + public String toString() { + return "NO_RECEIVER"; + } + }; + + @NotNull + JetType getReceiverType(); +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/DeferredType.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/DeferredType.java index fae49326ec9..b405df67340 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/DeferredType.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/DeferredType.java @@ -2,7 +2,7 @@ package org.jetbrains.jet.lang.types; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; -import org.jetbrains.jet.lang.resolve.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import java.util.List; 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 8c23eb4103f..ebcff036fb7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java @@ -3,7 +3,8 @@ package org.jetbrains.jet.lang.types; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; -import org.jetbrains.jet.lang.resolve.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import java.util.*; @@ -32,8 +33,12 @@ public class ErrorUtils { @NotNull @Override - public JetType getThisType() { - return createErrorType(""); + public ReceiverDescriptor getImplicitReceiver() { + return ReceiverDescriptor.NO_RECEIVER; + } + + @Override + public void getImplicitReceiversHierarchy(@NotNull List result) { } @NotNull @@ -64,6 +69,7 @@ public class ErrorUtils { return ERROR_CLASS; // TODO : review } + @NotNull @Override public Collection getAllDescriptors() { return Collections.emptyList(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardClasses.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardClasses.java index 2e30c1a0e38..3ce7eb0d2d6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardClasses.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardClasses.java @@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; -import org.jetbrains.jet.lang.resolve.*; +import org.jetbrains.jet.lang.resolve.scopes.*; import java.lang.reflect.Field; import java.lang.reflect.Modifier; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardLibrary.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardLibrary.java index 1ab9f99ebb4..1ec692c6930 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardLibrary.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetStandardLibrary.java @@ -11,6 +11,9 @@ import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.*; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler; +import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; import org.jetbrains.jet.plugin.JetFileType; import java.io.IOException; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetType.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetType.java index 930e9c2ae22..35d0c24f26a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetType.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetType.java @@ -2,7 +2,7 @@ package org.jetbrains.jet.lang.types; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.annotations.Annotated; -import org.jetbrains.jet.lang.resolve.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import java.util.List; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetTypeImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetTypeImpl.java index c5371ba11bb..69be07784c9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetTypeImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetTypeImpl.java @@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotatedImpl; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; -import org.jetbrains.jet.lang.resolve.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import java.util.Collections; import java.util.Iterator; 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 d1074f7e62f..440a0451e62 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -23,6 +23,9 @@ import org.jetbrains.jet.lang.resolve.calls.CallResolver; import org.jetbrains.jet.lang.resolve.calls.OverloadResolutionResult; import org.jetbrains.jet.lang.resolve.constants.*; import org.jetbrains.jet.lang.resolve.constants.StringValue; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScope; +import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.util.slicedmap.WritableSlice; @@ -891,7 +894,7 @@ public class JetTypeInferrer { if (receiverTypeRef != null) { receiverType = context.typeResolver.resolveType(context.scope, receiverTypeRef); } else { - receiverType = context.scope.getThisType(); + receiverType = context.scope.getImplicitReceiver().getReceiverType(); } FunctionDescriptorImpl functionDescriptor = new FunctionDescriptorImpl( @@ -1265,7 +1268,7 @@ public class JetTypeInferrer { } } else { - thisType = context.scope.getThisType(); + thisType = context.scope.getImplicitReceiver().getReceiverType(); DeclarationDescriptor declarationDescriptorForUnqualifiedThis = context.scope.getDeclarationDescriptorForUnqualifiedThis(); if (declarationDescriptorForUnqualifiedThis != null) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/NamespaceType.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/NamespaceType.java index dad72cb210c..35702cf2dba 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/NamespaceType.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/NamespaceType.java @@ -2,7 +2,7 @@ package org.jetbrains.jet.lang.types; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; -import org.jetbrains.jet.lang.resolve.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import java.util.List; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/TypeSubstitutor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/TypeSubstitutor.java index 7f548f50877..9745f1e646e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/TypeSubstitutor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/TypeSubstitutor.java @@ -3,7 +3,7 @@ package org.jetbrains.jet.lang.types; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; -import org.jetbrains.jet.lang.resolve.SubstitutingScope; +import org.jetbrains.jet.lang.resolve.scopes.SubstitutingScope; import java.util.ArrayList; import java.util.List; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/TypeUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/TypeUtils.java index 9d5a28a5844..ca595ac72cf 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/TypeUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/TypeUtils.java @@ -7,8 +7,8 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; -import org.jetbrains.jet.lang.resolve.ChainedScope; -import org.jetbrains.jet.lang.resolve.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.ChainedScope; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.util.CommonSuppliers; import java.util.*; diff --git a/idea/src/org/jetbrains/jet/plugin/references/JetPsiReference.java b/idea/src/org/jetbrains/jet/plugin/references/JetPsiReference.java index 033497955d8..a9f3c0a488b 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/JetPsiReference.java +++ b/idea/src/org/jetbrains/jet/plugin/references/JetPsiReference.java @@ -89,7 +89,7 @@ public abstract class JetPsiReference implements PsiPolyVariantReference { JetFile file = (JetFile) getElement().getContainingFile(); BindingContext bindingContext = AnalyzerFacade.analyzeFileWithCache(file); Collection declarationDescriptors = bindingContext.get(AMBIGUOUS_REFERENCE_TARGET, myExpression); - assert declarationDescriptors != null; + if (declarationDescriptors != null) return ResolveResult.EMPTY_ARRAY; ResolveResult[] results = new ResolveResult[declarationDescriptors.size()]; int i = 0; for (DeclarationDescriptor descriptor : declarationDescriptors) { diff --git a/idea/src/org/jetbrains/jet/plugin/references/JetSimpleNameReference.java b/idea/src/org/jetbrains/jet/plugin/references/JetSimpleNameReference.java index 7896d7bcf63..b90af3696ef 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/JetSimpleNameReference.java +++ b/idea/src/org/jetbrains/jet/plugin/references/JetSimpleNameReference.java @@ -13,7 +13,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.lang.resolve.JetScope; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.plugin.AnalyzerFacade; import org.jetbrains.jet.resolve.DescriptorRenderer; diff --git a/idea/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java b/idea/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java index a647c7a4d8f..078051a6a6f 100644 --- a/idea/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java +++ b/idea/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java @@ -17,6 +17,9 @@ import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.java.JavaPackageScope; import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices; +import org.jetbrains.jet.lang.resolve.scopes.*; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ExplicitReceiver; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.parsing.JetParsingTest; @@ -506,8 +509,8 @@ public class JetTypeCheckerTest extends LightDaemonAnalyzerTestCase { JetScope scope = new JetScopeAdapter(classDefinitions.BASIC_SCOPE) { @NotNull @Override - public JetType getThisType() { - return thisType; + public ReceiverDescriptor getImplicitReceiver() { + return new ExplicitReceiver(thisType); } }; assertType(scope, expression, expectedType);