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); return extractPropertyAccessors(property, getterWrapper, setterWrapper);
} }
@NotNull
public static PropertyAccessorsPsiMethods getLightClassPropertyMethods(@NotNull JetParameter parameter) { public static PropertyAccessorsPsiMethods getLightClassPropertyMethods(@NotNull JetParameter parameter) {
return extractPropertyAccessors(parameter, null, null); return extractPropertyAccessors(parameter, null, null);
} }
@@ -255,6 +256,7 @@ public class LightClassUtil {
return packageName == null ? null : PackageClassUtils.getPackageClassFqName(new FqName(packageName)); return packageName == null ? null : PackageClassUtils.getPackageClassFqName(new FqName(packageName));
} }
@NotNull
private static PropertyAccessorsPsiMethods extractPropertyAccessors( private static PropertyAccessorsPsiMethods extractPropertyAccessors(
@NotNull JetDeclaration jetDeclaration, @NotNull JetDeclaration jetDeclaration,
@Nullable PsiMethod specialGetter, @Nullable PsiMethod specialSetter @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.JetCallableDeclaration
import org.jetbrains.jet.lang.psi.JetParameter import org.jetbrains.jet.lang.psi.JetParameter
import org.jetbrains.jet.lang.psi.JetPsiUtil 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 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()!! 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 result = arrayListOf(name)
val getter = lightMethods.getGetter() if (readable && getter != null) result.add(getter.getName())
val setter = lightMethods.getSetter() if (writable && setter != null) result.add(setter.getName())
return result
}
val result = arrayListOf(name) if (JetPsiUtil.isLocal(this)) return Collections.singletonList(name)
if (readable && getter != null) result.add(getter.getName())
if (writable && setter != null) result.add(setter.getName()) when (this) {
return result 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> { public abstract class UsagesSearchHelper<T : PsiNamedElement> {
@@ -63,7 +77,7 @@ public abstract class UsagesSearchHelper<T : PsiNamedElement> {
when { when {
name == null -> Collections.emptyList<String>() name == null -> Collections.emptyList<String>()
element is JetProperty -> element.names() element is JetProperty, element is JetParameter -> (element as JetNamedDeclaration).namesWithAccessors()
else -> Collections.singletonList(name) else -> Collections.singletonList(name)
} }
} }
@@ -161,18 +175,19 @@ class FunctionUsagesSearchHelper(
val isPropertyReadOnlyUsage = (PsiReference::isPropertyReadOnlyUsage).searchFilter val isPropertyReadOnlyUsage = (PsiReference::isPropertyReadOnlyUsage).searchFilter
// Used for JetProperty and JetParameter
class PropertyUsagesSearchHelper( class PropertyUsagesSearchHelper(
public val readUsages: Boolean = true, public val readUsages: Boolean = true,
public val writeUsages: Boolean = true, public val writeUsages: Boolean = true,
public override val selfUsages: Boolean = true, public override val selfUsages: Boolean = true,
public override val overrideUsages: Boolean = true, public override val overrideUsages: Boolean = true,
skipImports: Boolean = false skipImports: Boolean = false
) : DefaultSearchHelper<JetProperty>(skipImports), OverrideSearchHelper { ) : DefaultSearchHelper<JetNamedDeclaration>(skipImports), OverrideSearchHelper {
override fun makeWordList(target: UsagesSearchTarget<JetProperty>): List<String> { override fun makeWordList(target: UsagesSearchTarget<JetNamedDeclaration>): List<String> {
return target.element.names(readable = readUsages, writable = writeUsages) 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 { val readWriteUsage = when {
readUsages && writeUsages -> True readUsages && writeUsages -> True
readUsages -> isPropertyReadOnlyUsage readUsages -> isPropertyReadOnlyUsage