diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/JetReferenceContributor.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/JetReferenceContributor.kt index e123f54f596..7dfa4ec0d87 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/JetReferenceContributor.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/JetReferenceContributor.kt @@ -38,9 +38,9 @@ public class JetReferenceContributor() : PsiReferenceContributor() { if (it.getReferencedNameElementType() != JetTokens.IDENTIFIER) return@registerMultiProvider emptyArray() when (it.access()) { - Access.READ -> arrayOf(SyntheticPropertyAccessorReference(it, true)) - Access.WRITE -> arrayOf(SyntheticPropertyAccessorReference(it, false)) - Access.READ_WRITE -> arrayOf(SyntheticPropertyAccessorReference(it, true), SyntheticPropertyAccessorReference(it, false)) + Access.READ -> arrayOf(SyntheticPropertyAccessorReference.Getter(it)) + Access.WRITE -> arrayOf(SyntheticPropertyAccessorReference.Setter(it)) + Access.READ_WRITE -> arrayOf(SyntheticPropertyAccessorReference.Getter(it), SyntheticPropertyAccessorReference.Setter(it)) } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/SyntheticPropertyAccessorReference.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/SyntheticPropertyAccessorReference.kt index 04194df0f62..fa92062357e 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/SyntheticPropertyAccessorReference.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/SyntheticPropertyAccessorReference.kt @@ -29,7 +29,7 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.synthetic.SyntheticExtensionPropertyDescriptor import org.jetbrains.kotlin.utils.addIfNotNull -class SyntheticPropertyAccessorReference(expression: JetNameReferenceExpression, val getter: Boolean) : JetSimpleReference(expression) { +sealed class SyntheticPropertyAccessorReference(expression: JetNameReferenceExpression, private val getter: Boolean) : JetSimpleReference(expression) { override fun getTargetDescriptors(context: BindingContext): Collection { val descriptors = super.getTargetDescriptors(context) if (descriptors.none { it is SyntheticExtensionPropertyDescriptor }) return emptyList() @@ -66,4 +66,7 @@ class SyntheticPropertyAccessorReference(expression: JetNameReferenceExpression, expression.getReferencedNameElement().replace(nameIdentifier) return expression } -} \ No newline at end of file + + public class Getter(expression: JetNameReferenceExpression) : SyntheticPropertyAccessorReference(expression, true) + public class Setter(expression: JetNameReferenceExpression) : SyntheticPropertyAccessorReference(expression, false) +} diff --git a/idea/src/org/jetbrains/kotlin/idea/findUsages/KotlinReferenceUsageInfo.kt b/idea/src/org/jetbrains/kotlin/idea/findUsages/KotlinReferenceUsageInfo.kt new file mode 100644 index 00000000000..9a846f7e005 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/findUsages/KotlinReferenceUsageInfo.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2010-2015 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.kotlin.idea.findUsages + +import com.intellij.psi.PsiReference +import com.intellij.usageView.UsageInfo +import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull + +public class KotlinReferenceUsageInfo(reference: PsiReference) : UsageInfo(reference) { + private val referenceType = reference.javaClass + + override fun getReference(): PsiReference? { + val element = getElement() ?: return null + return element.getReferences().singleOrNull { it.javaClass == referenceType } + } +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindClassUsagesHandler.kt b/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindClassUsagesHandler.kt index 8905dd83ef4..fd838b0fad0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindClassUsagesHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindClassUsagesHandler.kt @@ -43,6 +43,7 @@ import com.intellij.psi.search.searches.MethodReferencesSearch import com.intellij.util.CommonProcessors import org.jetbrains.kotlin.asJava.KotlinLightMethod import org.jetbrains.kotlin.asJava.toLightClass +import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.search.usagesSearch.processDelegationCallConstructorUsages import org.jetbrains.kotlin.psi.JetClass import org.jetbrains.kotlin.psi.psiUtil.isInheritable @@ -98,7 +99,7 @@ public class KotlinFindClassUsagesHandler( for (constructor in constructors) { if (constructor !is KotlinLightMethod) continue constructor.processDelegationCallConstructorUsages(constructor.getUseScope()) { - it.getCalleeExpression()?.getReference()?.let { KotlinFindUsagesHandler.processUsage(uniqueProcessor, it) } + it.getCalleeExpression()?.mainReference?.let { KotlinFindUsagesHandler.processUsage(uniqueProcessor, it) } } } } 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 6467533fe7d..ba2e0e4f8cd 100644 --- a/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindMemberUsagesHandler.java +++ b/idea/src/org/jetbrains/kotlin/idea/findUsages/handlers/KotlinFindMemberUsagesHandler.java @@ -168,7 +168,7 @@ public abstract class KotlinFindMemberUsagesHandler extends Find return factory; } - protected static boolean processUsage(Processor processor, PsiReference ref) { - if (ref == null) return true; - TextRange rangeInElement = ref.getRangeInElement(); - return processor.process(new UsageInfo(ref.getElement(), rangeInElement.getStartOffset(), rangeInElement.getEndOffset(), false)); + protected static boolean processUsage(@NotNull Processor processor, @NotNull PsiReference ref) { + return processor.process(new KotlinReferenceUsageInfo(ref)); } protected static boolean processUsage(@NotNull Processor processor, @NotNull PsiElement element) {