[Analysis API FIR] fix member scope for enum entries

This commit is contained in:
Ilya Kirillov
2022-06-24 14:11:37 +02:00
committed by teamcity
parent 89ff1f0c0b
commit 186beddf5c
4 changed files with 50 additions and 53 deletions
@@ -24,24 +24,32 @@ import org.jetbrains.kotlin.analysis.api.impl.base.scopes.KtCompositeTypeScope
import org.jetbrains.kotlin.analysis.api.impl.base.scopes.KtEmptyScope
import org.jetbrains.kotlin.analysis.api.scopes.KtScope
import org.jetbrains.kotlin.analysis.api.scopes.KtTypeScope
import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession
import org.jetbrains.kotlin.analysis.utils.printer.getElementTextInContext
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.utils.delegateFields
import org.jetbrains.kotlin.fir.declarations.utils.isCompanion
import org.jetbrains.kotlin.fir.expressions.FirAnonymousObjectExpression
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertiesScope
import org.jetbrains.kotlin.fir.resolve.scope
import org.jetbrains.kotlin.fir.scopes.*
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.scopes.FakeOverrideTypeCalculator
import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.impl.*
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.ensureResolved
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.utils.addToStdlib.applyIf
import java.util.*
internal class KtFirScopeProvider(
@@ -88,8 +96,8 @@ internal class KtFirScopeProvider(
scopeSession,
withForcedTypeCalculator = false
)
} ?: return@getOrPut getEmptyScope()
}?.applyIf(classSymbol is KtEnumEntrySymbol, ::EnumEntryContainingNamesAwareScope)
?: return@getOrPut getEmptyScope()
KtFirDelegatingScope(firScope, builder, token)
}
}
@@ -243,4 +251,34 @@ internal class KtFirScopeProvider(
else -> TODO(firScope::class.toString())
}
}
}
private class EnumEntryContainingNamesAwareScope(private val originalScope: FirContainingNamesAwareScope) : FirContainingNamesAwareScope() {
override fun getCallableNames(): Set<Name> = originalScope.getCallableNames()
override fun getClassifierNames(): Set<Name> = originalScope.getClassifierNames()
override fun mayContainName(name: Name): Boolean = originalScope.mayContainName(name)
override val scopeOwnerLookupNames: List<String> get() = super.scopeOwnerLookupNames
override fun processClassifiersByNameWithSubstitution(
name: Name,
processor: (FirClassifierSymbol<*>, ConeSubstitutor) -> Unit
) {
originalScope.processClassifiersByNameWithSubstitution(name) { classifier, substitutor ->
if ((classifier as? FirRegularClassSymbol)?.isCompanion != true) {
processor(classifier, substitutor)
}
}
}
override fun processFunctionsByName(name: Name, processor: (FirNamedFunctionSymbol) -> Unit) {
originalScope.processFunctionsByName(name, processor)
}
override fun processPropertiesByName(name: Name, processor: (FirVariableSymbol<*>) -> Unit) {
originalScope.processPropertiesByName(name, processor)
}
override fun processDeclaredConstructors(processor: (FirConstructorSymbol) -> Unit) {
// enum entries does not have constructors
}
}
@@ -7,13 +7,12 @@ package org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner
import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiSingleFileTest
import org.jetbrains.kotlin.analysis.api.symbols.DebugSymbolRenderer
import org.jetbrains.kotlin.analysis.api.symbols.KtDeclarationSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiSingleFileTest
import org.jetbrains.kotlin.analysis.test.framework.utils.executeOnPooledThreadInReadAction
import org.jetbrains.kotlin.analysis.utils.printer.prettyPrint
import org.jetbrains.kotlin.psi.KtFile
@@ -98,8 +97,11 @@ abstract class AbstractSymbolTest : AbstractAnalysisApiSingleFileTest() {
}
private fun List<PointerWithRenderedSymbol>.renderDeclarations(): String =
map { it.rendered }.renderAsDeclarations()
private fun List<String>.renderAsDeclarations(): String =
if (isEmpty()) "NO_SYMBOLS"
else joinToString(separator = "\n\n") { it.rendered }
else joinToString(separator = "\n\n")
private fun restoreSymbolsInOtherReadActionAndCompareResults(
ktFile: KtFile,
@@ -114,7 +116,7 @@ abstract class AbstractSymbolTest : AbstractAnalysisApiSingleFileTest() {
renderSymbolForComparison(restored)
}
}
val actual = restored.joinToString(separator = "\n\n")
val actual = restored.renderAsDeclarations()
testServices.assertions.assertEqualsToTestDataFileSibling(actual)
}
@@ -15,8 +15,4 @@ val name: kotlin.String
val ordinal: kotlin.Int
fun getDeclaringClass(): java.lang.Class<test.E!>!
companion object
private constructor()
fun getDeclaringClass(): java.lang.Class<test.E!>!
@@ -258,43 +258,4 @@ KtFunctionSymbol:
visibility: Public
getDispatchReceiver(): test/E
getContainingModule: KtSourceModule "Sources of main"
deprecationStatus: null
KtNamedClassOrObjectSymbol:
annotationsList: []
classIdIfNonLocal: kotlin/Enum.Companion
classKind: COMPANION_OBJECT
companionObject: null
isData: false
isExternal: false
isFun: false
isInline: false
isInner: false
modality: FINAL
name: Companion
origin: LIBRARY
superTypes: [
kotlin/Any
]
symbolKind: CLASS_MEMBER
typeParameters: []
visibility: Public
getContainingModule: KtLibraryModule "Library kotlin-stdlib"
deprecationStatus: null
KtConstructorSymbol:
annotationsList: []
callableIdIfNonLocal: null
containingClassIdIfNonLocal: null
hasStableParameterNames: true
isExtension: false
isPrimary: true
origin: SOURCE_MEMBER_GENERATED
receiverType: null
returnType: <anonymous>
symbolKind: CLASS_MEMBER
typeParameters: []
valueParameters: []
visibility: Private
getContainingModule: KtSourceModule "Sources of main"
deprecationStatus: null
deprecationStatus: null