More correct code - ensure that equals works correctly!

This commit is contained in:
Valentin Kipyatkov
2016-10-07 10:54:43 +03:00
parent 0399772ee6
commit 29fe63d5a9
2 changed files with 18 additions and 10 deletions
@@ -202,14 +202,25 @@ class ExpressionsOfTypeProcessor(
addTask(ProcessClassUsagesTask(classToSearch)) addTask(ProcessClassUsagesTask(classToSearch))
} }
private fun addCallableDeclarationToProcess(declaration: PsiElement, scope: SearchScope, processMethod: (PsiReference) -> Boolean) { private enum class ReferenceProcessor(val handler: (ExpressionsOfTypeProcessor, PsiReference) -> Boolean) {
data class ProcessCallableUsagesTask(val declaration: PsiElement, val processMethod: (PsiReference) -> Boolean) : Task { CallableOfOurType({ processor, reference ->
processor.processReferenceToCallableOfOurType(reference)
}),
ProcessLambdasInCalls({ processor, reference ->
(reference.element as? KtReferenceExpression)?.let { processor.processLambdasForCallableReference(it) }
true
})
}
private fun addCallableDeclarationToProcess(declaration: PsiElement, scope: SearchScope, processor: ReferenceProcessor) {
data class ProcessCallableUsagesTask(val declaration: PsiElement, val processor: ReferenceProcessor) : Task {
override fun perform() { override fun perform() {
testLog?.add("Searched references to ${logPresentation(declaration)} in non-Java files") testLog?.add("Searched references to ${logPresentation(declaration)} in non-Java files")
val searchParameters = KotlinReferencesSearchParameters( val searchParameters = KotlinReferencesSearchParameters(
declaration, scope, kotlinOptions = KotlinReferencesSearchOptions(searchNamedArguments = false)) declaration, scope, kotlinOptions = KotlinReferencesSearchOptions(searchNamedArguments = false))
searchReferences(searchParameters) { reference -> searchReferences(searchParameters) { reference ->
val processed = processMethod(reference) val processed = processor.handler(this@ExpressionsOfTypeProcessor, reference)
if (!processed) { // we don't know how to handle this reference and down-shift to plain search if (!processed) { // we don't know how to handle this reference and down-shift to plain search
downShiftToPlainSearch() downShiftToPlainSearch()
} }
@@ -217,11 +228,11 @@ class ExpressionsOfTypeProcessor(
} }
} }
} }
addTask(ProcessCallableUsagesTask(declaration, processMethod)) addTask(ProcessCallableUsagesTask(declaration, processor))
} }
private fun addCallableDeclarationOfOurType(declaration: PsiElement) { private fun addCallableDeclarationOfOurType(declaration: PsiElement) {
addCallableDeclarationToProcess(declaration, searchScope.restrictToKotlinSources(), this::processReferenceToCallableOfOurType) addCallableDeclarationToProcess(declaration, searchScope.restrictToKotlinSources(), ReferenceProcessor.CallableOfOurType)
} }
/** /**
@@ -230,10 +241,7 @@ class ExpressionsOfTypeProcessor(
private fun addCallableDeclarationToProcessLambdasInCalls(declaration: PsiElement) { private fun addCallableDeclarationToProcessLambdasInCalls(declaration: PsiElement) {
// we don't need to search usages of declarations in Java because Java doesn't have implicitly typed declarations so such usages cannot affect Kotlin code // we don't need to search usages of declarations in Java because Java doesn't have implicitly typed declarations so such usages cannot affect Kotlin code
val scope = GlobalSearchScope.projectScope(project).excludeFileTypes(JavaFileType.INSTANCE, XmlFileType.INSTANCE) val scope = GlobalSearchScope.projectScope(project).excludeFileTypes(JavaFileType.INSTANCE, XmlFileType.INSTANCE)
addCallableDeclarationToProcess(declaration, scope) { reference -> addCallableDeclarationToProcess(declaration, scope, ReferenceProcessor.ProcessLambdasInCalls)
(reference.element as? KtReferenceExpression)?.let { processLambdasForCallableReference(it) }
true
}
} }
/** /**
+1 -1
View File
@@ -3,4 +3,4 @@ Resolved B(1)[2]
Searched references to B Searched references to B
Searched references to b in non-Java files Searched references to b in non-Java files
Used plain search of B.get(i: Int) in LocalSearchScope: Used plain search of B.get(i: Int) in LocalSearchScope:
CLASS:B CLASS:B