Changes on code review
This commit is contained in:
@@ -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.getCall
|
||||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
|
||||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
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.constant
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
|
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
||||||
@@ -149,8 +150,12 @@ public enum class ReferenceAccess {
|
|||||||
|
|
||||||
public fun JetExpression.readWriteAccess(useResolveForReadWrite: Boolean): ReferenceAccess {
|
public fun JetExpression.readWriteAccess(useResolveForReadWrite: Boolean): ReferenceAccess {
|
||||||
var expression = getQualifiedExpressionForSelectorOrThis()
|
var expression = getQualifiedExpressionForSelectorOrThis()
|
||||||
while (expression.parent is JetParenthesizedExpression || expression.parent is JetAnnotatedExpression) {
|
loop@ while (true) {
|
||||||
expression = expression.parent as JetExpression
|
val parent = expression.parent
|
||||||
|
when (parent) {
|
||||||
|
is JetParenthesizedExpression, is JetAnnotatedExpression, is JetLabeledExpression -> expression = parent as JetExpression
|
||||||
|
else -> break@loop
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val assignment = expression.getAssignmentByLHS()
|
val assignment = expression.getAssignmentByLHS()
|
||||||
@@ -164,7 +169,7 @@ public fun JetExpression.readWriteAccess(useResolveForReadWrite: Boolean): Refer
|
|||||||
val bindingContext = assignment.analyze(BodyResolveMode.PARTIAL)
|
val bindingContext = assignment.analyze(BodyResolveMode.PARTIAL)
|
||||||
val resolvedCall = assignment.getResolvedCall(bindingContext) ?: return ReferenceAccess.READ_WRITE
|
val resolvedCall = assignment.getResolvedCall(bindingContext) ?: return ReferenceAccess.READ_WRITE
|
||||||
if (!resolvedCall.status.isSuccess) 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
|
ReferenceAccess.READ
|
||||||
else
|
else
|
||||||
ReferenceAccess.READ_WRITE
|
ReferenceAccess.READ_WRITE
|
||||||
|
|||||||
+4
-1
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.search.ideaExtensions
|
package org.jetbrains.kotlin.idea.search.ideaExtensions
|
||||||
|
|
||||||
|
import com.intellij.codeInsight.highlighting.JavaReadWriteAccessDetector
|
||||||
import com.intellij.codeInsight.highlighting.ReadWriteAccessDetector
|
import com.intellij.codeInsight.highlighting.ReadWriteAccessDetector
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiReference
|
import com.intellij.psi.PsiReference
|
||||||
@@ -56,7 +57,9 @@ public class KotlinReadWriteAccessDetector : ReadWriteAccessDetector() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun getExpressionAccess(expression: PsiElement): ReadWriteAccessDetector.Access {
|
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)) {
|
return when (expression.readWriteAccess(useResolveForReadWrite = true)) {
|
||||||
ReferenceAccess.READ -> ReadWriteAccessDetector.Access.Read
|
ReferenceAccess.READ -> ReadWriteAccessDetector.Access.Read
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
// OPTIONS: skipWrite
|
// OPTIONS: skipWrite
|
||||||
fun foo() {
|
fun foo() {
|
||||||
var <caret>v = 1
|
var <caret>v = 1
|
||||||
(@X v) = 2
|
(X@ v) = 2
|
||||||
print(v)
|
print(v)
|
||||||
++ @X v
|
++ @X v
|
||||||
v--
|
v--
|
||||||
|
|||||||
Reference in New Issue
Block a user