From e48c91bba463ce2487456910dc371713b4b60482 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 21 Nov 2013 19:24:07 +0400 Subject: [PATCH] Fix find usages classification for objects Objects/enum entries are treated as variables as before. Test data for private object in superclass was changed because now the object (as opposed to the property) is no longer resolved due to KT-354 --- .../jet/plugin/findUsages/JetUsageTypeProvider.kt | 9 ++++++++- .../findUsages/KotlinFindUsagesHandlerFactory.kt | 12 +++++++----- .../handlers/KotlinFindClassUsagesHandler.java | 7 +++---- .../kotlin/findObjectUsages/javaObjectUsages.0.kt | 2 +- .../findObjectUsages/kotlinLocalObjectUsages1.0.kt | 2 +- .../findObjectUsages/kotlinLocalObjectUsages2.0.kt | 2 +- .../findObjectUsages/kotlinNestedObjectUsages.0.kt | 2 +- .../kotlin/findObjectUsages/kotlinObjectUsages.0.kt | 2 +- .../findObjectUsages/kotlinPrivateObjectUsages.0.kt | 4 ++-- .../kotlinPrivateObjectUsages.results.txt | 2 +- 10 files changed, 26 insertions(+), 18 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/findUsages/JetUsageTypeProvider.kt b/idea/src/org/jetbrains/jet/plugin/findUsages/JetUsageTypeProvider.kt index 397d7bf269f..332a585d225 100644 --- a/idea/src/org/jetbrains/jet/plugin/findUsages/JetUsageTypeProvider.kt +++ b/idea/src/org/jetbrains/jet/plugin/findUsages/JetUsageTypeProvider.kt @@ -32,6 +32,7 @@ import org.jetbrains.jet.lexer.JetTokens import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache import org.jetbrains.jet.plugin.JetBundle import org.jetbrains.jet.lang.resolve.java.descriptor.JavaNamespaceDescriptor +import org.jetbrains.jet.lang.resolve.DescriptorUtils public object JetUsageTypeProvider : UsageTypeProviderEx { public override fun getUsageType(element: PsiElement?): UsageType? { @@ -179,7 +180,13 @@ public object JetUsageTypeProvider : UsageTypeProviderEx { val descriptor = bindingContext.get(BindingContext.REFERENCE_TARGET, reference) return when (descriptor) { - is ClassifierDescriptor, is JavaNamespaceDescriptor -> getClassUsageType() + is ClassifierDescriptor -> if (DescriptorUtils.isSingleton(descriptor)) { + // Treat object accesses as variables to simulate the old behaviour (when variables were created for objects) + getVariableUsageType() + } else { + getClassUsageType() + } + is JavaNamespaceDescriptor -> getClassUsageType() is VariableDescriptor -> getVariableUsageType() is FunctionDescriptor -> getFunctionUsageType(descriptor) else -> null diff --git a/idea/src/org/jetbrains/jet/plugin/findUsages/KotlinFindUsagesHandlerFactory.kt b/idea/src/org/jetbrains/jet/plugin/findUsages/KotlinFindUsagesHandlerFactory.kt index 1e01668a495..c87fd1abfdd 100644 --- a/idea/src/org/jetbrains/jet/plugin/findUsages/KotlinFindUsagesHandlerFactory.kt +++ b/idea/src/org/jetbrains/jet/plugin/findUsages/KotlinFindUsagesHandlerFactory.kt @@ -20,19 +20,17 @@ import com.intellij.find.findUsages.FindUsagesHandler import com.intellij.find.findUsages.FindUsagesHandlerFactory import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement -import org.jetbrains.jet.lang.psi.JetClass -import org.jetbrains.jet.lang.psi.JetDeclaration import org.jetbrains.jet.lang.psi.JetNamedFunction import org.jetbrains.jet.plugin.findUsages.handlers.KotlinFindClassUsagesHandler import org.jetbrains.jet.plugin.findUsages.handlers.KotlinFindMemberUsagesHandler import org.jetbrains.jet.plugin.refactoring.JetRefactoringUtil import org.jetbrains.jet.lang.psi.JetProperty -import org.jetbrains.jet.lang.psi.JetNamedDeclaration import com.intellij.find.findUsages.FindUsagesOptions import org.jetbrains.jet.lang.psi.JetTypeParameter import org.jetbrains.jet.plugin.findUsages.handlers.KotlinTypeParameterFindUsagesHandler import org.jetbrains.jet.lang.psi.JetParameter import org.jetbrains.jet.lang.psi.JetNamedDeclaration +import org.jetbrains.jet.lang.psi.JetClassOrObject public class KotlinFindUsagesHandlerFactory(project: Project) : FindUsagesHandlerFactory() { val findFunctionOptions = KotlinFunctionFindUsagesOptions(project) @@ -41,11 +39,15 @@ public class KotlinFindUsagesHandlerFactory(project: Project) : FindUsagesHandle val defaultOptions = FindUsagesOptions(project) public override fun canFindUsages(element: PsiElement): Boolean = - element is JetClass || element is JetNamedFunction || element is JetProperty || element is JetParameter || element is JetTypeParameter + element is JetClassOrObject || + element is JetNamedFunction || + element is JetProperty || + element is JetParameter || + element is JetTypeParameter public override fun createFindUsagesHandler(element: PsiElement, forHighlightUsages: Boolean): FindUsagesHandler { when(element) { - is JetClass -> + is JetClassOrObject -> return KotlinFindClassUsagesHandler(element, this) is JetNamedFunction, is JetProperty, is JetParameter -> { diff --git a/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindClassUsagesHandler.java b/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindClassUsagesHandler.java index 0b2f5c07da0..495311ffc09 100644 --- a/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindClassUsagesHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/findUsages/handlers/KotlinFindClassUsagesHandler.java @@ -33,7 +33,6 @@ import com.intellij.util.Processor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.asJava.LightClassUtil; -import org.jetbrains.jet.lang.psi.JetClass; import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.plugin.findUsages.FindUsagesPackage; import org.jetbrains.jet.plugin.findUsages.KotlinClassFindUsagesOptions; @@ -43,8 +42,8 @@ import org.jetbrains.jet.plugin.search.usagesSearch.UsagesSearch; import org.jetbrains.jet.plugin.search.usagesSearch.UsagesSearchRequest; import org.jetbrains.jet.plugin.search.usagesSearch.UsagesSearchTarget; -public class KotlinFindClassUsagesHandler extends KotlinFindUsagesHandler { - public KotlinFindClassUsagesHandler(@NotNull JetClass jetClass, @NotNull KotlinFindUsagesHandlerFactory factory) { +public class KotlinFindClassUsagesHandler extends KotlinFindUsagesHandler { + public KotlinFindClassUsagesHandler(@NotNull JetClassOrObject jetClass, @NotNull KotlinFindUsagesHandlerFactory factory) { super(jetClass, factory); } @@ -131,7 +130,7 @@ public class KotlinFindClassUsagesHandler extends KotlinFindUsagesHandlerO { diff --git a/idea/testData/findUsages/kotlin/findObjectUsages/kotlinLocalObjectUsages1.0.kt b/idea/testData/findUsages/kotlin/findObjectUsages/kotlinLocalObjectUsages1.0.kt index c304f1bdb09..af5a1f583de 100644 --- a/idea/testData/findUsages/kotlin/findObjectUsages/kotlinLocalObjectUsages1.0.kt +++ b/idea/testData/findUsages/kotlin/findObjectUsages/kotlinLocalObjectUsages1.0.kt @@ -1,4 +1,4 @@ -// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetObjectDeclarationName +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetObjectDeclaration // OPTIONS: usages fun foo(): Any { object Bar diff --git a/idea/testData/findUsages/kotlin/findObjectUsages/kotlinLocalObjectUsages2.0.kt b/idea/testData/findUsages/kotlin/findObjectUsages/kotlinLocalObjectUsages2.0.kt index 91a7bf64add..a029a7049f0 100644 --- a/idea/testData/findUsages/kotlin/findObjectUsages/kotlinLocalObjectUsages2.0.kt +++ b/idea/testData/findUsages/kotlin/findObjectUsages/kotlinLocalObjectUsages2.0.kt @@ -1,4 +1,4 @@ -// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetObjectDeclarationName +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetObjectDeclaration // OPTIONS: usages fun foo(): Any { if (true) { diff --git a/idea/testData/findUsages/kotlin/findObjectUsages/kotlinNestedObjectUsages.0.kt b/idea/testData/findUsages/kotlin/findObjectUsages/kotlinNestedObjectUsages.0.kt index fa0d5503cb6..c5392e2d91b 100644 --- a/idea/testData/findUsages/kotlin/findObjectUsages/kotlinNestedObjectUsages.0.kt +++ b/idea/testData/findUsages/kotlin/findObjectUsages/kotlinNestedObjectUsages.0.kt @@ -1,4 +1,4 @@ -// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetObjectDeclarationName +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetObjectDeclaration package a class A { diff --git a/idea/testData/findUsages/kotlin/findObjectUsages/kotlinObjectUsages.0.kt b/idea/testData/findUsages/kotlin/findObjectUsages/kotlinObjectUsages.0.kt index ff25227e772..22c113bad6c 100644 --- a/idea/testData/findUsages/kotlin/findObjectUsages/kotlinObjectUsages.0.kt +++ b/idea/testData/findUsages/kotlin/findObjectUsages/kotlinObjectUsages.0.kt @@ -1,4 +1,4 @@ -// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetObjectDeclarationName +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetObjectDeclaration package server; object O { diff --git a/idea/testData/findUsages/kotlin/findObjectUsages/kotlinPrivateObjectUsages.0.kt b/idea/testData/findUsages/kotlin/findObjectUsages/kotlinPrivateObjectUsages.0.kt index d377a2d8f82..c7ed4f0a0c7 100644 --- a/idea/testData/findUsages/kotlin/findObjectUsages/kotlinPrivateObjectUsages.0.kt +++ b/idea/testData/findUsages/kotlin/findObjectUsages/kotlinPrivateObjectUsages.0.kt @@ -1,4 +1,4 @@ -// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetObjectDeclarationName +// PSI_ELEMENT: org.jetbrains.jet.lang.psi.JetObjectDeclaration // OPTIONS: usages package server; @@ -11,6 +11,6 @@ public open class Server() { } public class ServerEx(): Server() { - override fun processRequest() = Foo + override fun processRequest() = Server.Foo } diff --git a/idea/testData/findUsages/kotlin/findObjectUsages/kotlinPrivateObjectUsages.results.txt b/idea/testData/findUsages/kotlin/findObjectUsages/kotlinPrivateObjectUsages.results.txt index 44c32570375..4bc4d748716 100644 --- a/idea/testData/findUsages/kotlin/findObjectUsages/kotlinPrivateObjectUsages.results.txt +++ b/idea/testData/findUsages/kotlin/findObjectUsages/kotlinPrivateObjectUsages.results.txt @@ -1,3 +1,3 @@ Value read (10: 33) open fun processRequest() = Foo -Value read (14: 37) override fun processRequest() = Foo +Value read (14: 44) override fun processRequest() = Server.Foo Value read (5: 26) println(Server().Foo)