[FIR IDE] Initial descriptor-based implementation of the Analysis API
This commit is contained in:
committed by
teamcityserver
parent
e2c9be0932
commit
516dd825c2
@@ -0,0 +1,44 @@
|
||||
plugins {
|
||||
kotlin("jvm")
|
||||
id("jps-compatible")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(project(":core:descriptors.jvm"))
|
||||
implementation(project(":compiler:frontend"))
|
||||
implementation(project(":compiler:frontend.java"))
|
||||
implementation(project(":analysis:analysis-api-impl-base"))
|
||||
|
||||
implementation(project(":compiler:backend"))
|
||||
implementation(project(":compiler:backend.jvm"))
|
||||
implementation(project(":compiler:backend-common"))
|
||||
implementation(project(":compiler:backend.common.jvm"))
|
||||
|
||||
testApiJUnit5()
|
||||
testImplementation(project(":analysis:analysis-api-providers"))
|
||||
testImplementation(projectTests(":compiler:tests-common"))
|
||||
testImplementation(projectTests(":compiler:test-infrastructure-utils"))
|
||||
testImplementation(projectTests(":compiler:test-infrastructure"))
|
||||
testImplementation(projectTests(":compiler:tests-common-new"))
|
||||
testImplementation(projectTests(":analysis:analysis-api-impl-barebone"))
|
||||
testImplementation(projectTests(":analysis:analysis-api-impl-base"))
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
"main" { projectDefault() }
|
||||
"test" { projectDefault() }
|
||||
}
|
||||
|
||||
tasks.withType<org.jetbrains.kotlin.gradle.dsl.KotlinCompile<*>> {
|
||||
kotlinOptions {
|
||||
freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
|
||||
}
|
||||
}
|
||||
|
||||
projectTest(jUnit5Enabled = true) {
|
||||
dependsOn(":dist")
|
||||
workingDir = rootDir
|
||||
useJUnitPlatform()
|
||||
}
|
||||
|
||||
testsJar()
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors
|
||||
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.components.*
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.components.*
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProvider
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
|
||||
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
|
||||
|
||||
@Suppress("LeakingThis")
|
||||
abstract class KtFe10AnalysisSession(val contextElement: KtElement, token: ValidityToken) : KtAnalysisSession(token) {
|
||||
override val smartCastProviderImpl: KtSmartCastProvider = KtFe10SmartCastProvider(this)
|
||||
override val diagnosticProviderImpl: KtDiagnosticProvider = KtFe10DiagnosticProvider(this)
|
||||
override val scopeProviderImpl: KtScopeProvider = KtFe10ScopeProvider(this)
|
||||
override val containingDeclarationProviderImpl: KtSymbolContainingDeclarationProvider = KtFe10SymbolContainingDeclarationProvider(this)
|
||||
override val symbolProviderImpl: KtSymbolProvider = KtFe10SymbolProvider(this)
|
||||
override val callResolverImpl: KtCallResolver = KtFe10CallResolver(this)
|
||||
override val completionCandidateCheckerImpl: KtCompletionCandidateChecker = KtFe10CompletionCandidateChecker(this)
|
||||
override val symbolDeclarationOverridesProviderImpl: KtSymbolDeclarationOverridesProvider = KtFe10SymbolDeclarationOverridesProvider(this)
|
||||
override val referenceShortenerImpl: KtReferenceShortener = KtFe10ReferenceShortener(this)
|
||||
override val symbolDeclarationRendererProviderImpl: KtSymbolDeclarationRendererProvider = KtFe10SymbolDeclarationRendererProvider(this)
|
||||
override val expressionTypeProviderImpl: KtExpressionTypeProvider = KtFe10ExpressionTypeProvider(this)
|
||||
override val psiTypeProviderImpl: KtPsiTypeProvider = KtFe10PsiTypeProvider(this)
|
||||
override val typeProviderImpl: KtTypeProvider = KtFe10TypeProvider(this)
|
||||
override val typeInfoProviderImpl: KtTypeInfoProvider = KtFe10TypeInfoProvider(this)
|
||||
override val subtypingComponentImpl: KtSubtypingComponent = KtFe10SubtypingComponent(this)
|
||||
override val expressionInfoProviderImpl: KtExpressionInfoProvider = KtFe10ExpressionInfoProvider(this)
|
||||
override val compileTimeConstantProviderImpl: KtCompileTimeConstantProvider = KtFe10CompileTimeConstantProvider(this)
|
||||
override val visibilityCheckerImpl: KtVisibilityChecker = KtFe10VisibilityChecker(this)
|
||||
override val overrideInfoProviderImpl: KtOverrideInfoProvider = KtFe10OverrideInfoProvider(this)
|
||||
override val inheritorsProviderImpl: KtInheritorsProvider = KtFe10InheritorsProvider(this)
|
||||
override val typesCreatorImpl: KtTypeCreator = KtFe10TypeCreator(this)
|
||||
override val samResolverImpl: KtSamResolver = KtFe10SamResolver(this)
|
||||
override val importOptimizerImpl: KtImportOptimizer = KtFe10ImportOptimizer(this)
|
||||
override val jvmTypeMapperImpl: KtJvmTypeMapper = KtFe10JvmTypeMapper(this)
|
||||
override val symbolInfoProviderImpl: KtSymbolInfoProvider = KtFe10SymbolInfoProvider(this)
|
||||
|
||||
abstract val resolveSession: ResolveSession
|
||||
abstract val deprecationResolver: DeprecationResolver
|
||||
|
||||
abstract fun analyze(element: KtElement, mode: AnalysisMode = AnalysisMode.FULL): BindingContext
|
||||
|
||||
abstract fun getOrigin(file: VirtualFile): KtSymbolOrigin
|
||||
|
||||
enum class AnalysisMode {
|
||||
FULL,
|
||||
PARTIAL_WITH_DIAGNOSTICS,
|
||||
PARTIAL
|
||||
}
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSessionProvider
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityTokenFactory
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
|
||||
@InvalidWayOfUsingAnalysisSession
|
||||
class KtFe10AnalysisSessionProvider : KtAnalysisSessionProvider() {
|
||||
@InvalidWayOfUsingAnalysisSession
|
||||
override fun getAnalysisSession(contextElement: KtElement, factory: ValidityTokenFactory): KtAnalysisSession {
|
||||
return KtFe10AnalysisSession(contextElement, factory.create(contextElement.project))
|
||||
}
|
||||
|
||||
@InvalidWayOfUsingAnalysisSession
|
||||
override fun getAnalysisSessionBySymbol(contextSymbol: KtSymbol): KtAnalysisSession {
|
||||
if (contextSymbol is KtFe10Symbol) {
|
||||
return contextSymbol.analysisSession
|
||||
} else {
|
||||
val contextElement = contextSymbol.psi
|
||||
if (contextElement != null) {
|
||||
return KtFe10AnalysisSession(contextElement, contextSymbol.token)
|
||||
}
|
||||
}
|
||||
|
||||
throw IllegalArgumentException("Unsupported symbol kind: $contextSymbol")
|
||||
}
|
||||
|
||||
override fun clearCaches() {}
|
||||
}
|
||||
+194
@@ -0,0 +1,194 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.calls.*
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescFunctionSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescPropertyGetterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescPropertySetterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.callableId
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.diagnostics.KtNonBoundToPsiErrorDiagnostic
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.components.AbstractKtCallResolver
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtVariableLikeSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.idea.references.readWriteAccessWithFullExpressionWithPossibleResolve
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.findAssignment
|
||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.calls.model.VariableAsFunctionResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.calls.results.ResolutionStatus
|
||||
import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isAnnotationConstructor
|
||||
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
|
||||
|
||||
internal class KtFe10CallResolver(override val analysisSession: KtFe10AnalysisSession) : AbstractKtCallResolver() {
|
||||
private companion object {
|
||||
private const val UNRESOLVED_CALL_MESSAGE = "Unresolved call"
|
||||
}
|
||||
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun resolveAccessorCall(call: KtSimpleNameExpression): KtCall? {
|
||||
val bindingContext = analysisSession.analyze(call, KtFe10AnalysisSession.AnalysisMode.PARTIAL_WITH_DIAGNOSTICS)
|
||||
val resolvedCall = call.getResolvedCall(bindingContext) ?: return null
|
||||
val resultingDescriptor = resolvedCall.resultingDescriptor
|
||||
|
||||
if (resultingDescriptor is PropertyDescriptor) {
|
||||
@Suppress("DEPRECATION")
|
||||
val access = call.readWriteAccessWithFullExpressionWithPossibleResolve(
|
||||
readWriteAccessWithFullExpressionByResolve = { null }
|
||||
).first
|
||||
|
||||
val setterValue = findAssignment(call)?.right
|
||||
val accessorSymbol = when (resultingDescriptor) {
|
||||
is SyntheticJavaPropertyDescriptor -> {
|
||||
when {
|
||||
access.isWrite -> resultingDescriptor.setMethod?.let { KtFe10DescFunctionSymbol(it, analysisSession) }
|
||||
access.isRead -> KtFe10DescFunctionSymbol(resultingDescriptor.getMethod, analysisSession)
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
when {
|
||||
access.isWrite -> resultingDescriptor.setter?.let { KtFe10DescPropertySetterSymbol(it, analysisSession) }
|
||||
access.isRead -> resultingDescriptor.getter?.let { KtFe10DescPropertyGetterSymbol(it, analysisSession) }
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (accessorSymbol != null) {
|
||||
val target = when {
|
||||
!access.isWrite || setterValue != null -> KtSuccessCallTarget(accessorSymbol, token)
|
||||
else -> {
|
||||
val diagnostic = KtNonBoundToPsiErrorDiagnostic(factoryName = null, "Setter value is missing", token)
|
||||
KtErrorCallTarget(listOf(accessorSymbol), diagnostic, token)
|
||||
}
|
||||
}
|
||||
|
||||
val argumentMapping = LinkedHashMap<KtExpression, KtValueParameterSymbol>()
|
||||
if (access.isWrite && setterValue != null) {
|
||||
val setterParameterSymbol = accessorSymbol.valueParameters.single()
|
||||
argumentMapping[setterValue] = setterParameterSymbol
|
||||
}
|
||||
|
||||
return KtFunctionCall(argumentMapping, target, KtSubstitutor.Empty(token), token)
|
||||
}
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
override fun resolveCall(call: KtCallElement): KtCall? = withValidityAssertion {
|
||||
return resolveCall(call, isUsualCall = true)
|
||||
}
|
||||
|
||||
override fun resolveCall(call: KtBinaryExpression): KtCall? = withValidityAssertion {
|
||||
return resolveCall(call, isUsualCall = false)
|
||||
}
|
||||
|
||||
override fun resolveCall(call: KtUnaryExpression): KtCall? = withValidityAssertion {
|
||||
return resolveCall(call, isUsualCall = false)
|
||||
}
|
||||
|
||||
override fun resolveCall(call: KtArrayAccessExpression): KtCall? = withValidityAssertion {
|
||||
return resolveCall(call, isUsualCall = false)
|
||||
}
|
||||
|
||||
/**
|
||||
* Analyze the given call element (a function call, unary/binary operator call, or convention call).
|
||||
*
|
||||
* @param call the call element to analyze.
|
||||
* @param isUsualCall `true` if the call is a usual function call (`foo()` or `foo {}`).
|
||||
*/
|
||||
private fun resolveCall(call: KtElement, isUsualCall: Boolean): KtCall? {
|
||||
val bindingContext = analysisSession.analyze(call, KtFe10AnalysisSession.AnalysisMode.PARTIAL_WITH_DIAGNOSTICS)
|
||||
val resolvedCall = call.getResolvedCall(bindingContext) ?: return getUnresolvedCall(call)
|
||||
|
||||
val argumentMapping = createArgumentMapping(resolvedCall)
|
||||
|
||||
fun getTarget(targetSymbol: KtFunctionLikeSymbol): KtCallTarget {
|
||||
if (resolvedCall.status == ResolutionStatus.SUCCESS) {
|
||||
return KtSuccessCallTarget(targetSymbol, token)
|
||||
}
|
||||
|
||||
val diagnostic = KtNonBoundToPsiErrorDiagnostic(factoryName = null, UNRESOLVED_CALL_MESSAGE, token)
|
||||
return KtErrorCallTarget(listOf(targetSymbol), diagnostic, token)
|
||||
}
|
||||
|
||||
val targetDescriptor = resolvedCall.resultingDescriptor
|
||||
|
||||
val callableSymbol = targetDescriptor.toKtCallableSymbol(analysisSession) as? KtFunctionLikeSymbol ?: return null
|
||||
|
||||
if (resolvedCall is VariableAsFunctionResolvedCall) {
|
||||
val variableDescriptor = resolvedCall.variableCall.resultingDescriptor
|
||||
val variableSymbol = variableDescriptor.toKtCallableSymbol(analysisSession) as? KtVariableLikeSymbol ?: return null
|
||||
|
||||
val substitutor = KtSubstitutor.Empty(token)
|
||||
return if (resolvedCall.functionCall.resultingDescriptor.callableId in kotlinFunctionInvokeCallableIds) {
|
||||
KtFunctionalTypeVariableCall(variableSymbol, argumentMapping, getTarget(callableSymbol), substitutor, token)
|
||||
} else {
|
||||
KtVariableWithInvokeFunctionCall(variableSymbol, argumentMapping, getTarget(callableSymbol), substitutor, token)
|
||||
}
|
||||
}
|
||||
|
||||
if (call is KtConstructorDelegationCall) {
|
||||
return KtDelegatedConstructorCall(argumentMapping, getTarget(callableSymbol), call.kind, token)
|
||||
}
|
||||
|
||||
if (isUsualCall) {
|
||||
if (targetDescriptor.isAnnotationConstructor()) {
|
||||
return KtAnnotationCall(argumentMapping, getTarget(callableSymbol), token)
|
||||
}
|
||||
}
|
||||
|
||||
return KtFunctionCall(argumentMapping, getTarget(callableSymbol), KtSubstitutor.Empty(token), token)
|
||||
}
|
||||
|
||||
private fun getUnresolvedCall(call: KtElement): KtCall? {
|
||||
return when (call) {
|
||||
is KtSuperTypeCallEntry -> {
|
||||
val diagnostic = KtNonBoundToPsiErrorDiagnostic(factoryName = null, UNRESOLVED_CALL_MESSAGE, token)
|
||||
val target = KtErrorCallTarget(emptyList(), diagnostic, token)
|
||||
KtDelegatedConstructorCall(LinkedHashMap(), target, KtDelegatedConstructorCallKind.SUPER_CALL, token)
|
||||
}
|
||||
is KtConstructorDelegationCall -> {
|
||||
val diagnostic = KtNonBoundToPsiErrorDiagnostic(factoryName = null, UNRESOLVED_CALL_MESSAGE, token)
|
||||
val target = KtErrorCallTarget(emptyList(), diagnostic, token)
|
||||
return KtDelegatedConstructorCall(LinkedHashMap(), target, call.kind, token)
|
||||
}
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
private val KtConstructorDelegationCall.kind: KtDelegatedConstructorCallKind
|
||||
get() = when {
|
||||
isCallToThis -> KtDelegatedConstructorCallKind.THIS_CALL
|
||||
else -> KtDelegatedConstructorCallKind.SUPER_CALL
|
||||
}
|
||||
|
||||
private fun createArgumentMapping(resolvedCall: ResolvedCall<*>): LinkedHashMap<KtExpression, KtValueParameterSymbol> {
|
||||
val result = LinkedHashMap<KtExpression, KtValueParameterSymbol>()
|
||||
for ((parameter, arguments) in resolvedCall.valueArguments) {
|
||||
val parameterSymbol = KtFe10DescValueParameterSymbol(parameter, analysisSession)
|
||||
|
||||
for (argument in arguments.arguments) {
|
||||
val expression = argument.getArgumentExpression() ?: continue
|
||||
result[expression] = parameterSymbol
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtCompileTimeConstantProvider
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtConstantValue
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.psi.KtExpression
|
||||
import org.jetbrains.kotlin.resolve.DelegatingBindingTrace
|
||||
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator
|
||||
import org.jetbrains.kotlin.types.TypeUtils
|
||||
|
||||
internal class KtFe10CompileTimeConstantProvider(override val analysisSession: KtFe10AnalysisSession) : KtCompileTimeConstantProvider() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun evaluate(expression: KtExpression): KtConstantValue? {
|
||||
val resolveSession = analysisSession.resolveSession
|
||||
val evaluator = ConstantExpressionEvaluator(
|
||||
resolveSession.moduleDescriptor,
|
||||
resolveSession.languageVersionSettings,
|
||||
resolveSession.project
|
||||
)
|
||||
|
||||
val bindingContext = analysisSession.analyze(expression)
|
||||
val bindingTrace = DelegatingBindingTrace(bindingContext, "Binding trace for constant expression evaluation")
|
||||
return evaluator.evaluateToConstantValue(expression, bindingTrace, TypeUtils.NO_EXPECTED_TYPE)?.toKtConstantValue()
|
||||
}
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtCompletionCandidateChecker
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtExtensionApplicabilityResult
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.psi.KtExpression
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
|
||||
|
||||
internal class KtFe10CompletionCandidateChecker(override val analysisSession: KtFe10AnalysisSession) : KtCompletionCandidateChecker() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun checkExtensionFitsCandidate(
|
||||
firSymbolForCandidate: KtCallableSymbol,
|
||||
originalFile: KtFile,
|
||||
nameExpression: KtSimpleNameExpression,
|
||||
possibleExplicitReceiver: KtExpression?
|
||||
): KtExtensionApplicabilityResult = withValidityAssertion {
|
||||
throw NotImplementedError("Method is not implemented for FE 1.0")
|
||||
}
|
||||
}
|
||||
+73
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import com.intellij.openapi.util.TextRange
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtDiagnosticCheckerFilter
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtDiagnosticProvider
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession.AnalysisMode
|
||||
import org.jetbrains.kotlin.analysis.api.diagnostics.KtDiagnosticWithPsi
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory
|
||||
import org.jetbrains.kotlin.diagnostics.Severity
|
||||
import org.jetbrains.kotlin.diagnostics.UnboundDiagnostic
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
internal class KtFe10DiagnosticProvider(override val analysisSession: KtFe10AnalysisSession) : KtDiagnosticProvider() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun getDiagnosticsForElement(element: KtElement, filter: KtDiagnosticCheckerFilter): Collection<KtDiagnosticWithPsi<*>> {
|
||||
withValidityAssertion {
|
||||
val bindingContext = analysisSession.analyze(element, AnalysisMode.PARTIAL_WITH_DIAGNOSTICS)
|
||||
val diagnostics = bindingContext.diagnostics.forElement(element)
|
||||
return diagnostics.map { KtFe10Diagnostic(it, token) }
|
||||
}
|
||||
}
|
||||
|
||||
override fun collectDiagnosticsForFile(ktFile: KtFile, filter: KtDiagnosticCheckerFilter): Collection<KtDiagnosticWithPsi<*>> {
|
||||
withValidityAssertion {
|
||||
val bindingContext = analysisSession.analyze(ktFile)
|
||||
val result = mutableListOf<KtDiagnosticWithPsi<*>>()
|
||||
for (diagnostic in bindingContext.diagnostics) {
|
||||
if (diagnostic.psiFile == ktFile) {
|
||||
result += KtFe10Diagnostic(diagnostic, token)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class KtFe10Diagnostic(private val diagnostic: Diagnostic, override val token: ValidityToken) : KtDiagnosticWithPsi<PsiElement> {
|
||||
override val severity: Severity
|
||||
get() = diagnostic.severity
|
||||
|
||||
override val factoryName: String
|
||||
get() = diagnostic.factory.name
|
||||
|
||||
override val defaultMessage: String
|
||||
get() {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
val factory = diagnostic.factory as DiagnosticFactory<UnboundDiagnostic>?
|
||||
return factory?.defaultRenderer?.render(diagnostic) ?: ""
|
||||
}
|
||||
|
||||
override val psi: PsiElement
|
||||
get() = diagnostic.psiElement
|
||||
|
||||
override val textRanges: Collection<TextRange>
|
||||
get() = diagnostic.textRanges
|
||||
|
||||
override val diagnosticClass: KClass<out KtDiagnosticWithPsi<PsiElement>>
|
||||
get() = KtFe10Diagnostic::class
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtExpressionInfoProvider
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession.AnalysisMode
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.cfg.WhenChecker
|
||||
import org.jetbrains.kotlin.diagnostics.WhenMissingCase
|
||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||
import org.jetbrains.kotlin.psi.KtReturnExpression
|
||||
import org.jetbrains.kotlin.psi.KtWhenExpression
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10ExpressionInfoProvider(override val analysisSession: KtFe10AnalysisSession) : KtExpressionInfoProvider() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun getReturnExpressionTargetSymbol(returnExpression: KtReturnExpression): KtCallableSymbol? = withValidityAssertion {
|
||||
val bindingContext = analysisSession.analyze(returnExpression, AnalysisMode.PARTIAL)
|
||||
val targetLabel = returnExpression.getTargetLabel() ?: return null
|
||||
val labelTarget = bindingContext[BindingContext.LABEL_TARGET, targetLabel] as? KtDeclaration ?: return null
|
||||
return with(analysisSession) { labelTarget.getSymbol() as? KtCallableSymbol }
|
||||
}
|
||||
|
||||
override fun getWhenMissingCases(whenExpression: KtWhenExpression): List<WhenMissingCase> = withValidityAssertion {
|
||||
val bindingContext = analysisSession.analyze(whenExpression)
|
||||
return WhenChecker.getMissingCases(whenExpression, bindingContext)
|
||||
}
|
||||
}
|
||||
+231
@@ -0,0 +1,231 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtExpressionTypeProvider
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession.AnalysisMode
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.diagnostics.Errors
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypes
|
||||
import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration
|
||||
import org.jetbrains.kotlin.psi.psiUtil.unwrapParenthesesLabelsAndAnnotations
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.returnTypeOrNothing
|
||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.MultipleSmartCasts
|
||||
import org.jetbrains.kotlin.resolve.calls.util.getParameterForArgument
|
||||
import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.calls.util.getType
|
||||
import org.jetbrains.kotlin.resolve.sam.SamConstructorDescriptor
|
||||
import org.jetbrains.kotlin.resolve.sam.getFunctionTypeForAbstractMethod
|
||||
import org.jetbrains.kotlin.types.ErrorUtils
|
||||
import org.jetbrains.kotlin.types.TypeUtils
|
||||
import org.jetbrains.kotlin.types.isError
|
||||
import org.jetbrains.kotlin.types.typeUtil.makeNullable
|
||||
|
||||
class KtFe10ExpressionTypeProvider(override val analysisSession: KtFe10AnalysisSession) : KtExpressionTypeProvider() {
|
||||
private companion object {
|
||||
val NON_EXPRESSION_CONTAINERS = arrayOf(
|
||||
KtImportDirective::class.java,
|
||||
KtTypeReference::class.java,
|
||||
KtPackageDirective::class.java,
|
||||
KtLabelReferenceExpression::class.java
|
||||
)
|
||||
}
|
||||
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
private val builtIns: KotlinBuiltIns
|
||||
get() = analysisSession.resolveSession.moduleDescriptor.builtIns
|
||||
|
||||
override fun getKtExpressionType(expression: KtExpression): KtType? = withValidityAssertion {
|
||||
// Not sure if it's safe enough. In theory, some annotations on expressions might change its type
|
||||
val unwrapped = expression.unwrapParenthesesLabelsAndAnnotations() as? KtExpression ?: return null
|
||||
if (unwrapped.getParentOfTypes(false, *NON_EXPRESSION_CONTAINERS) != null) {
|
||||
return null
|
||||
}
|
||||
|
||||
val bindingContext = analysisSession.analyze(unwrapped, AnalysisMode.PARTIAL)
|
||||
val kotlinType = expression.getType(bindingContext) ?: builtIns.unitType
|
||||
return kotlinType.toKtType(analysisSession)
|
||||
}
|
||||
|
||||
override fun getReturnTypeForKtDeclaration(declaration: KtDeclaration): KtType = withValidityAssertion {
|
||||
// Handle callable declarations with explicit return type first
|
||||
if (declaration is KtCallableDeclaration) {
|
||||
val typeReference = declaration.typeReference
|
||||
|
||||
if (typeReference != null) {
|
||||
val bindingContext = analysisSession.analyze(typeReference, AnalysisMode.PARTIAL)
|
||||
val kotlinType = bindingContext[BindingContext.TYPE, typeReference]
|
||||
?: ErrorUtils.createErrorType("Return type \"${typeReference.text}\" cannot be resolved")
|
||||
|
||||
return kotlinType.toKtType(analysisSession)
|
||||
}
|
||||
}
|
||||
|
||||
if (declaration is KtFunction && declaration !is KtConstructor<*> && declaration.equalsToken != null) {
|
||||
val bindingContext = analysisSession.analyze(declaration)
|
||||
val kotlinType = bindingContext[BindingContext.FUNCTION, declaration]?.returnType
|
||||
?: ErrorUtils.createErrorType("Implicit return type for function \"${declaration.name}\" cannot be resolved")
|
||||
|
||||
return kotlinType.toKtType(analysisSession)
|
||||
}
|
||||
|
||||
if (declaration is KtProperty) {
|
||||
val bindingContext = analysisSession.analyze(declaration)
|
||||
val kotlinType = bindingContext[BindingContext.VARIABLE, declaration]?.returnType
|
||||
?: ErrorUtils.createErrorType("Implicit return type for property \"${declaration.name}\" cannot be resolved")
|
||||
|
||||
return kotlinType.toKtType(analysisSession)
|
||||
}
|
||||
|
||||
if (declaration is KtPropertyAccessor) {
|
||||
val bindingContext = analysisSession.analyze(declaration)
|
||||
val kotlinType = bindingContext[BindingContext.PROPERTY_ACCESSOR, declaration]?.returnType
|
||||
?: ErrorUtils.createErrorType("Return type for property accessor \"${declaration.property.name}\" cannot be resolved")
|
||||
|
||||
return kotlinType.toKtType(analysisSession)
|
||||
}
|
||||
|
||||
return builtIns.unitType.toKtType(analysisSession)
|
||||
}
|
||||
|
||||
override fun getFunctionalTypeForKtFunction(declaration: KtFunction): KtType = withValidityAssertion {
|
||||
val analysisMode = if (declaration.hasDeclaredReturnType()) AnalysisMode.PARTIAL else AnalysisMode.FULL
|
||||
val bindingContext = analysisSession.analyze(declaration, analysisMode)
|
||||
val functionDescriptor = bindingContext[BindingContext.FUNCTION, declaration]
|
||||
|
||||
if (functionDescriptor != null) {
|
||||
return getFunctionTypeForAbstractMethod(functionDescriptor, false).toKtType(analysisSession)
|
||||
}
|
||||
|
||||
val parameterCount = declaration.valueParameters.size + (if (declaration.isExtensionDeclaration()) 1 else 0)
|
||||
|
||||
val function = when {
|
||||
declaration.hasModifier(KtTokens.SUSPEND_KEYWORD) -> builtIns.getSuspendFunction(parameterCount)
|
||||
else -> builtIns.getFunction(parameterCount)
|
||||
}
|
||||
|
||||
val errorMessage = "Descriptor not found for function \"${declaration.name}\""
|
||||
return ErrorUtils.createErrorTypeWithCustomConstructor(errorMessage, function.typeConstructor).toKtType(analysisSession)
|
||||
}
|
||||
|
||||
override fun getExpectedType(expression: PsiElement): KtType? = withValidityAssertion {
|
||||
val ktExpression = expression.getParentOfType<KtExpression>(false) ?: return null
|
||||
val parentExpression = ktExpression.parent
|
||||
|
||||
// Unwrap specific expressions
|
||||
when (ktExpression) {
|
||||
is KtNameReferenceExpression -> {
|
||||
if (parentExpression is KtDotQualifiedExpression && parentExpression.selectorExpression == ktExpression) {
|
||||
return getExpectedType(parentExpression)
|
||||
}
|
||||
}
|
||||
is KtFunctionLiteral -> {
|
||||
return getExpectedType(ktExpression.parent)
|
||||
}
|
||||
}
|
||||
|
||||
if (parentExpression is KtCallableDeclaration) {
|
||||
if (expression is KtBlockExpression) {
|
||||
return null
|
||||
}
|
||||
|
||||
val bindingContext = analysisSession.analyze(parentExpression)
|
||||
val descriptor = bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, parentExpression]
|
||||
if (descriptor is CallableDescriptor) {
|
||||
return descriptor.returnType?.takeIf { !it.isError }?.toKtType(analysisSession)
|
||||
}
|
||||
} else if (parentExpression is KtBinaryExpressionWithTypeRHS && KtPsiUtil.isCast(parentExpression)) {
|
||||
val typeReference = parentExpression.right
|
||||
if (typeReference != null) {
|
||||
val bindingContext = analysisSession.analyze(typeReference)
|
||||
var kotlinType = bindingContext[BindingContext.TYPE, typeReference]
|
||||
if (kotlinType != null && KtPsiUtil.isSafeCast(parentExpression)) {
|
||||
kotlinType = kotlinType.makeNullable()
|
||||
}
|
||||
return kotlinType?.toKtType(analysisSession)
|
||||
}
|
||||
} else if (parentExpression is KtValueArgument) {
|
||||
val callExpression = getContainingCallExpression(parentExpression)
|
||||
if (callExpression != null) {
|
||||
val bindingContext = analysisSession.analyze(callExpression)
|
||||
val resolvedCall = callExpression.getResolvedCall(bindingContext)
|
||||
if (resolvedCall != null) {
|
||||
val parameterDescriptor = resolvedCall.getParameterForArgument(parentExpression)?.original
|
||||
if (parameterDescriptor != null) {
|
||||
val kotlinType = when (val originalCallableDescriptor = parameterDescriptor.containingDeclaration) {
|
||||
is SamConstructorDescriptor -> originalCallableDescriptor.returnTypeOrNothing
|
||||
else -> parameterDescriptor.type
|
||||
}
|
||||
return kotlinType.takeIf { !it.isError }?.toKtType(analysisSession)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val bindingContext = analysisSession.analyze(ktExpression)
|
||||
val kotlinType = bindingContext[BindingContext.EXPECTED_EXPRESSION_TYPE, ktExpression]
|
||||
return kotlinType?.takeIf { !it.isError }?.toKtType(analysisSession)
|
||||
}
|
||||
|
||||
private fun getContainingCallExpression(argument: KtValueArgument): KtCallExpression? {
|
||||
return when (val parent = argument.parent) {
|
||||
is KtCallExpression -> parent
|
||||
is KtValueArgumentList -> parent.parent as? KtCallExpression
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
override fun isDefinitelyNull(expression: KtExpression): Boolean = withValidityAssertion {
|
||||
val unwrapped = expression.unwrapParenthesesLabelsAndAnnotations() as? KtElement ?: return false
|
||||
val bindingContext = analysisSession.analyze(expression, AnalysisMode.PARTIAL)
|
||||
|
||||
if (bindingContext[BindingContext.SMARTCAST_NULL, expression] == true) {
|
||||
return true
|
||||
}
|
||||
|
||||
for (diagnostic in bindingContext.diagnostics.forElement(unwrapped)) {
|
||||
if (diagnostic.factory == Errors.ALWAYS_NULL) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
override fun isDefinitelyNotNull(expression: KtExpression): Boolean = withValidityAssertion {
|
||||
val ktExpression = expression as? KtExpression ?: return false
|
||||
val bindingContext = analysisSession.analyze(ktExpression)
|
||||
|
||||
val smartCasts = bindingContext[BindingContext.SMARTCAST, ktExpression]
|
||||
|
||||
if (smartCasts is MultipleSmartCasts) {
|
||||
if (smartCasts.map.values.all { !it.isMarkedNullable }) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
val smartCastType = smartCasts?.defaultType
|
||||
if (smartCastType != null && !smartCastType.isMarkedNullable) {
|
||||
return true
|
||||
}
|
||||
|
||||
val expressionType = expression.getType(bindingContext) ?: return false
|
||||
return !TypeUtils.isNullableType(expressionType)
|
||||
}
|
||||
}
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtImportOptimizer
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtImportOptimizerResult
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.psi.KtImportDirective
|
||||
|
||||
internal class KtFe10ImportOptimizer(private val analysisSession: KtFe10AnalysisSession) : KtImportOptimizer() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun analyseImports(file: KtFile): KtImportOptimizerResult = withValidityAssertion {
|
||||
val (allUnderImports, otherImports) = file.importDirectives.partition { it.isAllUnder }
|
||||
|
||||
val unusedImports = LinkedHashSet<KtImportDirective>()
|
||||
val importedPackages = HashSet<FqName>()
|
||||
|
||||
for (import in allUnderImports) {
|
||||
val fqName = import.importedFqName ?: continue
|
||||
if (!importedPackages.add(fqName)) {
|
||||
unusedImports += import
|
||||
}
|
||||
}
|
||||
|
||||
for (import in otherImports) {
|
||||
val fqName = import.importedFqName ?: continue
|
||||
if (import.alias == null && fqName.parent() in importedPackages) {
|
||||
unusedImports += import
|
||||
}
|
||||
}
|
||||
|
||||
return KtImportOptimizerResult(unusedImports)
|
||||
}
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtInheritorsProvider
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescEnumEntrySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtClassifierSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.config.LanguageFeature
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
|
||||
internal class KtFe10InheritorsProvider(override val analysisSession: KtFe10AnalysisSession) : KtInheritorsProvider() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun getInheritorsOfSealedClass(classSymbol: KtNamedClassOrObjectSymbol): List<KtNamedClassOrObjectSymbol> {
|
||||
val classDescriptor = getSymbolDescriptor(classSymbol) as? ClassDescriptor ?: return emptyList()
|
||||
|
||||
val inheritorsProvider = analysisSession.resolveSession.sealedClassInheritorsProvider
|
||||
val allowInDifferentFiles = analysisSession.resolveSession.languageVersionSettings
|
||||
.supportsFeature(LanguageFeature.AllowSealedInheritorsInDifferentFilesOfSamePackage)
|
||||
|
||||
return inheritorsProvider.computeSealedSubclasses(classDescriptor, allowInDifferentFiles)
|
||||
.mapNotNull { it.toKtClassifierSymbol(analysisSession) as? KtNamedClassOrObjectSymbol }
|
||||
}
|
||||
|
||||
override fun getEnumEntries(classSymbol: KtNamedClassOrObjectSymbol): List<KtEnumEntrySymbol> = withValidityAssertion {
|
||||
val enumDescriptor = getSymbolDescriptor(classSymbol) as? ClassDescriptor ?: return emptyList()
|
||||
if (enumDescriptor.kind != ClassKind.ENUM_CLASS) {
|
||||
return emptyList()
|
||||
}
|
||||
|
||||
val result = mutableListOf<KtEnumEntrySymbol>()
|
||||
|
||||
for (entryDescriptor in enumDescriptor.unsubstitutedMemberScope.getContributedDescriptors()) {
|
||||
if (entryDescriptor is ClassDescriptor && entryDescriptor.kind == ClassKind.ENUM_ENTRY) {
|
||||
result += KtFe10DescEnumEntrySymbol(entryDescriptor, analysisSession)
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtJvmTypeMapper
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.KtFe10JvmTypeMapperContext
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.load.kotlin.TypeMappingMode
|
||||
import org.jetbrains.org.objectweb.asm.Type
|
||||
|
||||
internal class KtFe10JvmTypeMapper(override val analysisSession: KtFe10AnalysisSession) : KtJvmTypeMapper() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
private val typeMapper by lazy { KtFe10JvmTypeMapperContext(analysisSession.resolveSession) }
|
||||
|
||||
override fun mapTypeToJvmType(type: KtType, mode: TypeMappingMode): Type = withValidityAssertion {
|
||||
val kotlinType = (type as KtFe10Type).type
|
||||
return typeMapper.mapType(kotlinType, mode)
|
||||
}
|
||||
}
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtOverrideInfoProvider
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtClassifierSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||
import org.jetbrains.kotlin.resolve.findOriginalTopMostOverriddenDescriptors
|
||||
import org.jetbrains.kotlin.util.ImplementationStatus
|
||||
|
||||
internal class KtFe10OverrideInfoProvider(override val analysisSession: KtFe10AnalysisSession) : KtOverrideInfoProvider() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun isVisible(memberSymbol: KtCallableSymbol, classSymbol: KtClassOrObjectSymbol): Boolean = withValidityAssertion {
|
||||
val memberDescriptor = getSymbolDescriptor(memberSymbol) as? DeclarationDescriptorWithVisibility ?: return false
|
||||
val classDescriptor = getSymbolDescriptor(classSymbol) ?: return false
|
||||
return DescriptorVisibilities.isVisibleWithAnyReceiver(memberDescriptor, classDescriptor)
|
||||
}
|
||||
|
||||
override fun getImplementationStatus(
|
||||
memberSymbol: KtCallableSymbol,
|
||||
parentClassSymbol: KtClassOrObjectSymbol
|
||||
): ImplementationStatus? = withValidityAssertion {
|
||||
throw NotImplementedError("Method is not implemented for FE 1.0")
|
||||
}
|
||||
|
||||
override fun getOriginalOverriddenSymbol(symbol: KtCallableSymbol): KtCallableSymbol? = withValidityAssertion {
|
||||
val callableDescriptor = getSymbolDescriptor(symbol) as? CallableMemberDescriptor ?: return null
|
||||
val originalCallableDescriptor = callableDescriptor.findOriginalTopMostOverriddenDescriptors().firstOrNull() ?: return null
|
||||
return originalCallableDescriptor.toKtCallableSymbol(analysisSession)
|
||||
}
|
||||
|
||||
override fun getOriginalContainingClassForOverride(symbol: KtCallableSymbol): KtClassOrObjectSymbol? = withValidityAssertion {
|
||||
val callableDescriptor = getSymbolDescriptor(symbol) as? CallableMemberDescriptor ?: return null
|
||||
val originalCallableDescriptor = callableDescriptor.findOriginalTopMostOverriddenDescriptors().firstOrNull() ?: return null
|
||||
val containingClassDescriptor = originalCallableDescriptor.containingDeclaration as? ClassDescriptor ?: return null
|
||||
return containingClassDescriptor.toKtClassifierSymbol(analysisSession) as? KtClassOrObjectSymbol
|
||||
}
|
||||
}
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiType
|
||||
import com.intellij.psi.impl.cache.TypeInfo
|
||||
import com.intellij.psi.impl.compiled.ClsTypeElementImpl
|
||||
import com.intellij.psi.impl.compiled.SignatureParsing
|
||||
import com.intellij.psi.impl.compiled.StubBuildingVisitor
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtPsiTypeProvider
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.KtFe10JvmTypeMapperContext
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter
|
||||
import org.jetbrains.kotlin.load.kotlin.TypeMappingMode
|
||||
import org.jetbrains.kotlin.name.SpecialNames
|
||||
import org.jetbrains.kotlin.types.*
|
||||
import java.text.StringCharacterIterator
|
||||
|
||||
internal class KtFe10PsiTypeProvider(override val analysisSession: KtFe10AnalysisSession) : KtPsiTypeProvider() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
private val typeMapper by lazy { KtFe10JvmTypeMapperContext(analysisSession.resolveSession) }
|
||||
|
||||
override fun asPsiType(type: KtType, context: PsiElement, mode: TypeMappingMode): PsiType? = withValidityAssertion {
|
||||
val kotlinType = (type as KtFe10Type).type
|
||||
|
||||
if (kotlinType.isError || kotlinType.arguments.any { !it.isStarProjection && it.type.isError }) {
|
||||
return null
|
||||
}
|
||||
|
||||
return asPsiType(simplifyType(kotlinType), context, mode)
|
||||
}
|
||||
|
||||
private fun simplifyType(type: UnwrappedType): KotlinType {
|
||||
var result = type
|
||||
do {
|
||||
val oldResult = result
|
||||
result = when (type) {
|
||||
is FlexibleType -> type.upperBound
|
||||
is DefinitelyNotNullType -> type.original
|
||||
else -> type
|
||||
}
|
||||
} while (result !== oldResult)
|
||||
return result
|
||||
}
|
||||
|
||||
private fun asPsiType(type: KotlinType, context: PsiElement, mode: TypeMappingMode): PsiType? {
|
||||
val signatureWriter = BothSignatureWriter(BothSignatureWriter.Mode.SKIP_CHECKS)
|
||||
typeMapper.mapType(type, mode, signatureWriter)
|
||||
|
||||
val canonicalSignature = signatureWriter.toString()
|
||||
require(!canonicalSignature.contains(SpecialNames.ANONYMOUS_STRING))
|
||||
|
||||
if (canonicalSignature.contains("L<error>")) {
|
||||
return null
|
||||
}
|
||||
|
||||
val signature = StringCharacterIterator(canonicalSignature)
|
||||
val javaType = SignatureParsing.parseTypeString(signature, StubBuildingVisitor.GUESSING_MAPPER)
|
||||
val typeInfo = TypeInfo.fromString(javaType, false)
|
||||
val typeText = TypeInfo.createTypeText(typeInfo) ?: return null
|
||||
|
||||
val typeElement = ClsTypeElementImpl(context, typeText, '\u0000')
|
||||
return typeElement.type
|
||||
}
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import com.intellij.openapi.util.TextRange
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtReferenceShortener
|
||||
import org.jetbrains.kotlin.analysis.api.components.ShortenCommand
|
||||
import org.jetbrains.kotlin.analysis.api.components.ShortenOption
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
|
||||
internal class KtFe10ReferenceShortener(override val analysisSession: KtFe10AnalysisSession) : KtReferenceShortener() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun collectShortenings(
|
||||
file: KtFile,
|
||||
selection: TextRange,
|
||||
classShortenOption: (KtClassLikeSymbol) -> ShortenOption,
|
||||
callableShortenOption: (KtCallableSymbol) -> ShortenOption
|
||||
): ShortenCommand {
|
||||
// Compiler implementation does nothing.
|
||||
// Descriptor-based shortening is implemented on the IDE plugin side.
|
||||
return object : ShortenCommand {
|
||||
override val isEmpty: Boolean
|
||||
get() = true
|
||||
|
||||
override fun invokeShortening() {}
|
||||
}
|
||||
}
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtSamResolver
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescSamConstructorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSamConstructorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.load.java.sam.JvmSamConversionOracle
|
||||
import org.jetbrains.kotlin.resolve.sam.createSamConstructorFunction
|
||||
import org.jetbrains.kotlin.resolve.sam.getSingleAbstractMethodOrNull
|
||||
|
||||
internal class KtFe10SamResolver(override val analysisSession: KtFe10AnalysisSession) : KtSamResolver() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun getSamConstructor(ktClassLikeSymbol: KtClassLikeSymbol): KtSamConstructorSymbol? = withValidityAssertion {
|
||||
val descriptor = getSymbolDescriptor(ktClassLikeSymbol)
|
||||
if (descriptor is ClassDescriptor && getSingleAbstractMethodOrNull(descriptor) != null) {
|
||||
val constructorDescriptor = createSamConstructorFunction(
|
||||
descriptor.containingDeclaration,
|
||||
descriptor,
|
||||
analysisSession.resolveSession.samConversionResolver,
|
||||
JvmSamConversionOracle(analysisSession.resolveSession.languageVersionSettings)
|
||||
)
|
||||
|
||||
return KtFe10DescSamConstructorSymbol(constructorDescriptor, analysisSession)
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
}
|
||||
+150
@@ -0,0 +1,150 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import com.intellij.openapi.diagnostic.Logger
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtImplicitReceiver
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtScopeContext
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtScopeProvider
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.scopes.*
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.KtFe10FileSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.KtFe10PackageSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.KtFe10DescSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.getResolutionScope
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.scopes.SimpleKtCompositeScope
|
||||
import org.jetbrains.kotlin.analysis.api.scopes.*
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithDeclarations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.packageFragments
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.resolve.scopes.ChainedMemberScope
|
||||
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
|
||||
import org.jetbrains.kotlin.resolve.scopes.utils.getImplicitReceiversHierarchy
|
||||
import org.jetbrains.kotlin.util.containingNonLocalDeclaration
|
||||
|
||||
internal class KtFe10ScopeProvider(override val analysisSession: KtFe10AnalysisSession) : KtScopeProvider() {
|
||||
private companion object {
|
||||
val LOG = Logger.getInstance(KtFe10ScopeProvider::class.java)
|
||||
}
|
||||
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun getMemberScope(classSymbol: KtSymbolWithMembers): KtMemberScope = withValidityAssertion {
|
||||
val descriptor = getDescriptor<ClassDescriptor>(classSymbol)
|
||||
?: return object : KtFe10EmptyScope(token), KtMemberScope {
|
||||
override val owner get() = classSymbol
|
||||
}
|
||||
|
||||
// TODO either this or declared scope should return a different set of members
|
||||
return object : KtFe10ScopeMember(descriptor.unsubstitutedMemberScope, analysisSession), KtMemberScope {
|
||||
override val owner get() = classSymbol
|
||||
}
|
||||
}
|
||||
|
||||
override fun getDeclaredMemberScope(classSymbol: KtSymbolWithMembers): KtDeclaredMemberScope = withValidityAssertion {
|
||||
val descriptor = getDescriptor<ClassDescriptor>(classSymbol)
|
||||
?: return object : KtFe10EmptyScope(token), KtDeclaredMemberScope {
|
||||
override val owner get() = classSymbol
|
||||
}
|
||||
|
||||
return object : KtFe10ScopeMember(descriptor.unsubstitutedMemberScope, analysisSession), KtDeclaredMemberScope {
|
||||
override val owner get() = classSymbol
|
||||
}
|
||||
}
|
||||
|
||||
override fun getStaticMemberScope(symbol: KtSymbolWithMembers): KtScope = withValidityAssertion {
|
||||
val descriptor = getDescriptor<ClassDescriptor>(symbol) ?: return KtFe10EmptyScope(token)
|
||||
return KtFe10ScopeMember(descriptor.staticScope, analysisSession)
|
||||
}
|
||||
|
||||
override fun getFileScope(fileSymbol: KtFileSymbol): KtDeclarationScope<KtSymbolWithDeclarations> = withValidityAssertion {
|
||||
require(fileSymbol is KtFe10FileSymbol)
|
||||
val scope = analysisSession.resolveSession.fileScopeProvider.getFileResolutionScope(fileSymbol.psi)
|
||||
|
||||
return object : KtFe10ScopeLexical(scope, analysisSession), KtDeclarationScope<KtSymbolWithDeclarations> {
|
||||
override val owner: KtSymbolWithDeclarations
|
||||
get() = withValidityAssertion { fileSymbol }
|
||||
}
|
||||
}
|
||||
|
||||
override fun getPackageScope(packageSymbol: KtPackageSymbol): KtPackageScope = withValidityAssertion {
|
||||
require(packageSymbol is KtFe10PackageSymbol)
|
||||
val packageFragments = analysisSession.resolveSession.packageFragmentProvider.packageFragments(packageSymbol.fqName)
|
||||
val scopeDescription = "Compound scope for package \"${packageSymbol.fqName}\""
|
||||
val chainedScope = ChainedMemberScope.create(scopeDescription, packageFragments.map { it.getMemberScope() })
|
||||
return KtFe10PackageScope(chainedScope, packageSymbol, analysisSession)
|
||||
}
|
||||
|
||||
override fun getCompositeScope(subScopes: List<KtScope>): KtCompositeScope = withValidityAssertion {
|
||||
return SimpleKtCompositeScope(subScopes, token)
|
||||
}
|
||||
|
||||
override fun getTypeScope(type: KtType): KtScope = withValidityAssertion {
|
||||
require(type is KtFe10Type)
|
||||
return KtFe10ScopeMember(type.type.memberScope, analysisSession)
|
||||
}
|
||||
|
||||
override fun getScopeContextForPosition(originalFile: KtFile, positionInFakeFile: KtElement): KtScopeContext = withValidityAssertion {
|
||||
val elementToAnalyze = positionInFakeFile.containingNonLocalDeclaration() ?: originalFile
|
||||
val bindingContext = analysisSession.analyze(elementToAnalyze)
|
||||
|
||||
val lexicalScope = positionInFakeFile.getResolutionScope(bindingContext)
|
||||
if (lexicalScope != null) {
|
||||
val compositeScope = SimpleKtCompositeScope(listOf(KtFe10ScopeLexical(lexicalScope, analysisSession)), token)
|
||||
return KtScopeContext(compositeScope, collectImplicitReceivers(lexicalScope))
|
||||
}
|
||||
|
||||
val fileScope = analysisSession.resolveSession.fileScopeProvider.getFileResolutionScope(originalFile)
|
||||
val compositeScope = SimpleKtCompositeScope(listOf(KtFe10ScopeLexical(fileScope, analysisSession)), token)
|
||||
return KtScopeContext(compositeScope, collectImplicitReceivers(fileScope))
|
||||
}
|
||||
|
||||
private inline fun <reified T : DeclarationDescriptor> getDescriptor(symbol: KtSymbol): T? {
|
||||
return when (symbol) {
|
||||
is KtFe10DescSymbol<*> -> symbol.descriptor as? T
|
||||
is KtFe10PsiSymbol<*, *> -> symbol.descriptor as? T
|
||||
else -> {
|
||||
require(symbol is KtFe10Symbol) { "Unrecognized symbol implementation found" }
|
||||
null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun collectImplicitReceivers(scope: LexicalScope): MutableList<KtImplicitReceiver> {
|
||||
val result = mutableListOf<KtImplicitReceiver>()
|
||||
|
||||
for (implicitReceiver in scope.getImplicitReceiversHierarchy()) {
|
||||
val type = implicitReceiver.type.toKtType(analysisSession)
|
||||
val ownerDescriptor = implicitReceiver.containingDeclaration
|
||||
val owner = ownerDescriptor.toKtSymbol(analysisSession)
|
||||
|
||||
if (owner == null) {
|
||||
LOG.error("Unexpected implicit receiver owner: $ownerDescriptor (${ownerDescriptor.javaClass})")
|
||||
continue
|
||||
}
|
||||
|
||||
result += KtImplicitReceiver(token, type, owner)
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.ImplicitReceiverSmartCast
|
||||
import org.jetbrains.kotlin.analysis.api.ImplicitReceiverSmartcastKind
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtSmartCastProvider
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.psi.KtExpression
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.MultipleSmartCasts
|
||||
import org.jetbrains.kotlin.types.TypeIntersector
|
||||
|
||||
internal class KtFe10SmartCastProvider(override val analysisSession: KtFe10AnalysisSession) : KtSmartCastProvider() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun getSmartCastedToType(expression: KtExpression): KtType? {
|
||||
withValidityAssertion {
|
||||
val bindingContext = analysisSession.analyze(expression)
|
||||
val smartCasts = bindingContext[BindingContext.SMARTCAST, expression] ?: return null
|
||||
|
||||
if (smartCasts is MultipleSmartCasts) {
|
||||
return TypeIntersector.intersectTypes(smartCasts.map.values)?.toKtType(analysisSession)
|
||||
}
|
||||
|
||||
return smartCasts.defaultType?.toKtType(analysisSession)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getImplicitReceiverSmartCast(expression: KtExpression): Collection<ImplicitReceiverSmartCast> {
|
||||
withValidityAssertion {
|
||||
val bindingContext = analysisSession.analyze(expression)
|
||||
val smartCasts = bindingContext[BindingContext.IMPLICIT_RECEIVER_SMARTCAST, expression] ?: return emptyList()
|
||||
return smartCasts.receiverTypes.map { (_, type) ->
|
||||
val kind = ImplicitReceiverSmartcastKind.DISPATCH // TODO provide precise kind
|
||||
ImplicitReceiverSmartCast(type.toKtType(analysisSession), kind)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtSubtypingComponent
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
|
||||
internal class KtFe10SubtypingComponent(override val analysisSession: KtFe10AnalysisSession) : KtSubtypingComponent() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun isEqualTo(first: KtType, second: KtType): Boolean = withValidityAssertion {
|
||||
require(first is KtFe10Type)
|
||||
require(second is KtFe10Type)
|
||||
return analysisSession.resolveSession.kotlinTypeCheckerOfOwnerModule.equalTypes(first.type, second.type)
|
||||
}
|
||||
|
||||
override fun isSubTypeOf(subType: KtType, superType: KtType): Boolean = withValidityAssertion {
|
||||
require(subType is KtFe10Type)
|
||||
require(superType is KtFe10Type)
|
||||
val typeChecker = analysisSession.resolveSession.kotlinTypeCheckerOfOwnerModule
|
||||
return typeChecker.isSubtypeOf(subType.type, superType.type)
|
||||
}
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtSymbolContainingDeclarationProvider
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.KtFe10DescSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtBackingFieldSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithKind
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.cfg.getElementParentDeclaration
|
||||
|
||||
internal class KtFe10SymbolContainingDeclarationProvider(
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtSymbolContainingDeclarationProvider() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun getContainingDeclaration(symbol: KtSymbol): KtSymbolWithKind? {
|
||||
if (symbol is KtSymbolWithKind && symbol.symbolKind == KtSymbolKind.TOP_LEVEL) {
|
||||
return null
|
||||
}
|
||||
|
||||
return when (symbol) {
|
||||
is KtPackageSymbol -> null
|
||||
is KtBackingFieldSymbol -> symbol.owningProperty
|
||||
is KtFe10DescSymbol<*> -> symbol.descriptor.containingDeclaration?.toKtSymbol(analysisSession) as? KtSymbolWithKind
|
||||
is KtFe10PsiSymbol<*, *> -> {
|
||||
val parentDeclaration = symbol.psi.getElementParentDeclaration()
|
||||
if (parentDeclaration != null) {
|
||||
return with(analysisSession) {
|
||||
parentDeclaration.getSymbol() as? KtSymbolWithKind
|
||||
}
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtSymbolDeclarationOverridesProvider
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isSubclassOf
|
||||
|
||||
internal class KtFe10SymbolDeclarationOverridesProvider(
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtSymbolDeclarationOverridesProvider() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun <T : KtSymbol> getAllOverriddenSymbols(callableSymbol: T): List<KtCallableSymbol> {
|
||||
val descriptor = getSymbolDescriptor(callableSymbol) as? CallableMemberDescriptor ?: return emptyList()
|
||||
return getOverriddenDescriptors(descriptor, true).mapNotNull { it.toKtCallableSymbol(analysisSession) }
|
||||
}
|
||||
|
||||
override fun <T : KtSymbol> getDirectlyOverriddenSymbols(callableSymbol: T): List<KtCallableSymbol> {
|
||||
val descriptor = getSymbolDescriptor(callableSymbol) as? CallableMemberDescriptor ?: return emptyList()
|
||||
return getOverriddenDescriptors(descriptor, false).mapNotNull { it.toKtCallableSymbol(analysisSession) }
|
||||
}
|
||||
|
||||
private fun getOverriddenDescriptors(
|
||||
descriptor: CallableMemberDescriptor,
|
||||
collectAllOverrides: Boolean
|
||||
): Collection<CallableMemberDescriptor> {
|
||||
val overriddenDescriptors = LinkedHashSet<CallableMemberDescriptor>()
|
||||
val queue = ArrayDeque<CallableMemberDescriptor>().apply { addAll(descriptor.overriddenDescriptors) }
|
||||
|
||||
while (queue.isNotEmpty()) {
|
||||
val current = queue.removeFirst()
|
||||
|
||||
if (current.kind != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
|
||||
overriddenDescriptors.add(current)
|
||||
|
||||
if (!collectAllOverrides) {
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
val overriddenDescriptorsForCurrent = current.overriddenDescriptors
|
||||
for (overriddenDescriptor in overriddenDescriptorsForCurrent) {
|
||||
if (overriddenDescriptor.kind != CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
|
||||
overriddenDescriptors.add(overriddenDescriptor)
|
||||
}
|
||||
}
|
||||
queue.addAll(overriddenDescriptorsForCurrent)
|
||||
}
|
||||
|
||||
return overriddenDescriptors
|
||||
}
|
||||
|
||||
override fun isSubClassOf(subClass: KtClassOrObjectSymbol, superClass: KtClassOrObjectSymbol): Boolean = withValidityAssertion {
|
||||
val subClassDescriptor = getSymbolDescriptor(subClass) as? ClassDescriptor ?: return false
|
||||
val superClassDescriptor = getSymbolDescriptor(superClass) as? ClassDescriptor ?: return false
|
||||
return subClassDescriptor.isSubclassOf(superClassDescriptor)
|
||||
}
|
||||
|
||||
override fun isDirectSubClassOf(subClass: KtClassOrObjectSymbol, superClass: KtClassOrObjectSymbol): Boolean = withValidityAssertion {
|
||||
val subClassDescriptor = getSymbolDescriptor(subClass) as? ClassDescriptor ?: return false
|
||||
val superClassDescriptor = getSymbolDescriptor(superClass) as? ClassDescriptor ?: return false
|
||||
return subClassDescriptor.getSuperClassOrAny() == superClassDescriptor
|
||||
}
|
||||
|
||||
override fun getIntersectionOverriddenSymbols(symbol: KtCallableSymbol): Collection<KtCallableSymbol> = withValidityAssertion {
|
||||
throw NotImplementedError("Method is not implemented for FE 1.0")
|
||||
}
|
||||
}
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtSymbolDeclarationRendererProvider
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtTypeRendererOptions
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.render
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.KtFe10TypeRenderer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
|
||||
internal class KtFe10SymbolDeclarationRendererProvider(
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtSymbolDeclarationRendererProvider() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun render(symbol: KtSymbol, options: KtDeclarationRendererOptions): String {
|
||||
val descriptor = getSymbolDescriptor(symbol)
|
||||
if (descriptor != null) {
|
||||
return descriptor.render(analysisSession, options)
|
||||
}
|
||||
|
||||
// Rendering for unresolved symbols is not implemented
|
||||
return ""
|
||||
}
|
||||
|
||||
override fun render(type: KtType, options: KtTypeRendererOptions): String {
|
||||
require(type is KtFe10Type)
|
||||
val consumer = StringBuilder()
|
||||
KtFe10TypeRenderer(options).render(type.type, consumer)
|
||||
return consumer.toString()
|
||||
}
|
||||
}
|
||||
+87
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtSymbolInfoProvider
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.name.SpecialNames
|
||||
import org.jetbrains.kotlin.psi.KtProperty
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.deprecation.DeprecationInfo
|
||||
import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil
|
||||
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
|
||||
|
||||
internal class KtFe10SymbolInfoProvider(override val analysisSession: KtFe10AnalysisSession) : KtSymbolInfoProvider() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun getDeprecation(symbol: KtSymbol): DeprecationInfo? {
|
||||
val descriptor = getSymbolDescriptor(symbol) ?: return null
|
||||
ForceResolveUtil.forceResolveAllContents(descriptor)
|
||||
return analysisSession.deprecationResolver.getDeprecations(descriptor).firstOrNull()
|
||||
}
|
||||
|
||||
override fun getDeprecation(symbol: KtSymbol, annotationUseSiteTarget: AnnotationUseSiteTarget?): DeprecationInfo? {
|
||||
return getDeprecation(symbol) // TODO
|
||||
}
|
||||
|
||||
override fun getGetterDeprecation(symbol: KtPropertySymbol): DeprecationInfo? {
|
||||
val getter = symbol.getter ?: return null
|
||||
val accessorDescriptor = getSymbolDescriptor(getter) as? PropertyAccessorDescriptor ?: return null
|
||||
ForceResolveUtil.forceResolveAllContents(accessorDescriptor.correspondingProperty)
|
||||
return analysisSession.deprecationResolver.getDeprecations(accessorDescriptor).firstOrNull()
|
||||
}
|
||||
|
||||
override fun getSetterDeprecation(symbol: KtPropertySymbol): DeprecationInfo? {
|
||||
val getter = symbol.setter ?: return null
|
||||
val accessorDescriptor = getSymbolDescriptor(getter) as? PropertyAccessorDescriptor ?: return null
|
||||
ForceResolveUtil.forceResolveAllContents(accessorDescriptor.correspondingProperty)
|
||||
return analysisSession.deprecationResolver.getDeprecations(accessorDescriptor).firstOrNull()
|
||||
}
|
||||
|
||||
override fun getJavaGetterName(symbol: KtPropertySymbol): Name {
|
||||
val descriptor = getSymbolDescriptor(symbol) as? PropertyDescriptor
|
||||
if (descriptor is SyntheticJavaPropertyDescriptor) {
|
||||
return descriptor.getMethod.name
|
||||
}
|
||||
|
||||
if (descriptor != null) {
|
||||
val getter = descriptor.getter ?: return SpecialNames.NO_NAME_PROVIDED
|
||||
return Name.identifier(DescriptorUtils.getJvmName(getter) ?: JvmAbi.getterName(descriptor.name.asString()))
|
||||
}
|
||||
|
||||
val ktPropertyName = (symbol.psi as? KtProperty)?.name ?: return SpecialNames.NO_NAME_PROVIDED
|
||||
return Name.identifier(JvmAbi.getterName(ktPropertyName))
|
||||
}
|
||||
|
||||
override fun getJavaSetterName(symbol: KtPropertySymbol): Name? {
|
||||
val descriptor = getSymbolDescriptor(symbol) as? PropertyDescriptor
|
||||
if (descriptor is SyntheticJavaPropertyDescriptor) {
|
||||
return descriptor.setMethod?.name
|
||||
}
|
||||
|
||||
if (descriptor != null) {
|
||||
if (!descriptor.isVar) {
|
||||
return null
|
||||
}
|
||||
|
||||
val setter = descriptor.setter ?: return SpecialNames.NO_NAME_PROVIDED
|
||||
return Name.identifier(DescriptorUtils.getJvmName(setter) ?: JvmAbi.getterName(descriptor.name.asString()))
|
||||
}
|
||||
|
||||
val ktPropertyName = (symbol.psi as? KtProperty)?.takeIf { it.isVar }?.name ?: return SpecialNames.NO_NAME_PROVIDED
|
||||
return Name.identifier(JvmAbi.setterName(ktPropertyName))
|
||||
}
|
||||
}
|
||||
+123
@@ -0,0 +1,123 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.KtFe10FileSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.KtFe10PackageSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtClassSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.*
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.*
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||
|
||||
internal class KtFe10SymbolProvider(override val analysisSession: KtFe10AnalysisSession) : KtSymbolProvider() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override val ROOT_PACKAGE_SYMBOL: KtPackageSymbol
|
||||
get() = KtFe10PackageSymbol(FqName.ROOT, analysisSession)
|
||||
|
||||
override fun getFileSymbol(psi: KtFile): KtFileSymbol = withValidityAssertion {
|
||||
return KtFe10FileSymbol(psi, analysisSession)
|
||||
}
|
||||
|
||||
override fun getParameterSymbol(psi: KtParameter): KtValueParameterSymbol = withValidityAssertion {
|
||||
return KtFe10PsiValueParameterSymbol(psi, analysisSession)
|
||||
}
|
||||
|
||||
override fun getFunctionLikeSymbol(psi: KtNamedFunction): KtFunctionLikeSymbol = withValidityAssertion {
|
||||
return if (psi.hasBody() && (psi.funKeyword == null || psi.nameIdentifier == null)) {
|
||||
getAnonymousFunctionSymbol(psi)
|
||||
} else {
|
||||
KtFe10PsiFunctionSymbol(psi, analysisSession)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getConstructorSymbol(psi: KtConstructor<*>): KtConstructorSymbol = withValidityAssertion {
|
||||
return KtFe10PsiConstructorSymbol(psi, analysisSession)
|
||||
}
|
||||
|
||||
override fun getTypeParameterSymbol(psi: KtTypeParameter): KtTypeParameterSymbol = withValidityAssertion {
|
||||
return KtFe10PsiTypeParameterSymbol(psi, analysisSession)
|
||||
}
|
||||
|
||||
override fun getTypeAliasSymbol(psi: KtTypeAlias): KtTypeAliasSymbol = withValidityAssertion {
|
||||
return KtFe10PsiTypeAliasSymbol(psi, analysisSession)
|
||||
}
|
||||
|
||||
override fun getEnumEntrySymbol(psi: KtEnumEntry): KtEnumEntrySymbol = withValidityAssertion {
|
||||
return KtFe10PsiEnumEntrySymbol(psi, analysisSession)
|
||||
}
|
||||
|
||||
override fun getAnonymousFunctionSymbol(psi: KtNamedFunction): KtAnonymousFunctionSymbol = withValidityAssertion {
|
||||
return KtFe10PsiAnonymousFunctionSymbol(psi, analysisSession)
|
||||
}
|
||||
|
||||
override fun getAnonymousFunctionSymbol(psi: KtFunctionLiteral): KtAnonymousFunctionSymbol = withValidityAssertion {
|
||||
return KtFe10PsiLiteralAnonymousFunctionSymbol(psi, analysisSession)
|
||||
}
|
||||
|
||||
override fun getVariableSymbol(psi: KtProperty): KtVariableSymbol = withValidityAssertion {
|
||||
return if (psi.isLocal) {
|
||||
KtFe10PsiLocalVariableSymbol(psi, analysisSession)
|
||||
} else {
|
||||
KtFe10PsiKotlinPropertySymbol(psi, analysisSession)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getAnonymousObjectSymbol(psi: KtObjectLiteralExpression): KtAnonymousObjectSymbol = withValidityAssertion {
|
||||
return KtFe10PsiAnonymousObjectSymbol(psi.objectDeclaration, analysisSession)
|
||||
}
|
||||
|
||||
override fun getClassOrObjectSymbol(psi: KtClassOrObject): KtClassOrObjectSymbol = withValidityAssertion {
|
||||
return if (psi is KtObjectDeclaration && psi.isObjectLiteral()) {
|
||||
KtFe10PsiAnonymousObjectSymbol(psi, analysisSession)
|
||||
} else {
|
||||
KtFe10PsiNamedClassOrObjectSymbol(psi, analysisSession)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getNamedClassOrObjectSymbol(psi: KtClassOrObject): KtNamedClassOrObjectSymbol? = withValidityAssertion {
|
||||
if (psi is KtEnumEntry || psi.nameIdentifier == null) {
|
||||
return null
|
||||
}
|
||||
|
||||
return KtFe10PsiNamedClassOrObjectSymbol(psi, analysisSession)
|
||||
}
|
||||
|
||||
override fun getPropertyAccessorSymbol(psi: KtPropertyAccessor): KtPropertyAccessorSymbol = withValidityAssertion {
|
||||
return if (psi.isGetter) {
|
||||
KtFe10PsiPropertyGetterSymbol(psi, analysisSession)
|
||||
} else {
|
||||
KtFe10PsiPropertySetterSymbol(psi, analysisSession)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getClassInitializerSymbol(psi: KtClassInitializer): KtClassInitializerSymbol = withValidityAssertion {
|
||||
return KtFe10PsiClassInitializerSymbol(psi, analysisSession)
|
||||
}
|
||||
|
||||
override fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol? = withValidityAssertion {
|
||||
val descriptor = analysisSession.resolveSession.moduleDescriptor.findClassAcrossModuleDependencies(classId) ?: return null
|
||||
return descriptor.toKtClassSymbol(analysisSession)
|
||||
}
|
||||
|
||||
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence<KtSymbol> = withValidityAssertion {
|
||||
val packageViewDescriptor = analysisSession.resolveSession.moduleDescriptor.getPackage(packageFqName)
|
||||
return packageViewDescriptor.memberScope.getContributedDescriptors(DescriptorKindFilter.ALL, nameFilter = { it == name })
|
||||
.asSequence()
|
||||
.filter { it.name == name }
|
||||
.mapNotNull { it.toKtSymbol(analysisSession) as? KtCallableSymbol }
|
||||
}
|
||||
}
|
||||
+64
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtStarProjectionTypeArgument
|
||||
import org.jetbrains.kotlin.analysis.api.KtTypeArgumentWithVariance
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtClassTypeBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtTypeCreator
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.KtFe10ClassErrorType
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.KtFe10UsualClassType
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtClassType
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||
import org.jetbrains.kotlin.types.*
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
||||
|
||||
internal class KtFe10TypeCreator(override val analysisSession: KtFe10AnalysisSession) : KtTypeCreator() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun buildClassType(builder: KtClassTypeBuilder): KtClassType {
|
||||
val descriptor: ClassDescriptor? = when (builder) {
|
||||
is KtClassTypeBuilder.ByClassId -> {
|
||||
val fqName = builder.classId.asSingleFqName()
|
||||
analysisSession.resolveSession
|
||||
.getTopLevelClassifierDescriptors(fqName, NoLookupLocation.FROM_IDE)
|
||||
.firstIsInstanceOrNull()
|
||||
}
|
||||
is KtClassTypeBuilder.BySymbol -> {
|
||||
getSymbolDescriptor(builder.symbol) as? ClassDescriptor
|
||||
}
|
||||
}
|
||||
|
||||
if (descriptor == null) {
|
||||
val kotlinType = ErrorUtils.createErrorType("Cannot build class type, descriptor not found for builder $builder")
|
||||
return KtFe10ClassErrorType(kotlinType as ErrorType, analysisSession)
|
||||
}
|
||||
|
||||
val typeParameters = descriptor.typeConstructor.parameters
|
||||
val type = if (typeParameters.size == builder.arguments.size) {
|
||||
val projections = builder.arguments.mapIndexed { index, arg ->
|
||||
when (arg) {
|
||||
is KtStarProjectionTypeArgument -> StarProjectionImpl(typeParameters[index])
|
||||
is KtTypeArgumentWithVariance -> TypeProjectionImpl(arg.variance, (arg.type as KtFe10Type).type)
|
||||
}
|
||||
}
|
||||
|
||||
TypeUtils.substituteProjectionsForParameters(descriptor, projections)
|
||||
} else {
|
||||
descriptor.defaultType
|
||||
}
|
||||
|
||||
val typeWithNullability = TypeUtils.makeNullableAsSpecified(type, builder.nullability == KtTypeNullability.NULLABLE)
|
||||
return KtFe10UsualClassType(typeWithNullability as SimpleType, descriptor, analysisSession)
|
||||
}
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtTypeInfoProvider
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.load.java.sam.JavaSingleAbstractMethodUtils
|
||||
import org.jetbrains.kotlin.types.TypeUtils
|
||||
|
||||
internal class KtFe10TypeInfoProvider(override val analysisSession: KtFe10AnalysisSession) : KtTypeInfoProvider() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun isFunctionalInterfaceType(type: KtType): Boolean = withValidityAssertion {
|
||||
require(type is KtFe10Type)
|
||||
return JavaSingleAbstractMethodUtils.isSamType(type.type)
|
||||
}
|
||||
|
||||
override fun canBeNull(type: KtType): Boolean = withValidityAssertion {
|
||||
require(type is KtFe10Type)
|
||||
return TypeUtils.isNullableType(type.type)
|
||||
}
|
||||
}
|
||||
+451
@@ -0,0 +1,451 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtBuiltinTypes
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtTypeProvider
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession.AnalysisMode
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.classId
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.isInterfaceLike
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.getResolutionScope
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.PublicApproximatorConfiguration
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.nameOrAnonymous
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.config.LanguageFeature
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.name.StandardClassIds
|
||||
import org.jetbrains.kotlin.psi.KtDoubleColonExpression
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
import org.jetbrains.kotlin.psi.KtTypeReference
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.CapturedType
|
||||
import org.jetbrains.kotlin.resolve.scopes.utils.getImplicitReceiversHierarchy
|
||||
import org.jetbrains.kotlin.types.*
|
||||
import org.jetbrains.kotlin.types.checker.NewCapturedType
|
||||
import org.jetbrains.kotlin.types.checker.NewTypeVariableConstructor
|
||||
import org.jetbrains.kotlin.types.typeUtil.isNothing
|
||||
import org.jetbrains.kotlin.types.typeUtil.supertypes
|
||||
import org.jetbrains.kotlin.util.containingNonLocalDeclaration
|
||||
|
||||
internal class KtFe10TypeProvider(override val analysisSession: KtFe10AnalysisSession) : KtTypeProvider() {
|
||||
@Suppress("SpellCheckingInspection")
|
||||
private val typeApproximator by lazy {
|
||||
TypeApproximator(
|
||||
analysisSession.resolveSession.moduleDescriptor.builtIns,
|
||||
analysisSession.resolveSession.languageVersionSettings
|
||||
)
|
||||
}
|
||||
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override val builtinTypes: KtBuiltinTypes by cached { KtFe10BuiltinTypes(analysisSession) }
|
||||
|
||||
override fun approximateToSuperPublicDenotableType(type: KtType): KtType? = withValidityAssertion {
|
||||
require(type is KtFe10Type)
|
||||
return typeApproximator.approximateToSuperType(type.type, PublicApproximatorConfiguration)?.toKtType(analysisSession)
|
||||
}
|
||||
|
||||
override fun buildSelfClassType(symbol: KtNamedClassOrObjectSymbol): KtType = withValidityAssertion {
|
||||
val kotlinType = (getSymbolDescriptor(symbol) as? ClassDescriptor)?.defaultType
|
||||
?: ErrorUtils.createErrorType("Cannot get class type for unresolved class ${symbol.nameOrAnonymous}")
|
||||
|
||||
return kotlinType.toKtType(analysisSession)
|
||||
}
|
||||
|
||||
override fun commonSuperType(types: Collection<KtType>): KtType = withValidityAssertion {
|
||||
val kotlinTypes = types.map { (it as KtFe10Type).type }
|
||||
return CommonSupertypes.commonSupertype(kotlinTypes).toKtType(analysisSession)
|
||||
}
|
||||
|
||||
override fun getKtType(ktTypeReference: KtTypeReference): KtType = withValidityAssertion {
|
||||
val bindingContext = analysisSession.analyze(ktTypeReference, AnalysisMode.PARTIAL)
|
||||
val kotlinType = bindingContext[BindingContext.TYPE, ktTypeReference]
|
||||
?: ErrorUtils.createErrorType("Cannot resolve type reference ${ktTypeReference.text}")
|
||||
return kotlinType.toKtType(analysisSession)
|
||||
}
|
||||
|
||||
override fun getReceiverTypeForDoubleColonExpression(expression: KtDoubleColonExpression): KtType? = withValidityAssertion {
|
||||
val bindingContext = analysisSession.analyze(expression, AnalysisMode.PARTIAL)
|
||||
val lhs = bindingContext[BindingContext.DOUBLE_COLON_LHS, expression] ?: return null
|
||||
return lhs.type.toKtType(analysisSession)
|
||||
}
|
||||
|
||||
override fun withNullability(type: KtType, newNullability: KtTypeNullability): KtType = withValidityAssertion {
|
||||
require(type is KtFe10Type)
|
||||
return type.type.makeNullableAsSpecified(newNullability == KtTypeNullability.NULLABLE).toKtType(analysisSession)
|
||||
}
|
||||
|
||||
override fun haveCommonSubtype(a: KtType, b: KtType): Boolean {
|
||||
return areTypesCompatible((a as KtFe10Type).type, (b as KtFe10Type).type)
|
||||
}
|
||||
|
||||
override fun getImplicitReceiverTypesAtPosition(position: KtElement): List<KtType> {
|
||||
val elementToAnalyze = position.containingNonLocalDeclaration() ?: position
|
||||
val bindingContext = analysisSession.analyze(elementToAnalyze)
|
||||
|
||||
val lexicalScope = position.getResolutionScope(bindingContext) ?: return emptyList()
|
||||
return lexicalScope.getImplicitReceiversHierarchy().map { it.type.toKtType(analysisSession) }
|
||||
}
|
||||
|
||||
override fun getDirectSuperTypes(type: KtType, shouldApproximate: Boolean): List<KtType> {
|
||||
require(type is KtFe10Type)
|
||||
return TypeUtils.getImmediateSupertypes(type.type).map { it.toKtType(analysisSession) }
|
||||
}
|
||||
|
||||
override fun getAllSuperTypes(type: KtType, shouldApproximate: Boolean): List<KtType> {
|
||||
require(type is KtFe10Type)
|
||||
return TypeUtils.getAllSupertypes(type.type).map { it.toKtType(analysisSession) }
|
||||
}
|
||||
|
||||
private fun areTypesCompatible(a: KotlinType, b: KotlinType): Boolean {
|
||||
if (a.isNothing() || b.isNothing() || TypeUtils.equalTypes(a, b) || (a.isNullable() && b.isNullable())) {
|
||||
return true
|
||||
}
|
||||
|
||||
val aConstructor = a.constructor
|
||||
val bConstructor = b.constructor
|
||||
|
||||
if (aConstructor is IntersectionTypeConstructor) {
|
||||
return aConstructor.supertypes.all { areTypesCompatible(it, b) }
|
||||
}
|
||||
|
||||
if (bConstructor is IntersectionTypeConstructor) {
|
||||
return bConstructor.supertypes.all { areTypesCompatible(a, it) }
|
||||
}
|
||||
|
||||
val intersectionType = TypeIntersector.intersectTypes(listOf(a, b)) ?: return false
|
||||
val intersectionTypeConstructor = intersectionType.constructor
|
||||
|
||||
if (intersectionTypeConstructor is IntersectionTypeConstructor) {
|
||||
val intersectedTypes = intersectionTypeConstructor.supertypes
|
||||
if (intersectedTypes.all { it.isNullable() }) {
|
||||
return true
|
||||
}
|
||||
|
||||
val collectedUpperBounds = intersectedTypes.flatMapTo(mutableSetOf()) { getUpperBounds(it) }
|
||||
return areBoundsCompatible(collectedUpperBounds, emptySet())
|
||||
} else {
|
||||
return !intersectionType.isNothing()
|
||||
}
|
||||
}
|
||||
|
||||
private fun getUpperBounds(type: KotlinType): List<KotlinType> {
|
||||
when (type) {
|
||||
is FlexibleType -> return getUpperBounds(type.upperBound)
|
||||
is DefinitelyNotNullType -> return getUpperBounds(type.original)
|
||||
is ErrorType -> return emptyList()
|
||||
is CapturedType -> return type.constructor.supertypes.flatMap { getUpperBounds(it) }
|
||||
is NewCapturedType -> return type.constructor.supertypes.flatMap { getUpperBounds(it) }
|
||||
is SimpleType -> {
|
||||
val typeParameterDescriptor = TypeUtils.getTypeParameterDescriptorOrNull(type)
|
||||
if (typeParameterDescriptor != null) {
|
||||
return typeParameterDescriptor.upperBounds.flatMap { getUpperBounds(it) }
|
||||
}
|
||||
|
||||
val typeConstructor = type.constructor
|
||||
if (typeConstructor is NewTypeVariableConstructor) {
|
||||
return typeConstructor.originalTypeParameter?.upperBounds.orEmpty().flatMap { getUpperBounds(it) }
|
||||
}
|
||||
if (typeConstructor is IntersectionTypeConstructor) {
|
||||
return typeConstructor.supertypes.flatMap { getUpperBounds(it) }
|
||||
}
|
||||
|
||||
return listOf(type)
|
||||
}
|
||||
else -> return emptyList()
|
||||
}
|
||||
}
|
||||
|
||||
private fun areBoundsCompatible(
|
||||
upperBounds: Set<KotlinType>,
|
||||
lowerBounds: Set<KotlinType>,
|
||||
checkedTypeParameters: MutableSet<TypeParameterDescriptor> = mutableSetOf()
|
||||
): Boolean {
|
||||
val upperBoundClasses = upperBounds.mapNotNull { getBoundClass(it) }.toSet()
|
||||
|
||||
val leafClassesOrInterfaces = computeLeafClassesOrInterfaces(upperBoundClasses)
|
||||
if (areClassesOrInterfacesIncompatible(leafClassesOrInterfaces)) {
|
||||
return false
|
||||
}
|
||||
|
||||
if (!lowerBounds.all { lowerBoundType ->
|
||||
val classesSatisfyingLowerBounds = collectSuperClasses(lowerBoundType)
|
||||
leafClassesOrInterfaces.all { it in classesSatisfyingLowerBounds }
|
||||
}
|
||||
) {
|
||||
return false
|
||||
}
|
||||
|
||||
if (upperBounds.size < 2) {
|
||||
return true
|
||||
}
|
||||
|
||||
val typeArgumentMapping = collectTypeArgumentMapping(upperBounds)
|
||||
for ((typeParameter, boundTypeArguments) in typeArgumentMapping) {
|
||||
if (!boundTypeArguments.isCompatible) {
|
||||
return false
|
||||
}
|
||||
|
||||
checkedTypeParameters.add(typeParameter)
|
||||
if (!areBoundsCompatible(boundTypeArguments.upper, boundTypeArguments.lower, checkedTypeParameters)) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
private fun collectTypeArgumentMapping(upperBounds: Set<KotlinType>): Map<TypeParameterDescriptor, BoundTypeArguments> {
|
||||
val typeArgumentMapping = LinkedHashMap<TypeParameterDescriptor, BoundTypeArguments>()
|
||||
for (type in upperBounds) {
|
||||
val mappingForType = type.toTypeArgumentMapping() ?: continue
|
||||
|
||||
val queue = ArrayDeque<TypeArgumentMapping>()
|
||||
queue.addLast(mappingForType)
|
||||
|
||||
while (queue.isNotEmpty()) {
|
||||
val (typeParameterOwner, mapping) = queue.removeFirst()
|
||||
for (superType in typeParameterOwner.typeConstructor.supertypes) {
|
||||
val mappingForSupertype = superType.toTypeArgumentMapping(mapping) ?: continue
|
||||
queue.addLast(mappingForSupertype)
|
||||
}
|
||||
|
||||
for ((typeParameterDescriptor, boundTypeArgument) in mapping) {
|
||||
val boundsForParameter = typeArgumentMapping.computeIfAbsent(typeParameterDescriptor) {
|
||||
var isCompatible = true
|
||||
val languageVersionSettings = analysisSession.resolveSession.languageVersionSettings
|
||||
if (languageVersionSettings.supportsFeature(LanguageFeature.ProhibitComparisonOfIncompatibleEnums)) {
|
||||
isCompatible = isCompatible && typeParameterOwner.classId != StandardClassIds.Enum
|
||||
}
|
||||
if (languageVersionSettings.supportsFeature(LanguageFeature.ProhibitComparisonOfIncompatibleClasses)) {
|
||||
isCompatible = isCompatible && typeParameterOwner.classId != StandardClassIds.KClass
|
||||
}
|
||||
|
||||
BoundTypeArguments(mutableSetOf(), mutableSetOf(), isCompatible)
|
||||
}
|
||||
|
||||
if (boundTypeArgument.variance.allowsOutPosition) {
|
||||
boundsForParameter.upper += boundTypeArgument.type.collectUpperBounds()
|
||||
}
|
||||
|
||||
if (boundTypeArgument.variance.allowsInPosition) {
|
||||
boundsForParameter.lower += boundTypeArgument.type.collectLowerBounds()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return typeArgumentMapping
|
||||
}
|
||||
|
||||
private fun KotlinType.collectLowerBounds(): Set<KotlinType> {
|
||||
when (this) {
|
||||
is FlexibleType -> return lowerBound.collectLowerBounds()
|
||||
is DefinitelyNotNullType -> return original.collectLowerBounds()
|
||||
is ErrorType -> return emptySet()
|
||||
is CapturedType, is NewCapturedType -> return constructor.supertypes.flatMapTo(mutableSetOf()) { it.collectLowerBounds() }
|
||||
is SimpleType -> {
|
||||
val typeParameterDescriptor = TypeUtils.getTypeParameterDescriptorOrNull(this)
|
||||
if (typeParameterDescriptor != null) {
|
||||
return emptySet()
|
||||
}
|
||||
|
||||
return when (val typeConstructor = this.constructor) {
|
||||
is NewTypeVariableConstructor -> emptySet()
|
||||
is IntersectionTypeConstructor -> typeConstructor.supertypes.flatMapTo(mutableSetOf()) { it.collectLowerBounds() }
|
||||
else -> setOf(this)
|
||||
}
|
||||
|
||||
}
|
||||
else -> return emptySet()
|
||||
}
|
||||
}
|
||||
|
||||
private fun KotlinType.collectUpperBounds(): Set<KotlinType> {
|
||||
when (this) {
|
||||
is FlexibleType -> return lowerBound.collectUpperBounds()
|
||||
is DefinitelyNotNullType -> return original.collectUpperBounds()
|
||||
is ErrorType -> return emptySet()
|
||||
is CapturedType, is NewCapturedType -> return constructor.supertypes.flatMapTo(mutableSetOf()) { it.collectUpperBounds() }
|
||||
is SimpleType -> {
|
||||
val typeParameterDescriptor = TypeUtils.getTypeParameterDescriptorOrNull(this)
|
||||
if (typeParameterDescriptor != null) {
|
||||
return typeParameterDescriptor.upperBounds.flatMapTo(mutableSetOf()) { it.collectUpperBounds() }
|
||||
}
|
||||
|
||||
return when (val typeConstructor = this.constructor) {
|
||||
is NewTypeVariableConstructor -> typeConstructor.supertypes.flatMapTo(mutableSetOf()) { it.collectUpperBounds() }
|
||||
is IntersectionTypeConstructor -> typeConstructor.supertypes.flatMapTo(mutableSetOf()) { it.collectUpperBounds() }
|
||||
else -> setOf(this)
|
||||
}
|
||||
|
||||
}
|
||||
else -> return emptySet()
|
||||
}
|
||||
}
|
||||
|
||||
private fun KotlinType.toTypeArgumentMapping(
|
||||
envMapping: Map<TypeParameterDescriptor, BoundTypeArgument> = emptyMap()
|
||||
): TypeArgumentMapping? {
|
||||
val typeParameterOwner = constructor.declarationDescriptor as? ClassifierDescriptorWithTypeParameters ?: return null
|
||||
|
||||
val mapping = mutableMapOf<TypeParameterDescriptor, BoundTypeArgument>()
|
||||
arguments.forEachIndexed { index, typeProjection ->
|
||||
val typeParameter = typeParameterOwner.declaredTypeParameters.getOrNull(index) ?: return@forEachIndexed
|
||||
var boundTypeArgument: BoundTypeArgument = when {
|
||||
typeProjection.isStarProjection -> return@forEachIndexed
|
||||
typeProjection.projectionKind == Variance.INVARIANT -> {
|
||||
when (typeParameter.variance) {
|
||||
Variance.IN_VARIANCE -> BoundTypeArgument(typeProjection.type, Variance.IN_VARIANCE)
|
||||
Variance.OUT_VARIANCE -> BoundTypeArgument(typeProjection.type, Variance.OUT_VARIANCE)
|
||||
else -> BoundTypeArgument(typeProjection.type, Variance.INVARIANT)
|
||||
}
|
||||
}
|
||||
else -> BoundTypeArgument(typeProjection.type, typeProjection.projectionKind)
|
||||
}
|
||||
|
||||
val typeParameterDescriptor = TypeUtils.getTypeParameterDescriptorOrNull(boundTypeArgument.type)
|
||||
if (typeParameterDescriptor != null) {
|
||||
val mappedTypeArgument = envMapping[typeParameterDescriptor]
|
||||
if (mappedTypeArgument != null) {
|
||||
boundTypeArgument = mappedTypeArgument
|
||||
}
|
||||
}
|
||||
|
||||
mapping.put(typeParameter, boundTypeArgument)
|
||||
}
|
||||
|
||||
return TypeArgumentMapping(typeParameterOwner, mapping)
|
||||
}
|
||||
|
||||
private data class TypeArgumentMapping(
|
||||
val owner: ClassifierDescriptorWithTypeParameters,
|
||||
val mapping: Map<TypeParameterDescriptor, BoundTypeArgument>
|
||||
)
|
||||
|
||||
private data class BoundTypeArgument(val type: KotlinType, val variance: Variance)
|
||||
private data class BoundTypeArguments(val upper: MutableSet<KotlinType>, val lower: MutableSet<KotlinType>, val isCompatible: Boolean)
|
||||
|
||||
private fun computeLeafClassesOrInterfaces(upperBoundClasses: Set<ClassDescriptor>): Set<ClassDescriptor> {
|
||||
val isLeaf = mutableMapOf<ClassDescriptor, Boolean>()
|
||||
upperBoundClasses.associateWithTo(isLeaf) { true }
|
||||
val queue = ArrayDeque(upperBoundClasses)
|
||||
while (queue.isNotEmpty()) {
|
||||
for (superClass in DescriptorUtils.getSuperclassDescriptors(queue.removeFirst())) {
|
||||
when (isLeaf[superClass]) {
|
||||
true -> isLeaf[superClass] = false
|
||||
false -> {}
|
||||
else -> {
|
||||
isLeaf[superClass] = false
|
||||
queue.addLast(superClass)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return isLeaf.filterValues { it }.keys
|
||||
}
|
||||
|
||||
private fun getBoundClass(type: KotlinType): ClassDescriptor? {
|
||||
return when (val declaration = type.constructor.declarationDescriptor) {
|
||||
is ClassDescriptor -> declaration
|
||||
is TypeAliasDescriptor -> getBoundClass(declaration.expandedType)
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
private fun collectSuperClasses(type: KotlinType): Set<ClassDescriptor> {
|
||||
val initialClass = getBoundClass(type) ?: return emptySet()
|
||||
|
||||
val result = mutableSetOf<ClassDescriptor>()
|
||||
result.add(initialClass)
|
||||
|
||||
val queue = ArrayDeque<ClassDescriptor>()
|
||||
queue.addLast(initialClass)
|
||||
while (queue.isNotEmpty()) {
|
||||
val current = queue.removeFirst()
|
||||
val supertypes = DescriptorUtils.getSuperclassDescriptors(current)
|
||||
supertypes.filterNotTo(queue) { it !in result }
|
||||
result.addAll(supertypes)
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
private fun areClassesOrInterfacesIncompatible(classesOrInterfaces: Collection<ClassDescriptor>): Boolean {
|
||||
val classes = classesOrInterfaces.filter { !it.isInterfaceLike }
|
||||
return when {
|
||||
classes.size >= 2 -> true
|
||||
!classes.any { it.isFinalOrEnum } -> false
|
||||
classesOrInterfaces.size > classes.size -> true
|
||||
else -> false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class KtFe10BuiltinTypes(private val analysisSession: KtFe10AnalysisSession) : KtBuiltinTypes() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
private val builtIns = analysisSession.resolveSession.moduleDescriptor.builtIns
|
||||
|
||||
override val INT: KtType
|
||||
get() = withValidityAssertion { builtIns.intType.toKtType(analysisSession) }
|
||||
|
||||
override val LONG: KtType
|
||||
get() = withValidityAssertion { builtIns.longType.toKtType(analysisSession) }
|
||||
|
||||
override val SHORT: KtType
|
||||
get() = withValidityAssertion { builtIns.shortType.toKtType(analysisSession) }
|
||||
|
||||
override val BYTE: KtType
|
||||
get() = withValidityAssertion { builtIns.byteType.toKtType(analysisSession) }
|
||||
|
||||
override val FLOAT: KtType
|
||||
get() = withValidityAssertion { builtIns.floatType.toKtType(analysisSession) }
|
||||
|
||||
override val DOUBLE: KtType
|
||||
get() = withValidityAssertion { builtIns.doubleType.toKtType(analysisSession) }
|
||||
|
||||
override val BOOLEAN: KtType
|
||||
get() = withValidityAssertion { builtIns.booleanType.toKtType(analysisSession) }
|
||||
|
||||
override val CHAR: KtType
|
||||
get() = withValidityAssertion { builtIns.charType.toKtType(analysisSession) }
|
||||
|
||||
override val STRING: KtType
|
||||
get() = withValidityAssertion { builtIns.stringType.toKtType(analysisSession) }
|
||||
|
||||
override val UNIT: KtType
|
||||
get() = withValidityAssertion { builtIns.unitType.toKtType(analysisSession) }
|
||||
|
||||
override val NOTHING: KtType
|
||||
get() = withValidityAssertion { builtIns.nothingType.toKtType(analysisSession) }
|
||||
|
||||
override val ANY: KtType
|
||||
get() = withValidityAssertion { builtIns.anyType.toKtType(analysisSession) }
|
||||
|
||||
override val THROWABLE: KtType
|
||||
get() = withValidityAssertion { builtIns.throwable.defaultType.toKtType(analysisSession) }
|
||||
|
||||
override val NULLABLE_ANY: KtType
|
||||
get() = withValidityAssertion { builtIns.nullableAnyType.toKtType(analysisSession) }
|
||||
|
||||
override val NULLABLE_NOTHING: KtType
|
||||
get() = withValidityAssertion { builtIns.nullableNothingType.toKtType(analysisSession) }
|
||||
|
||||
}
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.components
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtVisibilityChecker
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession.AnalysisMode
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.getResolutionScope
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
||||
import org.jetbrains.kotlin.resolve.scopes.utils.getImplicitReceiversHierarchy
|
||||
|
||||
internal class KtFe10VisibilityChecker(override val analysisSession: KtFe10AnalysisSession) : KtVisibilityChecker() {
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
|
||||
override fun isVisible(
|
||||
candidateSymbol: KtSymbolWithVisibility,
|
||||
useSiteFile: KtFileSymbol,
|
||||
position: PsiElement,
|
||||
receiverExpression: KtExpression?
|
||||
): Boolean = withValidityAssertion {
|
||||
if (candidateSymbol.visibility == Visibilities.Public) {
|
||||
return true
|
||||
}
|
||||
|
||||
val targetDescriptor = getSymbolDescriptor(candidateSymbol) as? DeclarationDescriptorWithVisibility ?: return false
|
||||
|
||||
val useSiteDeclaration = findContainingNonLocalDeclaration(position) ?: return false
|
||||
val bindingContextForUseSite = analysisSession.analyze(useSiteDeclaration)
|
||||
val useSiteDescriptor = bindingContextForUseSite[BindingContext.DECLARATION_TO_DESCRIPTOR, useSiteDeclaration] ?: return false
|
||||
|
||||
if (receiverExpression != null && !targetDescriptor.isExtension) {
|
||||
val bindingContext = analysisSession.analyze(receiverExpression, AnalysisMode.PARTIAL)
|
||||
val receiverType = bindingContext.getType(receiverExpression) ?: return false
|
||||
val explicitReceiver = ExpressionReceiver.create(receiverExpression, receiverType, bindingContext)
|
||||
return DescriptorVisibilities.isVisible(explicitReceiver, targetDescriptor, useSiteDescriptor)
|
||||
} else {
|
||||
val bindingContext = analysisSession.analyze(useSiteDeclaration, AnalysisMode.FULL)
|
||||
|
||||
val lexicalScope = position.getResolutionScope(bindingContext)
|
||||
if (lexicalScope != null) {
|
||||
return lexicalScope.getImplicitReceiversHierarchy()
|
||||
.any { DescriptorVisibilities.isVisible(it.value, targetDescriptor, useSiteDescriptor) }
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
private fun findContainingNonLocalDeclaration(element: PsiElement): KtCallableDeclaration? {
|
||||
for (parent in element.parentsWithSelf) {
|
||||
if (parent is KtCallableDeclaration && !KtPsiUtil.isLocal(parent)) {
|
||||
return parent
|
||||
}
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.references
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.references.base.KtFe10Reference
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.idea.references.KtArrayAccessReference
|
||||
import org.jetbrains.kotlin.psi.KtArrayAccessExpression
|
||||
import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall
|
||||
|
||||
internal class KtFe10ArrayAccessReference(expression: KtArrayAccessExpression) : KtArrayAccessReference(expression), KtFe10Reference {
|
||||
override fun KtAnalysisSession.resolveToSymbols(): Collection<KtSymbol> {
|
||||
require(this is KtFe10AnalysisSession)
|
||||
|
||||
val bindingContext = analyze(expression, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
val descriptor = expression.getResolvedCall(bindingContext)?.resultingDescriptor
|
||||
return listOfNotNull(descriptor?.toKtCallableSymbol(this))
|
||||
}
|
||||
|
||||
override fun handleElementRename(newElementName: String): PsiElement? {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.references
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.references.base.KtFe10Reference
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.idea.references.KtCollectionLiteralReference
|
||||
import org.jetbrains.kotlin.psi.KtCollectionLiteralExpression
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10CollectionLiteralReference(
|
||||
expression: KtCollectionLiteralExpression
|
||||
) : KtCollectionLiteralReference(expression), KtFe10Reference {
|
||||
override fun KtAnalysisSession.resolveToSymbols(): Collection<KtSymbol> {
|
||||
require(this is KtFe10AnalysisSession)
|
||||
|
||||
val bindingContext = analyze(expression, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
val descriptor = bindingContext[BindingContext.COLLECTION_LITERAL_CALL, expression]?.resultingDescriptor
|
||||
return listOfNotNull(descriptor?.toKtCallableSymbol(this))
|
||||
}
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.references
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.references.base.KtFe10Reference
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.idea.references.KtConstructorDelegationReference
|
||||
import org.jetbrains.kotlin.psi.KtConstructorDelegationReferenceExpression
|
||||
import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall
|
||||
|
||||
internal class KtFe10ConstructorDelegationReference(
|
||||
expression: KtConstructorDelegationReferenceExpression
|
||||
) : KtConstructorDelegationReference(expression), KtFe10Reference {
|
||||
override fun KtAnalysisSession.resolveToSymbols(): Collection<KtSymbol> {
|
||||
require(this is KtFe10AnalysisSession)
|
||||
|
||||
val bindingContext = analyze(expression, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
val descriptor = expression.getResolvedCall(bindingContext)?.resultingDescriptor
|
||||
return listOfNotNull(descriptor?.toKtCallableSymbol(this))
|
||||
}
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.references
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.references.base.KtFe10Reference
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.idea.references.KtDestructuringDeclarationReference
|
||||
import org.jetbrains.kotlin.psi.KtDestructuringDeclarationEntry
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10DestructuringDeclarationEntry(
|
||||
element: KtDestructuringDeclarationEntry
|
||||
) : KtDestructuringDeclarationReference(element), KtFe10Reference {
|
||||
override fun KtAnalysisSession.resolveToSymbols(): Collection<KtSymbol> {
|
||||
check(this is KtFe10AnalysisSession)
|
||||
|
||||
val bindingContext = analyze(element, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
val descriptor = bindingContext[BindingContext.COMPONENT_RESOLVED_CALL, element]?.resultingDescriptor
|
||||
return listOfNotNull(descriptor?.toKtCallableSymbol(this))
|
||||
}
|
||||
|
||||
override fun canRename(): Boolean {
|
||||
return false // TODO
|
||||
}
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.references
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.references.base.KtFe10Reference
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.idea.references.KtForLoopInReference
|
||||
import org.jetbrains.kotlin.psi.KtForExpression
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10ForLoopInReference(element: KtForExpression) : KtForLoopInReference(element), KtFe10Reference {
|
||||
override fun KtAnalysisSession.resolveToSymbols(): Collection<KtSymbol> {
|
||||
check(this is KtFe10AnalysisSession)
|
||||
|
||||
val loopRange = element.loopRange ?: return emptyList()
|
||||
val bindingContext = analyze(loopRange)
|
||||
|
||||
return listOf(
|
||||
BindingContext.LOOP_RANGE_ITERATOR_RESOLVED_CALL,
|
||||
BindingContext.LOOP_RANGE_HAS_NEXT_RESOLVED_CALL,
|
||||
BindingContext.LOOP_RANGE_NEXT_RESOLVED_CALL
|
||||
).mapNotNull { slice -> bindingContext[slice, loopRange]?.resultingDescriptor?.toKtCallableSymbol(this) }
|
||||
}
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.references
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.references.base.KtFe10Reference
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.idea.references.KtInvokeFunctionReference
|
||||
import org.jetbrains.kotlin.psi.KtCallExpression
|
||||
import org.jetbrains.kotlin.psi.KtExpression
|
||||
import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall
|
||||
|
||||
internal class KtFe10InvokeFunctionReference(expression: KtCallExpression) : KtInvokeFunctionReference(expression), KtFe10Reference {
|
||||
override fun KtAnalysisSession.resolveToSymbols(): Collection<KtSymbol> {
|
||||
require(this is KtFe10AnalysisSession)
|
||||
|
||||
val bindingContext = analyze(expression, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
val descriptor = expression.getResolvedCall(bindingContext)?.resultingDescriptor
|
||||
return listOfNotNull(descriptor?.toKtCallableSymbol(this))
|
||||
}
|
||||
|
||||
override fun doRenameImplicitConventionalCall(newName: String?): KtExpression {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
}
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.references
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.references.base.KtFe10Reference
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.idea.references.KtPropertyDelegationMethodsReference
|
||||
import org.jetbrains.kotlin.psi.KtProperty
|
||||
import org.jetbrains.kotlin.psi.KtPropertyDelegate
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10PropertyDelegationMethodsReference(
|
||||
element: KtPropertyDelegate
|
||||
) : KtPropertyDelegationMethodsReference(element), KtFe10Reference {
|
||||
override fun KtAnalysisSession.resolveToSymbols(): Collection<KtSymbol> {
|
||||
require(this is KtFe10AnalysisSession)
|
||||
|
||||
val property = expression.parent as? KtProperty
|
||||
if (property == null || property.delegate !== element) {
|
||||
return emptyList()
|
||||
}
|
||||
|
||||
val bindingContext = analyze(property)
|
||||
val propertyDescriptor = bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, property]
|
||||
|
||||
if (propertyDescriptor is PropertyDescriptor) {
|
||||
return listOfNotNull(propertyDescriptor.getter, propertyDescriptor.setter)
|
||||
.mapNotNull { accessor ->
|
||||
val descriptor = bindingContext[BindingContext.DELEGATED_PROPERTY_RESOLVED_CALL, accessor]?.resultingDescriptor
|
||||
descriptor?.toKtCallableSymbol(this)
|
||||
}
|
||||
}
|
||||
|
||||
return emptyList()
|
||||
}
|
||||
}
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.references
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.references.base.KtFe10Reference
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.psi.KtImportAlias
|
||||
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall
|
||||
|
||||
internal class KtFe10SimpleNameReference(expression: KtSimpleNameExpression) : KtSimpleNameReference(expression), KtFe10Reference {
|
||||
override fun KtAnalysisSession.resolveToSymbols(): Collection<KtSymbol> {
|
||||
require(this is KtFe10AnalysisSession)
|
||||
|
||||
val bindingContext = analyze(expression, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
|
||||
val descriptor = bindingContext[BindingContext.REFERENCE_TARGET, expression]
|
||||
?: expression.getResolvedCall(bindingContext)?.resultingDescriptor
|
||||
|
||||
return listOfNotNull(descriptor?.toKtSymbol(this))
|
||||
}
|
||||
|
||||
override fun doCanBeReferenceTo(candidateTarget: PsiElement): Boolean {
|
||||
return true // TODO
|
||||
}
|
||||
|
||||
override fun isReferenceTo(element: PsiElement): Boolean {
|
||||
return resolve() == element // TODO
|
||||
}
|
||||
|
||||
override fun handleElementRename(newElementName: String): PsiElement? {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
override fun bindToElement(element: PsiElement, shorteningMode: ShorteningMode): PsiElement {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
override fun bindToFqName(fqName: FqName, shorteningMode: ShorteningMode, targetElement: PsiElement?): PsiElement {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
override fun getImportAlias(): KtImportAlias? {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.references.base
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.references.*
|
||||
import org.jetbrains.kotlin.idea.references.KotlinPsiReferenceRegistrar
|
||||
import org.jetbrains.kotlin.idea.references.KotlinReferenceProviderContributor
|
||||
|
||||
class KtFe10KotlinReferenceProviderContributor : KotlinReferenceProviderContributor {
|
||||
override fun registerReferenceProviders(registrar: KotlinPsiReferenceRegistrar) {
|
||||
with(registrar) {
|
||||
registerProvider(factory = ::KtFe10SimpleNameReference)
|
||||
registerProvider(factory = ::KtFe10ForLoopInReference)
|
||||
registerProvider(factory = ::KtFe10InvokeFunctionReference)
|
||||
registerProvider(factory = ::KtFe10PropertyDelegationMethodsReference)
|
||||
registerProvider(factory = ::KtFe10DestructuringDeclarationEntry)
|
||||
registerProvider(factory = ::KtFe10ArrayAccessReference)
|
||||
registerProvider(factory = ::KtFe10ConstructorDelegationReference)
|
||||
registerProvider(factory = ::KtFe10CollectionLiteralReference)
|
||||
}
|
||||
}
|
||||
}
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.references.base
|
||||
|
||||
import com.intellij.psi.PsiElementResolveResult
|
||||
import com.intellij.psi.ResolveResult
|
||||
import com.intellij.psi.impl.source.resolve.ResolveCache
|
||||
import org.jetbrains.kotlin.analysis.api.analyse
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.util.runInPossiblyEdtThread
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.HackToForceAllowRunningAnalyzeOnEDT
|
||||
import org.jetbrains.kotlin.idea.references.AbstractKtReference
|
||||
import org.jetbrains.kotlin.idea.references.KtReference
|
||||
import org.jetbrains.kotlin.load.kotlin.toSourceElement
|
||||
import org.jetbrains.kotlin.psi.KtReferenceExpression
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.source.getPsi
|
||||
|
||||
object KtFe10PolyVariantResolver : ResolveCache.PolyVariantResolver<KtReference> {
|
||||
@OptIn(HackToForceAllowRunningAnalyzeOnEDT::class)
|
||||
override fun resolve(reference: KtReference, incompleteCode: Boolean): Array<ResolveResult> {
|
||||
require(reference is AbstractKtReference<*>) { "reference should be AbstractKtReference, but was ${reference::class}" }
|
||||
return runInPossiblyEdtThread {
|
||||
val expression = reference.expression
|
||||
analyse(reference.expression) {
|
||||
val session = this as KtFe10AnalysisSession
|
||||
val bindingContext = session.analyze(expression, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
val descriptor = when (expression) {
|
||||
is KtReferenceExpression -> bindingContext[BindingContext.REFERENCE_TARGET, expression]
|
||||
else -> expression.getResolvedCall(bindingContext)?.resultingDescriptor
|
||||
}
|
||||
val source = descriptor?.toSourceElement?.getPsi()
|
||||
if (source != null) arrayOf(PsiElementResolveResult(source)) else emptyArray()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+15
@@ -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.analysis.api.descriptors.references.base
|
||||
|
||||
import com.intellij.psi.impl.source.resolve.ResolveCache
|
||||
import org.jetbrains.kotlin.analysis.api.KtSymbolBasedReference
|
||||
import org.jetbrains.kotlin.idea.references.KtReference
|
||||
|
||||
interface KtFe10Reference : KtReference, KtSymbolBasedReference {
|
||||
override val resolver: ResolveCache.PolyVariantResolver<KtReference>
|
||||
get() = KtFe10PolyVariantResolver
|
||||
}
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.scopes
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner
|
||||
import org.jetbrains.kotlin.analysis.api.scopes.KtScope
|
||||
import org.jetbrains.kotlin.analysis.api.scopes.KtScopeNameFilter
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassifierSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
internal open class KtFe10EmptyScope(override val token: ValidityToken) : KtScope, ValidityTokenOwner {
|
||||
override fun getAllPossibleNames(): Set<Name> = withValidityAssertion {
|
||||
return emptySet()
|
||||
}
|
||||
|
||||
override fun getPossibleCallableNames(): Set<Name> = withValidityAssertion {
|
||||
return emptySet()
|
||||
}
|
||||
|
||||
override fun getPossibleClassifierNames(): Set<Name> = withValidityAssertion {
|
||||
return emptySet()
|
||||
}
|
||||
|
||||
override fun getAllSymbols(): Sequence<KtSymbol> = withValidityAssertion {
|
||||
return emptySequence()
|
||||
}
|
||||
|
||||
override fun getCallableSymbols(nameFilter: KtScopeNameFilter): Sequence<KtCallableSymbol> = withValidityAssertion {
|
||||
return emptySequence()
|
||||
}
|
||||
|
||||
override fun getClassifierSymbols(nameFilter: KtScopeNameFilter): Sequence<KtClassifierSymbol> = withValidityAssertion {
|
||||
return emptySequence()
|
||||
}
|
||||
|
||||
override fun getConstructors(): Sequence<KtConstructorSymbol> = withValidityAssertion {
|
||||
return emptySequence()
|
||||
}
|
||||
|
||||
override fun mayContainName(name: Name): Boolean = withValidityAssertion {
|
||||
return false
|
||||
}
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.scopes
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.KtFe10PackageSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.scopes.KtPackageScope
|
||||
import org.jetbrains.kotlin.analysis.api.scopes.KtScopeNameFilter
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||
|
||||
internal class KtFe10PackageScope(
|
||||
scope: MemberScope,
|
||||
private val owner: KtPackageSymbol,
|
||||
analysisSession: KtFe10AnalysisSession
|
||||
) : KtFe10ScopeMember(scope, analysisSession), KtPackageScope {
|
||||
override val fqName: FqName
|
||||
get() = withValidityAssertion { owner.fqName }
|
||||
|
||||
override fun getPackageSymbols(nameFilter: KtScopeNameFilter): Sequence<KtPackageSymbol> = withValidityAssertion {
|
||||
val packageFragmentProvider = analysisSession.resolveSession.packageFragmentProvider
|
||||
return packageFragmentProvider.getSubPackagesOf(owner.fqName, nameFilter)
|
||||
.asSequence()
|
||||
.map { KtFe10PackageSymbol(it, analysisSession) }
|
||||
}
|
||||
|
||||
override fun getConstructors(): Sequence<KtConstructorSymbol> = withValidityAssertion {
|
||||
return emptySequence()
|
||||
}
|
||||
}
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.scopes
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtConstructorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.scopes.KtScope
|
||||
import org.jetbrains.kotlin.analysis.api.scopes.KtScopeNameFilter
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassifierSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
|
||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||
import org.jetbrains.kotlin.resolve.scopes.ResolutionScope
|
||||
|
||||
internal abstract class KtFe10ScopeResolution : KtScope, ValidityTokenOwner {
|
||||
abstract val analysisSession: KtFe10AnalysisSession
|
||||
abstract val scope: ResolutionScope
|
||||
|
||||
override fun getCallableSymbols(nameFilter: KtScopeNameFilter): Sequence<KtCallableSymbol> = withValidityAssertion {
|
||||
return scope
|
||||
.getContributedDescriptors(kindFilter = DescriptorKindFilter.ALL, nameFilter)
|
||||
.asSequence()
|
||||
.filter { nameFilter(it.name) }
|
||||
.mapNotNull { it.toKtSymbol(analysisSession) as? KtCallableSymbol }
|
||||
}
|
||||
|
||||
override fun getClassifierSymbols(nameFilter: KtScopeNameFilter): Sequence<KtClassifierSymbol> = withValidityAssertion {
|
||||
return scope
|
||||
.getContributedDescriptors(kindFilter = DescriptorKindFilter.CLASSIFIERS, nameFilter)
|
||||
.asSequence()
|
||||
.filter { nameFilter(it.name) }
|
||||
.mapNotNull { it.toKtSymbol(analysisSession) as? KtClassifierSymbol }
|
||||
}
|
||||
|
||||
override fun getConstructors(): Sequence<KtConstructorSymbol> = withValidityAssertion {
|
||||
return scope
|
||||
.getContributedDescriptors(kindFilter = DescriptorKindFilter.FUNCTIONS)
|
||||
.asSequence()
|
||||
.filterIsInstance<ConstructorDescriptor>()
|
||||
.map { it.toKtConstructorSymbol(analysisSession) }
|
||||
}
|
||||
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
}
|
||||
|
||||
internal open class KtFe10ScopeLexical(
|
||||
override val scope: LexicalScope,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtFe10ScopeResolution(), ValidityTokenOwner {
|
||||
override fun getPossibleCallableNames(): Set<Name> = withValidityAssertion {
|
||||
return emptySet()
|
||||
}
|
||||
|
||||
override fun getPossibleClassifierNames(): Set<Name> = withValidityAssertion {
|
||||
return emptySet()
|
||||
}
|
||||
}
|
||||
|
||||
internal open class KtFe10ScopeMember(
|
||||
override val scope: MemberScope,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtFe10ScopeResolution(), ValidityTokenOwner {
|
||||
override fun getPossibleCallableNames(): Set<Name> = withValidityAssertion {
|
||||
return scope.getFunctionNames() + scope.getVariableNames()
|
||||
}
|
||||
|
||||
override fun getPossibleClassifierNames(): Set<Name> = withValidityAssertion {
|
||||
return scope.getClassifierNames() ?: emptySet()
|
||||
}
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10AnnotatedSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithDeclarations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
|
||||
internal class KtFe10FileSymbol(
|
||||
private val file: KtFile,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtFileSymbol(), KtSymbolWithDeclarations, KtFe10AnnotatedSymbol {
|
||||
override val psi: KtFile
|
||||
get() = withValidityAssertion { file }
|
||||
|
||||
override val annotationsObject: Annotations
|
||||
get() = analysisSession.resolveSession.getFileAnnotations(file)
|
||||
|
||||
override val origin: KtSymbolOrigin
|
||||
get() = withValidityAssertion { if (file.isCompiled) KtSymbolOrigin.LIBRARY else KtSymbolOrigin.SOURCE }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtFileSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols
|
||||
|
||||
import com.intellij.psi.JavaPsiFacade
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.util.PsiUtilCore
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10PackageSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
|
||||
internal class KtFe10PackageSymbol(
|
||||
private val packageName: FqName,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtPackageSymbol(), KtFe10Symbol {
|
||||
override val fqName: FqName
|
||||
get() = withValidityAssertion { packageName }
|
||||
|
||||
override val psi: PsiElement? by cached {
|
||||
val project = analysisSession.resolveSession.project
|
||||
JavaPsiFacade.getInstance(project).findPackage(fqName.asString())
|
||||
}
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtPackageSymbol> = withValidityAssertion {
|
||||
return KtFe10PackageSymbolPointer(fqName)
|
||||
}
|
||||
|
||||
override val origin: KtSymbolOrigin
|
||||
get() = withValidityAssertion {
|
||||
val virtualFile = PsiUtilCore.getVirtualFile(psi)
|
||||
return if (virtualFile != null) {
|
||||
analysisSession.getOrigin(virtualFile)
|
||||
} else {
|
||||
KtSymbolOrigin.LIBRARY
|
||||
}
|
||||
}
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.base
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescAnnotationCall
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.maybeLocalClassId
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotationCall
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass
|
||||
|
||||
internal interface KtFe10AnnotatedSymbol : KtAnnotatedSymbol, KtFe10Symbol {
|
||||
val annotationsObject: Annotations
|
||||
|
||||
override val annotations: List<KtAnnotationCall>
|
||||
get() = withValidityAssertion {
|
||||
annotationsObject.map { KtFe10DescAnnotationCall(it, token) }
|
||||
}
|
||||
|
||||
override val annotationClassIds: Collection<ClassId>
|
||||
get() {
|
||||
withValidityAssertion {
|
||||
val result = mutableListOf<ClassId>()
|
||||
for (annotation in annotationsObject) {
|
||||
val annotationClass = annotation.annotationClass ?: continue
|
||||
result += annotationClass.maybeLocalClassId
|
||||
}
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
override fun containsAnnotation(classId: ClassId): Boolean = withValidityAssertion {
|
||||
return annotationsObject.hasAnnotation(classId.asSingleFqName())
|
||||
}
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.base
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
|
||||
interface KtFe10Symbol : KtSymbol {
|
||||
val analysisSession: KtFe10AnalysisSession
|
||||
|
||||
override val token: ValidityToken
|
||||
get() = analysisSession.token
|
||||
}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.maybeLocalClassId
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtConstantValue
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotationCall
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtNamedConstantValue
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.SourceElement
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.psi.KtAnnotationEntry
|
||||
import org.jetbrains.kotlin.psi.KtCallElement
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass
|
||||
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationDescriptor
|
||||
import org.jetbrains.kotlin.resolve.source.PsiSourceElement
|
||||
|
||||
internal class KtFe10DescAnnotationCall(
|
||||
private val descriptor: AnnotationDescriptor,
|
||||
override val token: ValidityToken
|
||||
) : KtAnnotationCall() {
|
||||
override val classId: ClassId?
|
||||
get() = withValidityAssertion { descriptor.annotationClass?.maybeLocalClassId }
|
||||
|
||||
override val useSiteTarget: AnnotationUseSiteTarget?
|
||||
get() = withValidityAssertion {
|
||||
val psiTarget = (descriptor as? LazyAnnotationDescriptor)?.annotationEntry?.useSiteTarget ?: return null
|
||||
return psiTarget.getAnnotationUseSiteTarget()
|
||||
}
|
||||
|
||||
val source: SourceElement
|
||||
get() = withValidityAssertion { descriptor.source }
|
||||
|
||||
override val psi: KtCallElement?
|
||||
get() = withValidityAssertion { (source as? PsiSourceElement)?.psi as? KtAnnotationEntry }
|
||||
|
||||
override val arguments: List<KtNamedConstantValue>
|
||||
get() = withValidityAssertion {
|
||||
descriptor.allValueArguments.map { (name, value) -> KtNamedConstantValue(name.asString(), value.toKtConstantValue()) }
|
||||
}
|
||||
}
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.KtFe10DescMemberSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktHasStableParameterNames
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtAnonymousFunctionSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.returnTypeOrNothing
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
||||
|
||||
internal class KtFe10DescAnonymousFunctionSymbol(
|
||||
override val descriptor: FunctionDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtAnonymousFunctionSymbol(), KtFe10DescMemberSymbol<FunctionDescriptor> {
|
||||
override val isExtension: Boolean
|
||||
get() = withValidityAssertion { descriptor.isExtension }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol>
|
||||
get() = withValidityAssertion { descriptor.valueParameters.map { KtFe10DescValueParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion { descriptor.ktHasStableParameterNames }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { descriptor.returnTypeOrNothing.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val receiverType: KtTypeAndAnnotations?
|
||||
get() = withValidityAssertion { descriptor.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtAnonymousFunctionSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.KtFe10DescMemberSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtAnonymousObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
|
||||
internal class KtFe10DescAnonymousObjectSymbol(
|
||||
override val descriptor: ClassDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtAnonymousObjectSymbol(), KtFe10DescMemberSymbol<ClassDescriptor> {
|
||||
override val superTypes: List<KtTypeAndAnnotations>
|
||||
get() = withValidityAssertion { descriptor.typeConstructor.supertypes.map { it.toKtTypeAndAnnotations(analysisSession) } }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtAnonymousObjectSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10DescFunctionLikeSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
internal class KtFe10DescConstructorSymbol(
|
||||
override val descriptor: ConstructorDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtConstructorSymbol(), KtFe10DescMemberSymbol<ConstructorDescriptor> {
|
||||
override val isPrimary: Boolean
|
||||
get() = withValidityAssertion { descriptor.isPrimary }
|
||||
|
||||
override val containingClassIdIfNonLocal: ClassId?
|
||||
get() = withValidityAssertion { descriptor.constructedClass.classId }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol>
|
||||
get() = withValidityAssertion { descriptor.valueParameters.map { KtFe10DescValueParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion { descriptor.ktHasStableParameterNames }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { descriptor.returnType.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val dispatchType: KtType?
|
||||
get() = withValidityAssertion {
|
||||
val containingClass = descriptor.constructedClass.containingDeclaration as? ClassDescriptor ?: return null
|
||||
return containingClass.defaultType.toKtType(analysisSession)
|
||||
}
|
||||
|
||||
override val typeParameters: List<KtTypeParameterSymbol>
|
||||
get() = withValidityAssertion { descriptor.typeParameters.map { KtFe10DescTypeParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtConstructorSymbol> = withValidityAssertion {
|
||||
val pointerByPsi = KtPsiBasedSymbolPointer.createForSymbolFromSource(this)
|
||||
if (pointerByPsi != null) {
|
||||
return pointerByPsi
|
||||
}
|
||||
|
||||
val callableId = descriptor.callableId
|
||||
if (callableId != null && !callableId.isLocal) {
|
||||
val signature = descriptor.getSymbolPointerSignature(analysisSession)
|
||||
return KtFe10DescFunctionLikeSymbolPointer(callableId, signature)
|
||||
}
|
||||
|
||||
return KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.KtFe10DescMemberSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.classId
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10DescEnumEntrySymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
internal class KtFe10DescEnumEntrySymbol(
|
||||
override val descriptor: ClassDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtEnumEntrySymbol(), KtFe10DescMemberSymbol<ClassDescriptor> {
|
||||
private val enumDescriptor: ClassDescriptor
|
||||
get() = descriptor.containingDeclaration as ClassDescriptor
|
||||
|
||||
override val containingEnumClassIdIfNonLocal: ClassId?
|
||||
get() = withValidityAssertion { enumDescriptor.classId }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId?
|
||||
get() = withValidityAssertion {
|
||||
val enumClassId = enumDescriptor.classId ?: return null
|
||||
CallableId(
|
||||
packageName = enumClassId.packageFqName,
|
||||
className = enumClassId.relativeClassName,
|
||||
callableName = descriptor.name
|
||||
)
|
||||
}
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { enumDescriptor.defaultType.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { descriptor.name }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtEnumEntrySymbol> = withValidityAssertion {
|
||||
val pointerByPsi = KtPsiBasedSymbolPointer.createForSymbolFromSource(this)
|
||||
if (pointerByPsi != null) {
|
||||
return pointerByPsi
|
||||
}
|
||||
|
||||
val enumClassId = enumDescriptor.classId
|
||||
if (enumClassId != null) {
|
||||
return KtFe10DescEnumEntrySymbolPointer(enumClassId, descriptor.name)
|
||||
}
|
||||
|
||||
return KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+98
@@ -0,0 +1,98 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10DescFunctionLikeSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.returnTypeOrNothing
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
||||
|
||||
internal class KtFe10DescFunctionSymbol(
|
||||
override val descriptor: FunctionDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtFunctionSymbol(), KtFe10DescMemberSymbol<FunctionDescriptor> {
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { descriptor.name }
|
||||
|
||||
override val symbolKind: KtSymbolKind
|
||||
get() = withValidityAssertion { descriptor.ktSymbolKind }
|
||||
|
||||
override val isSuspend: Boolean
|
||||
get() = withValidityAssertion { descriptor.isSuspend }
|
||||
|
||||
override val isOperator: Boolean
|
||||
get() = withValidityAssertion { descriptor.isOperator }
|
||||
|
||||
override val isExternal: Boolean
|
||||
get() = withValidityAssertion { descriptor.isExternal }
|
||||
|
||||
override val isInline: Boolean
|
||||
get() = withValidityAssertion { descriptor.isInline }
|
||||
|
||||
override val isOverride: Boolean
|
||||
get() = withValidityAssertion { descriptor.isExplicitOverride }
|
||||
|
||||
override val isInfix: Boolean
|
||||
get() = withValidityAssertion { descriptor.isInfix }
|
||||
|
||||
override val isStatic: Boolean
|
||||
get() = withValidityAssertion { descriptor is JavaCallableMemberDescriptor && DescriptorUtils.isStaticDeclaration(descriptor) }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol>
|
||||
get() = withValidityAssertion { descriptor.valueParameters.map { KtFe10DescValueParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion { descriptor.ktHasStableParameterNames }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId?
|
||||
get() = withValidityAssertion { descriptor.callableId }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { descriptor.returnTypeOrNothing.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val receiverType: KtTypeAndAnnotations?
|
||||
get() = withValidityAssertion { descriptor.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val isExtension: Boolean
|
||||
get() = withValidityAssertion { descriptor.isExtension }
|
||||
|
||||
override val dispatchType: KtType?
|
||||
get() = withValidityAssertion { descriptor.dispatchReceiverParameter?.type?.toKtType(analysisSession) }
|
||||
|
||||
override val typeParameters: List<KtTypeParameterSymbol>
|
||||
get() = withValidityAssertion { descriptor.typeParameters.map { KtFe10DescTypeParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtFunctionSymbol> = withValidityAssertion {
|
||||
val pointerByPsi = KtPsiBasedSymbolPointer.createForSymbolFromSource(this)
|
||||
if (pointerByPsi != null) {
|
||||
return pointerByPsi
|
||||
}
|
||||
|
||||
val callableId = descriptor.callableId
|
||||
if (callableId != null && !callableId.isLocal) {
|
||||
val signature = descriptor.getSymbolPointerSignature(analysisSession)
|
||||
return KtFe10DescFunctionLikeSymbolPointer(callableId, signature)
|
||||
}
|
||||
|
||||
return KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.KtFe10DescMemberSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.callableId
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtJavaFieldSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
|
||||
internal class KtFe10DescJavaFieldSymbol(
|
||||
override val descriptor: JavaPropertyDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtJavaFieldSymbol(), KtFe10DescMemberSymbol<JavaPropertyDescriptor> {
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { descriptor.name }
|
||||
|
||||
override val isStatic: Boolean
|
||||
get() = withValidityAssertion { DescriptorUtils.isStaticDeclaration(descriptor) }
|
||||
|
||||
override val isVal: Boolean
|
||||
get() = withValidityAssertion { !descriptor.isVar }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId?
|
||||
get() = withValidityAssertion { descriptor.callableId }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { descriptor.returnType.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtJavaFieldSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+102
@@ -0,0 +1,102 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
||||
|
||||
internal class KtFe10DescKotlinPropertySymbol(
|
||||
override val descriptor: PropertyDescriptorImpl,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtKotlinPropertySymbol(), KtFe10DescMemberSymbol<PropertyDescriptorImpl> {
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { descriptor.name }
|
||||
|
||||
override val symbolKind: KtSymbolKind
|
||||
get() = withValidityAssertion { descriptor.ktSymbolKind }
|
||||
|
||||
override val isLateInit: Boolean
|
||||
get() = withValidityAssertion { descriptor.isLateInit }
|
||||
|
||||
override val isConst: Boolean
|
||||
get() = withValidityAssertion { descriptor.isConst }
|
||||
|
||||
override val isVal: Boolean
|
||||
get() = withValidityAssertion { !descriptor.isVar }
|
||||
|
||||
override val isExtension: Boolean
|
||||
get() = withValidityAssertion { descriptor.isExtension }
|
||||
|
||||
override val isFromPrimaryConstructor: Boolean
|
||||
get() = withValidityAssertion { descriptor.containingDeclaration is ConstructorDescriptor }
|
||||
|
||||
override val isStatic: Boolean
|
||||
get() = withValidityAssertion { DescriptorUtils.isEnumEntry(descriptor) }
|
||||
|
||||
override val isOverride: Boolean
|
||||
get() = withValidityAssertion { descriptor.isExplicitOverride }
|
||||
|
||||
override val hasGetter: Boolean
|
||||
get() = withValidityAssertion { descriptor.getter != null }
|
||||
|
||||
override val hasSetter: Boolean
|
||||
get() = withValidityAssertion { descriptor.setter != null }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId?
|
||||
get() = withValidityAssertion { descriptor.callableId }
|
||||
|
||||
override val initializer: KtConstantValue?
|
||||
get() = withValidityAssertion { descriptor.compileTimeInitializer?.toKtConstantValue() }
|
||||
|
||||
override val getter: KtPropertyGetterSymbol?
|
||||
get() = withValidityAssertion {
|
||||
val getter = descriptor.getter ?: return null
|
||||
return KtFe10DescPropertyGetterSymbol(getter, analysisSession)
|
||||
}
|
||||
|
||||
override val setter: KtPropertySetterSymbol?
|
||||
get() = withValidityAssertion {
|
||||
val setter = descriptor.setter ?: return null
|
||||
return KtFe10DescPropertySetterSymbol(setter, analysisSession)
|
||||
}
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { descriptor.type.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val receiverType: KtTypeAndAnnotations?
|
||||
get() = withValidityAssertion { descriptor.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val dispatchType: KtType?
|
||||
get() = withValidityAssertion { descriptor.dispatchReceiverParameter?.type?.toKtType(analysisSession) }
|
||||
|
||||
override val hasBackingField: Boolean
|
||||
get() = withValidityAssertion {
|
||||
val bindingContext = analysisSession.resolveSession.bindingContext
|
||||
return bindingContext[BindingContext.BACKING_FIELD_REQUIRED, descriptor] == true
|
||||
}
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtKotlinPropertySymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.KtFe10DescSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtLocalVariableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
internal class KtFe10DescLocalVariableSymbol(
|
||||
override val descriptor: LocalVariableDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtLocalVariableSymbol(), KtFe10DescSymbol<LocalVariableDescriptor> {
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { descriptor.name }
|
||||
|
||||
override val isVal: Boolean
|
||||
get() = withValidityAssertion { !descriptor.isVar }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { descriptor.type.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val symbolKind: KtSymbolKind
|
||||
get() = withValidityAssertion { KtSymbolKind.LOCAL }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtLocalVariableSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+101
@@ -0,0 +1,101 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10DescNamedClassOrObjectSymbolSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassKind
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
|
||||
internal class KtFe10DescNamedClassOrObjectSymbol(
|
||||
override val descriptor: ClassDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtNamedClassOrObjectSymbol(), KtFe10DescMemberSymbol<ClassDescriptor> {
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { descriptor.name }
|
||||
|
||||
override val isInner: Boolean
|
||||
get() = withValidityAssertion { descriptor.isInner }
|
||||
|
||||
override val isData: Boolean
|
||||
get() = withValidityAssertion { descriptor.isData }
|
||||
|
||||
override val isInline: Boolean
|
||||
get() = withValidityAssertion { descriptor.isInline }
|
||||
|
||||
override val isFun: Boolean
|
||||
get() = withValidityAssertion { descriptor.isFun }
|
||||
|
||||
override val isExternal: Boolean
|
||||
get() = withValidityAssertion { descriptor.isExternal }
|
||||
|
||||
override val companionObject: KtNamedClassOrObjectSymbol?
|
||||
get() {
|
||||
withValidityAssertion {
|
||||
val companionObject = descriptor.companionObjectDescriptor ?: return null
|
||||
return KtFe10DescNamedClassOrObjectSymbol(companionObject, analysisSession)
|
||||
}
|
||||
}
|
||||
|
||||
override val classKind: KtClassKind
|
||||
get() = withValidityAssertion {
|
||||
if (descriptor.isCompanionObject) {
|
||||
return KtClassKind.COMPANION_OBJECT
|
||||
} else if (DescriptorUtils.isAnonymousObject(descriptor)) {
|
||||
error("Should be an anonymous object")
|
||||
}
|
||||
|
||||
return when (descriptor.kind) {
|
||||
ClassKind.CLASS -> KtClassKind.CLASS
|
||||
ClassKind.INTERFACE -> KtClassKind.INTERFACE
|
||||
ClassKind.ENUM_CLASS -> KtClassKind.ENUM_CLASS
|
||||
ClassKind.ENUM_ENTRY -> KtClassKind.ENUM_ENTRY
|
||||
ClassKind.ANNOTATION_CLASS -> KtClassKind.ANNOTATION_CLASS
|
||||
ClassKind.OBJECT -> KtClassKind.OBJECT
|
||||
}
|
||||
}
|
||||
|
||||
override val superTypes: List<KtTypeAndAnnotations>
|
||||
get() = withValidityAssertion {
|
||||
descriptor.getSupertypesWithAny().map { it.toKtTypeAndAnnotations(analysisSession) }
|
||||
}
|
||||
|
||||
override val classIdIfNonLocal: ClassId?
|
||||
get() = withValidityAssertion { descriptor.classId }
|
||||
|
||||
override val symbolKind: KtSymbolKind
|
||||
get() = withValidityAssertion { descriptor.ktSymbolKind }
|
||||
|
||||
override val typeParameters: List<KtTypeParameterSymbol>
|
||||
get() = withValidityAssertion { descriptor.declaredTypeParameters.map { KtFe10DescTypeParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtNamedClassOrObjectSymbol> = withValidityAssertion {
|
||||
val pointerByPsi = KtPsiBasedSymbolPointer.createForSymbolFromSource(this)
|
||||
if (pointerByPsi != null) {
|
||||
return pointerByPsi
|
||||
}
|
||||
|
||||
val classId = descriptor.classId
|
||||
if (classId != null) {
|
||||
return KtFe10DescNamedClassOrObjectSymbolSymbol(classId)
|
||||
}
|
||||
|
||||
return KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.PropertyGetterDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.SyntheticPropertyDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.hasBody
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.returnTypeOrNothing
|
||||
|
||||
internal class KtFe10DescPropertyGetterSymbol(
|
||||
override val descriptor: PropertyGetterDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtPropertyGetterSymbol(), KtFe10DescMemberSymbol<PropertyGetterDescriptor> {
|
||||
override val isDefault: Boolean
|
||||
get() = withValidityAssertion { descriptor.isDefault }
|
||||
|
||||
override val isInline: Boolean
|
||||
get() = withValidityAssertion { descriptor.isInline }
|
||||
|
||||
override val isOverride: Boolean
|
||||
get() = withValidityAssertion { descriptor.isExplicitOverride }
|
||||
|
||||
override val hasBody: Boolean
|
||||
get() = withValidityAssertion { descriptor.hasBody() }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol>
|
||||
get() = withValidityAssertion { descriptor.valueParameters.map { KtFe10DescValueParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion { descriptor.ktHasStableParameterNames }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId?
|
||||
get() = withValidityAssertion {
|
||||
val propertyDescriptor = descriptor.correspondingProperty
|
||||
return if (propertyDescriptor is SyntheticPropertyDescriptor) {
|
||||
propertyDescriptor.getMethod.callableId
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { descriptor.returnTypeOrNothing.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val receiverType: KtTypeAndAnnotations?
|
||||
get() = withValidityAssertion { descriptor.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val dispatchType: KtType?
|
||||
get() = withValidityAssertion { descriptor.dispatchReceiverParameter?.type?.toKtType(analysisSession) }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtPropertyGetterSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+73
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.PropertySetterDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.SyntheticPropertyDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.hasBody
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.returnTypeOrNothing
|
||||
|
||||
internal class KtFe10DescPropertySetterSymbol(
|
||||
override val descriptor: PropertySetterDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtPropertySetterSymbol(), KtFe10DescMemberSymbol<PropertySetterDescriptor> {
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { descriptor.returnTypeOrNothing.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val isDefault: Boolean
|
||||
get() = withValidityAssertion { descriptor.isDefault }
|
||||
|
||||
override val isInline: Boolean
|
||||
get() = withValidityAssertion { descriptor.isInline }
|
||||
|
||||
override val isOverride: Boolean
|
||||
get() = withValidityAssertion { descriptor.isExplicitOverride }
|
||||
|
||||
override val hasBody: Boolean
|
||||
get() = withValidityAssertion { descriptor.hasBody() }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol>
|
||||
get() = withValidityAssertion { descriptor.valueParameters.map { KtFe10DescValueParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion { descriptor.ktHasStableParameterNames }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId?
|
||||
get() = withValidityAssertion {
|
||||
val propertyDescriptor = descriptor.correspondingProperty
|
||||
return if (propertyDescriptor is SyntheticPropertyDescriptor) {
|
||||
propertyDescriptor.getMethod.callableId
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
override val parameter: KtValueParameterSymbol
|
||||
get() = withValidityAssertion { KtFe10DescValueParameterSymbol(descriptor.valueParameters.single(), analysisSession) }
|
||||
|
||||
override val receiverType: KtTypeAndAnnotations?
|
||||
get() = withValidityAssertion { descriptor.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val dispatchType: KtType?
|
||||
get() = withValidityAssertion { descriptor.dispatchReceiverParameter?.type?.toKtType(analysisSession) }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtPropertySetterSymbol> {
|
||||
withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
}
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10DescSamConstructorSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSamConstructorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.returnTypeOrNothing
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
||||
import org.jetbrains.kotlin.resolve.sam.SamConstructorDescriptor
|
||||
|
||||
internal class KtFe10DescSamConstructorSymbol(
|
||||
override val descriptor: SamConstructorDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtSamConstructorSymbol(), KtFe10DescSymbol<SamConstructorDescriptor> {
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { descriptor.name }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol>
|
||||
get() = withValidityAssertion { descriptor.valueParameters.map { KtFe10DescValueParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion { descriptor.ktHasStableParameterNames }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId?
|
||||
get() = withValidityAssertion { descriptor.callableId }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { descriptor.returnTypeOrNothing.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val receiverType: KtTypeAndAnnotations?
|
||||
get() = withValidityAssertion { descriptor.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val isExtension: Boolean
|
||||
get() = withValidityAssertion { descriptor.isExtension }
|
||||
|
||||
override val origin: KtSymbolOrigin
|
||||
get() = withValidityAssertion { KtSymbolOrigin.SAM_CONSTRUCTOR }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtSamConstructorSymbol> = withValidityAssertion {
|
||||
val pointerByPsi = KtPsiBasedSymbolPointer.createForSymbolFromSource(this)
|
||||
if (pointerByPsi != null) {
|
||||
return pointerByPsi
|
||||
}
|
||||
|
||||
val classId = descriptor.baseDescriptorForSynthetic.classId
|
||||
if (classId != null) {
|
||||
return KtFe10DescSamConstructorSymbolPointer(classId)
|
||||
}
|
||||
|
||||
return KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10DescSyntheticFieldSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtBackingFieldSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyAccessorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtVariableLikeSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl
|
||||
import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor
|
||||
import org.jetbrains.kotlin.load.kotlin.toSourceElement
|
||||
import org.jetbrains.kotlin.psi.KtPropertyAccessor
|
||||
import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer
|
||||
import org.jetbrains.kotlin.resolve.source.getPsi
|
||||
|
||||
internal class KtFe10DescSyntheticFieldSymbol(
|
||||
private val descriptor: SyntheticFieldDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtBackingFieldSymbol(), KtFe10Symbol {
|
||||
override val owningProperty: KtKotlinPropertySymbol
|
||||
get() = withValidityAssertion {
|
||||
val kotlinProperty = descriptor.propertyDescriptor as PropertyDescriptorImpl
|
||||
KtFe10DescKotlinPropertySymbol(kotlinProperty, analysisSession)
|
||||
}
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { descriptor.propertyDescriptor.type.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtVariableLikeSymbol> = withValidityAssertion {
|
||||
val accessorPsi = descriptor.containingDeclaration.toSourceElement.getPsi()
|
||||
if (accessorPsi is KtPropertyAccessor) {
|
||||
val accessorPointer = KtPsiBasedSymbolPointer<KtPropertyAccessorSymbol>(accessorPsi.createSmartPointer())
|
||||
return KtFe10DescSyntheticFieldSymbolPointer(accessorPointer)
|
||||
}
|
||||
|
||||
return KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+162
@@ -0,0 +1,162 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.*
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotationCall
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
||||
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
|
||||
|
||||
internal class KtFe10DescSyntheticJavaPropertySymbol(
|
||||
override val descriptor: SyntheticJavaPropertyDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtSyntheticJavaPropertySymbol(), KtFe10DescMemberSymbol<SyntheticJavaPropertyDescriptor> {
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { descriptor.name }
|
||||
|
||||
override val isFromPrimaryConstructor: Boolean
|
||||
get() = withValidityAssertion { descriptor.containingDeclaration is ConstructorDescriptor }
|
||||
|
||||
override val isOverride: Boolean
|
||||
get() = withValidityAssertion { descriptor.isExplicitOverride }
|
||||
|
||||
override val isStatic: Boolean
|
||||
get() = withValidityAssertion { DescriptorUtils.isStaticDeclaration(descriptor) }
|
||||
|
||||
override val isVal: Boolean
|
||||
get() = withValidityAssertion { !descriptor.isVar }
|
||||
|
||||
override val isExtension: Boolean
|
||||
get() = withValidityAssertion { descriptor.isExtension }
|
||||
|
||||
override val getter: KtPropertyGetterSymbol
|
||||
get() = withValidityAssertion {
|
||||
val getter = descriptor.getter ?: return EmptyGetterSymbol(descriptor, analysisSession)
|
||||
return KtFe10DescPropertyGetterSymbol(getter, analysisSession)
|
||||
}
|
||||
override val javaGetterSymbol: KtFunctionSymbol
|
||||
get() = withValidityAssertion { KtFe10DescFunctionSymbol(descriptor.getMethod, analysisSession) }
|
||||
|
||||
override val javaSetterSymbol: KtFunctionSymbol?
|
||||
get() = withValidityAssertion {
|
||||
val setMethod = descriptor.setMethod ?: return null
|
||||
return KtFe10DescFunctionSymbol(setMethod, analysisSession)
|
||||
}
|
||||
|
||||
override val hasSetter: Boolean
|
||||
get() = withValidityAssertion { descriptor.setter != null }
|
||||
|
||||
override val setter: KtPropertySetterSymbol?
|
||||
get() = withValidityAssertion {
|
||||
val setter = descriptor.setter ?: return null
|
||||
KtFe10DescPropertySetterSymbol(setter, analysisSession)
|
||||
}
|
||||
|
||||
override val initializer: KtConstantValue?
|
||||
get() = withValidityAssertion { descriptor.compileTimeInitializer?.toKtConstantValue() }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId?
|
||||
get() = withValidityAssertion { descriptor.callableId }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { descriptor.type.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val receiverType: KtTypeAndAnnotations?
|
||||
get() = withValidityAssertion { descriptor.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val dispatchType: KtType?
|
||||
get() = withValidityAssertion { descriptor.dispatchReceiverParameter?.type?.toKtType(analysisSession) }
|
||||
|
||||
override val origin: KtSymbolOrigin
|
||||
get() = withValidityAssertion { KtSymbolOrigin.JAVA_SYNTHETIC_PROPERTY }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtSyntheticJavaPropertySymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
|
||||
private class EmptyGetterSymbol(
|
||||
private val descriptor: SyntheticJavaPropertyDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtPropertyGetterSymbol(), KtFe10Symbol {
|
||||
override val isDefault: Boolean
|
||||
get() = withValidityAssertion { false }
|
||||
|
||||
override val isInline: Boolean
|
||||
get() = withValidityAssertion { false }
|
||||
|
||||
override val isOverride: Boolean
|
||||
get() = withValidityAssertion { descriptor.isExplicitOverride }
|
||||
|
||||
override val hasBody: Boolean
|
||||
get() = withValidityAssertion { false }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol>
|
||||
get() = withValidityAssertion { emptyList() }
|
||||
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion { true }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId?
|
||||
get() = withValidityAssertion { null }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { descriptor.type.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val origin: KtSymbolOrigin
|
||||
get() = withValidityAssertion { KtSymbolOrigin.JAVA }
|
||||
|
||||
override val psi: PsiElement?
|
||||
get() = withValidityAssertion { null }
|
||||
|
||||
override val receiverType: KtTypeAndAnnotations?
|
||||
get() = withValidityAssertion { descriptor.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val dispatchType: KtType?
|
||||
get() = withValidityAssertion { descriptor.dispatchReceiverParameter?.type?.toKtType(analysisSession) }
|
||||
|
||||
override val modality: Modality
|
||||
get() = withValidityAssertion { Modality.FINAL }
|
||||
|
||||
override val visibility: Visibility
|
||||
get() = withValidityAssertion { descriptor.ktVisibility }
|
||||
|
||||
override val annotations: List<KtAnnotationCall>
|
||||
get() = withValidityAssertion { emptyList() }
|
||||
|
||||
override fun containsAnnotation(classId: ClassId): Boolean {
|
||||
withValidityAssertion {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
override val annotationClassIds: Collection<ClassId>
|
||||
get() = withValidityAssertion { emptyList() }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtPropertyGetterSymbol> {
|
||||
withValidityAssertion {
|
||||
return KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+162
@@ -0,0 +1,162 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.*
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.*
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotationCall
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.load.java.descriptors.JavaForKotlinOverridePropertyDescriptor
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
||||
|
||||
internal class KtFe10DescSyntheticJavaPropertySymbolForOverride(
|
||||
override val descriptor: JavaForKotlinOverridePropertyDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtSyntheticJavaPropertySymbol(), KtFe10DescMemberSymbol<JavaForKotlinOverridePropertyDescriptor> {
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { descriptor.name }
|
||||
|
||||
override val isFromPrimaryConstructor: Boolean
|
||||
get() = withValidityAssertion { descriptor.containingDeclaration is ConstructorDescriptor }
|
||||
|
||||
override val isOverride: Boolean
|
||||
get() = withValidityAssertion { descriptor.isExplicitOverride }
|
||||
|
||||
override val isStatic: Boolean
|
||||
get() = withValidityAssertion { DescriptorUtils.isStaticDeclaration(descriptor) }
|
||||
|
||||
override val isVal: Boolean
|
||||
get() = withValidityAssertion { !descriptor.isVar }
|
||||
|
||||
override val isExtension: Boolean
|
||||
get() = withValidityAssertion { descriptor.isExtension }
|
||||
|
||||
override val getter: KtPropertyGetterSymbol
|
||||
get() = withValidityAssertion {
|
||||
val getter = descriptor.getter ?: return EmptyGetterSymbol(descriptor, analysisSession)
|
||||
return KtFe10DescPropertyGetterSymbol(getter, analysisSession)
|
||||
}
|
||||
override val javaGetterSymbol: KtFunctionSymbol
|
||||
get() = withValidityAssertion { KtFe10DescFunctionSymbol(descriptor.getterMethod, analysisSession) }
|
||||
|
||||
override val javaSetterSymbol: KtFunctionSymbol?
|
||||
get() = withValidityAssertion {
|
||||
val setMethod = descriptor.setterMethod ?: return null
|
||||
return KtFe10DescFunctionSymbol(setMethod, analysisSession)
|
||||
}
|
||||
|
||||
override val hasSetter: Boolean
|
||||
get() = withValidityAssertion { descriptor.setter != null }
|
||||
|
||||
override val setter: KtPropertySetterSymbol?
|
||||
get() = withValidityAssertion {
|
||||
val setter = descriptor.setter ?: return null
|
||||
KtFe10DescPropertySetterSymbol(setter, analysisSession)
|
||||
}
|
||||
|
||||
override val initializer: KtConstantValue?
|
||||
get() = withValidityAssertion { descriptor.compileTimeInitializer?.toKtConstantValue() }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId?
|
||||
get() = withValidityAssertion { descriptor.callableId }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { descriptor.type.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val receiverType: KtTypeAndAnnotations?
|
||||
get() = withValidityAssertion { descriptor.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val dispatchType: KtType?
|
||||
get() = withValidityAssertion { descriptor.dispatchReceiverParameter?.type?.toKtType(analysisSession) }
|
||||
|
||||
override val origin: KtSymbolOrigin
|
||||
get() = withValidityAssertion { KtSymbolOrigin.JAVA_SYNTHETIC_PROPERTY }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtSyntheticJavaPropertySymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
|
||||
private class EmptyGetterSymbol(
|
||||
private val descriptor: JavaForKotlinOverridePropertyDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtPropertyGetterSymbol(), KtFe10Symbol {
|
||||
override val isDefault: Boolean
|
||||
get() = withValidityAssertion { false }
|
||||
|
||||
override val isInline: Boolean
|
||||
get() = withValidityAssertion { false }
|
||||
|
||||
override val isOverride: Boolean
|
||||
get() = withValidityAssertion { descriptor.isExplicitOverride }
|
||||
|
||||
override val hasBody: Boolean
|
||||
get() = withValidityAssertion { false }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol>
|
||||
get() = withValidityAssertion { emptyList() }
|
||||
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion { true }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId?
|
||||
get() = withValidityAssertion { null }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { descriptor.type.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val origin: KtSymbolOrigin
|
||||
get() = withValidityAssertion { KtSymbolOrigin.JAVA }
|
||||
|
||||
override val psi: PsiElement?
|
||||
get() = withValidityAssertion { null }
|
||||
|
||||
override val receiverType: KtTypeAndAnnotations?
|
||||
get() = withValidityAssertion { descriptor.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisSession) }
|
||||
|
||||
override val dispatchType: KtType?
|
||||
get() = withValidityAssertion { descriptor.dispatchReceiverParameter?.type?.toKtType(analysisSession) }
|
||||
|
||||
override val modality: Modality
|
||||
get() = withValidityAssertion { Modality.FINAL }
|
||||
|
||||
override val visibility: Visibility
|
||||
get() = withValidityAssertion { descriptor.ktVisibility }
|
||||
|
||||
override val annotations: List<KtAnnotationCall>
|
||||
get() = withValidityAssertion { emptyList() }
|
||||
|
||||
override fun containsAnnotation(classId: ClassId): Boolean {
|
||||
withValidityAssertion {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
override val annotationClassIds: Collection<ClassId>
|
||||
get() = withValidityAssertion { emptyList() }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtPropertyGetterSymbol> {
|
||||
withValidityAssertion {
|
||||
return KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.KtFe10DescSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.classId
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktVisibility
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeAliasSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
internal class KtFe10DescTypeAliasSymbol(
|
||||
override val descriptor: TypeAliasDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtTypeAliasSymbol(), KtFe10DescSymbol<TypeAliasDescriptor> {
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { descriptor.name }
|
||||
|
||||
override val typeParameters: List<KtTypeParameterSymbol>
|
||||
get() = withValidityAssertion { descriptor.declaredTypeParameters.map { KtFe10DescTypeParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override val visibility: Visibility
|
||||
get() = withValidityAssertion { descriptor.ktVisibility }
|
||||
|
||||
override val expandedType: KtType
|
||||
get() = withValidityAssertion { descriptor.expandedType.toKtType(analysisSession) }
|
||||
|
||||
override val classIdIfNonLocal: ClassId?
|
||||
get() = withValidityAssertion { descriptor.classId }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtTypeAliasSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.KtFe10DescSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
|
||||
internal class KtFe10DescTypeParameterSymbol(
|
||||
override val descriptor: TypeParameterDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtTypeParameterSymbol(), KtFe10DescSymbol<TypeParameterDescriptor> {
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { descriptor.name }
|
||||
|
||||
override val upperBounds: List<KtType>
|
||||
get() = withValidityAssertion { descriptor.upperBounds.map { it.toKtType(analysisSession) } }
|
||||
|
||||
override val variance: Variance
|
||||
get() = withValidityAssertion { descriptor.variance }
|
||||
|
||||
override val isReified: Boolean
|
||||
get() = withValidityAssertion { descriptor.isReified }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtTypeParameterSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.KtFe10DescSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.name.SpecialNames
|
||||
import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue
|
||||
import org.jetbrains.kotlin.resolve.calls.components.isVararg
|
||||
|
||||
internal class KtFe10DescValueParameterSymbol(
|
||||
override val descriptor: ValueParameterDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtValueParameterSymbol(), KtFe10DescSymbol<ValueParameterDescriptor> {
|
||||
override val name: Name
|
||||
get() = withValidityAssertion {
|
||||
return when (val name = descriptor.name) {
|
||||
SpecialNames.IMPLICIT_SET_PARAMETER -> Name.identifier("value")
|
||||
else -> name
|
||||
}
|
||||
}
|
||||
|
||||
override val hasDefaultValue: Boolean
|
||||
get() = withValidityAssertion { descriptor.hasDefaultValue() }
|
||||
|
||||
override val isVararg: Boolean
|
||||
get() = withValidityAssertion { descriptor.isVararg }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion {
|
||||
return (descriptor.varargElementType ?: descriptor.type).toKtTypeAndAnnotations(analysisSession)
|
||||
}
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtValueParameterSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+299
@@ -0,0 +1,299 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased.base
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtStarProjectionTypeArgument
|
||||
import org.jetbrains.kotlin.analysis.api.KtTypeArgument
|
||||
import org.jetbrains.kotlin.analysis.api.KtTypeArgumentWithVariance
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.*
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.*
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10TypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.KtFe10Renderer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.*
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.*
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
||||
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl
|
||||
import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
||||
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor
|
||||
import org.jetbrains.kotlin.load.java.descriptors.JavaForKotlinOverridePropertyDescriptor
|
||||
import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.CapturedType
|
||||
import org.jetbrains.kotlin.resolve.constants.*
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
|
||||
import org.jetbrains.kotlin.resolve.sam.SamConstructorDescriptor
|
||||
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
|
||||
import org.jetbrains.kotlin.types.*
|
||||
import org.jetbrains.kotlin.types.checker.NewCapturedType
|
||||
import org.jetbrains.kotlin.types.checker.NewTypeVariableConstructor
|
||||
|
||||
internal val MemberDescriptor.ktSymbolKind: KtSymbolKind
|
||||
get() = when {
|
||||
containingDeclaration is PackageFragmentDescriptor -> KtSymbolKind.TOP_LEVEL
|
||||
DescriptorUtils.isLocal(this) -> KtSymbolKind.LOCAL
|
||||
else -> KtSymbolKind.CLASS_MEMBER
|
||||
}
|
||||
|
||||
internal val CallableMemberDescriptor.isExplicitOverride: Boolean
|
||||
get() {
|
||||
return (this !is PropertyAccessorDescriptor
|
||||
&& kind != CallableMemberDescriptor.Kind.FAKE_OVERRIDE
|
||||
&& overriddenDescriptors.isNotEmpty())
|
||||
}
|
||||
|
||||
internal val ClassDescriptor.isInterfaceLike: Boolean
|
||||
get() = when (kind) {
|
||||
ClassKind.CLASS, ClassKind.ENUM_CLASS, ClassKind.OBJECT, ClassKind.ENUM_ENTRY -> false
|
||||
else -> true
|
||||
}
|
||||
|
||||
internal fun DeclarationDescriptor.toKtSymbol(analysisSession: KtFe10AnalysisSession): KtSymbol? {
|
||||
if (this is ClassDescriptor && kind == ClassKind.ENUM_ENTRY) {
|
||||
return KtFe10DescEnumEntrySymbol(this, analysisSession)
|
||||
}
|
||||
|
||||
return when (this) {
|
||||
is ClassifierDescriptor -> toKtClassifierSymbol(analysisSession)
|
||||
is CallableDescriptor -> toKtCallableSymbol(analysisSession)
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
internal fun ClassifierDescriptor.toKtClassifierSymbol(analysisSession: KtFe10AnalysisSession): KtClassifierSymbol? {
|
||||
return when (this) {
|
||||
is TypeAliasDescriptor -> KtFe10DescTypeAliasSymbol(this, analysisSession)
|
||||
is TypeParameterDescriptor -> KtFe10DescTypeParameterSymbol(this, analysisSession)
|
||||
is ClassDescriptor -> toKtClassSymbol(analysisSession)
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
internal fun ClassDescriptor.toKtClassSymbol(analysisSession: KtFe10AnalysisSession): KtClassOrObjectSymbol? {
|
||||
return if (DescriptorUtils.isAnonymousObject(this)) {
|
||||
KtFe10DescAnonymousObjectSymbol(this, analysisSession)
|
||||
} else {
|
||||
KtFe10DescNamedClassOrObjectSymbol(this, analysisSession)
|
||||
}
|
||||
}
|
||||
|
||||
internal fun ConstructorDescriptor.toKtConstructorSymbol(analysisSession: KtFe10AnalysisSession): KtConstructorSymbol {
|
||||
if (this is TypeAliasConstructorDescriptor) {
|
||||
return this.underlyingConstructorDescriptor.toKtConstructorSymbol(analysisSession)
|
||||
}
|
||||
|
||||
return KtFe10DescConstructorSymbol(this, analysisSession)
|
||||
}
|
||||
|
||||
internal val CallableMemberDescriptor.ktHasStableParameterNames: Boolean
|
||||
get() = when {
|
||||
this is ConstructorDescriptor && isPrimary && constructedClass.kind == ClassKind.ANNOTATION_CLASS -> true
|
||||
isExpect -> false
|
||||
else -> when (this) {
|
||||
is JavaCallableMemberDescriptor -> false
|
||||
else -> hasStableParameterNames()
|
||||
}
|
||||
}
|
||||
|
||||
internal fun CallableDescriptor.toKtCallableSymbol(analysisSession: KtFe10AnalysisSession): KtCallableSymbol? {
|
||||
return when (this) {
|
||||
is PropertyGetterDescriptor -> KtFe10DescPropertyGetterSymbol(this, analysisSession)
|
||||
is PropertySetterDescriptor -> KtFe10DescPropertySetterSymbol(this, analysisSession)
|
||||
is SamConstructorDescriptor -> KtFe10DescSamConstructorSymbol(this, analysisSession)
|
||||
is ConstructorDescriptor -> toKtConstructorSymbol(analysisSession)
|
||||
is FunctionDescriptor -> {
|
||||
if (DescriptorUtils.isAnonymousFunction(this)) {
|
||||
KtFe10DescAnonymousFunctionSymbol(this, analysisSession)
|
||||
} else {
|
||||
KtFe10DescFunctionSymbol(this, analysisSession)
|
||||
}
|
||||
}
|
||||
is SyntheticFieldDescriptor -> KtFe10DescSyntheticFieldSymbol(this, analysisSession)
|
||||
is LocalVariableDescriptor -> KtFe10DescLocalVariableSymbol(this, analysisSession)
|
||||
is ValueParameterDescriptor -> KtFe10DescValueParameterSymbol(this, analysisSession)
|
||||
is SyntheticJavaPropertyDescriptor -> KtFe10DescSyntheticJavaPropertySymbol(this, analysisSession)
|
||||
is JavaForKotlinOverridePropertyDescriptor -> KtFe10DescSyntheticJavaPropertySymbolForOverride(this, analysisSession)
|
||||
is JavaPropertyDescriptor -> KtFe10DescJavaFieldSymbol(this, analysisSession)
|
||||
is PropertyDescriptorImpl -> KtFe10DescKotlinPropertySymbol(this, analysisSession)
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
internal fun KotlinType.toKtType(analysisSession: KtFe10AnalysisSession): KtType {
|
||||
return when (val unwrappedType = unwrap()) {
|
||||
is FlexibleType -> KtFe10FlexibleType(unwrappedType, analysisSession)
|
||||
is DefinitelyNotNullType -> KtFe10DefinitelyNotNullType(unwrappedType, analysisSession)
|
||||
is ErrorType -> KtFe10ClassErrorType(unwrappedType, analysisSession)
|
||||
is CapturedType -> KtFe10CapturedType(unwrappedType, analysisSession)
|
||||
is NewCapturedType -> KtFe10NewCapturedType(unwrappedType, analysisSession)
|
||||
is SimpleType -> {
|
||||
val typeParameterDescriptor = TypeUtils.getTypeParameterDescriptorOrNull(unwrappedType)
|
||||
if (typeParameterDescriptor != null) {
|
||||
return KtFe10TypeParameterType(unwrappedType, typeParameterDescriptor, analysisSession)
|
||||
}
|
||||
|
||||
val typeConstructor = unwrappedType.constructor
|
||||
|
||||
if (typeConstructor is NewTypeVariableConstructor) {
|
||||
val newTypeParameterDescriptor = typeConstructor.originalTypeParameter
|
||||
return if (newTypeParameterDescriptor != null) {
|
||||
KtFe10TypeParameterType(unwrappedType, newTypeParameterDescriptor, analysisSession)
|
||||
} else {
|
||||
KtFe10ClassErrorType(ErrorUtils.createErrorType("Unresolved type parameter type") as ErrorType, analysisSession)
|
||||
}
|
||||
}
|
||||
|
||||
if (typeConstructor is IntersectionTypeConstructor) {
|
||||
return KtFe10IntersectionType(unwrappedType, typeConstructor.supertypes, analysisSession)
|
||||
}
|
||||
|
||||
return when (val typeDeclaration = typeConstructor.declarationDescriptor) {
|
||||
is FunctionClassDescriptor -> KtFe10FunctionalType(unwrappedType, typeDeclaration, analysisSession)
|
||||
is ClassDescriptor -> KtFe10UsualClassType(unwrappedType, typeDeclaration, analysisSession)
|
||||
else -> {
|
||||
val errorType = ErrorUtils.createErrorTypeWithCustomConstructor("Unresolved class type", typeConstructor)
|
||||
KtFe10ClassErrorType(errorType as ErrorType, analysisSession)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else -> error("Unexpected type $this")
|
||||
}
|
||||
}
|
||||
|
||||
internal fun KotlinType.toKtTypeAndAnnotations(analysisSession: KtFe10AnalysisSession): KtTypeAndAnnotations {
|
||||
return KtFe10TypeAndAnnotations(toKtType(analysisSession), this, analysisSession.token)
|
||||
}
|
||||
|
||||
internal fun TypeProjection.toKtTypeArgument(analysisSession: KtFe10AnalysisSession): KtTypeArgument {
|
||||
return if (isStarProjection) {
|
||||
KtStarProjectionTypeArgument(analysisSession.token)
|
||||
} else {
|
||||
KtTypeArgumentWithVariance(type.toKtType(analysisSession), this.projectionKind, analysisSession.token)
|
||||
}
|
||||
}
|
||||
|
||||
internal val KotlinType.ktNullability: KtTypeNullability
|
||||
get() = when {
|
||||
this.isNullabilityFlexible() -> KtTypeNullability.UNKNOWN
|
||||
this.isMarkedNullable -> KtTypeNullability.NULLABLE
|
||||
else -> KtTypeNullability.NON_NULLABLE
|
||||
}
|
||||
|
||||
internal val DeclarationDescriptorWithVisibility.ktVisibility: Visibility
|
||||
get() = when (visibility) {
|
||||
DescriptorVisibilities.PUBLIC -> Visibilities.Public
|
||||
DescriptorVisibilities.PROTECTED -> Visibilities.Protected
|
||||
DescriptorVisibilities.INTERNAL -> Visibilities.Internal
|
||||
DescriptorVisibilities.PRIVATE -> Visibilities.Private
|
||||
DescriptorVisibilities.PRIVATE_TO_THIS -> Visibilities.PrivateToThis
|
||||
DescriptorVisibilities.LOCAL -> Visibilities.Local
|
||||
DescriptorVisibilities.INVISIBLE_FAKE -> Visibilities.InvisibleFake
|
||||
DescriptorVisibilities.INHERITED -> Visibilities.Inherited
|
||||
else -> Visibilities.Unknown
|
||||
}
|
||||
|
||||
internal fun ConstantValue<*>.toKtConstantValue(): KtConstantValue {
|
||||
return when (this) {
|
||||
is BooleanValue -> KtLiteralConstantValue(ConstantValueKind.Boolean, value, null)
|
||||
is CharValue -> KtLiteralConstantValue(ConstantValueKind.Char, value, null)
|
||||
is ByteValue -> KtLiteralConstantValue(ConstantValueKind.Byte, value, null)
|
||||
is UByteValue -> KtLiteralConstantValue(ConstantValueKind.UnsignedByte, value, null)
|
||||
is ShortValue -> KtLiteralConstantValue(ConstantValueKind.Short, value, null)
|
||||
is UShortValue -> KtLiteralConstantValue(ConstantValueKind.UnsignedShort, value, null)
|
||||
is IntValue -> KtLiteralConstantValue(ConstantValueKind.Int, value, null)
|
||||
is UIntValue -> KtLiteralConstantValue(ConstantValueKind.UnsignedInt, value, null)
|
||||
is LongValue -> KtLiteralConstantValue(ConstantValueKind.Long, value, null)
|
||||
is ULongValue -> KtLiteralConstantValue(ConstantValueKind.UnsignedLong, value, null)
|
||||
is FloatValue -> KtLiteralConstantValue(ConstantValueKind.Float, value, null)
|
||||
is DoubleValue -> KtLiteralConstantValue(ConstantValueKind.Double, value, null)
|
||||
is NullValue -> KtLiteralConstantValue(ConstantValueKind.Null, null, null)
|
||||
is StringValue -> KtLiteralConstantValue(ConstantValueKind.String, value, null)
|
||||
is ArrayValue -> KtArrayConstantValue(value.map { it.toKtConstantValue() }, null)
|
||||
is EnumValue -> KtEnumEntryConstantValue(CallableId(enumClassId, enumEntryName), null)
|
||||
is AnnotationValue -> {
|
||||
val arguments = value.allValueArguments.map { (name, v) -> KtNamedConstantValue(name.asString(), v.toKtConstantValue()) }
|
||||
KtAnnotationConstantValue(value.annotationClass?.classId, arguments, null)
|
||||
}
|
||||
else -> KtUnsupportedConstantValue
|
||||
}
|
||||
}
|
||||
|
||||
internal val CallableMemberDescriptor.callableId: CallableId?
|
||||
get() {
|
||||
var current: DeclarationDescriptor = containingDeclaration
|
||||
|
||||
val localName = mutableListOf<String>()
|
||||
val className = mutableListOf<String>()
|
||||
|
||||
while (true) {
|
||||
when (current) {
|
||||
is PackageFragmentDescriptor -> {
|
||||
return CallableId(
|
||||
packageName = current.fqName,
|
||||
className = if (className.isNotEmpty()) FqName.fromSegments(className.asReversed()) else null,
|
||||
callableName = name,
|
||||
pathToLocal = if (localName.isNotEmpty()) FqName.fromSegments(localName.asReversed()) else null
|
||||
)
|
||||
}
|
||||
is ClassDescriptor -> className += current.name.asString()
|
||||
is PropertyAccessorDescriptor -> {} // Filter out property accessors
|
||||
is CallableDescriptor -> localName += current.name.asString()
|
||||
}
|
||||
|
||||
current = current.containingDeclaration ?: return null
|
||||
}
|
||||
}
|
||||
|
||||
internal fun getSymbolDescriptor(symbol: KtSymbol): DeclarationDescriptor? {
|
||||
return when (symbol) {
|
||||
is KtFe10DescSymbol<*> -> symbol.descriptor
|
||||
is KtFe10PsiSymbol<*, *> -> symbol.descriptor
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
internal val ClassifierDescriptor.classId: ClassId?
|
||||
get() = when (val owner = containingDeclaration) {
|
||||
is PackageFragmentDescriptor -> ClassId(owner.fqName, name)
|
||||
is ClassifierDescriptorWithTypeParameters -> owner.classId?.createNestedClassId(name)
|
||||
else -> null
|
||||
}
|
||||
|
||||
internal val ClassifierDescriptor.maybeLocalClassId: ClassId
|
||||
get() = classId ?: ClassId(containingPackage() ?: FqName.ROOT, FqName.topLevel(this.name), true)
|
||||
|
||||
internal fun ClassDescriptor.getSupertypesWithAny(): Collection<KotlinType> {
|
||||
val supertypes = typeConstructor.supertypes
|
||||
if (isInterfaceLike) {
|
||||
return supertypes
|
||||
}
|
||||
|
||||
val hasClassSupertype = supertypes.any { (it.constructor.declarationDescriptor as? ClassDescriptor)?.kind == ClassKind.CLASS }
|
||||
return if (hasClassSupertype) supertypes else listOf(builtIns.anyType) + supertypes
|
||||
}
|
||||
|
||||
internal fun DeclarationDescriptor.render(analysisSession: KtFe10AnalysisSession, options: KtDeclarationRendererOptions): String {
|
||||
val renderer = KtFe10Renderer(analysisSession, options)
|
||||
val consumer = StringBuilder()
|
||||
renderer.render(this, consumer)
|
||||
return consumer.toString().trim()
|
||||
}
|
||||
|
||||
internal fun CallableMemberDescriptor.getSymbolPointerSignature(analysisSession: KtFe10AnalysisSession): String {
|
||||
return render(analysisSession, KtDeclarationRendererOptions.DEFAULT)
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased.base
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithKind
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithModality
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.MemberDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
|
||||
internal interface KtFe10DescMemberSymbol<T : MemberDescriptor> :
|
||||
KtFe10DescSymbol<T>, KtSymbolWithVisibility, KtSymbolWithModality, KtSymbolWithKind {
|
||||
override val modality: Modality
|
||||
get() = withValidityAssertion { descriptor.modality }
|
||||
|
||||
override val visibility: Visibility
|
||||
get() = withValidityAssertion { descriptor.ktVisibility }
|
||||
}
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.descriptorBased.base
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10AnnotatedSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource
|
||||
import org.jetbrains.kotlin.descriptors.SourceElement
|
||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||
import org.jetbrains.kotlin.load.java.sources.JavaSourceElement
|
||||
import org.jetbrains.kotlin.resolve.source.KotlinSourceElement
|
||||
import org.jetbrains.kotlin.resolve.source.PsiSourceElement
|
||||
|
||||
internal interface KtFe10DescSymbol<T : DeclarationDescriptor> : KtFe10Symbol, KtFe10AnnotatedSymbol {
|
||||
val descriptor: T
|
||||
|
||||
override val annotationsObject: Annotations
|
||||
get() = descriptor.annotations
|
||||
|
||||
val source: SourceElement
|
||||
get() {
|
||||
val descriptor = this.descriptor
|
||||
if (descriptor is CallableMemberDescriptor && descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
|
||||
val firstOverridden = descriptor.overriddenDescriptors.firstOrNull()
|
||||
if (firstOverridden != null) {
|
||||
return firstOverridden.source
|
||||
}
|
||||
}
|
||||
|
||||
return (descriptor as? DeclarationDescriptorWithSource)?.source ?: SourceElement.NO_SOURCE
|
||||
}
|
||||
|
||||
override val psi: PsiElement?
|
||||
get() = withValidityAssertion { (source as? PsiSourceElement)?.psi }
|
||||
|
||||
override val origin: KtSymbolOrigin
|
||||
get() = withValidityAssertion {
|
||||
val descriptor = this.descriptor
|
||||
if (descriptor is CallableMemberDescriptor) {
|
||||
// TODO: Add SUBSTITUTION_OVERRIDE when supported in HL API
|
||||
when (descriptor.kind) {
|
||||
CallableMemberDescriptor.Kind.FAKE_OVERRIDE -> return KtSymbolOrigin.INTERSECTION_OVERRIDE
|
||||
CallableMemberDescriptor.Kind.SYNTHESIZED -> return KtSymbolOrigin.SOURCE_MEMBER_GENERATED
|
||||
else -> {}
|
||||
}
|
||||
}
|
||||
|
||||
when (source) {
|
||||
is KotlinSourceElement -> KtSymbolOrigin.SOURCE
|
||||
is JavaSourceElement -> KtSymbolOrigin.JAVA
|
||||
else -> KtSymbolOrigin.LIBRARY
|
||||
}
|
||||
}
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.pointers
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescEnumEntrySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
|
||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class KtFe10DescEnumEntrySymbolPointer(private val classId: ClassId, private val entryName: Name) : KtSymbolPointer<KtEnumEntrySymbol>() {
|
||||
@Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol")
|
||||
override fun restoreSymbol(analysisSession: KtAnalysisSession): KtEnumEntrySymbol? {
|
||||
check(analysisSession is KtFe10AnalysisSession)
|
||||
val entryDescriptor = analysisSession.resolveSession.moduleDescriptor.findClassAcrossModuleDependencies(classId)
|
||||
?.unsubstitutedMemberScope
|
||||
?.getContributedClassifier(entryName, NoLookupLocation.FROM_IDE)
|
||||
|
||||
if (entryDescriptor is ClassDescriptor && entryDescriptor.kind == ClassKind.ENUM_ENTRY) {
|
||||
return KtFe10DescEnumEntrySymbol(entryDescriptor, analysisSession)
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
}
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.pointers
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolPointerSignature
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||
|
||||
class KtFe10DescFunctionLikeSymbolPointer<T : KtFunctionLikeSymbol>(
|
||||
private val callableId: CallableId,
|
||||
private val signature: String
|
||||
) : KtSymbolPointer<T>() {
|
||||
@Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol")
|
||||
override fun restoreSymbol(analysisSession: KtAnalysisSession): T? {
|
||||
check(analysisSession is KtFe10AnalysisSession)
|
||||
|
||||
val className = callableId.className
|
||||
val memberScope = if (className != null) {
|
||||
val outerClassId = ClassId(callableId.packageName, className, false)
|
||||
analysisSession.resolveSession.moduleDescriptor.findClassAcrossModuleDependencies(outerClassId)
|
||||
?.unsubstitutedMemberScope
|
||||
?: MemberScope.Empty
|
||||
} else {
|
||||
analysisSession.resolveSession.moduleDescriptor.getPackage(callableId.packageName).memberScope
|
||||
}
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
return memberScope
|
||||
.getContributedDescriptors(DescriptorKindFilter.CALLABLES) { it == callableId.callableName }
|
||||
.filterIsInstance<CallableMemberDescriptor>()
|
||||
.firstOrNull { it.getSymbolPointerSignature(analysisSession) == signature }
|
||||
?.toKtCallableSymbol(analysisSession) as? T
|
||||
}
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.pointers
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescNamedClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
class KtFe10DescNamedClassOrObjectSymbolSymbol(private val classId: ClassId) : KtSymbolPointer<KtNamedClassOrObjectSymbol>() {
|
||||
@Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol")
|
||||
override fun restoreSymbol(analysisSession: KtAnalysisSession): KtNamedClassOrObjectSymbol? {
|
||||
check(analysisSession is KtFe10AnalysisSession)
|
||||
val descriptor = analysisSession.resolveSession.moduleDescriptor.findClassAcrossModuleDependencies(classId) ?: return null
|
||||
return KtFe10DescNamedClassOrObjectSymbol(descriptor, analysisSession)
|
||||
}
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.pointers
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescSamConstructorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSamConstructorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
|
||||
import org.jetbrains.kotlin.load.java.sam.JvmSamConversionOracle
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.resolve.sam.createSamConstructorFunction
|
||||
import org.jetbrains.kotlin.resolve.sam.getSingleAbstractMethodOrNull
|
||||
|
||||
class KtFe10DescSamConstructorSymbolPointer(private val classId: ClassId) : KtSymbolPointer<KtSamConstructorSymbol>() {
|
||||
@Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol")
|
||||
override fun restoreSymbol(analysisSession: KtAnalysisSession): KtSamConstructorSymbol? {
|
||||
check(analysisSession is KtFe10AnalysisSession)
|
||||
val samInterface = analysisSession.resolveSession.moduleDescriptor.findClassAcrossModuleDependencies(classId)
|
||||
if (samInterface == null || getSingleAbstractMethodOrNull(samInterface) == null) {
|
||||
return null
|
||||
}
|
||||
|
||||
val constructorDescriptor = createSamConstructorFunction(
|
||||
samInterface.containingDeclaration,
|
||||
samInterface,
|
||||
analysisSession.resolveSession.samConversionResolver,
|
||||
JvmSamConversionOracle(analysisSession.resolveSession.languageVersionSettings)
|
||||
)
|
||||
|
||||
return KtFe10DescSamConstructorSymbol(constructorDescriptor, analysisSession)
|
||||
}
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.pointers
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescSyntheticFieldSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtBackingFieldSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyAccessorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor
|
||||
|
||||
class KtFe10DescSyntheticFieldSymbolPointer(
|
||||
private val psiPointer: KtPsiBasedSymbolPointer<KtPropertyAccessorSymbol>
|
||||
) : KtSymbolPointer<KtBackingFieldSymbol>() {
|
||||
@Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol")
|
||||
override fun restoreSymbol(analysisSession: KtAnalysisSession): KtBackingFieldSymbol? {
|
||||
check(analysisSession is KtFe10AnalysisSession)
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
val accessorSymbol = psiPointer.restoreSymbol(analysisSession) ?: return null
|
||||
|
||||
val accessorDescriptor = getSymbolDescriptor(accessorSymbol) as? PropertyAccessorDescriptor ?: return null
|
||||
val syntheticFieldDescriptor = SyntheticFieldDescriptor(accessorDescriptor, accessorDescriptor.correspondingProperty.source)
|
||||
return KtFe10DescSyntheticFieldSymbol(syntheticFieldDescriptor, analysisSession)
|
||||
}
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.pointers
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
|
||||
internal class KtFe10NeverRestoringSymbolPointer<T : KtSymbol> : KtSymbolPointer<T>() {
|
||||
@Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol", ReplaceWith("null"))
|
||||
override fun restoreSymbol(analysisSession: KtAnalysisSession): T? {
|
||||
return null
|
||||
}
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.pointers
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.KtFe10PackageSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
|
||||
internal class KtFe10PackageSymbolPointer(private val packageName: FqName) : KtSymbolPointer<KtPackageSymbol>() {
|
||||
@Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol")
|
||||
override fun restoreSymbol(analysisSession: KtAnalysisSession): KtPackageSymbol {
|
||||
check(analysisSession is KtFe10AnalysisSession)
|
||||
return KtFe10PackageSymbol(packageName, analysisSession)
|
||||
}
|
||||
}
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.psiBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.createErrorTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtAnonymousFunctionSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.psi.KtNamedFunction
|
||||
import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10PsiAnonymousFunctionSymbol(
|
||||
override val psi: KtNamedFunction,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtAnonymousFunctionSymbol(), KtFe10PsiSymbol<KtNamedFunction, FunctionDescriptor> {
|
||||
override val descriptor: FunctionDescriptor? by cached {
|
||||
val bindingContext = analysisSession.analyze(psi, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
bindingContext[BindingContext.FUNCTION, psi]
|
||||
}
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol>
|
||||
get() = withValidityAssertion { psi.valueParameters.map { KtFe10PsiValueParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion { true }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion {
|
||||
descriptor?.returnType?.toKtTypeAndAnnotations(analysisSession) ?: createErrorTypeAndAnnotations()
|
||||
}
|
||||
|
||||
override val receiverType: KtTypeAndAnnotations?
|
||||
get() = withValidityAssertion {
|
||||
descriptor?.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisSession) ?: createErrorTypeAndAnnotations()
|
||||
}
|
||||
|
||||
override val isExtension: Boolean
|
||||
get() = withValidityAssertion { psi.isExtensionDeclaration() }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtAnonymousFunctionSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.psiBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtAnonymousObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.psi.KtObjectDeclaration
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10PsiAnonymousObjectSymbol(
|
||||
override val psi: KtObjectDeclaration,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtAnonymousObjectSymbol(), KtFe10PsiSymbol<KtObjectDeclaration, ClassDescriptor> {
|
||||
override val descriptor: ClassDescriptor? by cached {
|
||||
val bindingContext = analysisSession.analyze(psi, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
bindingContext[BindingContext.CLASS, psi]
|
||||
}
|
||||
|
||||
override val superTypes: List<KtTypeAndAnnotations>
|
||||
get() = withValidityAssertion {
|
||||
descriptor?.typeConstructor?.supertypes?.map { it.toKtTypeAndAnnotations(analysisSession) } ?: emptyList()
|
||||
}
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtAnonymousObjectSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.psiBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassInitializerSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.psi.KtClassInitializer
|
||||
|
||||
class KtFe10PsiClassInitializerSymbol(
|
||||
override val psi: KtClassInitializer,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtClassInitializerSymbol(), KtFe10Symbol {
|
||||
override val origin: KtSymbolOrigin
|
||||
get() = withValidityAssertion {
|
||||
return if (psi.containingKtFile.isCompiled) {
|
||||
KtSymbolOrigin.LIBRARY
|
||||
} else {
|
||||
KtSymbolOrigin.SOURCE
|
||||
}
|
||||
}
|
||||
|
||||
override val symbolKind: KtSymbolKind
|
||||
get() = withValidityAssertion { KtSymbolKind.CLASS_MEMBER }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtClassInitializerSymbol> {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.psiBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktVisibility
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.createErrorTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktVisibility
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.psi.KtConstructor
|
||||
import org.jetbrains.kotlin.psi.KtPrimaryConstructor
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10PsiConstructorSymbol(
|
||||
override val psi: KtConstructor<*>,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtConstructorSymbol(), KtFe10PsiSymbol<KtConstructor<*>, ConstructorDescriptor> {
|
||||
override val descriptor: ConstructorDescriptor? by cached {
|
||||
val bindingContext = analysisSession.analyze(psi, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
bindingContext[BindingContext.CONSTRUCTOR, psi]
|
||||
}
|
||||
|
||||
override val isPrimary: Boolean
|
||||
get() = withValidityAssertion { psi is KtPrimaryConstructor }
|
||||
|
||||
override val containingClassIdIfNonLocal: ClassId?
|
||||
get() = withValidityAssertion { psi.getContainingClassOrObject().getClassId() }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol>
|
||||
get() = withValidityAssertion { psi.valueParameters.map { KtFe10PsiValueParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion { true }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion {
|
||||
descriptor?.returnType?.toKtTypeAndAnnotations(analysisSession) ?: createErrorTypeAndAnnotations()
|
||||
}
|
||||
|
||||
override val dispatchType: KtType?
|
||||
get() = withValidityAssertion {
|
||||
val containingClass = descriptor?.constructedClass?.containingDeclaration as? ClassDescriptor ?: return null
|
||||
return containingClass.defaultType.toKtType(analysisSession)
|
||||
}
|
||||
|
||||
override val visibility: Visibility
|
||||
get() = withValidityAssertion { psi.ktVisibility ?: descriptor?.ktVisibility ?: Visibilities.Public }
|
||||
|
||||
override val typeParameters: List<KtTypeParameterSymbol>
|
||||
get() = withValidityAssertion { psi.typeParameters.map { KtFe10PsiTypeParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtConstructorSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.psiBased
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.createErrorTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotationCall
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.KtPropertyAccessor
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10PsiDefaultSetterParameterSymbol(
|
||||
private val accessorPsi: KtPropertyAccessor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtValueParameterSymbol(), KtFe10Symbol {
|
||||
private val descriptor: VariableDescriptor? by cached {
|
||||
val bindingContext = analysisSession.analyze(accessorPsi, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
bindingContext[BindingContext.PROPERTY_ACCESSOR, accessorPsi]?.valueParameters?.single()
|
||||
}
|
||||
|
||||
override val origin: KtSymbolOrigin
|
||||
get() = withValidityAssertion { KtSymbolOrigin.SOURCE_MEMBER_GENERATED }
|
||||
|
||||
override val hasDefaultValue: Boolean
|
||||
get() = withValidityAssertion { false }
|
||||
|
||||
override val isVararg: Boolean
|
||||
get() = withValidityAssertion { false }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { descriptor?.type?.toKtTypeAndAnnotations(analysisSession) ?: createErrorTypeAndAnnotations() }
|
||||
|
||||
override val psi: PsiElement?
|
||||
get() = withValidityAssertion { null }
|
||||
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { descriptor?.name ?: Name.identifier("value") }
|
||||
|
||||
override val annotations: List<KtAnnotationCall>
|
||||
get() = withValidityAssertion { emptyList() }
|
||||
|
||||
override fun containsAnnotation(classId: ClassId): Boolean = withValidityAssertion {
|
||||
return false
|
||||
}
|
||||
|
||||
override val annotationClassIds: Collection<ClassId>
|
||||
get() = withValidityAssertion { emptyList() }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtValueParameterSymbol> = withValidityAssertion {
|
||||
return KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.psiBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.callableId
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.createErrorTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.KtEnumEntry
|
||||
import org.jetbrains.kotlin.psi.psiUtil.containingClass
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10PsiEnumEntrySymbol(
|
||||
override val psi: KtEnumEntry,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtEnumEntrySymbol(), KtFe10PsiSymbol<KtEnumEntry, ClassDescriptor> {
|
||||
override val descriptor: ClassDescriptor? by cached {
|
||||
val bindingContext = analysisSession.analyze(psi, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
bindingContext[BindingContext.CLASS, psi]
|
||||
}
|
||||
|
||||
override val containingEnumClassIdIfNonLocal: ClassId?
|
||||
get() = withValidityAssertion {
|
||||
val containingClass = psi.containingClass()?.takeIf { it.isEnum() } ?: return null
|
||||
return containingClass.getClassId()
|
||||
}
|
||||
|
||||
override val callableIdIfNonLocal: CallableId?
|
||||
get() = withValidityAssertion { psi.callableId }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion {
|
||||
descriptor?.defaultType?.toKtTypeAndAnnotations(analysisSession) ?: createErrorTypeAndAnnotations()
|
||||
}
|
||||
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { psi.nameAsSafeName }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtEnumEntrySymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+119
@@ -0,0 +1,119 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.psiBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktVisibility
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.*
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.KtNamedFunction
|
||||
import org.jetbrains.kotlin.psi.KtObjectDeclaration
|
||||
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
||||
import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10PsiFunctionSymbol(
|
||||
override val psi: KtNamedFunction,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtFunctionSymbol(), KtFe10PsiSymbol<KtNamedFunction, FunctionDescriptor> {
|
||||
override val descriptor: FunctionDescriptor? by cached {
|
||||
val bindingContext = analysisSession.analyze(psi, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
bindingContext[BindingContext.FUNCTION, psi]
|
||||
}
|
||||
|
||||
override val isSuspend: Boolean
|
||||
get() = withValidityAssertion { psi.hasModifier(KtTokens.SUSPEND_KEYWORD) }
|
||||
|
||||
override val isOperator: Boolean
|
||||
get() = withValidityAssertion { psi.hasModifier(KtTokens.OPERATOR_KEYWORD) }
|
||||
|
||||
override val isExternal: Boolean
|
||||
get() = withValidityAssertion { psi.hasModifier(KtTokens.EXTERNAL_KEYWORD) }
|
||||
|
||||
override val isInline: Boolean
|
||||
get() = withValidityAssertion { psi.hasModifier(KtTokens.INLINE_KEYWORD) }
|
||||
|
||||
override val isOverride: Boolean
|
||||
get() = withValidityAssertion { psi.hasModifier(KtTokens.OVERRIDE_KEYWORD) }
|
||||
|
||||
override val isInfix: Boolean
|
||||
get() = withValidityAssertion { psi.hasModifier(KtTokens.INFIX_KEYWORD) }
|
||||
|
||||
override val isStatic: Boolean
|
||||
get() = withValidityAssertion { false }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol>
|
||||
get() = withValidityAssertion { psi.valueParameters.map { KtFe10PsiValueParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion { true }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId?
|
||||
get() = withValidityAssertion { psi.callableId }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { descriptor?.returnType?.toKtTypeAndAnnotations(analysisSession) ?: createErrorTypeAndAnnotations() }
|
||||
|
||||
override val receiverType: KtTypeAndAnnotations?
|
||||
get() = withValidityAssertion {
|
||||
return if (psi.isExtensionDeclaration()) {
|
||||
descriptor?.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisSession) ?: createErrorTypeAndAnnotations()
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
override val isExtension: Boolean
|
||||
get() = withValidityAssertion { psi.isExtensionDeclaration() }
|
||||
|
||||
override val symbolKind: KtSymbolKind
|
||||
get() = withValidityAssertion { psi.ktSymbolKind }
|
||||
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { psi.nameAsSafeName }
|
||||
|
||||
override val dispatchType: KtType?
|
||||
get() = withValidityAssertion {
|
||||
val containingClass = psi.containingClassOrObject
|
||||
if (containingClass == null || containingClass is KtObjectDeclaration) {
|
||||
return null
|
||||
}
|
||||
|
||||
return descriptor?.dispatchReceiverParameter?.type?.toKtType(analysisSession) ?: createErrorType()
|
||||
}
|
||||
|
||||
override val typeParameters: List<KtTypeParameterSymbol>
|
||||
get() = withValidityAssertion { psi.typeParameters.map { KtFe10PsiTypeParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override val modality: Modality
|
||||
get() = withValidityAssertion { psi.ktModality ?: descriptor?.modality ?: Modality.FINAL }
|
||||
|
||||
override val visibility: Visibility
|
||||
get() = withValidityAssertion { psi.ktVisibility ?: descriptor?.ktVisibility ?: Visibilities.Public }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtFunctionSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+133
@@ -0,0 +1,133 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.psiBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktVisibility
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtConstantValue
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.*
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtConstantValue
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.KtProperty
|
||||
import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10PsiKotlinPropertySymbol(
|
||||
override val psi: KtProperty,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtKotlinPropertySymbol(), KtFe10PsiSymbol<KtProperty, PropertyDescriptor> {
|
||||
override val descriptor: PropertyDescriptor? by cached {
|
||||
val bindingContext = analysisSession.analyze(psi, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
bindingContext[BindingContext.VARIABLE, psi] as? PropertyDescriptor
|
||||
}
|
||||
|
||||
override val isLateInit: Boolean
|
||||
get() = withValidityAssertion { psi.hasModifier(KtTokens.LATEINIT_KEYWORD) }
|
||||
|
||||
override val isConst: Boolean
|
||||
get() = withValidityAssertion { psi.hasModifier(KtTokens.CONST_KEYWORD) }
|
||||
|
||||
override val hasGetter: Boolean
|
||||
get() = withValidityAssertion { psi.getter != null }
|
||||
|
||||
override val hasSetter: Boolean
|
||||
get() = withValidityAssertion { psi.setter != null }
|
||||
|
||||
override val getter: KtPropertyGetterSymbol?
|
||||
get() = withValidityAssertion {
|
||||
val getter = psi.getter ?: return null
|
||||
return KtFe10PsiPropertyGetterSymbol(getter, analysisSession)
|
||||
}
|
||||
|
||||
override val setter: KtPropertySetterSymbol?
|
||||
get() = withValidityAssertion {
|
||||
val setter = psi.setter ?: return null
|
||||
return KtFe10PsiPropertySetterSymbol(setter, analysisSession)
|
||||
}
|
||||
|
||||
override val hasBackingField: Boolean
|
||||
get() = withValidityAssertion {
|
||||
val bindingContext = analysisSession.analyze(psi, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
bindingContext[BindingContext.BACKING_FIELD_REQUIRED, descriptor] == true
|
||||
}
|
||||
|
||||
override val isFromPrimaryConstructor: Boolean
|
||||
get() = withValidityAssertion { false }
|
||||
|
||||
override val isOverride: Boolean
|
||||
get() = withValidityAssertion { psi.hasModifier(KtTokens.OVERRIDE_KEYWORD) }
|
||||
|
||||
override val isStatic: Boolean
|
||||
get() = withValidityAssertion { false }
|
||||
|
||||
override val initializer: KtConstantValue?
|
||||
get() = withValidityAssertion { descriptor?.compileTimeInitializer?.toKtConstantValue() }
|
||||
|
||||
override val isVal: Boolean
|
||||
get() = withValidityAssertion { !psi.isVar }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId?
|
||||
get() = withValidityAssertion { psi.callableId }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { descriptor?.type?.toKtTypeAndAnnotations(analysisSession) ?: createErrorTypeAndAnnotations() }
|
||||
|
||||
override val receiverType: KtTypeAndAnnotations?
|
||||
get() = withValidityAssertion {
|
||||
return if (psi.isExtensionDeclaration()) {
|
||||
descriptor?.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisSession) ?: createErrorTypeAndAnnotations()
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
override val isExtension: Boolean
|
||||
get() = withValidityAssertion { psi.isExtensionDeclaration() }
|
||||
|
||||
override val symbolKind: KtSymbolKind
|
||||
get() = withValidityAssertion { psi.ktSymbolKind }
|
||||
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { psi.nameAsSafeName }
|
||||
|
||||
override val dispatchType: KtType?
|
||||
get() = withValidityAssertion {
|
||||
return if (!isStatic) {
|
||||
descriptor?.dispatchReceiverParameter?.type?.toKtType(analysisSession) ?: createErrorType()
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
override val modality: Modality
|
||||
get() = withValidityAssertion { psi.ktModality ?: descriptor?.modality ?: Modality.FINAL }
|
||||
|
||||
override val visibility: Visibility
|
||||
get() = withValidityAssertion { psi.ktVisibility ?: descriptor?.ktVisibility ?: Visibilities.Public }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtKotlinPropertySymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.psiBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.createErrorTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtAnonymousFunctionSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.psi.KtFunctionLiteral
|
||||
import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10PsiLiteralAnonymousFunctionSymbol(
|
||||
override val psi: KtFunctionLiteral,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtAnonymousFunctionSymbol(), KtFe10PsiSymbol<KtFunctionLiteral, FunctionDescriptor> {
|
||||
override val descriptor: FunctionDescriptor? by cached {
|
||||
val bindingContext = analysisSession.analyze(psi)
|
||||
bindingContext[BindingContext.FUNCTION, psi]
|
||||
}
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol>
|
||||
get() = withValidityAssertion { psi.valueParameters.map { KtFe10PsiValueParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion { true }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion {
|
||||
descriptor?.returnType?.toKtTypeAndAnnotations(analysisSession) ?: createErrorTypeAndAnnotations()
|
||||
}
|
||||
|
||||
override val receiverType: KtTypeAndAnnotations?
|
||||
get() = withValidityAssertion {
|
||||
descriptor?.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisSession) ?: createErrorTypeAndAnnotations()
|
||||
}
|
||||
|
||||
override val isExtension: Boolean
|
||||
get() = withValidityAssertion { psi.isExtensionDeclaration() }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtAnonymousFunctionSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.psiBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.createErrorTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtLocalVariableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.KtVariableDeclaration
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10PsiLocalVariableSymbol(
|
||||
override val psi: KtVariableDeclaration,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtLocalVariableSymbol(), KtFe10PsiSymbol<KtVariableDeclaration, VariableDescriptor> {
|
||||
override val descriptor: VariableDescriptor? by cached {
|
||||
val bindingContext = analysisSession.analyze(psi, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
bindingContext[BindingContext.VARIABLE, psi]
|
||||
}
|
||||
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { psi.nameAsSafeName }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion { descriptor?.type?.toKtTypeAndAnnotations(analysisSession) ?: createErrorTypeAndAnnotations() }
|
||||
|
||||
override val isVal: Boolean
|
||||
get() = withValidityAssertion { !psi.isVar }
|
||||
|
||||
override val symbolKind: KtSymbolKind
|
||||
get() = withValidityAssertion { KtSymbolKind.LOCAL }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtLocalVariableSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+114
@@ -0,0 +1,114 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.psiBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSupertypesWithAny
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktVisibility
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktModality
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktSymbolKind
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktVisibility
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassKind
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.KtClass
|
||||
import org.jetbrains.kotlin.psi.KtClassOrObject
|
||||
import org.jetbrains.kotlin.psi.KtEnumEntry
|
||||
import org.jetbrains.kotlin.psi.KtObjectDeclaration
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10PsiNamedClassOrObjectSymbol(
|
||||
override val psi: KtClassOrObject,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtNamedClassOrObjectSymbol(), KtFe10PsiSymbol<KtClassOrObject, ClassDescriptor> {
|
||||
override val descriptor: ClassDescriptor? by cached {
|
||||
val bindingContext = analysisSession.analyze(psi, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
bindingContext[BindingContext.CLASS, psi]
|
||||
}
|
||||
|
||||
override val isInner: Boolean
|
||||
get() = withValidityAssertion { psi.hasModifier(KtTokens.INNER_KEYWORD) }
|
||||
|
||||
override val isData: Boolean
|
||||
get() = withValidityAssertion { psi.hasModifier(KtTokens.DATA_KEYWORD) }
|
||||
|
||||
override val isInline: Boolean
|
||||
get() = withValidityAssertion { psi.hasModifier(KtTokens.INLINE_KEYWORD) }
|
||||
|
||||
override val isFun: Boolean
|
||||
get() = withValidityAssertion { psi.hasModifier(KtTokens.FUN_KEYWORD) }
|
||||
|
||||
override val isExternal: Boolean
|
||||
get() = withValidityAssertion { psi.hasModifier(KtTokens.EXTERNAL_KEYWORD) }
|
||||
|
||||
override val companionObject: KtNamedClassOrObjectSymbol?
|
||||
get() = withValidityAssertion {
|
||||
val companionObject = psi.companionObjects.firstOrNull() ?: return null
|
||||
KtFe10PsiNamedClassOrObjectSymbol(companionObject, analysisSession)
|
||||
}
|
||||
|
||||
override val classKind: KtClassKind
|
||||
get() = withValidityAssertion {
|
||||
when (psi) {
|
||||
is KtEnumEntry -> KtClassKind.ENUM_ENTRY
|
||||
is KtObjectDeclaration -> when {
|
||||
psi.isCompanion() -> KtClassKind.COMPANION_OBJECT
|
||||
psi.isObjectLiteral() -> KtClassKind.ANONYMOUS_OBJECT
|
||||
else -> KtClassKind.OBJECT
|
||||
}
|
||||
is KtClass -> when {
|
||||
psi.isInterface() -> KtClassKind.INTERFACE
|
||||
psi.isEnum() -> KtClassKind.ENUM_CLASS
|
||||
psi.isAnnotation() -> KtClassKind.ANNOTATION_CLASS
|
||||
else -> KtClassKind.CLASS
|
||||
}
|
||||
else -> error("Unexpected class instance")
|
||||
}
|
||||
}
|
||||
|
||||
override val superTypes: List<KtTypeAndAnnotations>
|
||||
get() = withValidityAssertion {
|
||||
descriptor?.getSupertypesWithAny()?.map { it.toKtTypeAndAnnotations(analysisSession) } ?: emptyList()
|
||||
}
|
||||
|
||||
override val classIdIfNonLocal: ClassId?
|
||||
get() = withValidityAssertion { psi.getClassId() }
|
||||
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { psi.nameAsSafeName }
|
||||
|
||||
override val symbolKind: KtSymbolKind
|
||||
get() = withValidityAssertion { psi.ktSymbolKind }
|
||||
|
||||
override val typeParameters: List<KtTypeParameterSymbol>
|
||||
get() = withValidityAssertion { psi.typeParameters.map { KtFe10PsiTypeParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override val modality: Modality
|
||||
get() = withValidityAssertion { psi.ktModality ?: descriptor?.modality ?: Modality.FINAL }
|
||||
|
||||
override val visibility: Visibility
|
||||
get() = withValidityAssertion { psi.ktVisibility ?: descriptor?.ktVisibility ?: Visibilities.Public }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtNamedClassOrObjectSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+94
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.psiBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktVisibility
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.*
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.PropertyGetterDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.psi.KtPropertyAccessor
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10PsiPropertyGetterSymbol(
|
||||
override val psi: KtPropertyAccessor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtPropertyGetterSymbol(), KtFe10PsiSymbol<KtPropertyAccessor, PropertyGetterDescriptor> {
|
||||
override val descriptor: PropertyGetterDescriptor? by cached {
|
||||
val bindingContext = analysisSession.analyze(psi, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
bindingContext[BindingContext.PROPERTY_ACCESSOR, psi] as? PropertyGetterDescriptor
|
||||
}
|
||||
|
||||
override val modality: Modality
|
||||
get() = withValidityAssertion { psi.property.ktModality ?: descriptor?.modality ?: Modality.FINAL }
|
||||
|
||||
override val visibility: Visibility
|
||||
get() = withValidityAssertion { psi.ktVisibility ?: descriptor?.ktVisibility ?: psi.property.ktVisibility ?: Visibilities.Public }
|
||||
|
||||
override val isDefault: Boolean
|
||||
get() = withValidityAssertion { false }
|
||||
|
||||
override val isInline: Boolean
|
||||
get() = withValidityAssertion { psi.hasModifier(KtTokens.INLINE_KEYWORD) || psi.property.hasModifier(KtTokens.INLINE_KEYWORD) }
|
||||
|
||||
override val isOverride: Boolean
|
||||
get() = withValidityAssertion { psi.property.hasModifier(KtTokens.OVERRIDE_KEYWORD) }
|
||||
|
||||
override val hasBody: Boolean
|
||||
get() = withValidityAssertion { psi.hasBody() }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol>
|
||||
get() = withValidityAssertion { psi.valueParameters.map { KtFe10PsiValueParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion { true }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId?
|
||||
get() = withValidityAssertion { psi.property.callableId }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion {
|
||||
descriptor?.returnType?.toKtTypeAndAnnotations(analysisSession) ?: createErrorTypeAndAnnotations()
|
||||
}
|
||||
override val receiverType: KtTypeAndAnnotations?
|
||||
get() = withValidityAssertion {
|
||||
val descriptor = this.descriptor
|
||||
return when {
|
||||
descriptor != null -> descriptor.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisSession)
|
||||
!psi.property.isTopLevel -> createErrorTypeAndAnnotations()
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
override val dispatchType: KtType?
|
||||
get() = withValidityAssertion {
|
||||
val descriptor = this.descriptor
|
||||
return when {
|
||||
descriptor != null -> descriptor.dispatchReceiverParameter?.type?.toKtType(analysisSession)
|
||||
!psi.property.isTopLevel -> createErrorType()
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtPropertyGetterSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+105
@@ -0,0 +1,105 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.psiBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktVisibility
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.*
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.PropertySetterDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.psi.KtPropertyAccessor
|
||||
import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10PsiPropertySetterSymbol(
|
||||
override val psi: KtPropertyAccessor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtPropertySetterSymbol(), KtFe10PsiSymbol<KtPropertyAccessor, PropertySetterDescriptor> {
|
||||
override val descriptor: PropertySetterDescriptor? by cached {
|
||||
val bindingContext = analysisSession.analyze(psi, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
bindingContext[BindingContext.PROPERTY_ACCESSOR, psi] as? PropertySetterDescriptor
|
||||
}
|
||||
|
||||
override val modality: Modality
|
||||
get() = withValidityAssertion { psi.property.ktModality ?: descriptor?.modality ?: Modality.FINAL }
|
||||
|
||||
override val visibility: Visibility
|
||||
get() = withValidityAssertion { psi.ktVisibility ?: descriptor?.ktVisibility ?: psi.property.ktVisibility ?: Visibilities.Public }
|
||||
|
||||
override val isDefault: Boolean
|
||||
get() = withValidityAssertion { false }
|
||||
|
||||
override val isInline: Boolean
|
||||
get() = withValidityAssertion { psi.hasModifier(KtTokens.INLINE_KEYWORD) || psi.property.hasModifier(KtTokens.INLINE_KEYWORD) }
|
||||
|
||||
override val isOverride: Boolean
|
||||
get() = withValidityAssertion { psi.property.hasModifier(KtTokens.OVERRIDE_KEYWORD) }
|
||||
|
||||
override val hasBody: Boolean
|
||||
get() = withValidityAssertion { psi.hasBody() }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol>
|
||||
get() = withValidityAssertion { psi.valueParameters.map { KtFe10PsiValueParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion { true }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId?
|
||||
get() = TODO("Not yet implemented")
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion {
|
||||
descriptor?.returnType?.toKtTypeAndAnnotations(analysisSession) ?: createErrorTypeAndAnnotations()
|
||||
}
|
||||
override val receiverType: KtTypeAndAnnotations?
|
||||
get() = withValidityAssertion {
|
||||
val descriptor = this.descriptor
|
||||
return when {
|
||||
descriptor != null -> descriptor.extensionReceiverParameter?.type?.toKtTypeAndAnnotations(analysisSession)
|
||||
psi.property.isExtensionDeclaration() -> createErrorTypeAndAnnotations()
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
override val dispatchType: KtType?
|
||||
get() = withValidityAssertion {
|
||||
val descriptor = this.descriptor
|
||||
return when {
|
||||
descriptor != null -> descriptor.dispatchReceiverParameter?.type?.toKtType(analysisSession)
|
||||
!psi.property.isTopLevel -> createErrorType()
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
override val parameter: KtValueParameterSymbol
|
||||
get() = withValidityAssertion {
|
||||
val parameter = psi.parameter
|
||||
return if (parameter != null) {
|
||||
KtFe10PsiValueParameterSymbol(parameter, analysisSession)
|
||||
} else {
|
||||
KtFe10PsiDefaultSetterParameterSymbol(psi, analysisSession)
|
||||
}
|
||||
}
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtPropertySetterSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.psiBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktVisibility
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.createErrorType
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.ktVisibility
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeAliasSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.KtTypeAlias
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10PsiTypeAliasSymbol(
|
||||
override val psi: KtTypeAlias,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtTypeAliasSymbol(), KtFe10PsiSymbol<KtTypeAlias, TypeAliasDescriptor> {
|
||||
override val descriptor: TypeAliasDescriptor? by cached {
|
||||
val bindingContext = analysisSession.analyze(psi)
|
||||
bindingContext[BindingContext.TYPE_ALIAS, psi]
|
||||
}
|
||||
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { psi.nameAsSafeName }
|
||||
|
||||
override val typeParameters: List<KtTypeParameterSymbol>
|
||||
get() = withValidityAssertion { psi.typeParameters.map { KtFe10PsiTypeParameterSymbol(it, analysisSession) } }
|
||||
|
||||
override val visibility: Visibility
|
||||
get() = withValidityAssertion { psi.ktVisibility ?: descriptor?.ktVisibility ?: Visibilities.Public }
|
||||
|
||||
override val expandedType: KtType
|
||||
get() = withValidityAssertion { descriptor?.expandedType?.toKtType(analysisSession) ?: createErrorType() }
|
||||
|
||||
override val classIdIfNonLocal: ClassId?
|
||||
get() = withValidityAssertion { psi.getClassId() }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtTypeAliasSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.psiBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.KtTypeParameter
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
|
||||
internal class KtFe10PsiTypeParameterSymbol(
|
||||
override val psi: KtTypeParameter,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtTypeParameterSymbol(), KtFe10PsiSymbol<KtTypeParameter, TypeParameterDescriptor> {
|
||||
override val descriptor: TypeParameterDescriptor? by cached {
|
||||
val bindingContext = analysisSession.analyze(psi)
|
||||
bindingContext[BindingContext.TYPE_PARAMETER, psi]
|
||||
}
|
||||
|
||||
override val variance: Variance
|
||||
get() = withValidityAssertion { psi.variance }
|
||||
|
||||
override val upperBounds: List<KtType>
|
||||
get() = withValidityAssertion { descriptor?.upperBounds?.map { it.toKtType(analysisSession) } ?: emptyList() }
|
||||
|
||||
override val isReified: Boolean
|
||||
get() = withValidityAssertion { psi.hasModifier(KtTokens.REIFIED_KEYWORD) }
|
||||
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { psi.nameAsSafeName }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtTypeParameterSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.psiBased
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.createErrorTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.KtParameter
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
internal class KtFe10PsiValueParameterSymbol(
|
||||
override val psi: KtParameter,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtValueParameterSymbol(), KtFe10PsiSymbol<KtParameter, VariableDescriptor> {
|
||||
override val descriptor: VariableDescriptor? by cached {
|
||||
val bindingContext = analysisSession.analyze(psi, KtFe10AnalysisSession.AnalysisMode.PARTIAL)
|
||||
bindingContext[BindingContext.VALUE_PARAMETER, psi]
|
||||
}
|
||||
|
||||
override val hasDefaultValue: Boolean
|
||||
get() = withValidityAssertion { psi.hasDefaultValue() }
|
||||
|
||||
override val isVararg: Boolean
|
||||
get() = withValidityAssertion { psi.isVarArg }
|
||||
|
||||
override val annotatedType: KtTypeAndAnnotations
|
||||
get() = withValidityAssertion {
|
||||
val type = (descriptor as? ValueParameterDescriptor)?.varargElementType ?: descriptor?.type
|
||||
return type?.toKtTypeAndAnnotations(analysisSession) ?: createErrorTypeAndAnnotations()
|
||||
}
|
||||
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { psi.nameAsSafeName }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtValueParameterSymbol> = withValidityAssertion {
|
||||
return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer()
|
||||
}
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.psiBased.base
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10AnnotatedSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
|
||||
internal interface KtFe10PsiSymbol<P : KtElement, D : DeclarationDescriptor> : KtFe10Symbol, KtFe10AnnotatedSymbol {
|
||||
override val psi: P
|
||||
val descriptor: D?
|
||||
|
||||
override val annotationsObject: Annotations
|
||||
get() = descriptor?.annotations ?: Annotations.EMPTY
|
||||
|
||||
override val origin: KtSymbolOrigin
|
||||
get() = withValidityAssertion {
|
||||
return if (psi.containingKtFile.isCompiled) {
|
||||
KtSymbolOrigin.LIBRARY
|
||||
} else {
|
||||
KtSymbolOrigin.SOURCE
|
||||
}
|
||||
}
|
||||
}
|
||||
+137
@@ -0,0 +1,137 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.symbols.psiBased.base
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.KtFe10ClassErrorType
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotationCall
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.cfg.getElementParentDeclaration
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptorWithResolutionScopes
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.hasBody
|
||||
import org.jetbrains.kotlin.psi.psiUtil.isTopLevelInFileOrScript
|
||||
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
|
||||
import org.jetbrains.kotlin.types.ErrorType
|
||||
import org.jetbrains.kotlin.types.ErrorUtils
|
||||
|
||||
internal val KtDeclaration.ktVisibility: Visibility?
|
||||
get() = when {
|
||||
hasModifier(KtTokens.PUBLIC_KEYWORD) -> Visibilities.Public
|
||||
hasModifier(KtTokens.PROTECTED_KEYWORD) -> Visibilities.Protected
|
||||
hasModifier(KtTokens.PRIVATE_KEYWORD) -> Visibilities.Private
|
||||
hasModifier(KtTokens.INTERNAL_KEYWORD) -> Visibilities.Internal
|
||||
else -> null
|
||||
}
|
||||
|
||||
internal val KtDeclaration.ktModality: Modality?
|
||||
get() = when {
|
||||
hasModifier(KtTokens.ABSTRACT_KEYWORD) -> Modality.ABSTRACT
|
||||
hasModifier(KtTokens.FINAL_KEYWORD) -> Modality.FINAL
|
||||
hasModifier(KtTokens.SEALED_KEYWORD) -> Modality.SEALED
|
||||
hasModifier(KtTokens.OPEN_KEYWORD) -> {
|
||||
if (this is KtCallableDeclaration && !hasBody()) {
|
||||
val parentDeclaration = this.getElementParentDeclaration()
|
||||
if (parentDeclaration is KtClass && parentDeclaration.isInterface()) {
|
||||
Modality.ABSTRACT
|
||||
} else {
|
||||
Modality.OPEN
|
||||
}
|
||||
}
|
||||
Modality.OPEN
|
||||
}
|
||||
else -> null
|
||||
}
|
||||
|
||||
internal val KtElement.ktSymbolKind: KtSymbolKind
|
||||
get() = when {
|
||||
this is KtPropertyAccessor -> KtSymbolKind.ACCESSOR
|
||||
isTopLevelInFileOrScript(this) -> KtSymbolKind.TOP_LEVEL
|
||||
this is KtDeclaration && !KtPsiUtil.isLocal(this) -> KtSymbolKind.CLASS_MEMBER
|
||||
else -> KtSymbolKind.LOCAL
|
||||
}
|
||||
|
||||
internal val KtDeclaration.callableId: CallableId?
|
||||
get() {
|
||||
val selfName = this.name ?: return null
|
||||
val containingFile = this.containingKtFile
|
||||
|
||||
var current = this.getElementParentDeclaration()
|
||||
|
||||
val localName = mutableListOf<String>()
|
||||
val className = mutableListOf<String>()
|
||||
|
||||
while (current != null) {
|
||||
when (current) {
|
||||
is KtClassOrObject -> className += current.name ?: return null
|
||||
is KtPropertyAccessor -> {} // Filter out property accessors
|
||||
is KtCallableDeclaration -> localName += current.name ?: return null
|
||||
}
|
||||
|
||||
current = current.getElementParentDeclaration()
|
||||
}
|
||||
|
||||
return CallableId(
|
||||
packageName = containingFile.packageFqName,
|
||||
className = if (className.isNotEmpty()) FqName.fromSegments(className.asReversed()) else null,
|
||||
callableName = Name.identifier(selfName),
|
||||
pathToLocal = if (localName.isNotEmpty()) FqName.fromSegments(localName.asReversed()) else null
|
||||
)
|
||||
}
|
||||
|
||||
internal fun PsiElement.getResolutionScope(bindingContext: BindingContext): LexicalScope? {
|
||||
for (parent in parentsWithSelf) {
|
||||
if (parent is KtElement) {
|
||||
val scope = bindingContext[BindingContext.LEXICAL_SCOPE, parent]
|
||||
if (scope != null) return scope
|
||||
}
|
||||
|
||||
if (parent is KtClassBody) {
|
||||
val classDescriptor = bindingContext[BindingContext.CLASS, parent.getParent()] as? ClassDescriptorWithResolutionScopes
|
||||
if (classDescriptor != null) {
|
||||
return classDescriptor.scopeForMemberDeclarationResolution
|
||||
}
|
||||
}
|
||||
if (parent is KtFile) {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
internal fun KtFe10Symbol.createErrorTypeAndAnnotations(): KtTypeAndAnnotations {
|
||||
val errorType = createErrorType()
|
||||
|
||||
return object : KtTypeAndAnnotations() {
|
||||
override val type: KtType
|
||||
get() = withValidityAssertion { errorType }
|
||||
override val annotations: List<KtAnnotationCall>
|
||||
get() = withValidityAssertion { emptyList() }
|
||||
override val token: ValidityToken
|
||||
get() = this@createErrorTypeAndAnnotations.token
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
internal fun KtFe10Symbol.createErrorType(): KtType {
|
||||
val type = ErrorUtils.createErrorType("Type is unavailable for declaration $psi") as ErrorType
|
||||
return KtFe10ClassErrorType(type, analysisSession)
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.types
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktNullability
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.asStringForDebugging
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtCapturedType
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.CapturedType
|
||||
|
||||
internal class KtFe10CapturedType(
|
||||
override val type: CapturedType,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtCapturedType(), KtFe10Type {
|
||||
override fun asStringForDebugging(): String = withValidityAssertion { type.asStringForDebugging() }
|
||||
|
||||
override val nullability: KtTypeNullability
|
||||
get() = withValidityAssertion { type.ktNullability }
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.types
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktNullability
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.asStringForDebugging
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtClassErrorType
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.types.ErrorType
|
||||
|
||||
internal class KtFe10ClassErrorType(
|
||||
override val type: ErrorType,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtClassErrorType(), KtFe10Type {
|
||||
override fun asStringForDebugging(): String = withValidityAssertion { type.asStringForDebugging() }
|
||||
|
||||
override val error: String
|
||||
get() = withValidityAssertion { "Type \"${type.presentableName}\" is unresolved" }
|
||||
|
||||
override val candidateClassSymbols: Collection<KtClassLikeSymbol>
|
||||
get() = withValidityAssertion { emptyList() }
|
||||
|
||||
override val nullability: KtTypeNullability
|
||||
get() = withValidityAssertion { type.ktNullability }
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.types
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.asStringForDebugging
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtDefinitelyNotNullType
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.types.DefinitelyNotNullType
|
||||
|
||||
internal class KtFe10DefinitelyNotNullType(
|
||||
override val type: DefinitelyNotNullType,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtDefinitelyNotNullType(), KtFe10Type {
|
||||
override fun asStringForDebugging(): String = withValidityAssertion { type.asStringForDebugging() }
|
||||
|
||||
override val original: KtType
|
||||
get() = withValidityAssertion { type.original.toKtType(analysisSession) }
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.types
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktNullability
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.asStringForDebugging
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtFlexibleType
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.types.FlexibleType
|
||||
|
||||
internal class KtFe10FlexibleType(
|
||||
override val type: FlexibleType,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtFlexibleType(), KtFe10Type {
|
||||
override fun asStringForDebugging(): String = withValidityAssertion { type.asStringForDebugging() }
|
||||
|
||||
override val lowerBound: KtType
|
||||
get() = withValidityAssertion { type.lowerBound.toKtType(analysisSession) }
|
||||
|
||||
override val upperBound: KtType
|
||||
get() = withValidityAssertion { type.upperBound.toKtType(analysisSession) }
|
||||
|
||||
override val nullability: KtTypeNullability
|
||||
get() = withValidityAssertion { type.ktNullability }
|
||||
}
|
||||
+64
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.types
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtTypeArgument
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescNamedClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktNullability
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtTypeArgument
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.asStringForDebugging
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtFunctionalType
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
|
||||
import org.jetbrains.kotlin.builtins.getReceiverTypeFromFunctionType
|
||||
import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType
|
||||
import org.jetbrains.kotlin.builtins.getValueParameterTypesFromFunctionType
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.types.SimpleType
|
||||
|
||||
internal class KtFe10FunctionalType(
|
||||
override val type: SimpleType,
|
||||
private val descriptor: FunctionClassDescriptor,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtFunctionalType(), KtFe10Type {
|
||||
override fun asStringForDebugging(): String = withValidityAssertion { type.asStringForDebugging() }
|
||||
|
||||
override val nullability: KtTypeNullability
|
||||
get() = withValidityAssertion { type.ktNullability }
|
||||
|
||||
override val isSuspend: Boolean
|
||||
get() = withValidityAssertion { descriptor.functionKind.isSuspendType }
|
||||
|
||||
override val arity: Int
|
||||
get() = withValidityAssertion { descriptor.arity }
|
||||
|
||||
override val hasReceiver: Boolean
|
||||
get() = withValidityAssertion { type.getReceiverTypeFromFunctionType() != null }
|
||||
|
||||
override val receiverType: KtType?
|
||||
get() = withValidityAssertion { type.getReceiverTypeFromFunctionType()?.toKtType(analysisSession) }
|
||||
|
||||
override val parameterTypes: List<KtType>
|
||||
get() = withValidityAssertion { type.getValueParameterTypesFromFunctionType().map { it.type.toKtType(analysisSession) } }
|
||||
|
||||
override val returnType: KtType
|
||||
get() = withValidityAssertion { type.getReturnTypeFromFunctionType().toKtType(analysisSession) }
|
||||
|
||||
override val classId: ClassId
|
||||
get() = ClassId(descriptor.functionKind.packageFqName, descriptor.functionKind.numberedClassName(descriptor.arity))
|
||||
|
||||
override val classSymbol: KtClassLikeSymbol
|
||||
get() = withValidityAssertion { KtFe10DescNamedClassOrObjectSymbol(descriptor, analysisSession) }
|
||||
|
||||
override val typeArguments: List<KtTypeArgument>
|
||||
get() = withValidityAssertion { type.arguments.map { it.toKtTypeArgument(analysisSession) } }
|
||||
}
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.types
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktNullability
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.asStringForDebugging
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtIntersectionType
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.types.SimpleType
|
||||
import org.jetbrains.kotlin.types.typeUtil.makeNullable
|
||||
|
||||
internal class KtFe10IntersectionType(
|
||||
override val type: SimpleType,
|
||||
private val supertypes: Collection<KotlinType>,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtIntersectionType(), KtFe10Type {
|
||||
override fun asStringForDebugging(): String = withValidityAssertion { type.asStringForDebugging() }
|
||||
|
||||
override val conjuncts: List<KtType> by cached {
|
||||
val result = ArrayList<KtType>(supertypes.size)
|
||||
val isNullable = type.isMarkedNullable
|
||||
for (supertype in supertypes) {
|
||||
val mappedSupertype = if (isNullable) supertype.makeNullable() else supertype
|
||||
result += mappedSupertype.toKtType(analysisSession)
|
||||
}
|
||||
return@cached result
|
||||
}
|
||||
|
||||
override val nullability: KtTypeNullability
|
||||
get() = withValidityAssertion { type.ktNullability }
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* 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.analysis.api.descriptors.types
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.ktNullability
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.KtFe10Type
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.types.base.asStringForDebugging
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtCapturedType
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.types.checker.NewCapturedType
|
||||
|
||||
internal class KtFe10NewCapturedType(
|
||||
override val type: NewCapturedType,
|
||||
override val analysisSession: KtFe10AnalysisSession
|
||||
) : KtCapturedType(), KtFe10Type {
|
||||
override fun asStringForDebugging(): String = withValidityAssertion { type.asStringForDebugging() }
|
||||
|
||||
override val nullability: KtTypeNullability
|
||||
get() = withValidityAssertion { type.ktNullability }
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user