[Analysis API FIR] Initialize properties of KtCallableSignature lazily
This commit is contained in:
committed by
teamcity
parent
2eab9fc00f
commit
2cc3b542fd
+3
-55
@@ -16,31 +16,6 @@ import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor
|
||||
import org.jetbrains.kotlin.analysis.utils.errors.unexpectedElementError
|
||||
|
||||
public abstract class KtSignatureSubstitutor : KtAnalysisSessionComponent() {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
public open fun <S : KtCallableSymbol> substitute(
|
||||
signature: KtCallableSignature<S>,
|
||||
substitutor: KtSubstitutor
|
||||
): KtCallableSignature<S> {
|
||||
return when (signature) {
|
||||
is KtFunctionLikeSignature -> {
|
||||
substitute(signature as KtFunctionLikeSignature<KtFunctionLikeSymbol>, substitutor) as KtCallableSignature<S>
|
||||
}
|
||||
is KtVariableLikeSignature -> {
|
||||
substitute(signature as KtVariableLikeSignature<KtVariableLikeSymbol>, substitutor) as KtCallableSignature<S>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public abstract fun <S : KtFunctionLikeSymbol> substitute(
|
||||
signature: KtFunctionLikeSignature<S>,
|
||||
substitutor: KtSubstitutor
|
||||
): KtFunctionLikeSignature<S>
|
||||
|
||||
public abstract fun <S : KtVariableLikeSymbol> substitute(
|
||||
signature: KtVariableLikeSignature<S>,
|
||||
substitutor: KtSubstitutor
|
||||
): KtVariableLikeSignature<S>
|
||||
|
||||
public open fun <S : KtCallableSymbol> substitute(symbol: S, substitutor: KtSubstitutor): KtCallableSignature<S> = when (symbol) {
|
||||
is KtFunctionLikeSymbol -> substitute(symbol, substitutor)
|
||||
is KtVariableLikeSymbol -> substitute(symbol, substitutor)
|
||||
@@ -51,41 +26,14 @@ public abstract class KtSignatureSubstitutor : KtAnalysisSessionComponent() {
|
||||
|
||||
public abstract fun <S : KtVariableLikeSymbol> substitute(symbol: S, substitutor: KtSubstitutor): KtVariableLikeSignature<S>
|
||||
|
||||
public open fun <S : KtCallableSymbol> asSignature(symbol: S): KtCallableSignature<S> =
|
||||
substitute(symbol, KtSubstitutor.Empty(token))
|
||||
public abstract fun <S : KtCallableSymbol> asSignature(symbol: S): KtCallableSignature<S>
|
||||
|
||||
public open fun <S : KtFunctionLikeSymbol> asSignature(symbol: S): KtFunctionLikeSignature<S> =
|
||||
substitute(symbol, KtSubstitutor.Empty(token))
|
||||
public abstract fun <S : KtFunctionLikeSymbol> asSignature(symbol: S): KtFunctionLikeSignature<S>
|
||||
|
||||
public open fun <S : KtVariableLikeSymbol> asSignature(symbol: S): KtVariableLikeSignature<S> =
|
||||
substitute(symbol, KtSubstitutor.Empty(token))
|
||||
public abstract fun <S : KtVariableLikeSymbol> asSignature(symbol: S): KtVariableLikeSignature<S>
|
||||
}
|
||||
|
||||
public interface KtSignatureSubstitutorMixIn : KtAnalysisSessionMixIn {
|
||||
/**
|
||||
* Applies a [substitutor] to the given signature and return a new signature with substituted types.
|
||||
*
|
||||
* @see KtSubstitutor.substitute
|
||||
*/
|
||||
public fun <S : KtCallableSymbol> KtCallableSignature<S>.substitute(substitutor: KtSubstitutor): KtCallableSignature<S> =
|
||||
withValidityAssertion { analysisSession.signatureSubstitutor.substitute(this, substitutor) }
|
||||
|
||||
/**
|
||||
* Applies a [substitutor] to the given signature and return a new signature with substituted types.
|
||||
*
|
||||
* @see KtSubstitutor.substitute
|
||||
*/
|
||||
public fun <S : KtFunctionLikeSymbol> KtFunctionLikeSignature<S>.substitute(substitutor: KtSubstitutor): KtFunctionLikeSignature<S> =
|
||||
withValidityAssertion { analysisSession.signatureSubstitutor.substitute(this, substitutor) }
|
||||
|
||||
/**
|
||||
* Applies a [substitutor] to the given signature and return a new signature with substituted types.
|
||||
*
|
||||
* @see KtSubstitutor.substitute
|
||||
*/
|
||||
public fun <S : KtVariableLikeSymbol> KtVariableLikeSignature<S>.substitute(substitutor: KtSubstitutor): KtVariableLikeSignature<S> =
|
||||
withValidityAssertion { analysisSession.signatureSubstitutor.substitute(this, substitutor) }
|
||||
|
||||
/**
|
||||
* Applies a [substitutor] to the given symbol and return a signature with substituted types.
|
||||
*
|
||||
|
||||
+8
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.signatures
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
|
||||
@@ -43,6 +44,13 @@ public sealed class KtCallableSignature<out S : KtCallableSymbol> : KtLifetimeOw
|
||||
*/
|
||||
public open val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { symbol.callableIdIfNonLocal }
|
||||
|
||||
/**
|
||||
* Applies a [substitutor] to the given signature and return a new signature with substituted types.
|
||||
*
|
||||
* @see KtSubstitutor.substitute
|
||||
*/
|
||||
public abstract fun substitute(substitutor: KtSubstitutor): KtCallableSignature<S>
|
||||
|
||||
abstract override fun equals(other: Any?): Boolean
|
||||
abstract override fun hashCode(): Int
|
||||
}
|
||||
|
||||
+4
-42
@@ -5,57 +5,19 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.signatures
|
||||
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor
|
||||
|
||||
/**
|
||||
* A signature of a function-like symbol. This includes functions, getters, setters, lambdas, etc.
|
||||
*/
|
||||
public class KtFunctionLikeSignature<out S : KtFunctionLikeSymbol>(
|
||||
private val _symbol: S,
|
||||
private val _returnType: KtType,
|
||||
private val _receiverType: KtType?,
|
||||
private val _valueParameters: List<KtVariableLikeSignature<KtValueParameterSymbol>>,
|
||||
) : KtCallableSignature<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 }
|
||||
|
||||
public abstract class KtFunctionLikeSignature<out S : KtFunctionLikeSymbol> : KtCallableSignature<S>() {
|
||||
/**
|
||||
* The use-site-substituted value parameters.
|
||||
*/
|
||||
public val valueParameters: List<KtVariableLikeSignature<KtValueParameterSymbol>>
|
||||
get() = withValidityAssertion { _valueParameters }
|
||||
public abstract val valueParameters: List<KtVariableLikeSignature<KtValueParameterSymbol>>
|
||||
|
||||
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
|
||||
}
|
||||
abstract override fun substitute(substitutor: KtSubstitutor): KtFunctionLikeSignature<S>
|
||||
}
|
||||
|
||||
|
||||
+6
-37
@@ -8,9 +8,9 @@ package org.jetbrains.kotlin.analysis.api.signatures
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplicationWithArgumentsInfo
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtConstantAnnotationValue
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.annotationsByClassId
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtVariableLikeSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.builtins.StandardNames
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -21,20 +21,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
||||
/**
|
||||
* A signature of a variable-like symbol. This includes properties, enum entries local variables, etc.
|
||||
*/
|
||||
public class KtVariableLikeSignature<out S : KtVariableLikeSymbol>(
|
||||
private val _symbol: S,
|
||||
private val _returnType: KtType,
|
||||
private val _receiverType: KtType?,
|
||||
) : KtCallableSignature<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 }
|
||||
|
||||
public abstract class KtVariableLikeSignature<out S : KtVariableLikeSymbol> : KtCallableSignature<S>() {
|
||||
/**
|
||||
* A name of the variable with respect to the `@ParameterName` annotation. Can be different from the [KtVariableLikeSymbol.name].
|
||||
*
|
||||
@@ -66,11 +53,13 @@ public class KtVariableLikeSignature<out S : KtVariableLikeSymbol>(
|
||||
//
|
||||
// fun foo(x: (item: Int) -> Unit) { x(1) }
|
||||
// fun bar(x: Function1<@ParameterName("item") Int, Unit>) { x(1) }
|
||||
val nameCanBeDeclaredInAnnotation = _symbol.psi == null
|
||||
val nameCanBeDeclaredInAnnotation = symbol.psi == null
|
||||
|
||||
runIf(nameCanBeDeclaredInAnnotation) { getValueFromParameterNameAnnotation() } ?: _symbol.name
|
||||
runIf(nameCanBeDeclaredInAnnotation) { getValueFromParameterNameAnnotation() } ?: symbol.name
|
||||
}
|
||||
|
||||
abstract override fun substitute(substitutor: KtSubstitutor): KtVariableLikeSignature<S>
|
||||
|
||||
private fun getValueFromParameterNameAnnotation(): Name? {
|
||||
val resultingAnnotation = findParameterNameAnnotation() ?: return null
|
||||
val parameterNameArgument = resultingAnnotation.arguments
|
||||
@@ -91,24 +80,4 @@ public class KtVariableLikeSignature<out S : KtVariableLikeSymbol>(
|
||||
implicitAnnotations.singleOrNull()
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user