From 5f189a8c0fd3a8030f58c609c6d4cce090edee5a Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Wed, 11 Sep 2013 16:26:20 +0400 Subject: [PATCH] KT-3833 Invoke method not working inside class object? #KT-3833 Fixed --- .../lang/resolve/calls/CandidateResolver.java | 2 +- .../invoke/kt3833-invokeInsideNestedClass.kt | 35 +++++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 5 +++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/resolve/invoke/kt3833-invokeInsideNestedClass.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java index 21a83a50c07..d8655c09a74 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java @@ -185,7 +185,7 @@ public class CandidateResolver { private static boolean checkOuterClassMemberIsAccessible(@NotNull CallCandidateResolutionContext context) { // In "this@Outer.foo()" the error will be reported on "this@Outer" instead - if (context.call.getExplicitReceiver().exists()) return true; + if (context.call.getExplicitReceiver().exists() || context.call.getThisObject().exists()) return true; ClassDescriptor candidateThis = getDeclaringClass(context.candidateCall.getCandidateDescriptor()); if (candidateThis == null || candidateThis.getKind().isObject()) return true; diff --git a/compiler/testData/diagnostics/tests/resolve/invoke/kt3833-invokeInsideNestedClass.kt b/compiler/testData/diagnostics/tests/resolve/invoke/kt3833-invokeInsideNestedClass.kt new file mode 100644 index 00000000000..07cdca46b10 --- /dev/null +++ b/compiler/testData/diagnostics/tests/resolve/invoke/kt3833-invokeInsideNestedClass.kt @@ -0,0 +1,35 @@ +//KT-3833 Invoke method not working inside class object? +package m + +class Either1 { + class Left() { + fun match(left: () -> Unit) { + left() + } + } + + inner class Right() { + fun match(right: () -> Unit) { + right() + } + } +} + + +class X { + fun invoke() { + } +} + +object Foo{ + val v : X = X() +} + +class C{ + class object { + fun f(){ + Foo.v() + } + } +} + diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index db0573b15d4..4af452edd9b 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -4975,6 +4975,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/resolve/invoke/kt3772.kt"); } + @TestMetadata("kt3833-invokeInsideNestedClass.kt") + public void testKt3833_invokeInsideNestedClass() throws Exception { + doTest("compiler/testData/diagnostics/tests/resolve/invoke/kt3833-invokeInsideNestedClass.kt"); + } + } @TestMetadata("compiler/testData/diagnostics/tests/resolve/nestedCalls")