diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java index c32fa83c82f..fe54871bcf7 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java @@ -54,6 +54,7 @@ import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver; import org.jetbrains.jet.lang.resolve.OverloadResolver; import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver; +import org.jetbrains.jet.lang.types.expressions.DelegatedPropertyResolver; import org.jetbrains.jet.lang.resolve.ScriptBodyResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver; @@ -113,6 +114,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly private final OverloadResolver overloadResolver; private final OverrideResolver overrideResolver; private final TypeHierarchyResolver typeHierarchyResolver; + private final DelegatedPropertyResolver delegatedPropertyResolver; private final ScriptBodyResolver scriptBodyResolver; private final JavaClassResolver javaClassResolver; private final JavaAnnotationResolver javaAnnotationResolver; @@ -173,6 +175,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.overloadResolver = new OverloadResolver(); this.overrideResolver = new OverrideResolver(); this.typeHierarchyResolver = new TypeHierarchyResolver(); + this.delegatedPropertyResolver = new DelegatedPropertyResolver(); this.scriptBodyResolver = new ScriptBodyResolver(); this.javaClassResolver = new JavaClassResolver(); this.javaAnnotationResolver = new JavaAnnotationResolver(); @@ -207,6 +210,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.bodyResolver.setContext(topDownAnalysisContext); this.bodyResolver.setControlFlowAnalyzer(controlFlowAnalyzer); this.bodyResolver.setDeclarationsChecker(declarationsChecker); + this.bodyResolver.setDelegatedPropertyResolver(delegatedPropertyResolver); this.bodyResolver.setDescriptorResolver(descriptorResolver); this.bodyResolver.setExpressionTypingServices(expressionTypingServices); this.bodyResolver.setScriptBodyResolverResolver(scriptBodyResolver); @@ -219,6 +223,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.declarationsChecker.setTrace(bindingTrace); this.descriptorResolver.setAnnotationResolver(annotationResolver); + this.descriptorResolver.setDelegatedPropertyResolver(delegatedPropertyResolver); this.descriptorResolver.setExpressionTypingServices(expressionTypingServices); this.descriptorResolver.setTypeResolver(typeResolver); @@ -307,6 +312,8 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly typeHierarchyResolver.setScriptHeaderResolver(scriptHeaderResolver); typeHierarchyResolver.setTrace(bindingTrace); + delegatedPropertyResolver.setExpressionTypingServices(expressionTypingServices); + scriptBodyResolver.setContext(topDownAnalysisContext); scriptBodyResolver.setExpressionTypingServices(expressionTypingServices); scriptBodyResolver.setTrace(bindingTrace); diff --git a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForBodyResolve.java b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForBodyResolve.java index efd34da5671..0c7985c5972 100644 --- a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForBodyResolve.java +++ b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForBodyResolve.java @@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.resolve.calls.ArgumentTypeResolver; import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices; import org.jetbrains.jet.lang.resolve.calls.CallExpressionResolver; import org.jetbrains.jet.lang.resolve.DescriptorResolver; +import org.jetbrains.jet.lang.types.expressions.DelegatedPropertyResolver; import org.jetbrains.jet.lang.resolve.TypeResolver; import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver; import org.jetbrains.jet.lang.resolve.calls.CandidateResolver; @@ -57,6 +58,7 @@ public class InjectorForBodyResolve { private final ExpressionTypingServices expressionTypingServices; private final CallExpressionResolver callExpressionResolver; private final DescriptorResolver descriptorResolver; + private final DelegatedPropertyResolver delegatedPropertyResolver; private final TypeResolver typeResolver; private final QualifiedExpressionResolver qualifiedExpressionResolver; private final CandidateResolver candidateResolver; @@ -86,6 +88,7 @@ public class InjectorForBodyResolve { this.expressionTypingServices = new ExpressionTypingServices(); this.callExpressionResolver = new CallExpressionResolver(); this.descriptorResolver = new DescriptorResolver(); + this.delegatedPropertyResolver = new DelegatedPropertyResolver(); this.typeResolver = new TypeResolver(); this.qualifiedExpressionResolver = new QualifiedExpressionResolver(); this.candidateResolver = new CandidateResolver(); @@ -99,6 +102,7 @@ public class InjectorForBodyResolve { this.bodyResolver.setContext(bodiesResolveContext); this.bodyResolver.setControlFlowAnalyzer(controlFlowAnalyzer); this.bodyResolver.setDeclarationsChecker(declarationsChecker); + this.bodyResolver.setDelegatedPropertyResolver(delegatedPropertyResolver); this.bodyResolver.setDescriptorResolver(descriptorResolver); this.bodyResolver.setExpressionTypingServices(expressionTypingServices); this.bodyResolver.setScriptBodyResolverResolver(scriptBodyResolver); @@ -128,9 +132,12 @@ public class InjectorForBodyResolve { callExpressionResolver.setExpressionTypingServices(expressionTypingServices); descriptorResolver.setAnnotationResolver(annotationResolver); + descriptorResolver.setDelegatedPropertyResolver(delegatedPropertyResolver); descriptorResolver.setExpressionTypingServices(expressionTypingServices); descriptorResolver.setTypeResolver(typeResolver); + delegatedPropertyResolver.setExpressionTypingServices(expressionTypingServices); + typeResolver.setAnnotationResolver(annotationResolver); typeResolver.setModuleDescriptor(moduleDescriptor); typeResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver); diff --git a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForLazyResolve.java b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForLazyResolve.java index 3854e5d6a62..7ddbd715fab 100644 --- a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForLazyResolve.java +++ b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForLazyResolve.java @@ -28,6 +28,7 @@ import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver; import org.jetbrains.jet.lang.psi.JetImportsFactory; import org.jetbrains.jet.lang.resolve.calls.CompositeExtension; import org.jetbrains.jet.lang.PlatformToKotlinClassMap; +import org.jetbrains.jet.lang.types.expressions.DelegatedPropertyResolver; import org.jetbrains.jet.lang.resolve.calls.CallExpressionResolver; import org.jetbrains.jet.lang.resolve.calls.CallResolver; import org.jetbrains.jet.lang.resolve.calls.ArgumentTypeResolver; @@ -50,6 +51,7 @@ public class InjectorForLazyResolve { private final JetImportsFactory jetImportsFactory; private final CompositeExtension compositeExtension; private final PlatformToKotlinClassMap platformToKotlinClassMap; + private final DelegatedPropertyResolver delegatedPropertyResolver; private final CallExpressionResolver callExpressionResolver; private final CallResolver callResolver; private final ArgumentTypeResolver argumentTypeResolver; @@ -72,12 +74,14 @@ public class InjectorForLazyResolve { this.jetImportsFactory = new JetImportsFactory(); this.compositeExtension = new CompositeExtension(); this.platformToKotlinClassMap = moduleDescriptor.getPlatformToKotlinClassMap(); + this.delegatedPropertyResolver = new DelegatedPropertyResolver(); this.callExpressionResolver = new CallExpressionResolver(); this.callResolver = new CallResolver(); this.argumentTypeResolver = new ArgumentTypeResolver(); this.candidateResolver = new CandidateResolver(); this.descriptorResolver.setAnnotationResolver(annotationResolver); + this.descriptorResolver.setDelegatedPropertyResolver(delegatedPropertyResolver); this.descriptorResolver.setExpressionTypingServices(expressionTypingServices); this.descriptorResolver.setTypeResolver(typeResolver); @@ -98,6 +102,8 @@ public class InjectorForLazyResolve { this.jetImportsFactory.setProject(project); + delegatedPropertyResolver.setExpressionTypingServices(expressionTypingServices); + callExpressionResolver.setExpressionTypingServices(expressionTypingServices); callResolver.setArgumentTypeResolver(argumentTypeResolver); diff --git a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForMacros.java b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForMacros.java index 6d1798e5165..27eab69ab6f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForMacros.java +++ b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForMacros.java @@ -29,6 +29,7 @@ import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver; import org.jetbrains.jet.lang.resolve.calls.CandidateResolver; import org.jetbrains.jet.lang.resolve.calls.CallExpressionResolver; import org.jetbrains.jet.lang.resolve.DescriptorResolver; +import org.jetbrains.jet.lang.types.expressions.DelegatedPropertyResolver; import org.jetbrains.annotations.NotNull; import javax.annotation.PreDestroy; @@ -48,6 +49,7 @@ public class InjectorForMacros { private final CandidateResolver candidateResolver; private final CallExpressionResolver callExpressionResolver; private final DescriptorResolver descriptorResolver; + private final DelegatedPropertyResolver delegatedPropertyResolver; public InjectorForMacros( @NotNull Project project, @@ -66,6 +68,7 @@ public class InjectorForMacros { this.candidateResolver = new CandidateResolver(); this.callExpressionResolver = new CallExpressionResolver(); this.descriptorResolver = new DescriptorResolver(); + this.delegatedPropertyResolver = new DelegatedPropertyResolver(); this.expressionTypingServices.setAnnotationResolver(annotationResolver); this.expressionTypingServices.setCallExpressionResolver(callExpressionResolver); @@ -96,9 +99,12 @@ public class InjectorForMacros { callExpressionResolver.setExpressionTypingServices(expressionTypingServices); descriptorResolver.setAnnotationResolver(annotationResolver); + descriptorResolver.setDelegatedPropertyResolver(delegatedPropertyResolver); descriptorResolver.setExpressionTypingServices(expressionTypingServices); descriptorResolver.setTypeResolver(typeResolver); + delegatedPropertyResolver.setExpressionTypingServices(expressionTypingServices); + } @PreDestroy diff --git a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java index e8eadfe6bf7..95168e343c5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java +++ b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java @@ -45,6 +45,7 @@ import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver; import org.jetbrains.jet.lang.resolve.OverloadResolver; import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver; +import org.jetbrains.jet.lang.types.expressions.DelegatedPropertyResolver; import org.jetbrains.jet.lang.resolve.ScriptBodyResolver; import org.jetbrains.annotations.NotNull; import javax.annotation.PreDestroy; @@ -81,6 +82,7 @@ public class InjectorForTopDownAnalyzerBasic { private final OverloadResolver overloadResolver; private final OverrideResolver overrideResolver; private final TypeHierarchyResolver typeHierarchyResolver; + private final DelegatedPropertyResolver delegatedPropertyResolver; private final ScriptBodyResolver scriptBodyResolver; public InjectorForTopDownAnalyzerBasic( @@ -119,6 +121,7 @@ public class InjectorForTopDownAnalyzerBasic { this.overloadResolver = new OverloadResolver(); this.overrideResolver = new OverrideResolver(); this.typeHierarchyResolver = new TypeHierarchyResolver(); + this.delegatedPropertyResolver = new DelegatedPropertyResolver(); this.scriptBodyResolver = new ScriptBodyResolver(); this.topDownAnalyzer.setBodyResolver(bodyResolver); @@ -139,6 +142,7 @@ public class InjectorForTopDownAnalyzerBasic { this.bodyResolver.setContext(topDownAnalysisContext); this.bodyResolver.setControlFlowAnalyzer(controlFlowAnalyzer); this.bodyResolver.setDeclarationsChecker(declarationsChecker); + this.bodyResolver.setDelegatedPropertyResolver(delegatedPropertyResolver); this.bodyResolver.setDescriptorResolver(descriptorResolver); this.bodyResolver.setExpressionTypingServices(expressionTypingServices); this.bodyResolver.setScriptBodyResolverResolver(scriptBodyResolver); @@ -151,6 +155,7 @@ public class InjectorForTopDownAnalyzerBasic { this.declarationsChecker.setTrace(bindingTrace); this.descriptorResolver.setAnnotationResolver(annotationResolver); + this.descriptorResolver.setDelegatedPropertyResolver(delegatedPropertyResolver); this.descriptorResolver.setExpressionTypingServices(expressionTypingServices); this.descriptorResolver.setTypeResolver(typeResolver); @@ -220,6 +225,8 @@ public class InjectorForTopDownAnalyzerBasic { typeHierarchyResolver.setScriptHeaderResolver(scriptHeaderResolver); typeHierarchyResolver.setTrace(bindingTrace); + delegatedPropertyResolver.setExpressionTypingServices(expressionTypingServices); + scriptBodyResolver.setContext(topDownAnalysisContext); scriptBodyResolver.setExpressionTypingServices(expressionTypingServices); scriptBodyResolver.setTrace(bindingTrace); 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 9a364ad23fd..55e47fe10f4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java @@ -41,7 +41,7 @@ import org.jetbrains.jet.lang.resolve.scopes.*; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.expressions.DataFlowUtils; -import org.jetbrains.jet.lang.types.expressions.DelegatedPropertyUtils; +import org.jetbrains.jet.lang.types.expressions.DelegatedPropertyResolver; import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices; import org.jetbrains.jet.lang.types.expressions.LabelResolver; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; @@ -81,6 +81,8 @@ public class BodyResolver { private DeclarationsChecker declarationsChecker; @NotNull private AnnotationResolver annotationResolver; + @NotNull + private DelegatedPropertyResolver delegatedPropertyResolver; @Inject public void setTopDownAnalysisParameters(@NotNull TopDownAnalysisParameters topDownAnalysisParameters) { @@ -132,6 +134,11 @@ public class BodyResolver { this.annotationResolver = annotationResolver; } + @Inject + public void setDelegatedPropertyResolver(@NotNull DelegatedPropertyResolver delegatedPropertyResolver) { + this.delegatedPropertyResolver = delegatedPropertyResolver; + } + private void resolveBehaviorDeclarationBodies(@NotNull BodiesResolveContext bodiesResolveContext) { // Initialize context context = bodiesResolveContext; @@ -543,12 +550,12 @@ public class BodyResolver { } }, true); - DelegatedPropertyUtils.resolveDelegatedPropertyGetMethod(propertyDescriptor, delegateExpression, delegateType, - expressionTypingServices, trace, accessorScope); + delegatedPropertyResolver.resolveDelegatedPropertyGetMethod(propertyDescriptor, delegateExpression, delegateType, + trace, accessorScope); if (jetProperty.isVar()) { - DelegatedPropertyUtils.resolveDelegatedPropertySetMethod(propertyDescriptor, delegateExpression, delegateType, - expressionTypingServices, trace, accessorScope); + delegatedPropertyResolver.resolveDelegatedPropertySetMethod(propertyDescriptor, delegateExpression, delegateType, + trace, accessorScope); } } @@ -570,9 +577,8 @@ public class BodyResolver { TemporaryBindingTrace traceToResolveConventionMethods = TemporaryBindingTrace.create(trace, "Trace to resolve delegated property convention methods"); OverloadResolutionResults - getMethodResults = DelegatedPropertyUtils.getDelegatedPropertyConventionMethod( - propertyDescriptor, delegateExpression, returnType, expressionTypingServices, - traceToResolveConventionMethods, accessorScope, true); + getMethodResults = delegatedPropertyResolver.getDelegatedPropertyConventionMethod( + propertyDescriptor, delegateExpression, returnType, traceToResolveConventionMethods, accessorScope, true); if (conventionMethodFound(getMethodResults)) { FunctionDescriptor descriptor = getMethodResults.getResultingDescriptor(); @@ -585,9 +591,8 @@ public class BodyResolver { if (!propertyDescriptor.isVar()) return; OverloadResolutionResults setMethodResults = - DelegatedPropertyUtils.getDelegatedPropertyConventionMethod( - propertyDescriptor, delegateExpression, returnType, expressionTypingServices, - traceToResolveConventionMethods, accessorScope, false); + delegatedPropertyResolver.getDelegatedPropertyConventionMethod( + propertyDescriptor, delegateExpression, returnType, traceToResolveConventionMethods, accessorScope, false); if (conventionMethodFound(setMethodResults)) { FunctionDescriptor descriptor = setMethodResults.getResultingDescriptor(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java index 0e1283e0fa7..0858ecdd417 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -38,7 +38,7 @@ 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.lang.types.checker.JetTypeChecker; -import org.jetbrains.jet.lang.types.expressions.DelegatedPropertyUtils; +import org.jetbrains.jet.lang.types.expressions.DelegatedPropertyResolver; import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lexer.JetKeywordToken; @@ -65,6 +65,8 @@ public class DescriptorResolver { private AnnotationResolver annotationResolver; @NotNull private ExpressionTypingServices expressionTypingServices; + @NotNull + private DelegatedPropertyResolver delegatedPropertyResolver; @Inject public void setTypeResolver(@NotNull TypeResolver typeResolver) { @@ -81,6 +83,10 @@ public class DescriptorResolver { this.expressionTypingServices = expressionTypingServices; } + @Inject + public void setDelegatedPropertyResolver(@NotNull DelegatedPropertyResolver delegatedPropertyResolver) { + this.delegatedPropertyResolver = delegatedPropertyResolver; + } public void resolveMutableClassDescriptor( @NotNull JetClass classElement, @@ -1093,9 +1099,8 @@ public class DescriptorResolver { JetType type = expressionTypingServices.safeGetType(scope, delegateExpression, TypeUtils.NO_EXPECTED_TYPE, dataFlowInfo, trace); JetScope accessorScope = JetScopeUtils.makeScopeForPropertyAccessor(propertyDescriptor, scope, this, trace); - JetType getterReturnType = DelegatedPropertyUtils - .getDelegatedPropertyGetMethodReturnType(propertyDescriptor, delegateExpression, type, expressionTypingServices, trace, - accessorScope); + JetType getterReturnType = delegatedPropertyResolver + .getDelegatedPropertyGetMethodReturnType(propertyDescriptor, delegateExpression, type, trace, accessorScope); if (getterReturnType != null) { return getterReturnType; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/DelegatedPropertyUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/DelegatedPropertyResolver.java similarity index 89% rename from compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/DelegatedPropertyUtils.java rename to compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/DelegatedPropertyResolver.java index f5f09cf4e85..f16fc52fa8f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/DelegatedPropertyUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/DelegatedPropertyResolver.java @@ -45,6 +45,7 @@ import org.jetbrains.jet.lang.types.TypeUtils; import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; +import javax.inject.Inject; import java.util.List; import static org.jetbrains.jet.lang.diagnostics.Errors.*; @@ -53,34 +54,39 @@ import static org.jetbrains.jet.lang.psi.JetPsiFactory.createSimpleName; import static org.jetbrains.jet.lang.resolve.BindingContext.*; import static org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils.createFakeExpressionOfType; -public class DelegatedPropertyUtils { +public class DelegatedPropertyResolver { + + @NotNull + private ExpressionTypingServices expressionTypingServices; + + @Inject + public void setExpressionTypingServices(@NotNull ExpressionTypingServices expressionTypingServices) { + this.expressionTypingServices = expressionTypingServices; + } @Nullable - public static JetType getDelegatedPropertyGetMethodReturnType( + public JetType getDelegatedPropertyGetMethodReturnType( @NotNull PropertyDescriptor propertyDescriptor, @NotNull JetExpression delegateExpression, @NotNull JetType delegateType, - @NotNull ExpressionTypingServices expressionTypingServices, @NotNull BindingTrace trace, @NotNull JetScope scope ) { - resolveDelegatedPropertyConventionMethod(propertyDescriptor, delegateExpression, delegateType, expressionTypingServices, trace, - scope, true); + resolveDelegatedPropertyConventionMethod(propertyDescriptor, delegateExpression, delegateType, trace, scope, true); ResolvedCall resolvedCall = trace.getBindingContext().get(DELEGATED_PROPERTY_RESOLVED_CALL, propertyDescriptor.getGetter()); return resolvedCall != null ? resolvedCall.getResultingDescriptor().getReturnType() : null; } - public static void resolveDelegatedPropertyGetMethod( + public void resolveDelegatedPropertyGetMethod( @NotNull PropertyDescriptor propertyDescriptor, @NotNull JetExpression delegateExpression, @NotNull JetType delegateType, - @NotNull ExpressionTypingServices expressionTypingServices, @NotNull BindingTrace trace, @NotNull JetScope scope ) { JetType returnType = getDelegatedPropertyGetMethodReturnType( - propertyDescriptor, delegateExpression, delegateType, expressionTypingServices, trace, scope); + propertyDescriptor, delegateExpression, delegateType, trace, scope); JetType propertyType = propertyDescriptor.getType(); /* Do not check return type of get() method of delegate for properties with DeferredType because property type is taken from it */ @@ -92,24 +98,21 @@ public class DelegatedPropertyUtils { } } - public static void resolveDelegatedPropertySetMethod( + public void resolveDelegatedPropertySetMethod( @NotNull PropertyDescriptor propertyDescriptor, @NotNull JetExpression delegateExpression, @NotNull JetType delegateType, - @NotNull ExpressionTypingServices expressionTypingServices, @NotNull BindingTrace trace, @NotNull JetScope scope ) { - resolveDelegatedPropertyConventionMethod(propertyDescriptor, delegateExpression, delegateType, expressionTypingServices, trace, - scope, false); + resolveDelegatedPropertyConventionMethod(propertyDescriptor, delegateExpression, delegateType, trace, scope, false); } /* Resolve get() or set() methods from delegate */ - private static void resolveDelegatedPropertyConventionMethod( + private void resolveDelegatedPropertyConventionMethod( @NotNull PropertyDescriptor propertyDescriptor, @NotNull JetExpression delegateExpression, @NotNull JetType delegateType, - @NotNull ExpressionTypingServices expressionTypingServices, @NotNull BindingTrace trace, @NotNull JetScope scope, boolean isGet @@ -120,7 +123,7 @@ public class DelegatedPropertyUtils { if (trace.getBindingContext().get(DELEGATED_PROPERTY_CALL, accessor) != null) return; OverloadResolutionResults functionResults = getDelegatedPropertyConventionMethod( - propertyDescriptor, delegateExpression, delegateType, expressionTypingServices, trace, scope, isGet); + propertyDescriptor, delegateExpression, delegateType, trace, scope, isGet); Call call = trace.getBindingContext().get(DELEGATED_PROPERTY_CALL, accessor); assert call != null : "'getDelegatedPropertyConventionMethod' didn't record a call"; @@ -148,11 +151,10 @@ public class DelegatedPropertyUtils { } /* Resolve get() or set() methods from delegate */ - public static OverloadResolutionResults getDelegatedPropertyConventionMethod( + public OverloadResolutionResults getDelegatedPropertyConventionMethod( @NotNull PropertyDescriptor propertyDescriptor, @NotNull JetExpression delegateExpression, @NotNull JetType delegateType, - @NotNull ExpressionTypingServices expressionTypingServices, @NotNull BindingTrace trace, @NotNull JetScope scope, boolean isGet @@ -191,7 +193,7 @@ public class DelegatedPropertyUtils { return context.resolveCallWithGivenName(call, fakeCalleeExpression, functionName); } - private static String renderCall(@NotNull Call call, @NotNull BindingContext context) { + private String renderCall(@NotNull Call call, @NotNull BindingContext context) { JetExpression calleeExpression = call.getCalleeExpression(); assert calleeExpression != null : "CalleeExpression should exists for fake call of convention method"; StringBuilder builder = new StringBuilder(calleeExpression.getText()); @@ -205,7 +207,4 @@ public class DelegatedPropertyUtils { builder.append(")"); return builder.toString(); } - - private DelegatedPropertyUtils() { - } } diff --git a/compiler/tests/org/jetbrains/jet/di/InjectorForTests.java b/compiler/tests/org/jetbrains/jet/di/InjectorForTests.java index ca1240cb689..70f7804cd13 100644 --- a/compiler/tests/org/jetbrains/jet/di/InjectorForTests.java +++ b/compiler/tests/org/jetbrains/jet/di/InjectorForTests.java @@ -26,6 +26,7 @@ import org.jetbrains.jet.lang.PlatformToKotlinClassMap; import com.intellij.openapi.project.Project; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.resolve.AnnotationResolver; +import org.jetbrains.jet.lang.types.expressions.DelegatedPropertyResolver; import org.jetbrains.jet.lang.resolve.calls.CallExpressionResolver; import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver; import org.jetbrains.jet.lang.resolve.calls.ArgumentTypeResolver; @@ -46,6 +47,7 @@ public class InjectorForTests { private final Project project; private final ModuleDescriptor moduleDescriptor; private final AnnotationResolver annotationResolver; + private final DelegatedPropertyResolver delegatedPropertyResolver; private final CallExpressionResolver callExpressionResolver; private final QualifiedExpressionResolver qualifiedExpressionResolver; private final ArgumentTypeResolver argumentTypeResolver; @@ -65,12 +67,14 @@ public class InjectorForTests { this.project = project; this.moduleDescriptor = moduleDescriptor; this.annotationResolver = new AnnotationResolver(); + this.delegatedPropertyResolver = new DelegatedPropertyResolver(); this.callExpressionResolver = new CallExpressionResolver(); this.qualifiedExpressionResolver = new QualifiedExpressionResolver(); this.argumentTypeResolver = new ArgumentTypeResolver(); this.candidateResolver = new CandidateResolver(); this.descriptorResolver.setAnnotationResolver(annotationResolver); + this.descriptorResolver.setDelegatedPropertyResolver(delegatedPropertyResolver); this.descriptorResolver.setExpressionTypingServices(expressionTypingServices); this.descriptorResolver.setTypeResolver(typeResolver); @@ -95,6 +99,8 @@ public class InjectorForTests { annotationResolver.setCallResolver(callResolver); annotationResolver.setExpressionTypingServices(expressionTypingServices); + delegatedPropertyResolver.setExpressionTypingServices(expressionTypingServices); + callExpressionResolver.setExpressionTypingServices(expressionTypingServices); argumentTypeResolver.setExpressionTypingServices(expressionTypingServices); diff --git a/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java b/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java index 566d52965a5..fca0e4ff92b 100644 --- a/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java +++ b/js/js.translator/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJs.java @@ -45,6 +45,7 @@ import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver; import org.jetbrains.jet.lang.resolve.OverloadResolver; import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver; +import org.jetbrains.jet.lang.types.expressions.DelegatedPropertyResolver; import org.jetbrains.jet.lang.resolve.ScriptBodyResolver; import org.jetbrains.annotations.NotNull; import javax.annotation.PreDestroy; @@ -81,6 +82,7 @@ public class InjectorForTopDownAnalyzerForJs { private final OverloadResolver overloadResolver; private final OverrideResolver overrideResolver; private final TypeHierarchyResolver typeHierarchyResolver; + private final DelegatedPropertyResolver delegatedPropertyResolver; private final ScriptBodyResolver scriptBodyResolver; public InjectorForTopDownAnalyzerForJs( @@ -118,6 +120,7 @@ public class InjectorForTopDownAnalyzerForJs { this.overloadResolver = new OverloadResolver(); this.overrideResolver = new OverrideResolver(); this.typeHierarchyResolver = new TypeHierarchyResolver(); + this.delegatedPropertyResolver = new DelegatedPropertyResolver(); this.scriptBodyResolver = new ScriptBodyResolver(); this.topDownAnalyzer.setBodyResolver(bodyResolver); @@ -138,6 +141,7 @@ public class InjectorForTopDownAnalyzerForJs { this.bodyResolver.setContext(topDownAnalysisContext); this.bodyResolver.setControlFlowAnalyzer(controlFlowAnalyzer); this.bodyResolver.setDeclarationsChecker(declarationsChecker); + this.bodyResolver.setDelegatedPropertyResolver(delegatedPropertyResolver); this.bodyResolver.setDescriptorResolver(descriptorResolver); this.bodyResolver.setExpressionTypingServices(expressionTypingServices); this.bodyResolver.setScriptBodyResolverResolver(scriptBodyResolver); @@ -150,6 +154,7 @@ public class InjectorForTopDownAnalyzerForJs { this.declarationsChecker.setTrace(bindingTrace); this.descriptorResolver.setAnnotationResolver(annotationResolver); + this.descriptorResolver.setDelegatedPropertyResolver(delegatedPropertyResolver); this.descriptorResolver.setExpressionTypingServices(expressionTypingServices); this.descriptorResolver.setTypeResolver(typeResolver); @@ -219,6 +224,8 @@ public class InjectorForTopDownAnalyzerForJs { typeHierarchyResolver.setScriptHeaderResolver(scriptHeaderResolver); typeHierarchyResolver.setTrace(bindingTrace); + delegatedPropertyResolver.setExpressionTypingServices(expressionTypingServices); + scriptBodyResolver.setContext(topDownAnalysisContext); scriptBodyResolver.setExpressionTypingServices(expressionTypingServices); scriptBodyResolver.setTrace(bindingTrace);