Extract methods for conversion between Kotlin declarations and light

methods
This commit is contained in:
Alexey Sedunov
2014-01-13 18:52:39 +04:00
parent f30d4f042e
commit 4ba01ee1d5
2 changed files with 49 additions and 8 deletions
@@ -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<PsiMethod> =
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
}
@@ -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<PsiElement>.searchOverriders(): Query<PsiMethod> {
val psiMethods: List<PsiMethod> = 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)}