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 630308bcbba..0ccd424045d 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 @@ -119,10 +119,19 @@ public class CallResolver { else { callableDescriptorCollectors = CallableDescriptorCollectors.VARIABLES; } - TracingStrategy tracing = TracingStrategyImpl.create(nameExpression, context.call); - List> prioritizedTasks = - taskPrioritizer.computePrioritizedTasks(context, referencedName, tracing, callableDescriptorCollectors); - return doResolveCallOrGetCachedResults(context, prioritizedTasks, CallTransformer.PROPERTY_CALL_TRANSFORMER, tracing); + return computeTasksAndResolveCall( + context, referencedName, nameExpression, + callableDescriptorCollectors, CallTransformer.VARIABLE_CALL_TRANSFORMER); + } + + @NotNull + public OverloadResolutionResults resolveCallForMember( + @NotNull JetSimpleNameExpression nameExpression, + @NotNull BasicCallResolutionContext context + ) { + return computeTasksAndResolveCall( + context, nameExpression.getReferencedNameAsName(), nameExpression, + CallableDescriptorCollectors.FUNCTIONS_AND_VARIABLES, CallTransformer.MEMBER_CALL_TRANSFORMER); } @NotNull @@ -132,21 +141,10 @@ public class CallResolver { @NotNull JetReferenceExpression functionReference, @NotNull Name name ) { - return resolveCallWithGivenName( - BasicCallResolutionContext.create(context, call, CheckValueArgumentsMode.ENABLED), - functionReference, - name - ); - } - - @NotNull - public OverloadResolutionResults resolveCallWithGivenName( - @NotNull BasicCallResolutionContext context, - @NotNull JetReferenceExpression functionReference, - @NotNull Name name - ) { - TracingStrategy tracing = TracingStrategyImpl.create(functionReference, context.call); - return resolveCallWithGivenName(context, name, tracing, CallableDescriptorCollectors.FUNCTIONS_AND_VARIABLES); + BasicCallResolutionContext callResolutionContext = BasicCallResolutionContext.create(context, call, CheckValueArgumentsMode.ENABLED); + return computeTasksAndResolveCall( + callResolutionContext, name, functionReference, + CallableDescriptorCollectors.FUNCTIONS_AND_VARIABLES, CallTransformer.FUNCTION_CALL_TRANSFORMER); } @NotNull @@ -154,19 +152,33 @@ public class CallResolver { @NotNull BasicCallResolutionContext context, @NotNull TracingStrategy tracing ) { - return resolveCallWithGivenName(context, Name.identifier("invoke"), tracing, CallableDescriptorCollectors.FUNCTIONS); + return computeTasksAndResolveCall( + context, Name.identifier("invoke"), tracing, + CallableDescriptorCollectors.FUNCTIONS, CallTransformer.FUNCTION_CALL_TRANSFORMER); } @NotNull - public OverloadResolutionResults resolveCallWithGivenName( + private OverloadResolutionResults computeTasksAndResolveCall( + @NotNull BasicCallResolutionContext context, + @NotNull Name name, + @NotNull JetReferenceExpression referenceExpression, + @NotNull CallableDescriptorCollectors collectors, + @NotNull CallTransformer callTransformer + ) { + TracingStrategy tracing = TracingStrategyImpl.create(referenceExpression, context.call); + return computeTasksAndResolveCall(context, name, tracing, collectors, callTransformer); + } + + @NotNull + private OverloadResolutionResults computeTasksAndResolveCall( @NotNull BasicCallResolutionContext context, @NotNull Name name, @NotNull TracingStrategy tracing, - @NotNull CallableDescriptorCollectors collectors + @NotNull CallableDescriptorCollectors collectors, + @NotNull CallTransformer callTransformer ) { - List> tasks = - taskPrioritizer.computePrioritizedTasks(context, name, tracing, collectors); - return doResolveCallOrGetCachedResults(context, tasks, CallTransformer.FUNCTION_CALL_TRANSFORMER, tracing); + List> tasks = taskPrioritizer.computePrioritizedTasks(context, name, tracing, collectors); + return doResolveCallOrGetCachedResults(context, tasks, callTransformer, tracing); } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallTransformer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallTransformer.java index 262cc3b2ec2..6bb58413eb1 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallTransformer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallTransformer.java @@ -91,7 +91,9 @@ public class CallTransformer { } - public static CallTransformer PROPERTY_CALL_TRANSFORMER = new CallTransformer(); + public static CallTransformer MEMBER_CALL_TRANSFORMER = new CallTransformer(); + + public static CallTransformer VARIABLE_CALL_TRANSFORMER = new CallTransformer(); public static CallTransformer FUNCTION_CALL_TRANSFORMER = new CallTransformer() { @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index 606e6e79602..896804cb055 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -639,41 +639,22 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { @NotNull boolean[] result ) { Call call = CallMaker.makeCall(reference, receiver, null, reference, ThrowingList.instance()); - - TemporaryTraceAndCache funTrace = TemporaryTraceAndCache.create(context, "trace to resolve callable reference as function", + TemporaryTraceAndCache temporaryTrace = TemporaryTraceAndCache.create(context, "trace to resolve callable reference as function", reference); - ResolvedCall function = components.expressionTypingServices.getCallExpressionResolver() - .getResolvedCallForFunction(call, reference, context.replaceTraceAndCache(funTrace).replaceExpectedType(NO_EXPECTED_TYPE), - CheckValueArgumentsMode.DISABLED, result); - if (result[0]) { - funTrace.commit(); - if (function instanceof VariableAsFunctionResolvedCall) { - context.trace.report(UNSUPPORTED.on(reference, "References to variables aren't supported yet")); - return null; - } - - return function != null ? function.getResultingDescriptor() : null; - } - - TemporaryTraceAndCache varTrace = TemporaryTraceAndCache.create(context, "trace to resolve callable reference as variable", - reference); - OverloadResolutionResults variableResults = - components.expressionTypingServices.getCallResolver().resolveSimpleProperty( - BasicCallResolutionContext.create(context.replaceTraceAndCache(varTrace).replaceExpectedType(NO_EXPECTED_TYPE), - call, CheckValueArgumentsMode.DISABLED) - ); - if (!variableResults.isNothing()) { - ResolvedCall variable = - OverloadResolutionResultsUtil.getResultingCall(variableResults, context.contextDependency); - - varTrace.commit(); - if (variable != null) { - result[0] = true; - return variable.getResultingDescriptor(); + BasicCallResolutionContext callResolutionContext = BasicCallResolutionContext.create( + context.replaceTraceAndCache(temporaryTrace).replaceExpectedType(NO_EXPECTED_TYPE), call, CheckValueArgumentsMode.DISABLED); + OverloadResolutionResults results = + components.expressionTypingServices.getCallResolver().resolveCallForMember(reference, callResolutionContext); + if (!results.isNothing()) { + temporaryTrace.commit(); + result[0] = true; + ResolvedCall callable = + OverloadResolutionResultsUtil.getResultingCall(results, context.contextDependency); + if (callable != null) { + return callable.getResultingDescriptor(); } } - return null; } diff --git a/compiler/testData/diagnostics/testsWithStdLib/callableReference/property/samePriorityForFunctionsAndProperties.kt b/compiler/testData/diagnostics/testsWithStdLib/callableReference/property/samePriorityForFunctionsAndProperties.kt new file mode 100644 index 00000000000..6a4a3e07b96 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/callableReference/property/samePriorityForFunctionsAndProperties.kt @@ -0,0 +1,13 @@ +// !CHECK_TYPE + +import kotlin.reflect.KMemberProperty + +class C { + val baz: Int = 12 +} + +fun Int.baz() {} + +fun test() { + C::baz checkType { it : _>} +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/callableReference/property/samePriorityForFunctionsAndProperties.txt b/compiler/testData/diagnostics/testsWithStdLib/callableReference/property/samePriorityForFunctionsAndProperties.txt new file mode 100644 index 00000000000..fc8da96f8a8 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/callableReference/property/samePriorityForFunctionsAndProperties.txt @@ -0,0 +1,12 @@ +package + +internal fun test(): kotlin.Unit +internal fun kotlin.Int.baz(): kotlin.Unit + +internal final class C { + public constructor C() + internal final val baz: kotlin.Int = 12 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestWithStdLibGenerated.java index 9fc7e0ceb85..9019ce00c2a 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestWithStdLibGenerated.java @@ -544,6 +544,12 @@ public class JetDiagnosticsTestWithStdLibGenerated extends AbstractJetDiagnostic doTest(fileName); } + @TestMetadata("samePriorityForFunctionsAndProperties.kt") + public void testSamePriorityForFunctionsAndProperties() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/callableReference/property/samePriorityForFunctionsAndProperties.kt"); + doTest(fileName); + } + @TestMetadata("topLevelFromTopLevel.kt") public void testTopLevelFromTopLevel() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/callableReference/property/topLevelFromTopLevel.kt");