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