[Analysis API FIR] Initialize properties of KtCallableSignature lazily

This commit is contained in:
aleksandrina-streltsova
2023-04-13 14:01:57 +02:00
committed by teamcity
parent 2eab9fc00f
commit 2cc3b542fd
17 changed files with 496 additions and 245 deletions
@@ -10,6 +10,8 @@ import org.jetbrains.kotlin.analysis.api.calls.*
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade.AnalysisMode
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent
import org.jetbrains.kotlin.analysis.api.descriptors.signatures.KtFe10FunctionLikeSignature
import org.jetbrains.kotlin.analysis.api.descriptors.signatures.KtFe10VariableLikeSignature
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescValueParameterSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10ReceiverParameterSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.KtFe10DescSymbol
@@ -59,10 +61,6 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeUtils
import org.jetbrains.kotlin.types.UnwrappedType
import org.jetbrains.kotlin.types.asSimpleType
import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext.contains
import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext.isTypeVariable
import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext.typeConstructor
import org.jetbrains.kotlin.types.expressions.OperatorConventions
import org.jetbrains.kotlin.types.typeUtil.contains
import org.jetbrains.kotlin.util.OperatorNameConventions
@@ -567,8 +565,8 @@ internal class KtFe10CallResolver(
resultingDescriptor.extensionReceiverParameter?.returnType?.toKtType(analysisContext)
}
return when (symbol) {
is KtVariableLikeSymbol -> KtVariableLikeSignature(symbol, ktReturnType, receiverType)
is KtFunctionLikeSymbol -> KtFunctionLikeSignature(
is KtVariableLikeSymbol -> KtFe10VariableLikeSignature(symbol, ktReturnType, receiverType)
is KtFunctionLikeSymbol -> KtFe10FunctionLikeSignature(
symbol,
ktReturnType,
receiverType,
@@ -7,8 +7,23 @@ package org.jetbrains.kotlin.analysis.api.descriptors.components
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent
import org.jetbrains.kotlin.analysis.api.impl.base.components.AbstractKtSignatureSubstitutorImpl
import org.jetbrains.kotlin.analysis.api.descriptors.signatures.KtFe10FunctionLikeSignature
import org.jetbrains.kotlin.analysis.api.descriptors.signatures.KtFe10VariableLikeSignature
import org.jetbrains.kotlin.analysis.api.impl.base.components.AbstractKtSignatureSubstitutor
import org.jetbrains.kotlin.analysis.api.signatures.KtFunctionLikeSignature
import org.jetbrains.kotlin.analysis.api.signatures.KtVariableLikeSignature
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtVariableLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.receiverType
internal class KtFe10SignatureSubstitutor(
override val analysisSession: KtFe10AnalysisSession
) : AbstractKtSignatureSubstitutorImpl(), Fe10KtAnalysisSessionComponent
) : AbstractKtSignatureSubstitutor(), Fe10KtAnalysisSessionComponent {
override fun <S : KtFunctionLikeSymbol> asSignature(symbol: S): KtFunctionLikeSignature<S> {
return KtFe10FunctionLikeSignature(symbol, symbol.returnType, symbol.receiverType, symbol.valueParameters.map { asSignature(it) })
}
override fun <S : KtVariableLikeSymbol> asSignature(symbol: S): KtVariableLikeSignature<S> {
return KtFe10VariableLikeSignature(symbol, symbol.returnType, symbol.receiverType)
}
}
@@ -0,0 +1,70 @@
/*
* Copyright 2010-2023 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.signatures
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.analysis.api.signatures.KtFunctionLikeSignature
import org.jetbrains.kotlin.analysis.api.signatures.KtVariableLikeSignature
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor
import org.jetbrains.kotlin.analysis.api.types.KtType
internal class KtFe10FunctionLikeSignature<out S : KtFunctionLikeSymbol>(
private val _symbol: S,
private val _returnType: KtType,
private val _receiverType: KtType?,
private val _valueParameters: List<KtVariableLikeSignature<KtValueParameterSymbol>>,
) : KtFunctionLikeSignature<S>() {
override val token: KtLifetimeToken
get() = _symbol.token
override val symbol: S
get() = withValidityAssertion { _symbol }
override val returnType: KtType
get() = withValidityAssertion { _returnType }
override val receiverType: KtType?
get() = withValidityAssertion { _receiverType }
override val valueParameters: List<KtVariableLikeSignature<KtValueParameterSymbol>>
get() = withValidityAssertion { _valueParameters }
override fun substitute(substitutor: KtSubstitutor): KtFunctionLikeSignature<S> = withValidityAssertion {
KtFe10FunctionLikeSignature(
symbol,
substitutor.substitute(returnType),
receiverType?.let { substitutor.substitute(it) },
valueParameters.map { valueParameter ->
KtFe10VariableLikeSignature<KtValueParameterSymbol>(
valueParameter.symbol,
substitutor.substitute(valueParameter.returnType),
valueParameter.receiverType?.let { substitutor.substitute(it) }
)
}
)
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as KtFunctionLikeSignature<*>
if (symbol != other.symbol) return false
if (returnType != other.returnType) return false
if (receiverType != other.receiverType) return false
if (valueParameters != other.valueParameters) return false
return true
}
override fun hashCode(): Int {
var result = symbol.hashCode()
result = 31 * result + returnType.hashCode()
result = 31 * result + (receiverType?.hashCode() ?: 0)
result = 31 * result + valueParameters.hashCode()
return result
}
}
@@ -0,0 +1,56 @@
/*
* Copyright 2010-2023 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.signatures
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.analysis.api.signatures.KtVariableLikeSignature
import org.jetbrains.kotlin.analysis.api.symbols.KtVariableLikeSymbol
import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor
import org.jetbrains.kotlin.analysis.api.types.KtType
internal class KtFe10VariableLikeSignature<out S : KtVariableLikeSymbol>(
private val _symbol: S,
private val _returnType: KtType,
private val _receiverType: KtType?,
) : KtVariableLikeSignature<S>() {
override val token: KtLifetimeToken
get() = _symbol.token
override val symbol: S
get() = withValidityAssertion { _symbol }
override val returnType: KtType
get() = withValidityAssertion { _returnType }
override val receiverType: KtType?
get() = withValidityAssertion { _receiverType }
override fun substitute(substitutor: KtSubstitutor): KtVariableLikeSignature<S> = withValidityAssertion {
KtFe10VariableLikeSignature(
symbol,
substitutor.substitute(returnType),
receiverType?.let { substitutor.substitute(it) },
)
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as KtVariableLikeSignature<*>
if (symbol != other.symbol) return false
if (returnType != other.returnType) return false
if (receiverType != other.receiverType) return false
return true
}
override fun hashCode(): Int {
var result = symbol.hashCode()
result = 31 * result + returnType.hashCode()
result = 31 * result + (receiverType?.hashCode() ?: 0)
return result
}
}