[Analysis API] introduce API to work with signatures substitution
This commit is contained in:
@@ -7,11 +7,11 @@ package org.jetbrains.kotlin.analysis.api
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.components.*
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProvider
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolProviderMixIn
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
@@ -57,7 +57,8 @@ public abstract class KtAnalysisSession(final override val token: KtLifetimeToke
|
||||
KtMemberSymbolProviderMixin,
|
||||
KtInheritorsProviderMixIn,
|
||||
KtTypeCreatorMixIn,
|
||||
KtAnalysisScopeProviderMixIn {
|
||||
KtAnalysisScopeProviderMixIn,
|
||||
KtSignatureSubsitutorMixIn {
|
||||
|
||||
public abstract val useSiteModule: KtModule
|
||||
|
||||
@@ -143,6 +144,9 @@ public abstract class KtAnalysisSession(final override val token: KtLifetimeToke
|
||||
internal val referenceResolveProvider: KtReferenceResolveProvider get() = referenceResolveProviderImpl
|
||||
protected abstract val referenceResolveProviderImpl: KtReferenceResolveProvider
|
||||
|
||||
internal val substitutionProvider: KtSignatureSubsitutor get() = substitutionProviderImpl
|
||||
protected abstract val substitutionProviderImpl: KtSignatureSubsitutor
|
||||
|
||||
@PublishedApi
|
||||
internal val typesCreator: KtTypeCreator
|
||||
get() = typesCreatorImpl
|
||||
|
||||
+107
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
* Copyright 2010-2020 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.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.*
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor
|
||||
|
||||
public abstract class KtSignatureSubsitutor : KtAnalysisSessionComponent() {
|
||||
public abstract fun <S : KtCallableSymbol> substitute(
|
||||
signature: KtSignature<S>,
|
||||
substitutor: KtSubstitutor
|
||||
): KtSignature<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 abstract fun <S : KtCallableSymbol> substitute(symbol: S, substitutor: KtSubstitutor): KtSignature<S>
|
||||
|
||||
public abstract fun <S : KtFunctionLikeSymbol> substitute(symbol: S, substitutor: KtSubstitutor): KtFunctionLikeSignature<S>
|
||||
|
||||
public abstract fun <S : KtVariableLikeSymbol> substitute(symbol: S, substitutor: KtSubstitutor): KtVariableLikeSignature<S>
|
||||
|
||||
public abstract fun <S : KtCallableSymbol> asSignature(symbol: S): KtSignature<S>
|
||||
|
||||
public abstract fun <S : KtFunctionLikeSymbol> asSignature(symbol: S): KtFunctionLikeSignature<S>
|
||||
|
||||
public abstract fun <S : KtVariableLikeSymbol> asSignature(symbol: S): KtVariableLikeSignature<S>
|
||||
}
|
||||
|
||||
public interface KtSignatureSubsitutorMixIn : KtAnalysisSessionMixIn {
|
||||
/**
|
||||
* Applies a [substitutor] to the given signature and return a new signature with substituted types.
|
||||
*
|
||||
* @see KtSubstitutor.substituteOrSelf
|
||||
*/
|
||||
public fun <S : KtCallableSymbol> KtSignature<S>.substitute(substitutor: KtSubstitutor): KtSignature<S> =
|
||||
withValidityAssertion { analysisSession.substitutionProvider.substitute(this, substitutor) }
|
||||
|
||||
/**
|
||||
* Applies a [substitutor] to the given signature and return a new signature with substituted types.
|
||||
*
|
||||
* @see KtSubstitutor.substituteOrSelf
|
||||
*/
|
||||
public fun <S : KtFunctionLikeSymbol> KtFunctionLikeSignature<S>.substitute(substitutor: KtSubstitutor): KtFunctionLikeSignature<S> =
|
||||
withValidityAssertion { analysisSession.substitutionProvider.substitute(this, substitutor) }
|
||||
|
||||
/**
|
||||
* Applies a [substitutor] to the given signature and return a new signature with substituted types.
|
||||
*
|
||||
* @see KtSubstitutor.substituteOrSelf
|
||||
*/
|
||||
public fun <S : KtVariableLikeSymbol> KtVariableLikeSignature<S>.substitute(substitutor: KtSubstitutor): KtVariableLikeSignature<S> =
|
||||
withValidityAssertion { analysisSession.substitutionProvider.substitute(this, substitutor) }
|
||||
|
||||
/**
|
||||
* Applies a [substitutor] to the given symbols and return a signature with substituted types.
|
||||
*
|
||||
* @see KtSubstitutor.substituteOrSelf
|
||||
*/
|
||||
public fun <S : KtCallableSymbol> S.substitute(substitutor: KtSubstitutor): KtSignature<S> =
|
||||
withValidityAssertion { analysisSession.substitutionProvider.substitute(this, substitutor) }
|
||||
|
||||
/**
|
||||
* Applies a [substitutor] to the given symbols and return a signature with substituted types.
|
||||
*
|
||||
* @see KtSubstitutor.substituteOrSelf
|
||||
*/
|
||||
public fun <S : KtFunctionSymbol> S.substitute(substitutor: KtSubstitutor): KtFunctionLikeSignature<S> =
|
||||
withValidityAssertion { analysisSession.substitutionProvider.substitute(this, substitutor) }
|
||||
|
||||
/**
|
||||
* Applies a [substitutor] to the given symbols and return a signature with substituted types.
|
||||
*
|
||||
* @see KtSubstitutor.substituteOrSelf
|
||||
*/
|
||||
public fun <S : KtVariableLikeSymbol> S.substitute(substitutor: KtSubstitutor): KtVariableLikeSignature<S> =
|
||||
withValidityAssertion { analysisSession.substitutionProvider.substitute(this, substitutor) }
|
||||
|
||||
/**
|
||||
* Creates a new [KtSignature] by given symbol and leave all types intact
|
||||
*/
|
||||
public fun <S : KtCallableSymbol> S.asSignature(): KtSignature<S> =
|
||||
withValidityAssertion { analysisSession.substitutionProvider.asSignature(this) }
|
||||
|
||||
/**
|
||||
* Creates a new [KtSignature] by given symbol and leave all types intact
|
||||
*/
|
||||
public fun <S : KtFunctionLikeSymbol> S.asSignature(): KtFunctionLikeSignature<S> =
|
||||
withValidityAssertion { analysisSession.substitutionProvider.asSignature(this) }
|
||||
|
||||
/**
|
||||
* Creates a new [KtSignature] by given symbol and leave all types intact
|
||||
*/
|
||||
public fun <S : KtVariableLikeSymbol> S.asSignature(): KtVariableLikeSignature<S> =
|
||||
withValidityAssertion { analysisSession.substitutionProvider.asSignature(this) }
|
||||
}
|
||||
@@ -148,47 +148,3 @@ public data class KtVariableLikeSignature<out S : KtVariableLikeSymbol>(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public fun <S : KtCallableSymbol> S.toSignature(substitutor: KtSubstitutor = KtSubstitutor.Empty(token)): KtSignature<S> {
|
||||
return when (this) {
|
||||
is KtVariableLikeSymbol -> toSignature(substitutor)
|
||||
is KtFunctionLikeSymbol -> toSignature(substitutor)
|
||||
else -> error("unexpected callable symbol $this")
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a signature with the same type as the given symbol.
|
||||
*/
|
||||
public fun <S : KtVariableLikeSymbol> S.toSignature(substitutor: KtSubstitutor = KtSubstitutor.Empty(token)): KtVariableLikeSignature<S> {
|
||||
return KtVariableLikeSignature(this, returnType, receiverType).substitute(substitutor)
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a signature with the same type as the given symbol.
|
||||
*/
|
||||
public fun <S : KtFunctionLikeSymbol> S.toSignature(substitutor: KtSubstitutor = KtSubstitutor.Empty(token)): KtFunctionLikeSignature<S> {
|
||||
return KtFunctionLikeSignature(this, returnType, receiverType, valueParameters.map { it.toSignature() }).substitute(substitutor)
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies a substitutor to the given signature and return a new signature with substituted types.
|
||||
*/
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
public fun <C : KtSignature<S>, S : KtCallableSymbol> C.substitute(substitutor: KtSubstitutor): C {
|
||||
if (substitutor is KtSubstitutor.Empty) return this
|
||||
return when (this) {
|
||||
is KtFunctionLikeSignature<*> -> KtFunctionLikeSignature(
|
||||
symbol,
|
||||
substitutor.substituteOrSelf(returnType),
|
||||
receiverType?.let { substitutor.substituteOrSelf(it) },
|
||||
valueParameters.map { it.substitute(substitutor) }
|
||||
) as C
|
||||
is KtVariableLikeSignature<*> -> KtVariableLikeSignature(
|
||||
symbol,
|
||||
substitutor.substituteOrSelf(returnType),
|
||||
receiverType?.let { substitutor.substituteOrSelf(it) },
|
||||
) as C
|
||||
else -> error("impossible since KtSignature is sealed")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user