Find Usages: Use MethodReferencesSearch to find constructor usages

This commit is contained in:
Alexey Sedunov
2017-06-30 16:00:59 +03:00
parent 28c5978d81
commit 994b6d687c
7 changed files with 17 additions and 11 deletions
@@ -24,6 +24,7 @@ import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement
import com.intellij.psi.search.PsiElementProcessor
import com.intellij.psi.search.PsiElementProcessorAdapter
import com.intellij.psi.search.searches.MethodReferencesSearch
import com.intellij.psi.search.searches.ReferencesSearch
import com.intellij.usageView.UsageInfo
import com.intellij.util.FilteredQuery
@@ -34,7 +35,6 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.findUsages.KotlinClassFindUsagesOptions
import org.jetbrains.kotlin.idea.findUsages.KotlinFindUsagesHandlerFactory
import org.jetbrains.kotlin.idea.findUsages.dialogs.KotlinFindClassUsagesDialog
import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.idea.search.declarationsSearch.HierarchySearchRequest
import org.jetbrains.kotlin.idea.search.declarationsSearch.searchInheritors
import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchOptions
@@ -42,7 +42,6 @@ import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchPar
import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
import org.jetbrains.kotlin.idea.search.usagesSearch.isConstructorUsage
import org.jetbrains.kotlin.idea.search.usagesSearch.isImportUsage
import org.jetbrains.kotlin.idea.search.usagesSearch.buildProcessDelegationCallConstructorUsagesTask
import org.jetbrains.kotlin.idea.util.application.runReadAction
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.anyDescendantOfType
@@ -99,10 +98,11 @@ class KotlinFindClassUsagesHandler(
if (kotlinOptions.searchConstructorUsages) {
classOrObject.toLightClass()?.constructors?.filterIsInstance<KtLightMethod>()?.forEach { constructor ->
val scope = constructor.useScope.intersectWith(options.searchScope)
val task = constructor.buildProcessDelegationCallConstructorUsagesTask(scope) {
it.calleeExpression?.mainReference?.let { referenceProcessor.process(it) } ?: false
var query = MethodReferencesSearch.search(constructor, scope, true)
if (kotlinOptions.isSkipImportStatements) {
query = FilteredQuery(query) { !it.isImportUsage() }
}
addTask(task)
addTask { query.forEach(Processor { referenceProcessor.process(it) }) }
}
}
@@ -18,4 +18,5 @@
[kotlinDeeplyNestedClassAllUsages.1.kt] Usage in cast target type 41 return if (this is Inner.A) this as Inner.A else null
[kotlinDeeplyNestedClassAllUsages.2.java] Field declaration 6 Inner.A next = new Inner.A();
[kotlinDeeplyNestedClassAllUsages.2.java] New instance creation 6 Inner.A next = new Inner.A();
[kotlinDeeplyNestedClassAllUsages.2.java] Usage in extends/implements clause 5 public class X extends Inner.A {
[kotlinDeeplyNestedClassAllUsages.2.java] Unclassified usage 5 public class X extends Inner.A {
[kotlinDeeplyNestedClassAllUsages.2.java] Usage in extends/implements clause 5 public class X extends Inner.A {
@@ -18,4 +18,5 @@
[kotlinInnerClassAllUsages.1.kt] Usage in cast target type 38 return if (this is Outer.A) this as Outer.A else null
[kotlinInnerClassAllUsages.2.java] Field declaration 10 A next = new A();
[kotlinInnerClassAllUsages.2.java] New instance creation 10 A next = new A();
[kotlinInnerClassAllUsages.2.java] Usage in extends/implements clause 6 class Y extends A {
[kotlinInnerClassAllUsages.2.java] Unclassified usage 6 class Y extends A {
[kotlinInnerClassAllUsages.2.java] Usage in extends/implements clause 6 class Y extends A {
@@ -18,4 +18,5 @@
[kotlinNestedClassAllUsages.1.kt] Usage in cast target type 41 return if (this is Outer.A) this as Outer.A else null
[kotlinNestedClassAllUsages.2.java] Field declaration 6 Outer.A next = new Outer.A();
[kotlinNestedClassAllUsages.2.java] New instance creation 6 Outer.A next = new Outer.A();
[kotlinNestedClassAllUsages.2.java] Usage in extends/implements clause 5 public class X extends Outer.A {
[kotlinNestedClassAllUsages.2.java] Unclassified usage 5 public class X extends Outer.A {
[kotlinNestedClassAllUsages.2.java] Usage in extends/implements clause 5 public class X extends Outer.A {
@@ -1 +1,2 @@
Usage in extends/implements clause 1 public class Client extends Foo {}
Unclassified usage 1 public class Client extends Foo {}
Usage in extends/implements clause 1 public class Client extends Foo {}
@@ -7,6 +7,7 @@
[LibraryClassUsages.1.java] Local variable declaration 12 A aa = new A(1);
[LibraryClassUsages.1.java] New instance creation 11 A a = new A();
[LibraryClassUsages.1.java] New instance creation 12 A aa = new A(1);
[LibraryClassUsages.1.java] Unclassified usage 7 super(n);
[LibraryClassUsages.1.java] Usage in extends/implements clause 5 class J extends A {
[library.kt] Nested class/object 63 val t = A.T(1)
[library.kt] Nested class/object 64 val tt = A.T()
@@ -21,4 +22,4 @@
[library.kt] Supertype 34 class UU: A.T {
[library.kt] Supertype 39 class CC(): A() {
[library.kt] Supertype 40 class VV(): A.T()
[library.kt] Unclassified usage 61 val ff = A::foo
[library.kt] Unclassified usage 61 val ff = A::foo
@@ -7,6 +7,7 @@
[LibraryNestedClassUsages.1.java] Local variable declaration 12 A.T tt = new A.T(1);
[LibraryNestedClassUsages.1.java] New instance creation 11 A.T t = new A.T();
[LibraryNestedClassUsages.1.java] New instance creation 12 A.T tt = new A.T(1);
[LibraryNestedClassUsages.1.java] Unclassified usage 7 super(n);
[LibraryNestedClassUsages.1.java] Usage in extends/implements clause 5 class J extends A.T {
[library.kt] New instance creation 63 val t = A.T(1)
[library.kt] New instance creation 64 val tt = A.T()
@@ -14,4 +15,4 @@
[library.kt] Supertype 28 class V(): A.T(1)
[library.kt] Supertype 34 class UU: A.T {
[library.kt] Supertype 40 class VV(): A.T()
[library.kt] Unclassified usage 66 val fff = A.T::bar
[library.kt] Unclassified usage 66 val fff = A.T::bar