Changes on code review

This commit is contained in:
Valentin Kipyatkov
2015-08-19 17:23:12 +03:00
parent 4876668716
commit 4bf20d747a
3 changed files with 13 additions and 5 deletions
@@ -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
@@ -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
+1 -1
View File
@@ -3,7 +3,7 @@
// OPTIONS: skipWrite
fun foo() {
var <caret>v = 1
(@X v) = 2
(X@ v) = 2
print(v)
++ @X v
v--