From a6a70755682c587727da14e9d6e18011e83f9fd1 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Mon, 5 Sep 2016 16:17:35 +0300 Subject: [PATCH] Fixed the case of public from private class inheritance in Java --- .../usagesSearch/ExpressionsOfTypeProcessor.kt | 6 ++++-- .../kotlin/conventions/components/dataClass.1.kt | 1 + .../kotlin/conventions/components/dataClass.3.java | 14 ++++++++++++++ .../kotlin/conventions/components/dataClass.log | 6 ++++++ .../conventions/components/dataClass.results.txt | 1 + 5 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 idea/testData/findUsages/kotlin/conventions/components/dataClass.3.java diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/ExpressionsOfTypeProcessor.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/ExpressionsOfTypeProcessor.kt index 00d1b3db72e..b7a8ddf0d30 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/ExpressionsOfTypeProcessor.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/ExpressionsOfTypeProcessor.kt @@ -455,7 +455,7 @@ class ExpressionsOfTypeProcessor( is PsiReferenceList -> { // usage in extends/implements list if (parent.role == PsiReferenceList.Role.EXTENDS_LIST || parent.role == PsiReferenceList.Role.IMPLEMENTS_LIST) { val psiClass = parent.parent as PsiClass - if (!psiClass.isPrivateOrLocal()) { + if (!psiClass.isLocal()) { // we don't filter out private classes because we can inherit public class from private in Java addClassToProcess(psiClass) } } @@ -628,9 +628,11 @@ class ExpressionsOfTypeProcessor( } private fun PsiModifierListOwner.isPrivateOrLocal(): Boolean { - return hasModifierProperty(PsiModifier.PRIVATE) || parents.any { it is PsiCodeBlock } + return hasModifierProperty(PsiModifier.PRIVATE) || isLocal() } + private fun PsiModifierListOwner.isLocal() = parents.any { it is PsiCodeBlock } + private fun PsiElement.isOperatorExpensiveToSearch(): Boolean { when (this) { is KtFunction -> { diff --git a/idea/testData/findUsages/kotlin/conventions/components/dataClass.1.kt b/idea/testData/findUsages/kotlin/conventions/components/dataClass.1.kt index 6aa5aa1bbe4..8d7466460fa 100644 --- a/idea/testData/findUsages/kotlin/conventions/components/dataClass.1.kt +++ b/idea/testData/findUsages/kotlin/conventions/components/dataClass.1.kt @@ -24,4 +24,5 @@ fun listOfA() = listOf(A(1, "", "")) fun test2(p1: JavaClass2, p2: JavaClass3) { val (x1, y1) = p1[0] val (x2, y2) = p2[0] + val (x3, y3) = JavaClass4.getNested()[0] } \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/conventions/components/dataClass.3.java b/idea/testData/findUsages/kotlin/conventions/components/dataClass.3.java new file mode 100644 index 00000000000..9f471457113 --- /dev/null +++ b/idea/testData/findUsages/kotlin/conventions/components/dataClass.3.java @@ -0,0 +1,14 @@ +import pack.A; + +import java.util.List; + +public class JavaClass4 { + private interface NestedPrivate extends List { + } + + public interface NestedPublic extends NestedPrivate { + } + + public static NestedPublic getNested() { + } +} diff --git a/idea/testData/findUsages/kotlin/conventions/components/dataClass.log b/idea/testData/findUsages/kotlin/conventions/components/dataClass.log index 8ec6f649588..406d82fdc57 100644 --- a/idea/testData/findUsages/kotlin/conventions/components/dataClass.log +++ b/idea/testData/findUsages/kotlin/conventions/components/dataClass.log @@ -9,6 +9,7 @@ Checked type of x1 Checked type of x2 Checked type of x2 Checked type of x3 +Checked type of x3 Checked type of x4 Checked type of x5 Checked type of y @@ -17,6 +18,7 @@ Checked type of y1 Checked type of y2 Checked type of y2 Checked type of y3 +Checked type of y3 Checked type of y4 Checked type of y5 Checked type of z @@ -30,12 +32,16 @@ Resolved (x1, y1) Resolved (x1, y1, z1) Resolved (x2, y2) Resolved (x2, y2, z2) +Resolved (x3, y3) Resolved (x3, y3, z3) Resolved (x4, y4, z4) Resolved (x5, y5, z5) Searched references to JavaClass.getA() in Kotlin files Searched references to JavaClass2 Searched references to JavaClass3 +Searched references to JavaClass4.NestedPrivate +Searched references to JavaClass4.NestedPublic +Searched references to JavaClass4.getNested() in Kotlin files Searched references to a in Kotlin files Searched references to f() in Kotlin files Searched references to g() in Kotlin files diff --git a/idea/testData/findUsages/kotlin/conventions/components/dataClass.results.txt b/idea/testData/findUsages/kotlin/conventions/components/dataClass.results.txt index 87c2cbe1aed..e71b80b80f0 100644 --- a/idea/testData/findUsages/kotlin/conventions/components/dataClass.results.txt +++ b/idea/testData/findUsages/kotlin/conventions/components/dataClass.results.txt @@ -7,6 +7,7 @@ [dataClass.1.kt] Value read 15 val (x5, y5, z5) = javaClass.getA()[0] [dataClass.1.kt] Value read 25 val (x1, y1) = p1[0] [dataClass.1.kt] Value read 26 val (x2, y2) = p2[0] +[dataClass.1.kt] Value read 27 val (x3, y3) = JavaClass4.getNested()[0] [dataClass.1.kt] Value read 5 a.n [dataClass.1.kt] Value read 8 val (x, y, z) = a [dataClass.1.kt] Value read 9 val (x1, y1, z1) = f() \ No newline at end of file