Quick search of equals operator usages
This commit is contained in:
@@ -192,14 +192,14 @@ object OperatorChecks : AbstractModifierChecks() {
|
|||||||
Checks(RANGE_TO, MemberOrExtension, SingleValueParameter, NoDefaultAndVarargsCheck),
|
Checks(RANGE_TO, MemberOrExtension, SingleValueParameter, NoDefaultAndVarargsCheck),
|
||||||
Checks(EQUALS, Member) {
|
Checks(EQUALS, Member) {
|
||||||
fun DeclarationDescriptor.isAny() = this is ClassDescriptor && KotlinBuiltIns.isAny(this)
|
fun DeclarationDescriptor.isAny() = this is ClassDescriptor && KotlinBuiltIns.isAny(this)
|
||||||
ensure(overriddenDescriptors.any { it.containingDeclaration.isAny() }) { "must override ''equals()'' in Any" }
|
ensure(containingDeclaration.isAny() || overriddenDescriptors.any { it.containingDeclaration.isAny() }) { "must override ''equals()'' in Any" }
|
||||||
},
|
},
|
||||||
Checks(COMPARE_TO, MemberOrExtension, ReturnsInt, SingleValueParameter, NoDefaultAndVarargsCheck),
|
Checks(COMPARE_TO, MemberOrExtension, ReturnsInt, SingleValueParameter, NoDefaultAndVarargsCheck),
|
||||||
Checks(BINARY_OPERATION_NAMES, MemberOrExtension, SingleValueParameter, NoDefaultAndVarargsCheck),
|
Checks(BINARY_OPERATION_NAMES, MemberOrExtension, SingleValueParameter, NoDefaultAndVarargsCheck),
|
||||||
Checks(SIMPLE_UNARY_OPERATION_NAMES, MemberOrExtension, NoValueParameters),
|
Checks(SIMPLE_UNARY_OPERATION_NAMES, MemberOrExtension, NoValueParameters),
|
||||||
Checks(listOf(INC, DEC), MemberOrExtension) {
|
Checks(listOf(INC, DEC), MemberOrExtension) {
|
||||||
val receiver = dispatchReceiverParameter ?: extensionReceiverParameter
|
val receiver = dispatchReceiverParameter ?: extensionReceiverParameter
|
||||||
ensure(receiver != null && (returnType?.let { it.isSubtypeOf(receiver.type) } ?: false)) {
|
ensure(receiver != null && (returnType?.isSubtypeOf(receiver.type) ?: false)) {
|
||||||
"receiver must be a supertype of the return type"
|
"receiver must be a supertype of the return type"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
+4
-2
@@ -22,6 +22,7 @@ import com.intellij.psi.search.SearchRequestCollector
|
|||||||
import com.intellij.psi.search.SearchScope
|
import com.intellij.psi.search.SearchScope
|
||||||
import com.intellij.util.Processor
|
import com.intellij.util.Processor
|
||||||
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
|
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
|
||||||
|
import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchOptions
|
||||||
import org.jetbrains.kotlin.lexer.KtSingleValueToken
|
import org.jetbrains.kotlin.lexer.KtSingleValueToken
|
||||||
import org.jetbrains.kotlin.psi.KtBinaryExpression
|
import org.jetbrains.kotlin.psi.KtBinaryExpression
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
@@ -33,8 +34,9 @@ class BinaryOperatorReferenceSearcher(
|
|||||||
private val operationTokens: List<KtSingleValueToken>,
|
private val operationTokens: List<KtSingleValueToken>,
|
||||||
searchScope: SearchScope,
|
searchScope: SearchScope,
|
||||||
consumer: Processor<PsiReference>,
|
consumer: Processor<PsiReference>,
|
||||||
optimizer: SearchRequestCollector
|
optimizer: SearchRequestCollector,
|
||||||
) : OperatorReferenceSearcher<KtBinaryExpression>(targetFunction, searchScope, consumer, optimizer, wordsToSearch = operationTokens.map { it.value }) {
|
options: KotlinReferencesSearchOptions
|
||||||
|
) : OperatorReferenceSearcher<KtBinaryExpression>(targetFunction, searchScope, consumer, optimizer, options, wordsToSearch = operationTokens.map { it.value }) {
|
||||||
|
|
||||||
override fun processPossibleReceiverExpression(expression: KtExpression) {
|
override fun processPossibleReceiverExpression(expression: KtExpression) {
|
||||||
val binaryExpression = expression.parent as? KtBinaryExpression ?: return
|
val binaryExpression = expression.parent as? KtBinaryExpression ?: return
|
||||||
|
|||||||
+4
-2
@@ -22,6 +22,7 @@ import com.intellij.psi.search.SearchRequestCollector
|
|||||||
import com.intellij.psi.search.SearchScope
|
import com.intellij.psi.search.SearchScope
|
||||||
import com.intellij.util.Processor
|
import com.intellij.util.Processor
|
||||||
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
|
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
|
||||||
|
import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchOptions
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
|
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
|
||||||
@@ -30,8 +31,9 @@ class ContainsOperatorReferenceSearcher(
|
|||||||
targetFunction: PsiElement,
|
targetFunction: PsiElement,
|
||||||
searchScope: SearchScope,
|
searchScope: SearchScope,
|
||||||
consumer: Processor<PsiReference>,
|
consumer: Processor<PsiReference>,
|
||||||
optimizer: SearchRequestCollector
|
optimizer: SearchRequestCollector,
|
||||||
) : OperatorReferenceSearcher<KtOperationReferenceExpression>(targetFunction, searchScope, consumer, optimizer, wordsToSearch = listOf("in")) {
|
options: KotlinReferencesSearchOptions
|
||||||
|
) : OperatorReferenceSearcher<KtOperationReferenceExpression>(targetFunction, searchScope, consumer, optimizer, options, wordsToSearch = listOf("in")) {
|
||||||
|
|
||||||
private val OPERATION_TOKENS = setOf(KtTokens.IN_KEYWORD, KtTokens.NOT_IN)
|
private val OPERATION_TOKENS = setOf(KtTokens.IN_KEYWORD, KtTokens.NOT_IN)
|
||||||
|
|
||||||
|
|||||||
+4
-2
@@ -24,6 +24,7 @@ import com.intellij.util.Processor
|
|||||||
import org.jetbrains.kotlin.KtNodeTypes
|
import org.jetbrains.kotlin.KtNodeTypes
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.idea.references.KtDestructuringDeclarationReference
|
import org.jetbrains.kotlin.idea.references.KtDestructuringDeclarationReference
|
||||||
|
import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchOptions
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
|
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
|
||||||
|
|
||||||
@@ -32,8 +33,9 @@ class DestructuringDeclarationReferenceSearcher(
|
|||||||
private val componentIndex: Int,
|
private val componentIndex: Int,
|
||||||
searchScope: SearchScope,
|
searchScope: SearchScope,
|
||||||
consumer: Processor<PsiReference>,
|
consumer: Processor<PsiReference>,
|
||||||
optimizer: SearchRequestCollector
|
optimizer: SearchRequestCollector,
|
||||||
) : OperatorReferenceSearcher<KtDestructuringDeclaration>(targetDeclaration, searchScope, consumer, optimizer, wordsToSearch = listOf("(")) {
|
options: KotlinReferencesSearchOptions
|
||||||
|
) : OperatorReferenceSearcher<KtDestructuringDeclaration>(targetDeclaration, searchScope, consumer, optimizer, options, wordsToSearch = listOf("(")) {
|
||||||
|
|
||||||
override fun resolveTargetToDescriptor(): FunctionDescriptor? {
|
override fun resolveTargetToDescriptor(): FunctionDescriptor? {
|
||||||
if (targetDeclaration is KtParameter) {
|
if (targetDeclaration is KtParameter) {
|
||||||
|
|||||||
+5
-4
@@ -125,10 +125,13 @@ class ExpressionsOfTypeProcessor(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
val psiClass = runReadAction { detectClassToSearch() } ?: return
|
// optimization
|
||||||
|
if (runReadAction { searchScope is GlobalSearchScope && !FileTypeIndex.containsFileOfType(KotlinFileType.INSTANCE, searchScope) }) return
|
||||||
|
|
||||||
|
val psiClass = runReadAction { detectClassToSearch() }
|
||||||
|
|
||||||
// for class from library always use plain search because we cannot search usages in compiled code (we could though)
|
// for class from library always use plain search because we cannot search usages in compiled code (we could though)
|
||||||
if (!runReadAction { psiClass.isValid && ProjectRootsUtil.isInProjectSource (psiClass) }) {
|
if (psiClass == null || !runReadAction { psiClass.isValid && ProjectRootsUtil.isInProjectSource(psiClass) }) {
|
||||||
possibleMatchesInScopeHandler(searchScope)
|
possibleMatchesInScopeHandler(searchScope)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -149,8 +152,6 @@ class ExpressionsOfTypeProcessor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun detectClassToSearch(): PsiClass? {
|
private fun detectClassToSearch(): PsiClass? {
|
||||||
if (searchScope is GlobalSearchScope && !FileTypeIndex.containsFileOfType(KotlinFileType.INSTANCE, searchScope)) return null // optimization
|
|
||||||
|
|
||||||
val classDescriptor = typeToSearch.type.constructor.declarationDescriptor ?: return null
|
val classDescriptor = typeToSearch.type.constructor.declarationDescriptor ?: return null
|
||||||
val classDeclaration = DescriptorToSourceUtilsIde.getAnyDeclaration(project, classDescriptor)
|
val classDeclaration = DescriptorToSourceUtilsIde.getAnyDeclaration(project, classDescriptor)
|
||||||
return when (classDeclaration) {
|
return when (classDeclaration) {
|
||||||
|
|||||||
+3
-2
@@ -23,10 +23,10 @@ import com.intellij.psi.search.SearchScope
|
|||||||
import com.intellij.util.Processor
|
import com.intellij.util.Processor
|
||||||
import org.jetbrains.kotlin.idea.references.KtArrayAccessReference
|
import org.jetbrains.kotlin.idea.references.KtArrayAccessReference
|
||||||
import org.jetbrains.kotlin.idea.references.readWriteAccess
|
import org.jetbrains.kotlin.idea.references.readWriteAccess
|
||||||
|
import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchOptions
|
||||||
import org.jetbrains.kotlin.psi.KtArrayAccessExpression
|
import org.jetbrains.kotlin.psi.KtArrayAccessExpression
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.psi.KtExpression
|
import org.jetbrains.kotlin.psi.KtExpression
|
||||||
import org.jetbrains.kotlin.psi.KtFunction
|
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
|
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
|
||||||
|
|
||||||
class IndexingOperatorReferenceSearcher(
|
class IndexingOperatorReferenceSearcher(
|
||||||
@@ -34,8 +34,9 @@ class IndexingOperatorReferenceSearcher(
|
|||||||
searchScope: SearchScope,
|
searchScope: SearchScope,
|
||||||
consumer: Processor<PsiReference>,
|
consumer: Processor<PsiReference>,
|
||||||
optimizer: SearchRequestCollector,
|
optimizer: SearchRequestCollector,
|
||||||
|
options: KotlinReferencesSearchOptions,
|
||||||
private val isSet: Boolean
|
private val isSet: Boolean
|
||||||
) : OperatorReferenceSearcher<KtArrayAccessExpression>(targetFunction, searchScope, consumer, optimizer, wordsToSearch = listOf("[")) {
|
) : OperatorReferenceSearcher<KtArrayAccessExpression>(targetFunction, searchScope, consumer, optimizer, options, wordsToSearch = listOf("[")) {
|
||||||
|
|
||||||
override fun processPossibleReceiverExpression(expression: KtExpression) {
|
override fun processPossibleReceiverExpression(expression: KtExpression) {
|
||||||
val accessExpression = expression.parent as? KtArrayAccessExpression ?: return
|
val accessExpression = expression.parent as? KtArrayAccessExpression ?: return
|
||||||
|
|||||||
+4
-2
@@ -22,6 +22,7 @@ import com.intellij.psi.search.SearchRequestCollector
|
|||||||
import com.intellij.psi.search.SearchScope
|
import com.intellij.psi.search.SearchScope
|
||||||
import com.intellij.util.Processor
|
import com.intellij.util.Processor
|
||||||
import org.jetbrains.kotlin.idea.references.KtInvokeFunctionReference
|
import org.jetbrains.kotlin.idea.references.KtInvokeFunctionReference
|
||||||
|
import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchOptions
|
||||||
import org.jetbrains.kotlin.psi.KtCallExpression
|
import org.jetbrains.kotlin.psi.KtCallExpression
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.psi.KtExpression
|
import org.jetbrains.kotlin.psi.KtExpression
|
||||||
@@ -31,8 +32,9 @@ class InvokeOperatorReferenceSearcher(
|
|||||||
targetFunction: PsiElement,
|
targetFunction: PsiElement,
|
||||||
searchScope: SearchScope,
|
searchScope: SearchScope,
|
||||||
consumer: Processor<PsiReference>,
|
consumer: Processor<PsiReference>,
|
||||||
optimizer: SearchRequestCollector
|
optimizer: SearchRequestCollector,
|
||||||
) : OperatorReferenceSearcher<KtCallExpression>(targetFunction, searchScope, consumer, optimizer, wordsToSearch = emptyList()) {
|
options: KotlinReferencesSearchOptions
|
||||||
|
) : OperatorReferenceSearcher<KtCallExpression>(targetFunction, searchScope, consumer, optimizer, options, wordsToSearch = emptyList()) {
|
||||||
|
|
||||||
override fun processPossibleReceiverExpression(expression: KtExpression) {
|
override fun processPossibleReceiverExpression(expression: KtExpression) {
|
||||||
val callExpression = expression.parent as? KtCallExpression ?: return
|
val callExpression = expression.parent as? KtCallExpression ?: return
|
||||||
|
|||||||
+23
-10
@@ -38,6 +38,7 @@ import org.jetbrains.kotlin.idea.util.FuzzyType
|
|||||||
import org.jetbrains.kotlin.idea.util.application.runReadAction
|
import org.jetbrains.kotlin.idea.util.application.runReadAction
|
||||||
import org.jetbrains.kotlin.idea.util.fuzzyExtensionReceiverType
|
import org.jetbrains.kotlin.idea.util.fuzzyExtensionReceiverType
|
||||||
import org.jetbrains.kotlin.idea.util.toFuzzyType
|
import org.jetbrains.kotlin.idea.util.toFuzzyType
|
||||||
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType
|
import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType
|
||||||
@@ -55,6 +56,7 @@ abstract class OperatorReferenceSearcher<TReferenceElement : KtElement>(
|
|||||||
private val searchScope: SearchScope,
|
private val searchScope: SearchScope,
|
||||||
private val consumer: Processor<PsiReference>,
|
private val consumer: Processor<PsiReference>,
|
||||||
private val optimizer: SearchRequestCollector,
|
private val optimizer: SearchRequestCollector,
|
||||||
|
private val options: KotlinReferencesSearchOptions,
|
||||||
private val wordsToSearch: List<String>
|
private val wordsToSearch: List<String>
|
||||||
) {
|
) {
|
||||||
private val project = targetDeclaration.project
|
private val project = targetDeclaration.project
|
||||||
@@ -138,7 +140,7 @@ abstract class OperatorReferenceSearcher<TReferenceElement : KtElement>(
|
|||||||
if (DataClassDescriptorResolver.isComponentLike(name)) {
|
if (DataClassDescriptorResolver.isComponentLike(name)) {
|
||||||
if (!options.searchForComponentConventions) return null
|
if (!options.searchForComponentConventions) return null
|
||||||
val componentIndex = DataClassDescriptorResolver.getComponentIndex(name.asString())
|
val componentIndex = DataClassDescriptorResolver.getComponentIndex(name.asString())
|
||||||
return DestructuringDeclarationReferenceSearcher(declaration, componentIndex, searchScope, consumer, optimizer)
|
return DestructuringDeclarationReferenceSearcher(declaration, componentIndex, searchScope, consumer, optimizer, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!options.searchForOperatorConventions) return null
|
if (!options.searchForOperatorConventions) return null
|
||||||
@@ -151,22 +153,32 @@ abstract class OperatorReferenceSearcher<TReferenceElement : KtElement>(
|
|||||||
binaryOp != null -> {
|
binaryOp != null -> {
|
||||||
val counterpartAssignmentOp = OperatorConventions.ASSIGNMENT_OPERATION_COUNTERPARTS.inverse()[binaryOp]
|
val counterpartAssignmentOp = OperatorConventions.ASSIGNMENT_OPERATION_COUNTERPARTS.inverse()[binaryOp]
|
||||||
val operationTokens = listOf(binaryOp, counterpartAssignmentOp).filterNotNull()
|
val operationTokens = listOf(binaryOp, counterpartAssignmentOp).filterNotNull()
|
||||||
return BinaryOperatorReferenceSearcher(declaration, operationTokens, searchScope, consumer, optimizer)
|
return BinaryOperatorReferenceSearcher(declaration, operationTokens, searchScope, consumer, optimizer, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
assignmentOp != null -> return BinaryOperatorReferenceSearcher(declaration, listOf(assignmentOp), searchScope, consumer, optimizer)
|
assignmentOp != null ->
|
||||||
|
return BinaryOperatorReferenceSearcher(declaration, listOf(assignmentOp), searchScope, consumer, optimizer, options)
|
||||||
|
|
||||||
unaryOp != null -> return UnaryOperatorReferenceSearcher(declaration, unaryOp, searchScope, consumer, optimizer)
|
unaryOp != null ->
|
||||||
|
return UnaryOperatorReferenceSearcher(declaration, unaryOp, searchScope, consumer, optimizer, options)
|
||||||
|
|
||||||
name == OperatorNameConventions.INVOKE -> return InvokeOperatorReferenceSearcher(declaration, searchScope, consumer, optimizer)
|
name == OperatorNameConventions.INVOKE ->
|
||||||
|
return InvokeOperatorReferenceSearcher(declaration, searchScope, consumer, optimizer, options)
|
||||||
|
|
||||||
name == OperatorNameConventions.GET -> return IndexingOperatorReferenceSearcher(declaration, searchScope, consumer, optimizer, isSet = false)
|
name == OperatorNameConventions.GET ->
|
||||||
|
return IndexingOperatorReferenceSearcher(declaration, searchScope, consumer, optimizer, options, isSet = false)
|
||||||
|
|
||||||
name == OperatorNameConventions.SET -> return IndexingOperatorReferenceSearcher(declaration, searchScope, consumer, optimizer, isSet = true)
|
name == OperatorNameConventions.SET ->
|
||||||
|
return IndexingOperatorReferenceSearcher(declaration, searchScope, consumer, optimizer, options, isSet = true)
|
||||||
|
|
||||||
name == OperatorNameConventions.CONTAINS -> return ContainsOperatorReferenceSearcher(declaration, searchScope, consumer, optimizer)
|
name == OperatorNameConventions.CONTAINS ->
|
||||||
|
return ContainsOperatorReferenceSearcher(declaration, searchScope, consumer, optimizer, options)
|
||||||
|
|
||||||
else -> return null
|
name == OperatorNameConventions.EQUALS ->
|
||||||
|
return BinaryOperatorReferenceSearcher(declaration, listOf(KtTokens.EQEQ, KtTokens.EXCLEQ), searchScope, consumer, optimizer, options)
|
||||||
|
|
||||||
|
else ->
|
||||||
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -246,7 +258,8 @@ abstract class OperatorReferenceSearcher<TReferenceElement : KtElement>(
|
|||||||
if (wordsToSearch.isNotEmpty()) {
|
if (wordsToSearch.isNotEmpty()) {
|
||||||
val unwrappedElement = targetDeclaration.namedUnwrappedElement ?: return
|
val unwrappedElement = targetDeclaration.namedUnwrappedElement ?: return
|
||||||
val resultProcessor = KotlinRequestResultProcessor(unwrappedElement,
|
val resultProcessor = KotlinRequestResultProcessor(unwrappedElement,
|
||||||
filter = { ref -> isReferenceToCheck(ref) })
|
filter = { ref -> isReferenceToCheck(ref) },
|
||||||
|
options = options)
|
||||||
wordsToSearch.forEach {
|
wordsToSearch.forEach {
|
||||||
optimizer.searchWord(it, scope.restrictToKotlinSources(), UsageSearchContext.IN_CODE, true, unwrappedElement, resultProcessor)
|
optimizer.searchWord(it, scope.restrictToKotlinSources(), UsageSearchContext.IN_CODE, true, unwrappedElement, resultProcessor)
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-3
@@ -22,10 +22,10 @@ import com.intellij.psi.search.SearchRequestCollector
|
|||||||
import com.intellij.psi.search.SearchScope
|
import com.intellij.psi.search.SearchScope
|
||||||
import com.intellij.util.Processor
|
import com.intellij.util.Processor
|
||||||
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
|
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
|
||||||
|
import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchOptions
|
||||||
import org.jetbrains.kotlin.lexer.KtSingleValueToken
|
import org.jetbrains.kotlin.lexer.KtSingleValueToken
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.psi.KtExpression
|
import org.jetbrains.kotlin.psi.KtExpression
|
||||||
import org.jetbrains.kotlin.psi.KtFunction
|
|
||||||
import org.jetbrains.kotlin.psi.KtUnaryExpression
|
import org.jetbrains.kotlin.psi.KtUnaryExpression
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
|
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
|
||||||
|
|
||||||
@@ -34,8 +34,9 @@ class UnaryOperatorReferenceSearcher(
|
|||||||
private val operationToken: KtSingleValueToken,
|
private val operationToken: KtSingleValueToken,
|
||||||
searchScope: SearchScope,
|
searchScope: SearchScope,
|
||||||
consumer: Processor<PsiReference>,
|
consumer: Processor<PsiReference>,
|
||||||
optimizer: SearchRequestCollector
|
optimizer: SearchRequestCollector,
|
||||||
) : OperatorReferenceSearcher<KtUnaryExpression>(targetFunction, searchScope, consumer, optimizer, wordsToSearch = listOf(operationToken.value)) {
|
options: KotlinReferencesSearchOptions
|
||||||
|
) : OperatorReferenceSearcher<KtUnaryExpression>(targetFunction, searchScope, consumer, optimizer, options, wordsToSearch = listOf(operationToken.value)) {
|
||||||
|
|
||||||
override fun processPossibleReceiverExpression(expression: KtExpression) {
|
override fun processPossibleReceiverExpression(expression: KtExpression) {
|
||||||
val unaryExpression = expression.parent as? KtUnaryExpression ?: return
|
val unaryExpression = expression.parent as? KtUnaryExpression ?: return
|
||||||
|
|||||||
@@ -48,7 +48,6 @@ val COMPARISON_OPERATIONS_TO_SEARCH = setOf(KtTokens.LT, KtTokens.GT)
|
|||||||
fun Name.getOperationSymbolsToSearch(): Pair<Set<KtToken>, Class<*>>? {
|
fun Name.getOperationSymbolsToSearch(): Pair<Set<KtToken>, Class<*>>? {
|
||||||
when (this) {
|
when (this) {
|
||||||
OperatorNameConventions.COMPARE_TO -> return COMPARISON_OPERATIONS_TO_SEARCH to KtSimpleNameReference::class.java
|
OperatorNameConventions.COMPARE_TO -> return COMPARISON_OPERATIONS_TO_SEARCH to KtSimpleNameReference::class.java
|
||||||
OperatorNameConventions.EQUALS -> return EQUALS_OPERATIONS to KtSimpleNameReference::class.java
|
|
||||||
OperatorNameConventions.ITERATOR -> return IN_OPERATIONS_TO_SEARCH to KtForLoopInReference::class.java
|
OperatorNameConventions.ITERATOR -> return IN_OPERATIONS_TO_SEARCH to KtForLoopInReference::class.java
|
||||||
in DELEGATE_ACCESSOR_NAMES -> return setOf(KtTokens.BY_KEYWORD) to KtPropertyDelegationMethodsReference::class.java
|
in DELEGATE_ACCESSOR_NAMES -> return setOf(KtTokens.BY_KEYWORD) to KtPropertyDelegationMethodsReference::class.java
|
||||||
DelegatedPropertyResolver.PROPERTY_DELEGATED_FUNCTION_NAME -> return setOf(KtTokens.BY_KEYWORD) to KtPropertyDelegationMethodsReference::class.java
|
DelegatedPropertyResolver.PROPERTY_DELEGATED_FUNCTION_NAME -> return setOf(KtTokens.BY_KEYWORD) to KtPropertyDelegationMethodsReference::class.java
|
||||||
|
|||||||
+1
-1
@@ -36,7 +36,7 @@ class KotlinConventionMethodReferencesSearcher() : QueryExecutorBase<PsiReferenc
|
|||||||
val identifier = Name.identifier(name)
|
val identifier = Name.identifier(name)
|
||||||
|
|
||||||
val operatorSearcher = OperatorReferenceSearcher.create(
|
val operatorSearcher = OperatorReferenceSearcher.create(
|
||||||
method, queryParameters.effectiveSearchScope, consumer, queryParameters.optimizer, KotlinReferencesSearchOptions.Empty)
|
method, queryParameters.effectiveSearchScope, consumer, queryParameters.optimizer, KotlinReferencesSearchOptions(acceptCallableOverrides = true))
|
||||||
if (operatorSearcher != null) {
|
if (operatorSearcher != null) {
|
||||||
operatorSearcher.run()
|
operatorSearcher.run()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Used plain search of kotlin.Any.equals(other: kotlin.Any?) in whole search scope
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtNamedFunction
|
||||||
|
// OPTIONS: usages
|
||||||
|
// FIND_BY_REF
|
||||||
|
|
||||||
|
class A(val n: Int) {
|
||||||
|
fun foo(a: A) = a <caret>== this
|
||||||
|
|
||||||
|
override override fun equals(other: Any?): Boolean = TODO()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
1 == 2
|
||||||
|
A(0) == A(1)
|
||||||
|
A(0) != A(1)
|
||||||
|
A(0) equals A(1)
|
||||||
|
A(0) === A(1)
|
||||||
|
A(0) !== A(1)
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
Checked type of A.foo(a: A)
|
||||||
|
Resolved A(0) != A(1)
|
||||||
|
Resolved A(0) == A(1)
|
||||||
|
Resolved a == this
|
||||||
|
Searched references to A
|
||||||
|
Searched references to parameter a of A.foo(a: A) in non-Java files
|
||||||
|
Used plain search of A.equals(other: Any?) in LocalSearchScope:
|
||||||
|
CLASS:A
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
Function call 13 A(0) == A(1)
|
||||||
|
Function call 14 A(0) != A(1)
|
||||||
|
Function call 15 A(0) equals A(1)
|
||||||
|
Function call 6 fun foo(a: A) = a == this
|
||||||
@@ -96,6 +96,12 @@ public class FindUsagesTestGenerated extends AbstractFindUsagesTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("equalsNotAny.0.kt")
|
||||||
|
public void testEqualsNotAny() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/conventions/equalsNotAny.0.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("forIteration.0.kt")
|
@TestMetadata("forIteration.0.kt")
|
||||||
public void testForIteration() throws Exception {
|
public void testForIteration() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/conventions/forIteration.0.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/conventions/forIteration.0.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user