Unify API of FirScope.processClassifiersByName (use ProcessorAction)
This commit is contained in:
@@ -18,7 +18,6 @@ import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractImportingScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirExplicitSimpleImportingScope
|
||||
import org.jetbrains.kotlin.fir.scopes.processClassifiersByNameWithAction
|
||||
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeAbbreviatedType
|
||||
@@ -133,7 +132,7 @@ class MemberScopeTowerLevel(
|
||||
this.processFunctionsByName(name, symbol.cast())
|
||||
}
|
||||
TowerScopeLevel.Token.Objects -> processMembers(processor, explicitExtensionReceiver) { symbol ->
|
||||
this.processClassifiersByNameWithAction(name, FirPosition.OTHER, symbol.cast())
|
||||
this.processClassifiersByName(name, FirPosition.OTHER, symbol.cast())
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -199,7 +198,7 @@ class ScopeTowerLevel(
|
||||
ProcessorAction.NEXT
|
||||
}
|
||||
}
|
||||
TowerScopeLevel.Token.Objects -> scope.processClassifiersByNameWithAction(name, FirPosition.OTHER) {
|
||||
TowerScopeLevel.Token.Objects -> scope.processClassifiersByName(name, FirPosition.OTHER) {
|
||||
processor.consumeCandidate(
|
||||
it as T, dispatchReceiverValue = null,
|
||||
implicitExtensionReceiverValue = null
|
||||
@@ -247,7 +246,7 @@ class QualifiedReceiverTowerLevel(
|
||||
}
|
||||
|
||||
return when (token) {
|
||||
TowerScopeLevel.Token.Objects -> scope.processClassifiersByNameWithAction(name, FirPosition.OTHER) {
|
||||
TowerScopeLevel.Token.Objects -> scope.processClassifiersByName(name, FirPosition.OTHER) {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
processor.consumeCandidate(it as T, null, null)
|
||||
}
|
||||
@@ -308,7 +307,7 @@ private fun FirScope.processFunctionsAndConstructorsByName(
|
||||
|
||||
private fun FirScope.getFirstClassifierOrNull(name: Name): FirClassifierSymbol<*>? {
|
||||
var result: FirClassifierSymbol<*>? = null
|
||||
processClassifiersByNameWithAction(name, FirPosition.OTHER) {
|
||||
processClassifiersByName(name, FirPosition.OTHER) {
|
||||
result = it
|
||||
ProcessorAction.STOP
|
||||
}
|
||||
|
||||
+2
-1
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.render
|
||||
import org.jetbrains.kotlin.fir.resolve.*
|
||||
import org.jetbrains.kotlin.fir.scopes.FirPosition
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
@@ -63,7 +64,7 @@ class FirTypeResolverImpl(private val session: FirSession) : FirTypeResolver {
|
||||
}
|
||||
else -> error("!")
|
||||
}
|
||||
resolvedSymbol == null
|
||||
if (resolvedSymbol == null) ProcessorAction.NEXT else ProcessorAction.STOP
|
||||
}
|
||||
|
||||
// TODO: Imports
|
||||
|
||||
@@ -15,10 +15,13 @@ abstract class FirTypeParameterScope : FirScope() {
|
||||
override fun processClassifiersByName(
|
||||
name: Name,
|
||||
position: FirPosition,
|
||||
processor: (FirClassifierSymbol<*>) -> Boolean
|
||||
): Boolean {
|
||||
val matchedTypeParameters = typeParameters[name] ?: return true
|
||||
processor: (FirClassifierSymbol<*>) -> ProcessorAction
|
||||
): ProcessorAction {
|
||||
val matchedTypeParameters = typeParameters[name] ?: return ProcessorAction.NEXT
|
||||
|
||||
return matchedTypeParameters.all { processor(it.symbol) }
|
||||
return when {
|
||||
matchedTypeParameters.all { processor(it.symbol) == ProcessorAction.NEXT } -> ProcessorAction.NEXT
|
||||
else -> ProcessorAction.STOP
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+5
-1
@@ -37,7 +37,11 @@ abstract class AbstractFirUseSiteScope(
|
||||
}
|
||||
}
|
||||
|
||||
override fun processClassifiersByName(name: Name, position: FirPosition, processor: (FirClassifierSymbol<*>) -> Boolean): Boolean {
|
||||
override fun processClassifiersByName(
|
||||
name: Name,
|
||||
position: FirPosition,
|
||||
processor: (FirClassifierSymbol<*>) -> ProcessorAction
|
||||
): ProcessorAction {
|
||||
return declaredMemberScope.processClassifiersByName(name, position, processor)
|
||||
}
|
||||
}
|
||||
+6
-6
@@ -27,10 +27,10 @@ abstract class FirAbstractSimpleImportingScope(
|
||||
override fun processClassifiersByName(
|
||||
name: Name,
|
||||
position: FirPosition,
|
||||
processor: (FirClassifierSymbol<*>) -> Boolean
|
||||
): Boolean {
|
||||
val imports = simpleImports[name] ?: return true
|
||||
if (imports.isEmpty()) return true
|
||||
processor: (FirClassifierSymbol<*>) -> ProcessorAction
|
||||
): ProcessorAction {
|
||||
val imports = simpleImports[name] ?: return ProcessorAction.NONE
|
||||
if (imports.isEmpty()) return ProcessorAction.NONE
|
||||
val provider = FirSymbolProvider.getInstance(session)
|
||||
for (import in imports) {
|
||||
val importedName = import.importedName ?: continue
|
||||
@@ -39,10 +39,10 @@ abstract class FirAbstractSimpleImportingScope(
|
||||
?: ClassId.topLevel(import.packageFqName.child(importedName))
|
||||
val symbol = provider.getClassLikeSymbolByFqName(classId) ?: continue
|
||||
if (!processor(symbol)) {
|
||||
return false
|
||||
return ProcessorAction.STOP
|
||||
}
|
||||
}
|
||||
return true
|
||||
return ProcessorAction.NEXT
|
||||
}
|
||||
|
||||
override fun <T : FirCallableSymbol<*>> processCallables(
|
||||
|
||||
+6
-6
@@ -29,29 +29,29 @@ abstract class FirAbstractStarImportingScope(
|
||||
override fun processClassifiersByName(
|
||||
name: Name,
|
||||
position: FirPosition,
|
||||
processor: (FirClassifierSymbol<*>) -> Boolean
|
||||
): Boolean {
|
||||
processor: (FirClassifierSymbol<*>) -> ProcessorAction
|
||||
): ProcessorAction {
|
||||
if (starImports.isEmpty() || name in absentClassifierNames) {
|
||||
return true
|
||||
return ProcessorAction.NONE
|
||||
}
|
||||
var empty = true
|
||||
for (import in starImports) {
|
||||
val relativeClassName = import.relativeClassName
|
||||
val classId = when {
|
||||
!name.isSpecial && name.identifier.isEmpty() -> return true
|
||||
!name.isSpecial && name.identifier.isEmpty() -> return ProcessorAction.NEXT
|
||||
relativeClassName == null -> ClassId(import.packageFqName, name)
|
||||
else -> ClassId(import.packageFqName, relativeClassName.child(name), false)
|
||||
}
|
||||
val symbol = provider.getClassLikeSymbolByFqName(classId) ?: continue
|
||||
empty = false
|
||||
if (!processor(symbol)) {
|
||||
return false
|
||||
return ProcessorAction.STOP
|
||||
}
|
||||
}
|
||||
if (empty) {
|
||||
absentClassifierNames += name
|
||||
}
|
||||
return true
|
||||
return ProcessorAction.NEXT
|
||||
}
|
||||
|
||||
|
||||
|
||||
+6
-2
@@ -85,10 +85,14 @@ class FirClassDeclaredMemberScope(klass: FirRegularClass) : FirScope() {
|
||||
return NEXT
|
||||
}
|
||||
|
||||
override fun processClassifiersByName(name: Name, position: FirPosition, processor: (FirClassifierSymbol<*>) -> Boolean): Boolean {
|
||||
override fun processClassifiersByName(
|
||||
name: Name,
|
||||
position: FirPosition,
|
||||
processor: (FirClassifierSymbol<*>) -> ProcessorAction
|
||||
): ProcessorAction {
|
||||
val matchedClass = classIndex[name]
|
||||
if (matchedClass != null && !processor(matchedClass)) {
|
||||
return false
|
||||
return STOP
|
||||
}
|
||||
|
||||
return super.processClassifiersByName(name, position, processor)
|
||||
|
||||
@@ -23,16 +23,16 @@ class FirCompositeScope(
|
||||
override fun processClassifiersByName(
|
||||
name: Name,
|
||||
position: FirPosition,
|
||||
processor: (FirClassifierSymbol<*>) -> Boolean
|
||||
): Boolean {
|
||||
processor: (FirClassifierSymbol<*>) -> ProcessorAction
|
||||
): ProcessorAction {
|
||||
val scopes = if (reversedPriority) scopes.asReversed() else scopes
|
||||
for (scope in scopes) {
|
||||
if (!position.allowTypeParameters && scope is FirTypeParameterScope) continue
|
||||
if (!scope.processClassifiersByName(name, position, processor)) {
|
||||
return false
|
||||
return STOP
|
||||
}
|
||||
}
|
||||
return true
|
||||
return NEXT
|
||||
}
|
||||
|
||||
private inline fun <T> processComposite(
|
||||
|
||||
+5
-4
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.scopes.impl
|
||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.scopes.FirPosition
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -20,11 +21,11 @@ class FirNestedClassifierScope(
|
||||
override fun processClassifiersByName(
|
||||
name: Name,
|
||||
position: FirPosition,
|
||||
processor: (FirClassifierSymbol<*>) -> Boolean
|
||||
): Boolean {
|
||||
processor: (FirClassifierSymbol<*>) -> ProcessorAction
|
||||
): ProcessorAction {
|
||||
val child = classId.createNestedClassId(name)
|
||||
val symbol = symbolProvider.getClassLikeSymbolByFqName(child)
|
||||
val symbol = symbolProvider.getClassLikeSymbolByFqName(child) ?: return ProcessorAction.NONE
|
||||
|
||||
return symbol == null || processor(symbol)
|
||||
return processor(symbol)
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -27,9 +27,9 @@ class FirSelfImportingScope(val fqName: FqName, val session: FirSession) : FirSc
|
||||
override fun processClassifiersByName(
|
||||
name: Name,
|
||||
position: FirPosition,
|
||||
processor: (FirClassifierSymbol<*>) -> Boolean
|
||||
): Boolean {
|
||||
if (name.asString().isEmpty()) return true
|
||||
processor: (FirClassifierSymbol<*>) -> ProcessorAction
|
||||
): ProcessorAction {
|
||||
if (name.asString().isEmpty()) return ProcessorAction.NONE
|
||||
|
||||
|
||||
val symbol = cache.getOrPut(name) {
|
||||
@@ -40,7 +40,7 @@ class FirSelfImportingScope(val fqName: FqName, val session: FirSession) : FirSc
|
||||
return if (symbol != null) {
|
||||
processor(symbol)
|
||||
} else {
|
||||
true
|
||||
ProcessorAction.NONE
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,22 +6,17 @@
|
||||
package org.jetbrains.kotlin.fir.scopes
|
||||
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
abstract class FirScope {
|
||||
@Deprecated(
|
||||
"obsolete",
|
||||
replaceWith = ReplaceWith("processClassifiersByNameWithAction(name, position) { if (processor()) ProcessorAction.NEXT else ProcessorAction.STOP }.next()")
|
||||
)
|
||||
open fun processClassifiersByName(
|
||||
name: Name,
|
||||
position: FirPosition,
|
||||
processor: (FirClassifierSymbol<*>) -> Boolean
|
||||
): Boolean = true
|
||||
processor: (FirClassifierSymbol<*>) -> ProcessorAction
|
||||
): ProcessorAction = NEXT
|
||||
|
||||
open fun processFunctionsByName(
|
||||
name: Name,
|
||||
@@ -35,18 +30,6 @@ abstract class FirScope {
|
||||
): ProcessorAction = NEXT
|
||||
}
|
||||
|
||||
|
||||
inline fun FirScope.processClassifiersByNameWithAction(
|
||||
name: Name,
|
||||
position: FirPosition,
|
||||
crossinline processor: (FirClassifierSymbol<*>) -> ProcessorAction
|
||||
): ProcessorAction {
|
||||
val result = processClassifiersByName(name, position) {
|
||||
processor(it).next()
|
||||
}
|
||||
return if (result) NEXT else STOP
|
||||
}
|
||||
|
||||
enum class FirPosition(val allowTypeParameters: Boolean = true) {
|
||||
SUPER_TYPE_OR_EXPANSION(allowTypeParameters = false),
|
||||
OTHER
|
||||
|
||||
Reference in New Issue
Block a user