From 6d028fbcced51bc56511c16751547ee24864d916 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Mon, 5 Sep 2016 19:15:20 +0300 Subject: [PATCH] Supported object value access expressions --- .../usagesSearch/ExpressionsOfTypeProcessor.kt | 9 +++++++++ .../findUsages/kotlin/conventions/invoke.0.kt | 10 +++++++++- .../findUsages/kotlin/conventions/invoke.log | 16 +++++++++++----- .../kotlin/conventions/invoke.results.txt | 6 ++++-- 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/ExpressionsOfTypeProcessor.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/ExpressionsOfTypeProcessor.kt index ad066bf1994..cf8e769014d 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/ExpressionsOfTypeProcessor.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/ExpressionsOfTypeProcessor.kt @@ -39,6 +39,7 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.diagnostics.DiagnosticUtils import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.KotlinLanguage +import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde @@ -58,6 +59,7 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform +import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.KotlinType import java.util.* @@ -352,6 +354,13 @@ class ExpressionsOfTypeProcessor( } if (element.getStrictParentOfType() != null) return true // ignore usage in import + + val bindingContext = element.analyze(BodyResolveMode.PARTIAL) + val hasType = bindingContext.getType(element) != null + if (hasType) { // access to object or companion object + processSuspiciousExpression(element) + return true + } } is KDocName -> return true // ignore usage in doc-comment diff --git a/idea/testData/findUsages/kotlin/conventions/invoke.0.kt b/idea/testData/findUsages/kotlin/conventions/invoke.0.kt index e2b0d38d500..aabce91d499 100644 --- a/idea/testData/findUsages/kotlin/conventions/invoke.0.kt +++ b/idea/testData/findUsages/kotlin/conventions/invoke.0.kt @@ -1,13 +1,21 @@ // PSI_ELEMENT: org.jetbrains.kotlin.psi.KtNamedFunction // OPTIONS: usages +package pack -class B(val n: Int) { +open class B(val n: Int) { operator fun invoke(i: Int){} } +object Obj : B(0) + fun f() = B(1) fun test() { f(1).invoke(2) f(2)(2) + + val v = Obj + v(1) + + listOf(pack.Obj)[0](1) } diff --git a/idea/testData/findUsages/kotlin/conventions/invoke.log b/idea/testData/findUsages/kotlin/conventions/invoke.log index 39494f034be..73dc3c49bd9 100644 --- a/idea/testData/findUsages/kotlin/conventions/invoke.log +++ b/idea/testData/findUsages/kotlin/conventions/invoke.log @@ -1,8 +1,14 @@ -Checked type of f() +Checked type of pack.f() +Checked type of v Resolved f(1) Resolved f(2) Resolved f(2)(2) -Searched references to B -Searched references to f() in non-Java files -Used plain search of B.invoke(i: Int) in LocalSearchScope: - CLASS:B \ No newline at end of file +Resolved listOf(pack.Obj)[0](1) +Resolved v(1) +Searched references to pack.B +Searched references to pack.Obj +Searched references to pack.f() in non-Java files +Searched references to v in non-Java files +Used plain search of pack.B.invoke(i: Int) in LocalSearchScope: + CLASS:B + OBJECT_DECLARATION:Obj \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/conventions/invoke.results.txt b/idea/testData/findUsages/kotlin/conventions/invoke.results.txt index aa797ea0af4..3056313ace8 100644 --- a/idea/testData/findUsages/kotlin/conventions/invoke.results.txt +++ b/idea/testData/findUsages/kotlin/conventions/invoke.results.txt @@ -1,2 +1,4 @@ -Function call 11 f(1).invoke(2) -Implicit 'invoke' 12 f(2)(2) \ No newline at end of file +Function call 14 f(1).invoke(2) +Implicit 'invoke' 15 f(2)(2) +Implicit 'invoke' 18 v(1) +Implicit 'invoke' 20 listOf(pack.Obj)[0](1) \ No newline at end of file