diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetPsiUtil.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetPsiUtil.java index 1d1df588374..ba5d664b652 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetPsiUtil.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetPsiUtil.java @@ -793,6 +793,14 @@ public class JetPsiUtil { return getEnclosingElementForLocalDeclaration(declaration, true); } + private static boolean isMemberOfObjectExpression(@NotNull JetCallableDeclaration propertyOrFunction) { + PsiElement parent = PsiTreeUtil.getStubOrPsiParent(propertyOrFunction); + if (!(parent instanceof JetClassBody)) return false; + PsiElement grandparent = PsiTreeUtil.getStubOrPsiParent(parent); + if (!(grandparent instanceof JetObjectDeclaration)) return false; + return PsiTreeUtil.getStubOrPsiParent(grandparent) instanceof JetObjectLiteralExpression; + } + @Nullable public static JetElement getEnclosingElementForLocalDeclaration(@NotNull JetDeclaration declaration, boolean skipParameters) { if (declaration instanceof JetTypeParameter && skipParameters) { @@ -819,10 +827,12 @@ public class JetPsiUtil { if (current instanceof JetClassInitializer) { return ((JetClassInitializer) current).getBody(); } - if (current instanceof JetBlockExpression || - current instanceof JetProperty || - current instanceof JetParameter || - current instanceof JetFunction) { + if (current instanceof JetProperty || current instanceof JetFunction) { + if (parent instanceof JetFile || (parent instanceof JetClassBody && !isMemberOfObjectExpression((JetCallableDeclaration) current))) { + return (JetElement) current; + } + } + if (current instanceof JetBlockExpression || current instanceof JetParameter) { return (JetElement) current; } diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/localClassMember.0.kt b/idea/testData/findUsages/kotlin/findFunctionUsages/localClassMember.0.kt new file mode 100644 index 00000000000..e42f9973b0d --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/localClassMember.0.kt @@ -0,0 +1,12 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.JetNamedFunction +// OPTIONS: usages +package anonymousUnused + +fun main(args: Array) { + class LocalClass { + fun f() { + } + } + + LocalClass().f() +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/localClassMember.results.txt b/idea/testData/findUsages/kotlin/findFunctionUsages/localClassMember.results.txt new file mode 100644 index 00000000000..8bce9f71188 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/localClassMember.results.txt @@ -0,0 +1 @@ +Function call (11: 18) LocalClass().f() \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionDeepMember.0.kt b/idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionDeepMember.0.kt new file mode 100644 index 00000000000..d73c6e80b94 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionDeepMember.0.kt @@ -0,0 +1,15 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.JetProperty +// OPTIONS: usages +package anonymousUnused + +fun main(args: Array) { + val a = object { + val b = object { + val c = object { + val d = 5 + } + } + } + + a.b.c.d +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionDeepMember.results.txt b/idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionDeepMember.results.txt new file mode 100644 index 00000000000..afa35e6d7c3 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionDeepMember.results.txt @@ -0,0 +1 @@ +Value read (14: 11) a.b.c.d \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionMember.0.kt b/idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionMember.0.kt new file mode 100644 index 00000000000..9e3ce698382 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionMember.0.kt @@ -0,0 +1,12 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.JetNamedFunction +// OPTIONS: usages +package anonymousUnused + +fun main(args: Array) { + val localObject = object : Any() { + fun f() { + } + } + + localObject.f() +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionMember.results.txt b/idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionMember.results.txt new file mode 100644 index 00000000000..82353d58d0a --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionMember.results.txt @@ -0,0 +1 @@ +Function call (11: 17) localObject.f() \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionMember2.0.kt b/idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionMember2.0.kt new file mode 100644 index 00000000000..e55c4687fa0 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionMember2.0.kt @@ -0,0 +1,12 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.JetNamedFunction +// OPTIONS: usages +package anonymousUnused + +fun main(args: Array) { + fun localObject() = object : Any() { + fun f() { + } + } + + localObject().f() +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionMember2.results.txt b/idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionMember2.results.txt new file mode 100644 index 00000000000..49fe2eb71c8 --- /dev/null +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionMember2.results.txt @@ -0,0 +1 @@ +Function call (11: 19) localObject().f() diff --git a/idea/testData/inspections/unusedSymbol/function/localMember.kt b/idea/testData/inspections/unusedSymbol/function/localMember.kt new file mode 100644 index 00000000000..eeaa39a1522 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/function/localMember.kt @@ -0,0 +1,45 @@ +fun main(args: Array) { + val localObject = object { + fun f() { + } + + val p = 5 + } + + localObject.f() + localObject.p + + + fun localObject2() = object { + fun f() { + } + + val p = 5 + } + + localObject2().f() + localObject2().p + + + val a = object { + val b = object { + val c = object { + val d = 5 + } + } + } + + a.b.c.d + + + class LocalClass { + fun f() { + } + + val p = 5 + } + + + LocalClass().f() + LocalClass().p +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java b/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java index ffbfec37e0e..ad73597e13f 100644 --- a/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/findUsages/JetFindUsagesTestGenerated.java @@ -618,6 +618,30 @@ public class JetFindUsagesTestGenerated extends AbstractJetFindUsagesTest { doTest(fileName); } + @TestMetadata("localClassMember.0.kt") + public void testLocalClassMember() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findFunctionUsages/localClassMember.0.kt"); + doTest(fileName); + } + + @TestMetadata("objectExpressionDeepMember.0.kt") + public void testObjectExpressionDeepMember() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionDeepMember.0.kt"); + doTest(fileName); + } + + @TestMetadata("objectExpressionMember.0.kt") + public void testObjectExpressionMember() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionMember.0.kt"); + doTest(fileName); + } + + @TestMetadata("objectExpressionMember2.0.kt") + public void testObjectExpressionMember2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findFunctionUsages/objectExpressionMember2.0.kt"); + doTest(fileName); + } + @TestMetadata("synthesizedFunction.0.kt") public void testSynthesizedFunction() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/findFunctionUsages/synthesizedFunction.0.kt");