Reuse property search for parameters

This commit is contained in:
Alexey Sedunov
2013-11-07 13:55:43 +04:00
parent 58f7a3efbf
commit cfaeca88bf
2 changed files with 31 additions and 14 deletions
@@ -151,6 +151,7 @@ public class LightClassUtil {
return extractPropertyAccessors(property, getterWrapper, setterWrapper);
}
@NotNull
public static PropertyAccessorsPsiMethods getLightClassPropertyMethods(@NotNull JetParameter parameter) {
return extractPropertyAccessors(parameter, null, null);
}
@@ -255,6 +256,7 @@ public class LightClassUtil {
return packageName == null ? null : PackageClassUtils.getPackageClassFqName(new FqName(packageName));
}
@NotNull
private static PropertyAccessorsPsiMethods extractPropertyAccessors(
@NotNull JetDeclaration jetDeclaration,
@Nullable PsiMethod specialGetter, @Nullable PsiMethod specialSetter
@@ -36,22 +36,36 @@ import com.intellij.psi.search.SearchRequestCollector
import org.jetbrains.jet.lang.psi.JetCallableDeclaration
import org.jetbrains.jet.lang.psi.JetParameter
import org.jetbrains.jet.lang.psi.JetPsiUtil
import org.jetbrains.jet.lang.psi.psiUtil.*
import org.jetbrains.jet.asJava.LightClassUtil.PropertyAccessorsPsiMethods
val isTargetUsage = (PsiReference::isTargetUsage).searchFilter
fun JetProperty.names(readable: Boolean = true, writable: Boolean = true): List<String> {
fun JetNamedDeclaration.namesWithAccessors(readable: Boolean = true, writable: Boolean = true): List<String> {
val name = getName()!!
if (isLocal()) return Collections.singletonList(name)
fun PropertyAccessorsPsiMethods.toNameList(): List<String> {
val getter = getGetter()
val setter = getSetter()
val lightMethods = LightClassUtil.getLightClassPropertyMethods(this)
val getter = lightMethods.getGetter()
val setter = lightMethods.getSetter()
val result = arrayListOf(name)
if (readable && getter != null) result.add(getter.getName())
if (writable && setter != null) result.add(setter.getName())
return result
}
val result = arrayListOf(name)
if (readable && getter != null) result.add(getter.getName())
if (writable && setter != null) result.add(setter.getName())
return result
if (JetPsiUtil.isLocal(this)) return Collections.singletonList(name)
when (this) {
is JetProperty ->
return LightClassUtil.getLightClassPropertyMethods(this).toNameList()
is JetParameter ->
if (getValOrVarNode() != null) {
return LightClassUtil.getLightClassPropertyMethods(this).toNameList()
}
}
return Collections.singletonList(name)
}
public abstract class UsagesSearchHelper<T : PsiNamedElement> {
@@ -63,7 +77,7 @@ public abstract class UsagesSearchHelper<T : PsiNamedElement> {
when {
name == null -> Collections.emptyList<String>()
element is JetProperty -> element.names()
element is JetProperty, element is JetParameter -> (element as JetNamedDeclaration).namesWithAccessors()
else -> Collections.singletonList(name)
}
}
@@ -161,18 +175,19 @@ class FunctionUsagesSearchHelper(
val isPropertyReadOnlyUsage = (PsiReference::isPropertyReadOnlyUsage).searchFilter
// Used for JetProperty and JetParameter
class PropertyUsagesSearchHelper(
public val readUsages: Boolean = true,
public val writeUsages: Boolean = true,
public override val selfUsages: Boolean = true,
public override val overrideUsages: Boolean = true,
skipImports: Boolean = false
) : DefaultSearchHelper<JetProperty>(skipImports), OverrideSearchHelper {
override fun makeWordList(target: UsagesSearchTarget<JetProperty>): List<String> {
return target.element.names(readable = readUsages, writable = writeUsages)
) : DefaultSearchHelper<JetNamedDeclaration>(skipImports), OverrideSearchHelper {
override fun makeWordList(target: UsagesSearchTarget<JetNamedDeclaration>): List<String> {
return target.element.namesWithAccessors(readable = readUsages, writable = writeUsages)
}
override fun makeFilter(target: UsagesSearchTarget<JetProperty>): UsagesSearchFilter {
override fun makeFilter(target: UsagesSearchTarget<JetNamedDeclaration>): UsagesSearchFilter {
val readWriteUsage = when {
readUsages && writeUsages -> True
readUsages -> isPropertyReadOnlyUsage