From 4bf20d747a39a352e6b8de799a85f2fc28ed6a8e Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 19 Aug 2015 17:23:12 +0300 Subject: [PATCH] Changes on code review --- .../jetbrains/kotlin/idea/references/referenceUtil.kt | 11 ++++++++--- .../ideaExtensions/KotlinReadWriteAccessDetector.kt | 5 ++++- .../findUsages/kotlin/variable/readAccess.0.kt | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt index 98e5148bfcd..7429da18230 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/referenceUtil.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis import org.jetbrains.kotlin.resolve.calls.callUtil.getCall import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode +import org.jetbrains.kotlin.types.expressions.OperatorConventions import org.jetbrains.kotlin.utils.addToStdlib.constant import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull @@ -149,8 +150,12 @@ public enum class ReferenceAccess { public fun JetExpression.readWriteAccess(useResolveForReadWrite: Boolean): ReferenceAccess { var expression = getQualifiedExpressionForSelectorOrThis() - while (expression.parent is JetParenthesizedExpression || expression.parent is JetAnnotatedExpression) { - expression = expression.parent as JetExpression + loop@ while (true) { + val parent = expression.parent + when (parent) { + is JetParenthesizedExpression, is JetAnnotatedExpression, is JetLabeledExpression -> expression = parent as JetExpression + else -> break@loop + } } val assignment = expression.getAssignmentByLHS() @@ -164,7 +169,7 @@ public fun JetExpression.readWriteAccess(useResolveForReadWrite: Boolean): Refer val bindingContext = assignment.analyze(BodyResolveMode.PARTIAL) val resolvedCall = assignment.getResolvedCall(bindingContext) ?: return ReferenceAccess.READ_WRITE if (!resolvedCall.status.isSuccess) return ReferenceAccess.READ_WRITE - return if (resolvedCall.resultingDescriptor.name.asString().endsWith("Assign")) + return if (resolvedCall.resultingDescriptor.name in OperatorConventions.ASSIGNMENT_OPERATIONS.values()) ReferenceAccess.READ else ReferenceAccess.READ_WRITE diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReadWriteAccessDetector.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReadWriteAccessDetector.kt index 6f7d080a858..33670e004a6 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReadWriteAccessDetector.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReadWriteAccessDetector.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.search.ideaExtensions +import com.intellij.codeInsight.highlighting.JavaReadWriteAccessDetector import com.intellij.codeInsight.highlighting.ReadWriteAccessDetector import com.intellij.psi.PsiElement import com.intellij.psi.PsiReference @@ -56,7 +57,9 @@ public class KotlinReadWriteAccessDetector : ReadWriteAccessDetector() { } override fun getExpressionAccess(expression: PsiElement): ReadWriteAccessDetector.Access { - if (expression !is JetExpression) return ReadWriteAccessDetector.Access.Read + if (expression !is JetExpression) { //TODO: there should be a more correct scheme of access type detection for cross-language references + return JavaReadWriteAccessDetector().getExpressionAccess(expression) + } return when (expression.readWriteAccess(useResolveForReadWrite = true)) { ReferenceAccess.READ -> ReadWriteAccessDetector.Access.Read diff --git a/idea/testData/findUsages/kotlin/variable/readAccess.0.kt b/idea/testData/findUsages/kotlin/variable/readAccess.0.kt index d31ee33818b..0bae4236bdb 100644 --- a/idea/testData/findUsages/kotlin/variable/readAccess.0.kt +++ b/idea/testData/findUsages/kotlin/variable/readAccess.0.kt @@ -3,7 +3,7 @@ // OPTIONS: skipWrite fun foo() { var v = 1 - (@X v) = 2 + (X@ v) = 2 print(v) ++ @X v v--