[FIR-IDE] Add workaround hack for building raw FIR with libraries session
This commit is contained in:
committed by
TeamCityServer
parent
0427066558
commit
f02a4a6b1f
+20
@@ -255,3 +255,23 @@ internal object FirIdeSessionFactory {
|
|||||||
register(SealedClassInheritorsProvider::class, SealedClassInheritorsProviderIdeImpl())
|
register(SealedClassInheritorsProvider::class, SealedClassInheritorsProviderIdeImpl())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated(
|
||||||
|
"This is a dirty hack used only for one usage (building fir for psi from stubs) and it should be removed after fix of that usage",
|
||||||
|
level = DeprecationLevel.ERROR
|
||||||
|
)
|
||||||
|
@OptIn(PrivateSessionConstructor::class)
|
||||||
|
fun createEmptySession(): FirSession {
|
||||||
|
return object : FirSession(null) {}.apply {
|
||||||
|
val moduleData = FirModuleDataImpl(
|
||||||
|
Name.identifier("<stub module>"),
|
||||||
|
dependencies = emptyList(),
|
||||||
|
dependsOnDependencies = emptyList(),
|
||||||
|
friendDependencies = emptyList(),
|
||||||
|
platform = JvmPlatforms.unspecifiedJvmPlatform,
|
||||||
|
analyzerServices = JvmPlatformAnalyzerServices
|
||||||
|
)
|
||||||
|
registerModuleData(moduleData)
|
||||||
|
moduleData.bindSession(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+14
-11
@@ -17,12 +17,13 @@ import org.jetbrains.kotlin.fir.scopes.FirScope
|
|||||||
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
|
import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.createEmptySession
|
||||||
import org.jetbrains.kotlin.name.StandardClassIds
|
import org.jetbrains.kotlin.name.StandardClassIds
|
||||||
import org.jetbrains.kotlin.psi.KtFunction
|
import org.jetbrains.kotlin.psi.KtFunction
|
||||||
import org.jetbrains.kotlin.psi.KtTypeReference
|
import org.jetbrains.kotlin.psi.KtTypeReference
|
||||||
import org.jetbrains.kotlin.types.Variance
|
import org.jetbrains.kotlin.types.Variance
|
||||||
|
|
||||||
// TODO replace with structural type comparision?
|
// TODO replace with structural type comparison?
|
||||||
object KtDeclarationAndFirDeclarationEqualityChecker {
|
object KtDeclarationAndFirDeclarationEqualityChecker {
|
||||||
fun representsTheSameDeclaration(psi: KtFunction, fir: FirFunction<*>): Boolean {
|
fun representsTheSameDeclaration(psi: KtFunction, fir: FirFunction<*>): Boolean {
|
||||||
if ((fir.receiverTypeRef != null) != (psi.receiverTypeReference != null)) return false
|
if ((fir.receiverTypeRef != null) != (psi.receiverTypeReference != null)) return false
|
||||||
@@ -30,7 +31,6 @@ object KtDeclarationAndFirDeclarationEqualityChecker {
|
|||||||
&& !isTheSameTypes(
|
&& !isTheSameTypes(
|
||||||
psi.receiverTypeReference!!,
|
psi.receiverTypeReference!!,
|
||||||
fir.receiverTypeRef!!,
|
fir.receiverTypeRef!!,
|
||||||
fir.moduleData.session,
|
|
||||||
isVararg = false
|
isVararg = false
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
@@ -44,7 +44,6 @@ object KtDeclarationAndFirDeclarationEqualityChecker {
|
|||||||
if (!isTheSameTypes(
|
if (!isTheSameTypes(
|
||||||
candidateParameterType,
|
candidateParameterType,
|
||||||
expectedParameter.returnTypeRef,
|
expectedParameter.returnTypeRef,
|
||||||
fir.moduleData.session,
|
|
||||||
isVararg = expectedParameter.isVararg
|
isVararg = expectedParameter.isVararg
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
@@ -126,14 +125,18 @@ object KtDeclarationAndFirDeclarationEqualityChecker {
|
|||||||
private fun isTheSameTypes(
|
private fun isTheSameTypes(
|
||||||
psiTypeReference: KtTypeReference,
|
psiTypeReference: KtTypeReference,
|
||||||
coneTypeReference: FirTypeRef,
|
coneTypeReference: FirTypeRef,
|
||||||
session: FirSession,
|
|
||||||
isVararg: Boolean
|
isVararg: Boolean
|
||||||
): Boolean =
|
): Boolean =
|
||||||
psiTypeReference.toKotlinTypReference(session).renderTypeAsKotlinType(isVararg) == coneTypeReference.renderTypeAsKotlinType()
|
psiTypeReference.toKotlinTypReference().renderTypeAsKotlinType(isVararg) == coneTypeReference.renderTypeAsKotlinType()
|
||||||
|
|
||||||
private fun KtTypeReference.toKotlinTypReference(session: FirSession): FirTypeRef {
|
@Suppress("DEPRECATION_ERROR")
|
||||||
|
private fun KtTypeReference.toKotlinTypReference(): FirTypeRef {
|
||||||
// Maybe resolve all types here to not to work with FirTypeRef directly
|
// Maybe resolve all types here to not to work with FirTypeRef directly
|
||||||
return RawFirBuilder(session, DummyScopeProvider, RawFirBuilderMode.STUBS).buildTypeReference(this)
|
return RawFirBuilder(
|
||||||
|
createEmptySession(),
|
||||||
|
DummyScopeProvider,
|
||||||
|
RawFirBuilderMode.STUBS
|
||||||
|
).buildTypeReference(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun ConeKotlinType.renderTypeAsKotlinType(): String {
|
private fun ConeKotlinType.renderTypeAsKotlinType(): String {
|
||||||
@@ -163,12 +166,12 @@ object KtDeclarationAndFirDeclarationEqualityChecker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@TestOnly
|
@TestOnly
|
||||||
internal fun renderPsi(ktFunction: KtFunction, session: FirSession): String = buildString {
|
internal fun renderPsi(ktFunction: KtFunction): String = buildString {
|
||||||
appendLine("receiver: ${ktFunction.receiverTypeReference?.toKotlinTypReference(session)?.renderTypeAsKotlinType()}")
|
appendLine("receiver: ${ktFunction.receiverTypeReference?.toKotlinTypReference()?.renderTypeAsKotlinType()}")
|
||||||
ktFunction.valueParameters.forEach { parameter ->
|
ktFunction.valueParameters.forEach { parameter ->
|
||||||
appendLine("${parameter.name}: ${parameter.typeReference?.toKotlinTypReference(session)?.renderTypeAsKotlinType()}")
|
appendLine("${parameter.name}: ${parameter.typeReference?.toKotlinTypReference()?.renderTypeAsKotlinType()}")
|
||||||
}
|
}
|
||||||
appendLine("return: ${ktFunction.typeReference?.toKotlinTypReference(session)?.renderTypeAsKotlinType()}")
|
appendLine("return: ${ktFunction.typeReference?.toKotlinTypReference()?.renderTypeAsKotlinType()}")
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestOnly
|
@TestOnly
|
||||||
|
|||||||
+1
-1
@@ -26,7 +26,7 @@ abstract class AbstractKtDeclarationAndFirDeclarationEqualityChecker : KotlinLig
|
|||||||
if (!KtDeclarationAndFirDeclarationEqualityChecker.representsTheSameDeclaration(ktFunction, firFunction)) {
|
if (!KtDeclarationAndFirDeclarationEqualityChecker.representsTheSameDeclaration(ktFunction, firFunction)) {
|
||||||
throw FileComparisonFailure(
|
throw FileComparisonFailure(
|
||||||
/* message= */ null,
|
/* message= */ null,
|
||||||
KtDeclarationAndFirDeclarationEqualityChecker.renderPsi(ktFunction, firFunction.moduleData.session),
|
KtDeclarationAndFirDeclarationEqualityChecker.renderPsi(ktFunction),
|
||||||
KtDeclarationAndFirDeclarationEqualityChecker.renderFir(firFunction),
|
KtDeclarationAndFirDeclarationEqualityChecker.renderFir(firFunction),
|
||||||
/* expectedFilePath= */ null
|
/* expectedFilePath= */ null
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user