From 0debd1ce6f0f9f6ad07fcf4ba99b65fc6eca4e81 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 16 Mar 2015 13:45:31 +0300 Subject: [PATCH] Make IDE parts using light methods work with JetFunction --- .../kotlin/asJava/LightClassUtil.java | 2 +- .../kotlin/asJava/lightClassUtils.kt | 9 ++++---- .../KotlinReferencesSearcher.java | 4 ++-- .../idea/search/usagesSearch/searchHelpers.kt | 4 ++-- .../debugger/KotlinSmartStepIntoHandler.kt | 8 +++---- .../KotlinFindMemberUsagesHandler.java | 21 ++++++++----------- .../calls/KotlinCallTreeStructure.java | 4 ++-- .../KotlinCallerMethodsTreeStructure.java | 4 ++-- .../idea/highlighter/markers/JavaPsiUtils.kt | 16 +++++++------- .../inspections/UnusedSymbolInspection.kt | 4 +--- .../changeSignature/JetChangeSignatureData.kt | 2 +- .../rename/RenameKotlinFunctionProcessor.kt | 12 +++++++---- .../KotlinAnnotatedElementsSearcher.java | 9 +++----- .../KotlinDefinitionsSearcher.java | 6 +++--- 14 files changed, 52 insertions(+), 53 deletions(-) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.java b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.java index 565cb898abf..df5d3495c90 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.java +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.java @@ -180,7 +180,7 @@ public class LightClassUtil { } @Nullable - public static PsiMethod getLightClassMethod(@NotNull JetNamedFunction function) { + public static PsiMethod getLightClassMethod(@NotNull JetFunction function) { return getPsiMethodWrapper(function); } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt index b1cca7280d7..4c2727f7e7a 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt @@ -29,7 +29,8 @@ public fun JetClassOrObject.toLightClass(): KotlinLightClass? = LightClassUtil.g public fun JetDeclaration.toLightElements(): List = when (this) { is JetClassOrObject -> Collections.singletonList(LightClassUtil.getPsiClass(this)) - is JetNamedFunction -> Collections.singletonList(LightClassUtil.getLightClassMethod(this)) + is JetNamedFunction, + is JetSecondaryConstructor -> Collections.singletonList(LightClassUtil.getLightClassMethod(this as JetFunction)) is JetProperty -> LightClassUtil.getLightClassPropertyMethods(this).toList() is JetPropertyAccessor -> Collections.singletonList(LightClassUtil.getLightClassAccessorMethod(this)) is JetParameter -> ArrayList().let { elements -> @@ -44,7 +45,7 @@ public fun JetDeclaration.toLightElements(): List = public fun PsiElement.toLightMethods(): List = when (this) { - is JetNamedFunction -> LightClassUtil.getLightClassMethod(this).singletonOrEmptyList() + is JetFunction -> LightClassUtil.getLightClassMethod(this).singletonOrEmptyList() is JetProperty -> LightClassUtil.getLightClassPropertyMethods(this).toList() is JetParameter -> LightClassUtil.getLightClassPropertyMethods(this).toList() is JetPropertyAccessor -> LightClassUtil.getLightClassAccessorMethod(this).singletonOrEmptyList() @@ -55,7 +56,7 @@ public fun PsiElement.toLightMethods(): List = public fun PsiElement.getRepresentativeLightMethod(): PsiMethod? = when (this) { - is JetNamedFunction -> LightClassUtil.getLightClassMethod(this) + is JetFunction -> LightClassUtil.getLightClassMethod(this) is JetProperty -> LightClassUtil.getLightClassPropertyMethods(this).getGetter() is JetParameter -> LightClassUtil.getLightClassPropertyMethods(this).getGetter() is JetPropertyAccessor -> LightClassUtil.getLightClassAccessorMethod(this) @@ -72,7 +73,7 @@ public fun JetParameter.toPsiParameter(): PsiParameter? { val lightParamIndex = if (owner != null && owner.isExtensionDeclaration()) paramIndex + 1 else paramIndex val method: PsiMethod? = when (owner) { - is JetNamedFunction -> LightClassUtil.getLightClassMethod(owner) + is JetFunction -> LightClassUtil.getLightClassMethod(owner) is JetPropertyAccessor -> LightClassUtil.getLightClassAccessorMethod(owner) is JetClass -> LightClassUtil.getPsiClass(owner)?.getConstructors()?.let { constructors -> if (constructors.isNotEmpty()) constructors[0] else null diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.java index 2dfd5671c0a..ad73b8c18af 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.java @@ -98,8 +98,8 @@ public class KotlinReferencesSearcher extends QueryExecutorBase() { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/searchHelpers.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/searchHelpers.kt index 29969ffebc7..450fb07495a 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/searchHelpers.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/searchHelpers.kt @@ -191,8 +191,8 @@ class FunctionUsagesSearchHelper( override val selfUsages: Boolean = true, override val overrideUsages: Boolean = true, skipImports: Boolean = false -) : DefaultSearchHelper(skipImports), OverrideSearchHelper { - override fun makeFilter(target: UsagesSearchTarget): UsagesSearchFilter { +) : DefaultSearchHelper(skipImports), OverrideSearchHelper { + override fun makeFilter(target: UsagesSearchTarget): UsagesSearchFilter { return (isTargetOrOverrideUsage or isOverloadUsage.ifOrFalse(overloadUsages) or isExtensionUsage.ifOrFalse(extensionUsages)) and isFilteredImport diff --git a/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinSmartStepIntoHandler.kt b/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinSmartStepIntoHandler.kt index c4a1f79bd78..f5b05826132 100644 --- a/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinSmartStepIntoHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/debugger/KotlinSmartStepIntoHandler.kt @@ -144,8 +144,8 @@ public class KotlinSmartStepIntoHandler : JvmSmartStepIntoHandler() { val delegatedPropertyGetterDescriptor = delegatedResolvedCall.getResultingDescriptor() if (delegatedPropertyGetterDescriptor is CallableMemberDescriptor) { val function = DescriptorToSourceUtilsIde.getAnyDeclaration(file.getProject(), delegatedPropertyGetterDescriptor) - if (function is JetNamedFunction) { - val psiMethod = LightClassUtil.getLightClassMethod(function) + if (function is JetNamedFunction || function is JetSecondaryConstructor) { + val psiMethod = LightClassUtil.getLightClassMethod(function as JetFunction) if (psiMethod != null) { result.add(KotlinMethodSmartStepTarget(function, psiMethod, "${propertyDescriptor.getName()}.", expression, false, lines)) } @@ -166,8 +166,8 @@ public class KotlinSmartStepIntoHandler : JvmSmartStepIntoHandler() { if (descriptor is CallableMemberDescriptor) { // TODO doesn't work for libraries val function = DescriptorToSourceUtilsIde.getAnyDeclaration(file.getProject(), descriptor) - if (function is JetNamedFunction) { - val psiMethod = LightClassUtil.getLightClassMethod(function) + if (function is JetNamedFunction || function is JetSecondaryConstructor) { + val psiMethod = LightClassUtil.getLightClassMethod(function as JetFunction) if (psiMethod != null) { result.add(KotlinMethodSmartStepTarget(function, psiMethod, null, expression, false, lines)) } diff --git a/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindMemberUsagesHandler.java b/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindMemberUsagesHandler.java index 2b9743c825e..2a7cb988519 100644 --- a/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindMemberUsagesHandler.java +++ b/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindMemberUsagesHandler.java @@ -39,19 +39,16 @@ import org.jetbrains.kotlin.idea.search.declarationsSearch.HierarchySearchReques import org.jetbrains.kotlin.idea.search.usagesSearch.UsagesSearch; import org.jetbrains.kotlin.idea.search.usagesSearch.UsagesSearchHelper; import org.jetbrains.kotlin.idea.search.usagesSearch.UsagesSearchRequest; -import org.jetbrains.kotlin.psi.JetNamedDeclaration; -import org.jetbrains.kotlin.psi.JetNamedFunction; -import org.jetbrains.kotlin.psi.JetParameter; -import org.jetbrains.kotlin.psi.JetProperty; +import org.jetbrains.kotlin.psi.*; import java.util.Collection; import java.util.Collections; import java.util.Iterator; public abstract class KotlinFindMemberUsagesHandler extends KotlinFindUsagesHandler { - private static class Function extends KotlinFindMemberUsagesHandler { + private static class Function extends KotlinFindMemberUsagesHandler { public Function( - @NotNull JetNamedFunction declaration, + @NotNull JetFunction declaration, @NotNull Collection elementsToSearch, @NotNull KotlinFindUsagesHandlerFactory factory ) { @@ -59,7 +56,7 @@ public abstract class KotlinFindMemberUsagesHandler getSearchHelper(KotlinCallableFindUsagesOptions options) { + protected UsagesSearchHelper getSearchHelper(KotlinCallableFindUsagesOptions options) { return FindUsagesPackage.toHelper((KotlinFunctionFindUsagesOptions) options); } @@ -124,8 +121,8 @@ public abstract class KotlinFindMemberUsagesHandler getSearchHelper(KotlinCallableFindUsagesOptions options); private static Iterable getLightMethods(JetNamedDeclaration element) { - if (element instanceof JetNamedFunction) { - PsiMethod method = LightClassUtil.getLightClassMethod((JetNamedFunction) element); + if (element instanceof JetNamedFunction || element instanceof JetSecondaryConstructor) { + PsiMethod method = LightClassUtil.getLightClassMethod((JetFunction) element); return method != null ? Collections.singletonList(method) : Collections.emptyList(); } @@ -152,7 +149,7 @@ public abstract class KotlinFindMemberUsagesHandlertoSearchTarget(options, (T) element, true)); for (PsiReference ref : UsagesSearch.INSTANCE$.search(request)) { processUsage(processor, ref); @@ -189,8 +186,8 @@ public abstract class KotlinFindMemberUsagesHandler elementsToSearch, @NotNull KotlinFindUsagesHandlerFactory factory) { - return declaration instanceof JetNamedFunction - ? new Function((JetNamedFunction) declaration, elementsToSearch, factory) + return declaration instanceof JetFunction + ? new Function((JetFunction) declaration, elementsToSearch, factory) : new Property(declaration, elementsToSearch, factory); } diff --git a/idea/src/org/jetbrains/kotlin/idea/hierarchy/calls/KotlinCallTreeStructure.java b/idea/src/org/jetbrains/kotlin/idea/hierarchy/calls/KotlinCallTreeStructure.java index 961a8cd4edc..0accad9dcb7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/hierarchy/calls/KotlinCallTreeStructure.java +++ b/idea/src/org/jetbrains/kotlin/idea/hierarchy/calls/KotlinCallTreeStructure.java @@ -91,8 +91,8 @@ public abstract class KotlinCallTreeStructure extends HierarchyTreeStructure { return (PsiMethod) element; } - if (element instanceof JetNamedFunction) { - return LightClassUtil.getLightClassMethod((JetNamedFunction) element); + if (element instanceof JetNamedFunction || element instanceof JetSecondaryConstructor) { + return LightClassUtil.getLightClassMethod((JetFunction) element); } if (element instanceof JetProperty) { diff --git a/idea/src/org/jetbrains/kotlin/idea/hierarchy/calls/KotlinCallerMethodsTreeStructure.java b/idea/src/org/jetbrains/kotlin/idea/hierarchy/calls/KotlinCallerMethodsTreeStructure.java index e1ef1b9e757..cdf936be87f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/hierarchy/calls/KotlinCallerMethodsTreeStructure.java +++ b/idea/src/org/jetbrains/kotlin/idea/hierarchy/calls/KotlinCallerMethodsTreeStructure.java @@ -103,8 +103,8 @@ public class KotlinCallerMethodsTreeStructure extends KotlinCallTreeStructure { Collections.singleton((PsiMethod) element), descriptor, methodToDescriptorMap, searchScope, true ); } - if (element instanceof JetNamedFunction) { - PsiMethod lightMethod = LightClassUtil.getLightClassMethod((JetNamedFunction) element); + if (element instanceof JetNamedFunction || element instanceof JetSecondaryConstructor) { + PsiMethod lightMethod = LightClassUtil.getLightClassMethod((JetFunction) element); processPsiMethodCallers(Collections.singleton(lightMethod), descriptor, methodToDescriptorMap, searchScope, false); } if (element instanceof JetProperty) { diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/JavaPsiUtils.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/JavaPsiUtils.kt index 99d1379f754..b871652a13e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/JavaPsiUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/JavaPsiUtils.kt @@ -16,15 +16,17 @@ package org.jetbrains.kotlin.idea.highlighter.markers -import java.util.HashSet -import com.intellij.psi.PsiMethod -import com.intellij.psi.PsiClass -import com.intellij.psi.CommonClassNames import com.intellij.openapi.progress.ProgressManager +import com.intellij.psi.CommonClassNames +import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.psi.JetClass +import com.intellij.psi.PsiMethod import org.jetbrains.kotlin.asJava.LightClassUtil +import org.jetbrains.kotlin.psi.JetClass +import org.jetbrains.kotlin.psi.JetFunction import org.jetbrains.kotlin.psi.JetNamedFunction +import org.jetbrains.kotlin.psi.JetSecondaryConstructor +import java.util.HashSet fun collectContainingClasses(methods: Collection): Set { val classes = HashSet() @@ -50,11 +52,11 @@ private fun getPsiClass(element: PsiElement?): PsiClass? { } private fun getPsiMethod(element: PsiElement?): PsiMethod? { + val parent = element?.getParent() return when { element == null -> null element is PsiMethod -> element - element.getParent() is JetNamedFunction -> - LightClassUtil.getLightClassMethod(element.getParent() as JetNamedFunction) + parent is JetNamedFunction, parent is JetSecondaryConstructor -> LightClassUtil.getLightClassMethod(parent as JetFunction) else -> null } } diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt index 4d640826a1c..6b3901f7fa6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt @@ -20,10 +20,8 @@ import com.intellij.codeInsight.FileModificationService import com.intellij.codeInsight.daemon.QuickFixBundle import com.intellij.codeInspection.* import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection -import com.intellij.codeInspection.ex.EntryPointsManager import com.intellij.codeInspection.ex.EntryPointsManagerImpl import com.intellij.openapi.project.Project -import com.intellij.openapi.project.ProjectUtil import com.intellij.openapi.util.TextRange import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementVisitor @@ -64,7 +62,7 @@ public class UnusedSymbolInspection : AbstractKotlinInspection() { val lightElement: PsiElement? = when (declaration) { is JetClassOrObject -> declaration.toLightClass() - is JetNamedFunction -> LightClassUtil.getLightClassMethod(declaration) + is JetNamedFunction, is JetSecondaryConstructor -> LightClassUtil.getLightClassMethod(declaration as JetFunction) else -> return false } return lightElement != null && javaInspection.isEntryPoint(lightElement) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureData.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureData.kt index 56fc74b3fd8..8672d5c22f9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureData.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/JetChangeSignatureData.kt @@ -97,7 +97,7 @@ public class JetChangeSignatureData( override val affectedFunctions: Collection by Delegates.lazy { primaryFunctions + primaryFunctions.flatMapTo(HashSet()) { primaryFunction -> - val primaryDeclaration = primaryFunction.getDeclaration() as? JetNamedFunction + val primaryDeclaration = primaryFunction.getDeclaration() as? JetFunction val lightMethod = primaryDeclaration?.let { LightClassUtil.getLightClassMethod(it) } val overrides = lightMethod?.let { OverridingMethodsSearch.search(it).findAll() } ?: Collections.emptyList() overrides.map { method -> diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessor.kt index c21dfc21421..2af8af347b3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessor.kt @@ -20,12 +20,14 @@ import com.intellij.openapi.editor.Editor import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod import com.intellij.psi.search.SearchScope -import org.jetbrains.kotlin.asJava.LightClassUtil -import org.jetbrains.kotlin.psi.JetNamedFunction import com.intellij.refactoring.rename.RenameJavaMethodProcessor import org.jetbrains.kotlin.asJava.KotlinLightMethod -import kotlin.properties.Delegates +import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.idea.util.application.runReadAction +import org.jetbrains.kotlin.psi.JetFunction +import org.jetbrains.kotlin.psi.JetNamedFunction +import org.jetbrains.kotlin.psi.JetSecondaryConstructor +import kotlin.properties.Delegates public class RenameKotlinFunctionProcessor : RenameKotlinPsiProcessor() { private val javaMethodProcessorInstance by Delegates.lazy { @@ -61,7 +63,9 @@ public class RenameKotlinFunctionProcessor : RenameKotlinPsiProcessor() { private fun wrapPsiMethod(element: PsiElement?): PsiMethod? = when (element) { is KotlinLightMethod -> element - is JetNamedFunction -> runReadAction { LightClassUtil.getLightClassMethod(element) } + is JetNamedFunction, is JetSecondaryConstructor -> runReadAction { + LightClassUtil.getLightClassMethod(element as JetFunction) + } else -> throw IllegalStateException("Can't be for element $element there because of canProcessElement()") } } diff --git a/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinAnnotatedElementsSearcher.java b/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinAnnotatedElementsSearcher.java index 3d4d8eb29f9..6ac8045a200 100644 --- a/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinAnnotatedElementsSearcher.java +++ b/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinAnnotatedElementsSearcher.java @@ -38,10 +38,7 @@ import org.jetbrains.kotlin.descriptors.ClassifierDescriptor; import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage; import org.jetbrains.kotlin.idea.stubindex.JetAnnotationsIndex; -import org.jetbrains.kotlin.psi.JetAnnotationEntry; -import org.jetbrains.kotlin.psi.JetClass; -import org.jetbrains.kotlin.psi.JetDeclaration; -import org.jetbrains.kotlin.psi.JetNamedFunction; +import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.DescriptorUtils; @@ -84,8 +81,8 @@ public class KotlinAnnotatedElementsSearcher extends AnnotatedElementsSearcher { PsiClass lightClass = LightClassUtil.getPsiClass((JetClass) parentOfType); consumer.process(lightClass); } - else if (parentOfType instanceof JetNamedFunction) { - PsiMethod wrappedMethod = LightClassUtil.getLightClassMethod((JetNamedFunction) parentOfType); + else if (parentOfType instanceof JetNamedFunction || parentOfType instanceof JetSecondaryConstructor) { + PsiMethod wrappedMethod = LightClassUtil.getLightClassMethod((JetFunction) parentOfType); consumer.process(wrappedMethod); } } diff --git a/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinDefinitionsSearcher.java b/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinDefinitionsSearcher.java index 739ccc706ba..827289e7e92 100644 --- a/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinDefinitionsSearcher.java +++ b/idea/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinDefinitionsSearcher.java @@ -43,8 +43,8 @@ public class KotlinDefinitionsSearcher implements QueryExecutor consumer) { + private static boolean processFunctionImplementations(final JetFunction function, SearchScope scope, Processor consumer) { PsiMethod psiMethod = ApplicationManager.getApplication().runReadAction(new Computable() { @Override public PsiMethod compute() {