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