Migrate ReadWriteAccess and checker logic (from frontend-independent)
This commit is contained in:
committed by
Ilya Kirillov
parent
01272cace3
commit
cd4a08cb18
@@ -6,9 +6,12 @@
|
|||||||
package org.jetbrains.kotlin.idea.references
|
package org.jetbrains.kotlin.idea.references
|
||||||
|
|
||||||
import org.jetbrains.kotlin.kdoc.psi.impl.KDocName
|
import org.jetbrains.kotlin.kdoc.psi.impl.KDocName
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.KtReferenceExpression
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
|
import org.jetbrains.kotlin.psi.psiUtil.getAssignmentByLHS
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis
|
||||||
|
import org.jetbrains.kotlin.resolve.references.ReferenceAccess
|
||||||
|
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
|
||||||
|
|
||||||
@@ -27,3 +30,37 @@ val KtElement.mainReference: KtReference?
|
|||||||
is KDocName -> mainReference
|
is KDocName -> mainReference
|
||||||
else -> references.firstIsInstanceOrNull()
|
else -> references.firstIsInstanceOrNull()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun KtExpression.readWriteAccess(useResolveForReadWrite: Boolean) =
|
||||||
|
readWriteAccessWithFullExpression(useResolveForReadWrite).first
|
||||||
|
|
||||||
|
fun KtExpression.readWriteAccessWithFullExpression(
|
||||||
|
useResolveForReadWrite: Boolean,
|
||||||
|
readWriteAccessWithFullExpressionByResolve: (KtBinaryExpression) -> Pair<ReferenceAccess, KtExpression>? = { null },
|
||||||
|
): Pair<ReferenceAccess, KtExpression> {
|
||||||
|
var expression = getQualifiedExpressionForSelectorOrThis()
|
||||||
|
loop@ while (true) {
|
||||||
|
when (val parent = expression.parent) {
|
||||||
|
is KtParenthesizedExpression, is KtAnnotatedExpression, is KtLabeledExpression -> expression = parent as KtExpression
|
||||||
|
else -> break@loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val assignment = expression.getAssignmentByLHS()
|
||||||
|
if (assignment != null) {
|
||||||
|
return when (assignment.operationToken) {
|
||||||
|
KtTokens.EQ -> ReferenceAccess.WRITE to assignment
|
||||||
|
|
||||||
|
else -> {
|
||||||
|
(if (useResolveForReadWrite) readWriteAccessWithFullExpressionByResolve(assignment) else null)
|
||||||
|
?: (ReferenceAccess.READ_WRITE to assignment)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val unaryExpression = expression.parent as? KtUnaryExpression
|
||||||
|
return if (unaryExpression != null && unaryExpression.operationToken in constant { setOf(KtTokens.PLUSPLUS, KtTokens.MINUSMINUS) })
|
||||||
|
ReferenceAccess.READ_WRITE to unaryExpression
|
||||||
|
else
|
||||||
|
ReferenceAccess.READ to expression
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.resolve.references
|
||||||
|
|
||||||
|
enum class ReferenceAccess(
|
||||||
|
val isRead: Boolean,
|
||||||
|
val isWrite: Boolean
|
||||||
|
) {
|
||||||
|
READ(true, false),
|
||||||
|
WRITE(false, true),
|
||||||
|
READ_WRITE(true, true)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user