FIR IDE: fix origin of synthetic functional interfaces

^KT-45312 fixed
This commit is contained in:
Ilya Kirillov
2021-03-11 20:48:19 +01:00
parent 41d1ef22b6
commit f339748f5b
4 changed files with 96 additions and 16 deletions
@@ -90,7 +90,7 @@ class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: Kot
FirRegularClassSymbol(this).apply symbol@{
buildRegularClass klass@{
session = this@FirBuiltinSymbolProvider.session
origin = FirDeclarationOrigin.Synthetic
origin = FirDeclarationOrigin.BuiltIns
name = relativeClassName.shortName()
status = FirResolvedDeclarationStatusImpl(
Visibilities.Public,
@@ -112,7 +112,7 @@ class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: Kot
buildTypeParameter {
session = this@FirBuiltinSymbolProvider.session
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
origin = FirDeclarationOrigin.Synthetic
origin = FirDeclarationOrigin.BuiltIns
name = Name.identifier("P$it")
symbol = FirTypeParameterSymbol()
variance = Variance.IN_VARIANCE
@@ -125,7 +125,7 @@ class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: Kot
buildTypeParameter {
session = this@FirBuiltinSymbolProvider.session
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
origin = FirDeclarationOrigin.Synthetic
origin = FirDeclarationOrigin.BuiltIns
name = Name.identifier("R")
symbol = FirTypeParameterSymbol()
variance = Variance.OUT_VARIANCE
@@ -200,7 +200,7 @@ class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: Kot
buildSimpleFunction {
session = this@FirBuiltinSymbolProvider.session
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
origin = FirDeclarationOrigin.Synthetic
origin = FirDeclarationOrigin.BuiltIns
returnTypeRef = typeArguments.last()
this.name = name
status = functionStatus
@@ -212,7 +212,7 @@ class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: Kot
val parameterName = Name.identifier("p${index + 1}")
buildValueParameter {
session = this@FirBuiltinSymbolProvider.session
origin = FirDeclarationOrigin.Synthetic
origin = FirDeclarationOrigin.BuiltIns
resolvePhase = FirResolvePhase.ANALYZED_DEPENDENCIES
returnTypeRef = typeArgument
this.name = parameterName
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.idea.frontend.api.fir.symbols
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.fir.FirFakeSourceElementKind
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
@@ -15,7 +14,6 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.FirRefWithValidityCheck
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbolOrigin
import org.jetbrains.kotlin.name.ClassId
internal interface KtFirSymbol<F : FirDeclaration> : KtSymbol, ValidityTokenOwner {
val firRef: FirRefWithValidityCheck<F>
@@ -40,7 +38,6 @@ private tailrec fun FirDeclaration.ktSymbolOrigin(): KtSymbolOrigin = when (orig
FirDeclarationOrigin.Delegated -> KtSymbolOrigin.DELEGATED
FirDeclarationOrigin.Synthetic -> {
when {
isSyntheticFunctionalInterface() -> KtSymbolOrigin.LIBRARY
this is FirSyntheticProperty -> KtSymbolOrigin.JAVA_SYNTHETIC_PROPERTY
else -> throw InvalidFirDeclarationOriginForSymbol(this)
}
@@ -53,14 +50,6 @@ private tailrec fun FirDeclaration.ktSymbolOrigin(): KtSymbolOrigin = when (orig
}
}
private fun FirDeclaration.isSyntheticFunctionalInterface(): Boolean {
if (this !is FirRegularClass) return false
return classId.isSyntheticFunctionalInterface()
}
private fun ClassId.isSyntheticFunctionalInterface(): Boolean {
return FunctionClassKind.byClassNamePrefix(packageFqName, relativeClassName.asString()) != null
}
class InvalidFirDeclarationOriginForSymbol(declaration: FirDeclaration) :
IllegalStateException("Invalid FirDeclarationOrigin ${declaration.origin::class.simpleName} for ${declaration.render()}")
@@ -0,0 +1,86 @@
class: kotlin/Function2
// SYMBOLS:
KtFirFunctionSymbol:
annotatedType: [] R
annotationClassIds: []
annotations: []
callableIdIfNonLocal: kotlin.Function2.invoke
dispatchType: kotlin/Function2<P1, P2, R>
isExtension: false
isExternal: false
isInline: false
isOperator: true
isOverride: false
isSuspend: false
modality: ABSTRACT
name: invoke
origin: LIBRARY
receiverType: null
symbolKind: MEMBER
typeParameters: []
valueParameters: [KtFirFunctionValueParameterSymbol(p1), KtFirFunctionValueParameterSymbol(p2)]
visibility: PUBLIC
KtFirFunctionSymbol:
annotatedType: [] kotlin/Boolean
annotationClassIds: []
annotations: []
callableIdIfNonLocal: kotlin.Any.equals
dispatchType: kotlin/Any
isExtension: false
isExternal: false
isInline: false
isOperator: true
isOverride: false
isSuspend: false
modality: OPEN
name: equals
origin: LIBRARY
receiverType: null
symbolKind: MEMBER
typeParameters: []
valueParameters: [KtFirFunctionValueParameterSymbol(other)]
visibility: PUBLIC
KtFirFunctionSymbol:
annotatedType: [] kotlin/Int
annotationClassIds: []
annotations: []
callableIdIfNonLocal: kotlin.Any.hashCode
dispatchType: kotlin/Any
isExtension: false
isExternal: false
isInline: false
isOperator: false
isOverride: false
isSuspend: false
modality: OPEN
name: hashCode
origin: LIBRARY
receiverType: null
symbolKind: MEMBER
typeParameters: []
valueParameters: []
visibility: PUBLIC
KtFirFunctionSymbol:
annotatedType: [] kotlin/String
annotationClassIds: []
annotations: []
callableIdIfNonLocal: kotlin.Any.toString
dispatchType: kotlin/Any
isExtension: false
isExternal: false
isInline: false
isOperator: false
isOverride: false
isSuspend: false
modality: OPEN
name: toString
origin: LIBRARY
receiverType: null
symbolKind: MEMBER
typeParameters: []
valueParameters: []
visibility: PUBLIC
@@ -39,6 +39,11 @@ public class MemberScopeByFqNameTestGenerated extends AbstractMemberScopeByFqNam
runTest("idea/idea-frontend-fir/testData/memberScopeByFqName/java.lang.String.txt");
}
@TestMetadata("kotlin.Function2.txt")
public void testKotlin_Function2() throws Exception {
runTest("idea/idea-frontend-fir/testData/memberScopeByFqName/kotlin.Function2.txt");
}
@TestMetadata("MutableList.txt")
public void testMutableList() throws Exception {
runTest("idea/idea-frontend-fir/testData/memberScopeByFqName/MutableList.txt");