search for members of companion object in KotlinReferencesSearch is optional

This commit is contained in:
Dmitry Jemerov
2015-09-02 21:34:00 +02:00
parent fcb8b796c4
commit ebce992f20
3 changed files with 27 additions and 22 deletions
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.asJava.*
import org.jetbrains.kotlin.idea.JetFileType
import org.jetbrains.kotlin.idea.references.JetSimpleNameReference
import org.jetbrains.kotlin.idea.search.KOTLIN_NAMED_ARGUMENT_SEARCH_CONTEXT
import org.jetbrains.kotlin.idea.search.allScope
import org.jetbrains.kotlin.idea.search.usagesSearch.*
import org.jetbrains.kotlin.idea.stubindex.JetSourceFilterScope
import org.jetbrains.kotlin.idea.util.application.runReadAction
@@ -34,9 +35,10 @@ import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.psi.psiUtil.parents
data class KotlinReferencesSearchOptions(val acceptCallableOverrides: Boolean,
val acceptOverloads: Boolean,
val acceptExtensionsOfDeclarationClass: Boolean) {
data class KotlinReferencesSearchOptions(val acceptCallableOverrides: Boolean = false,
val acceptOverloads: Boolean = false,
val acceptExtensionsOfDeclarationClass: Boolean = false,
val acceptCompanionObjectMembers: Boolean = false) {
fun anyEnabled(): Boolean = acceptCallableOverrides || acceptOverloads || acceptExtensionsOfDeclarationClass
companion object {
@@ -45,10 +47,10 @@ data class KotlinReferencesSearchOptions(val acceptCallableOverrides: Boolean,
}
public class KotlinReferencesSearchParameters(elementToSearch: PsiElement,
scope: SearchScope,
ignoreAccessScope: Boolean,
optimizer: SearchRequestCollector?,
val kotlinOptions: KotlinReferencesSearchOptions)
scope: SearchScope = elementToSearch.project.allScope(),
ignoreAccessScope: Boolean = false,
optimizer: SearchRequestCollector? = null,
val kotlinOptions: KotlinReferencesSearchOptions = KotlinReferencesSearchOptions.Empty)
: ReferencesSearch.SearchParameters(elementToSearch, scope, ignoreAccessScope, optimizer) {
}
@@ -179,17 +181,20 @@ public class KotlinReferencesSearcher : QueryExecutorBase<PsiReference, Referenc
searchNamedElement(queryParameters, fieldForCompanionObject)
}
val originClass = element.getStrictParentOfType<JetClass>()
val originLightClass = LightClassUtil.getPsiClass(originClass)
if (originLightClass != null) {
val lightDeclarations: List<KotlinLightElement<*, *>?> =
originLightClass.methods.map { it as? KotlinLightMethod } +
originLightClass.fields.map { it as? KotlinLightFieldForDeclaration }
val kotlinReferencesSearchOptions = (queryParameters as? KotlinReferencesSearchParameters)?.kotlinOptions
if (kotlinReferencesSearchOptions?.acceptCompanionObjectMembers == true) {
val originClass = element.getStrictParentOfType<JetClass>()
val originLightClass = LightClassUtil.getPsiClass(originClass)
if (originLightClass != null) {
val lightDeclarations: List<KotlinLightElement<*, *>?> =
originLightClass.methods.map { it as? KotlinLightMethod } +
originLightClass.fields.map { it as? KotlinLightFieldForDeclaration }
for (declaration in element.declarations) {
val lightDeclaration = lightDeclarations.find { it?.getOrigin() == declaration }
if (lightDeclaration != null) {
searchNamedElement(queryParameters, lightDeclaration)
for (declaration in element.declarations) {
val lightDeclaration = lightDeclarations.find { it?.getOrigin() == declaration }
if (lightDeclaration != null) {
searchNamedElement(queryParameters, lightDeclaration)
}
}
}
}
@@ -41,6 +41,8 @@ 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
import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchParameters
import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
import org.jetbrains.kotlin.idea.search.usagesSearch.isConstructorUsage
import org.jetbrains.kotlin.idea.search.usagesSearch.isImportUsage
@@ -126,7 +128,9 @@ public class KotlinFindClassUsagesHandler(
private fun processClassReferences(classOrObject: JetClassOrObject,
options: KotlinClassFindUsagesOptions,
processor: Processor<PsiReference>): Boolean {
var usagesQuery = ReferencesSearch.search(classOrObject)
val searchParameters = KotlinReferencesSearchParameters(classOrObject,
kotlinOptions = KotlinReferencesSearchOptions(acceptCompanionObjectMembers = true))
var usagesQuery = ReferencesSearch.search(searchParameters)
if (options.isSkipImportStatements) {
usagesQuery = FilteredQuery(usagesQuery) { !it.isImportUsage() }
@@ -35,7 +35,6 @@ import org.jetbrains.kotlin.idea.findUsages.KotlinFunctionFindUsagesOptions
import org.jetbrains.kotlin.idea.findUsages.KotlinPropertyFindUsagesOptions
import org.jetbrains.kotlin.idea.findUsages.dialogs.KotlinFindFunctionUsagesDialog
import org.jetbrains.kotlin.idea.findUsages.dialogs.KotlinFindPropertyUsagesDialog
import org.jetbrains.kotlin.idea.search.allScope
import org.jetbrains.kotlin.idea.search.declarationsSearch.HierarchySearchRequest
import org.jetbrains.kotlin.idea.search.declarationsSearch.searchOverriders
import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReadWriteAccessDetector
@@ -126,9 +125,6 @@ public abstract class KotlinFindMemberUsagesHandler<T : JetNamedDeclaration>
if (options.isUsages) {
val searchParameters = KotlinReferencesSearchParameters(element,
element.project.allScope(),
ignoreAccessScope = false,
optimizer = null,
kotlinOptions = createKotlinReferencesSearchOptions(options))
val query = applyQueryFilters(element, options, ReferencesSearch.search(searchParameters))