[Analysis API] Add KtFe10ReferenceResolutionHelper and ...
Make implementation of KtFe10XXXReference follow the old descriptor-based implementation as closely as possible.
This commit is contained in:
committed by
Ilya Kirillov
parent
b5139c958b
commit
0803ab0d0b
+60
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright 2010-2022 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.idea.references
|
||||
|
||||
import com.intellij.openapi.application.ApplicationManager
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
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
|
||||
|
||||
interface ReadWriteAccessChecker {
|
||||
fun readWriteAccessWithFullExpressionByResolve(assignment: KtBinaryExpression): Pair<ReferenceAccess, KtExpression>?
|
||||
|
||||
fun readWriteAccessWithFullExpression(
|
||||
targetExpression: KtExpression,
|
||||
useResolveForReadWrite: Boolean
|
||||
): Pair<ReferenceAccess, KtExpression> {
|
||||
var expression = targetExpression.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
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun getInstance(): ReadWriteAccessChecker = ApplicationManager.getApplication().getService(ReadWriteAccessChecker::class.java)
|
||||
}
|
||||
}
|
||||
|
||||
fun KtExpression.readWriteAccessWithFullExpression(useResolveForReadWrite: Boolean): Pair<ReferenceAccess, KtExpression> =
|
||||
ReadWriteAccessChecker.getInstance().readWriteAccessWithFullExpression(this, useResolveForReadWrite)
|
||||
|
||||
fun KtExpression.readWriteAccess(useResolveForReadWrite: Boolean): ReferenceAccess =
|
||||
ReadWriteAccessChecker.getInstance().readWriteAccessWithFullExpression(this, useResolveForReadWrite).first
|
||||
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Copyright 2010-2022 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.plugin.references
|
||||
|
||||
import com.intellij.openapi.extensions.ExtensionPointName
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
|
||||
import org.jetbrains.kotlin.psi.KtPsiFactory
|
||||
|
||||
interface SimpleNameReferenceExtension {
|
||||
companion object {
|
||||
val EP_NAME: ExtensionPointName<SimpleNameReferenceExtension> =
|
||||
ExtensionPointName.create("org.jetbrains.kotlin.simpleNameReferenceExtension")
|
||||
}
|
||||
|
||||
fun isReferenceTo(reference: KtSimpleNameReference, element: PsiElement): Boolean
|
||||
|
||||
fun handleElementRename(reference: KtSimpleNameReference, psiFactory: KtPsiFactory, newElementName: String): PsiElement?
|
||||
}
|
||||
Reference in New Issue
Block a user