Analysis API: add implementation of ReadWriteAccessChecker via descriptors
This commit is contained in:
+31
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* 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.analysis.api.descriptors.references
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.analysis.api.analyze
|
||||||
|
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade
|
||||||
|
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||||
|
import org.jetbrains.kotlin.idea.references.ReadWriteAccessChecker
|
||||||
|
import org.jetbrains.kotlin.psi.KtBinaryExpression
|
||||||
|
import org.jetbrains.kotlin.psi.KtExpression
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.util.getCall
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall
|
||||||
|
import org.jetbrains.kotlin.resolve.references.ReferenceAccess
|
||||||
|
import org.jetbrains.kotlin.types.expressions.OperatorConventions
|
||||||
|
|
||||||
|
class ReadWriteAccessCheckerDescriptorsImpl : ReadWriteAccessChecker {
|
||||||
|
override fun readWriteAccessWithFullExpressionByResolve(assignment: KtBinaryExpression): Pair<ReferenceAccess, KtExpression> {
|
||||||
|
val resolvedCall = analyze(assignment) {
|
||||||
|
with((this as KtFe10AnalysisSession).analysisContext.analyze(assignment, Fe10AnalysisFacade.AnalysisMode.PARTIAL)) {
|
||||||
|
assignment.getCall(this)?.getResolvedCall(this) ?: return ReferenceAccess.READ_WRITE to assignment
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return if (resolvedCall.resultingDescriptor.name in OperatorConventions.ASSIGNMENT_OPERATIONS.values)
|
||||||
|
ReferenceAccess.READ to assignment
|
||||||
|
else
|
||||||
|
ReferenceAccess.READ_WRITE to assignment
|
||||||
|
}
|
||||||
|
}
|
||||||
+3
@@ -13,11 +13,13 @@ import org.jetbrains.kotlin.analysis.api.descriptors.CliFe10AnalysisFacade
|
|||||||
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade
|
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisHandlerExtension
|
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisHandlerExtension
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSessionProvider
|
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSessionProvider
|
||||||
|
import org.jetbrains.kotlin.analysis.api.descriptors.references.ReadWriteAccessCheckerDescriptorsImpl
|
||||||
import org.jetbrains.kotlin.references.fe10.base.KtFe10KotlinReferenceProviderContributor
|
import org.jetbrains.kotlin.references.fe10.base.KtFe10KotlinReferenceProviderContributor
|
||||||
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar
|
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar
|
||||||
import org.jetbrains.kotlin.cli.common.CliModuleVisibilityManagerImpl
|
import org.jetbrains.kotlin.cli.common.CliModuleVisibilityManagerImpl
|
||||||
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
||||||
import org.jetbrains.kotlin.idea.references.KotlinReferenceProviderContributor
|
import org.jetbrains.kotlin.idea.references.KotlinReferenceProviderContributor
|
||||||
|
import org.jetbrains.kotlin.idea.references.ReadWriteAccessChecker
|
||||||
import org.jetbrains.kotlin.light.classes.symbol.caches.SymbolLightClassFacadeCache
|
import org.jetbrains.kotlin.light.classes.symbol.caches.SymbolLightClassFacadeCache
|
||||||
import org.jetbrains.kotlin.load.kotlin.ModuleVisibilityManager
|
import org.jetbrains.kotlin.load.kotlin.ModuleVisibilityManager
|
||||||
import org.jetbrains.kotlin.resolve.extensions.AnalysisHandlerExtension
|
import org.jetbrains.kotlin.resolve.extensions.AnalysisHandlerExtension
|
||||||
@@ -36,6 +38,7 @@ object AnalysisApiFe10TestServiceRegistrar : AnalysisApiTestServiceRegistrar() {
|
|||||||
registerService(ModuleVisibilityManager::class.java, CliModuleVisibilityManagerImpl(enabled = true))
|
registerService(ModuleVisibilityManager::class.java, CliModuleVisibilityManagerImpl(enabled = true))
|
||||||
|
|
||||||
registerService(SymbolLightClassFacadeCache::class.java)
|
registerService(SymbolLightClassFacadeCache::class.java)
|
||||||
|
registerService(ReadWriteAccessChecker::class.java, ReadWriteAccessCheckerDescriptorsImpl())
|
||||||
}
|
}
|
||||||
AnalysisHandlerExtension.registerExtension(project, KtFe10AnalysisHandlerExtension())
|
AnalysisHandlerExtension.registerExtension(project, KtFe10AnalysisHandlerExtension())
|
||||||
KotlinCoreEnvironment.registerKotlinLightClassSupport(project)
|
KotlinCoreEnvironment.registerKotlinLightClassSupport(project)
|
||||||
|
|||||||
+8
-9
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.references
|
package org.jetbrains.kotlin.idea.references
|
||||||
|
|
||||||
import com.intellij.openapi.application.ApplicationManager
|
import com.intellij.openapi.project.Project
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getAssignmentByLHS
|
import org.jetbrains.kotlin.psi.psiUtil.getAssignmentByLHS
|
||||||
@@ -48,17 +48,16 @@ interface ReadWriteAccessChecker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun getInstance(): ReadWriteAccessChecker = ApplicationManager.getApplication().getService(ReadWriteAccessChecker::class.java)
|
fun getInstance(project: Project): ReadWriteAccessChecker = project.getService(ReadWriteAccessChecker::class.java)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Used in IDE
|
||||||
|
@Suppress("unused")
|
||||||
fun KtExpression.readWriteAccessWithFullExpression(useResolveForReadWrite: Boolean): Pair<ReferenceAccess, KtExpression> =
|
fun KtExpression.readWriteAccessWithFullExpression(useResolveForReadWrite: Boolean): Pair<ReferenceAccess, KtExpression> =
|
||||||
ReadWriteAccessChecker.getInstance().readWriteAccessWithFullExpression(this, useResolveForReadWrite)
|
ReadWriteAccessChecker.getInstance(project).readWriteAccessWithFullExpression(this, useResolveForReadWrite)
|
||||||
|
|
||||||
fun KtExpression.readWriteAccess(useResolveForReadWrite: Boolean): ReferenceAccess =
|
fun KtExpression.readWriteAccess(useResolveForReadWrite: Boolean): ReferenceAccess {
|
||||||
object : ReadWriteAccessChecker {
|
return ReadWriteAccessChecker.getInstance(project).readWriteAccessWithFullExpression(this, useResolveForReadWrite).first
|
||||||
override fun readWriteAccessWithFullExpressionByResolve(
|
}
|
||||||
assignment: KtBinaryExpression
|
|
||||||
): Pair<ReferenceAccess, KtExpression>? = null
|
|
||||||
}.readWriteAccessWithFullExpression(this, useResolveForReadWrite).first
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user