From 4ba01ee1d5908670e4f4c5aa40f61807d5654461 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 13 Jan 2014 18:52:39 +0400 Subject: [PATCH] Extract methods for conversion between Kotlin declarations and light methods --- .../jetbrains/jet/asJava/lightClassUtils.kt | 45 +++++++++++++++++++ .../declarationsSearch/overridersSearch.kt | 12 ++--- 2 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/lightClassUtils.kt diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/lightClassUtils.kt b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/lightClassUtils.kt new file mode 100644 index 00000000000..1289b164c4b --- /dev/null +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/lightClassUtils.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.asJava + +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiMethod +import org.jetbrains.jet.lang.psi.JetNamedFunction +import org.jetbrains.jet.lang.psi.JetProperty +import org.jetbrains.jet.lang.psi.JetParameter +import java.util.Collections +import org.jetbrains.jet.lang.psi.JetPropertyAccessor + +fun PsiElement.toLightMethods(): List = + when (this) { + is JetNamedFunction -> Collections.singletonList(LightClassUtil.getLightClassMethod(this)) + is JetProperty -> LightClassUtil.getLightClassPropertyMethods(this).toList() + is JetParameter -> LightClassUtil.getLightClassPropertyMethods(this).toList() + is JetPropertyAccessor -> Collections.singletonList(LightClassUtil.getLightClassAccessorMethod(this)) + is PsiMethod -> Collections.singletonList(this) + else -> Collections.emptyList() + } + +fun PsiElement.getRepresentativeLightMethod(): PsiMethod? = + when (this) { + is JetNamedFunction -> LightClassUtil.getLightClassMethod(this) + is JetProperty -> LightClassUtil.getLightClassPropertyMethods(this).getGetter() + is JetParameter -> LightClassUtil.getLightClassPropertyMethods(this).getGetter() + is JetPropertyAccessor -> LightClassUtil.getLightClassAccessorMethod(this) + is PsiMethod -> this + else -> null + } \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/search/declarationsSearch/overridersSearch.kt b/idea/src/org/jetbrains/jet/plugin/search/declarationsSearch/overridersSearch.kt index 1eb43a7d3be..0d4aecf50ca 100644 --- a/idea/src/org/jetbrains/jet/plugin/search/declarationsSearch/overridersSearch.kt +++ b/idea/src/org/jetbrains/jet/plugin/search/declarationsSearch/overridersSearch.kt @@ -42,6 +42,7 @@ import com.intellij.util.EmptyQuery import com.intellij.util.MergeQuery import com.intellij.util.UniqueResultsQuery import com.intellij.util.containers.ContainerUtil +import org.jetbrains.jet.asJava.toLightMethods fun PsiElement.isOverridableElement(): Boolean = when (this) { is PsiMethod -> PsiUtil.canBeOverriden(this) @@ -50,14 +51,9 @@ fun PsiElement.isOverridableElement(): Boolean = when (this) { } public fun HierarchySearchRequest.searchOverriders(): Query { - val psiMethods: List = when (originalElement) { - is JetNamedFunction -> Collections.singletonList(LightClassUtil.getLightClassMethod(originalElement)) - is JetProperty -> LightClassUtil.getLightClassPropertyMethods(originalElement).iterator().toArrayList() - is JetParameter -> LightClassUtil.getLightClassPropertyMethods(originalElement).iterator().toArrayList() - is JetPropertyAccessor -> Collections.singletonList(LightClassUtil.getLightClassAccessorMethod(originalElement)) - is PsiMethod -> Collections.singletonList(originalElement) - else -> return EmptyQuery.getEmptyQuery() - } + val psiMethods = originalElement.toLightMethods() + if (psiMethods.isEmpty()) return EmptyQuery.getEmptyQuery() + return psiMethods .map { psiMethod -> KotlinPsiMethodOverridersSearch.search(copy(psiMethod)) } .reduce {(query1, query2) -> MergeQuery(query1, query2)}