FIR: Preparation for resolve to classifiers
This commit is contained in:
@@ -8,18 +8,23 @@ package org.jetbrains.kotlin.fir.symbols
|
|||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
interface ConeClassifierLookupTag
|
interface ConeClassifierLookupTag {
|
||||||
|
val name: Name
|
||||||
|
}
|
||||||
|
|
||||||
interface ConeClassifierLookupTagWithFixedSymbol {
|
interface ConeClassifierLookupTagWithFixedSymbol {
|
||||||
val symbol: ConeClassifierSymbol
|
val symbol: ConeClassifierSymbol
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ConeTypeParameterLookupTag : ConeClassifierLookupTag {
|
interface ConeTypeParameterLookupTag : ConeClassifierLookupTag {
|
||||||
val name: Name
|
override val name: Name
|
||||||
|
|
||||||
}
|
}
|
||||||
interface ConeClassLikeLookupTag : ConeClassifierLookupTag {
|
interface ConeClassLikeLookupTag : ConeClassifierLookupTag {
|
||||||
val classId: ClassId
|
val classId: ClassId
|
||||||
|
|
||||||
|
override val name: Name
|
||||||
|
get() = classId.shortClassName
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ConeTypeAliasLookupTag : ConeClassLikeLookupTag
|
interface ConeTypeAliasLookupTag : ConeClassLikeLookupTag
|
||||||
|
|||||||
+33
-20
@@ -16,10 +16,8 @@ import org.jetbrains.kotlin.fir.references.FirResolvedCallableReferenceImpl
|
|||||||
import org.jetbrains.kotlin.fir.references.FirSimpleNamedReference
|
import org.jetbrains.kotlin.fir.references.FirSimpleNamedReference
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
import org.jetbrains.kotlin.fir.scopes.*
|
||||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
|
||||||
import org.jetbrains.kotlin.fir.scopes.impl.*
|
import org.jetbrains.kotlin.fir.scopes.impl.*
|
||||||
import org.jetbrains.kotlin.fir.scopes.lookupSuperTypes
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.*
|
import org.jetbrains.kotlin.fir.symbols.*
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
||||||
@@ -181,7 +179,7 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
|
|||||||
abstract class ApplicabilityChecker {
|
abstract class ApplicabilityChecker {
|
||||||
|
|
||||||
val groupNumbers = mutableListOf<Int>()
|
val groupNumbers = mutableListOf<Int>()
|
||||||
val candidates = mutableListOf<ConeCallableSymbol>()
|
val candidates = mutableListOf<ConeSymbol>()
|
||||||
|
|
||||||
|
|
||||||
var currentApplicability = CandidateApplicability.HIDDEN
|
var currentApplicability = CandidateApplicability.HIDDEN
|
||||||
@@ -205,7 +203,7 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected open fun getApplicability(group: Int, symbol: ConeCallableSymbol): CandidateApplicability {
|
protected open fun getApplicability(group: Int, symbol: ConeSymbol): CandidateApplicability {
|
||||||
val declaration = (symbol as? FirBasedSymbol<*>)?.fir
|
val declaration = (symbol as? FirBasedSymbol<*>)?.fir
|
||||||
?: return CandidateApplicability.HIDDEN
|
?: return CandidateApplicability.HIDDEN
|
||||||
declaration as FirDeclaration
|
declaration as FirDeclaration
|
||||||
@@ -217,7 +215,7 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
|
|||||||
return CandidateApplicability.RESOLVED
|
return CandidateApplicability.RESOLVED
|
||||||
}
|
}
|
||||||
|
|
||||||
open fun consumeCandidate(group: Int, symbol: ConeCallableSymbol) {
|
open fun consumeCandidate(group: Int, symbol: ConeSymbol) {
|
||||||
val applicability = getApplicability(group, symbol)
|
val applicability = getApplicability(group, symbol)
|
||||||
|
|
||||||
if (applicability > currentApplicability) {
|
if (applicability > currentApplicability) {
|
||||||
@@ -235,13 +233,13 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
|
|||||||
|
|
||||||
abstract fun updateNames(names: LinkedHashSet<Name>)
|
abstract fun updateNames(names: LinkedHashSet<Name>)
|
||||||
|
|
||||||
open fun isSuccessful(index: Int, candidate: ConeCallableSymbol): Boolean {
|
open fun isSuccessful(index: Int, candidate: ConeSymbol): Boolean {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
open fun successCandidates(): List<ConeCallableSymbol> {
|
open fun successCandidates(): List<ConeSymbol> {
|
||||||
if (groupNumbers.isEmpty()) return emptyList()
|
if (groupNumbers.isEmpty()) return emptyList()
|
||||||
val result = mutableListOf<ConeCallableSymbol>()
|
val result = mutableListOf<ConeSymbol>()
|
||||||
var bestGroup = groupNumbers.first()
|
var bestGroup = groupNumbers.first()
|
||||||
for ((index, candidate) in candidates.withIndex()) {
|
for ((index, candidate) in candidates.withIndex()) {
|
||||||
val group = groupNumbers[index]
|
val group = groupNumbers[index]
|
||||||
@@ -263,7 +261,7 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
|
|||||||
names.add(name)
|
names.add(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun consumeCandidate(group: Int, symbol: ConeCallableSymbol) {
|
override fun consumeCandidate(group: Int, symbol: ConeSymbol) {
|
||||||
if (symbol !is ConeVariableSymbol) return
|
if (symbol !is ConeVariableSymbol) return
|
||||||
if (symbol.callableId.callableName != name) return
|
if (symbol.callableId.callableName != name) return
|
||||||
super.consumeCandidate(group, symbol)
|
super.consumeCandidate(group, symbol)
|
||||||
@@ -273,7 +271,7 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
|
|||||||
inner class VariableInvokeApplicabilityChecker(val variableName: Name) : FunctionApplicabilityChecker(invoke) {
|
inner class VariableInvokeApplicabilityChecker(val variableName: Name) : FunctionApplicabilityChecker(invoke) {
|
||||||
|
|
||||||
val variableChecker = object : VariableApplicabilityChecker(variableName) {
|
val variableChecker = object : VariableApplicabilityChecker(variableName) {
|
||||||
override fun isSuccessful(index: Int, candidate: ConeCallableSymbol): Boolean {
|
override fun isSuccessful(index: Int, candidate: ConeSymbol): Boolean {
|
||||||
return matchedProperties[index]
|
return matchedProperties[index]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -287,12 +285,13 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isInvokeApplicableOn(propertySymbol: ConeCallableSymbol, invokeSymbol: ConeCallableSymbol): Boolean {
|
private fun isInvokeApplicableOn(propertySymbol: ConeSymbol, invokeSymbol: ConeCallableSymbol): Boolean {
|
||||||
return true //TODO: Actual type-check here
|
return true //TODO: Actual type-check here
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getApplicability(group: Int, symbol: ConeCallableSymbol): CandidateApplicability {
|
override fun getApplicability(group: Int, symbol: ConeSymbol): CandidateApplicability {
|
||||||
|
|
||||||
|
symbol as ConeCallableSymbol
|
||||||
val declaration = (symbol as? FirBasedSymbol<*>)?.fir
|
val declaration = (symbol as? FirBasedSymbol<*>)?.fir
|
||||||
?: return CandidateApplicability.HIDDEN
|
?: return CandidateApplicability.HIDDEN
|
||||||
declaration as FirDeclaration
|
declaration as FirDeclaration
|
||||||
@@ -303,7 +302,7 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
|
|||||||
|
|
||||||
var applicable = false
|
var applicable = false
|
||||||
|
|
||||||
fun processCandidates(candidates: Iterable<IndexedValue<ConeCallableSymbol>>) {
|
fun processCandidates(candidates: Iterable<IndexedValue<ConeSymbol>>) {
|
||||||
for ((index, candidate) in candidates) {
|
for ((index, candidate) in candidates) {
|
||||||
val invokeApplicableOn = isInvokeApplicableOn(candidate, symbol)
|
val invokeApplicableOn = isInvokeApplicableOn(candidate, symbol)
|
||||||
if (invokeApplicableOn) {
|
if (invokeApplicableOn) {
|
||||||
@@ -330,8 +329,8 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
|
|||||||
return currentApplicability == CandidateApplicability.RESOLVED
|
return currentApplicability == CandidateApplicability.RESOLVED
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun consumeCandidate(group: Int, symbol: ConeCallableSymbol) {
|
override fun consumeCandidate(group: Int, symbol: ConeSymbol) {
|
||||||
if (symbol.callableId.callableName == variableName) {
|
if (symbol is ConeVariableSymbol && symbol.callableId.callableName == variableName) {
|
||||||
variableChecker.consumeCandidate(group, symbol)
|
variableChecker.consumeCandidate(group, symbol)
|
||||||
|
|
||||||
val lastCandidate = variableChecker.candidates.lastOrNull()
|
val lastCandidate = variableChecker.candidates.lastOrNull()
|
||||||
@@ -369,6 +368,19 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
|
|||||||
val invoke = Name.identifier("invoke")
|
val invoke = Name.identifier("invoke")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ClassifierApplicabilityChecker(val name: Name) : ApplicabilityChecker() {
|
||||||
|
override fun updateNames(names: LinkedHashSet<Name>) {
|
||||||
|
names.add(name)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun consumeCandidate(group: Int, symbol: ConeSymbol) {
|
||||||
|
if (symbol !is ConeClassifierSymbol) return
|
||||||
|
if (symbol.toLookupTag().name != name) return
|
||||||
|
super.consumeCandidate(group, symbol)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
open class FunctionApplicabilityChecker(val name: Name) : ApplicabilityChecker() {
|
open class FunctionApplicabilityChecker(val name: Name) : ApplicabilityChecker() {
|
||||||
|
|
||||||
var parameterCount = 0
|
var parameterCount = 0
|
||||||
@@ -377,7 +389,7 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
|
|||||||
names.add(name)
|
names.add(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getApplicability(group: Int, symbol: ConeCallableSymbol): CandidateApplicability {
|
override fun getApplicability(group: Int, symbol: ConeSymbol): CandidateApplicability {
|
||||||
val declaration = (symbol as FirBasedSymbol<*>).fir
|
val declaration = (symbol as FirBasedSymbol<*>).fir
|
||||||
|
|
||||||
if (declaration is FirFunction) {
|
if (declaration is FirFunction) {
|
||||||
@@ -386,7 +398,7 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
|
|||||||
return super.getApplicability(group, symbol)
|
return super.getApplicability(group, symbol)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun consumeCandidate(group: Int, symbol: ConeCallableSymbol) {
|
override fun consumeCandidate(group: Int, symbol: ConeSymbol) {
|
||||||
if (symbol !is ConeFunctionSymbol) return
|
if (symbol !is ConeFunctionSymbol) return
|
||||||
if (symbol.callableId.callableName != name) return
|
if (symbol.callableId.callableName != name) return
|
||||||
super.consumeCandidate(group, symbol)
|
super.consumeCandidate(group, symbol)
|
||||||
@@ -413,13 +425,14 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
|
|||||||
processedScopes.add(scope)
|
processedScopes.add(scope)
|
||||||
|
|
||||||
names.forEach { name ->
|
names.forEach { name ->
|
||||||
fun process(symbol: ConeCallableSymbol): ProcessorAction {
|
fun process(symbol: ConeSymbol): ProcessorAction {
|
||||||
for (checker in checkers) {
|
for (checker in checkers) {
|
||||||
checker.consumeCandidate(index, symbol)
|
checker.consumeCandidate(index, symbol)
|
||||||
}
|
}
|
||||||
return ProcessorAction.NEXT
|
return ProcessorAction.NEXT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
scope.processClassifiersByNameWithAction(name, FirPosition.OTHER, ::process)
|
||||||
scope.processPropertiesByName(name, ::process)
|
scope.processPropertiesByName(name, ::process)
|
||||||
scope.processFunctionsByName(name, ::process)
|
scope.processFunctionsByName(name, ::process)
|
||||||
}
|
}
|
||||||
@@ -515,7 +528,7 @@ class FirBodyResolveTransformer(val session: FirSession) : FirTransformer<Any?>(
|
|||||||
FirQualifiedAccessExpressionImpl(functionCall.session, functionCall.calleeReference.psi, functionCall.safe).apply {
|
FirQualifiedAccessExpressionImpl(functionCall.session, functionCall.calleeReference.psi, functionCall.safe).apply {
|
||||||
calleeReference = createResolvedNamedReference(
|
calleeReference = createResolvedNamedReference(
|
||||||
functionCall.calleeReference,
|
functionCall.calleeReference,
|
||||||
result.variableChecker.successCandidates()
|
result.variableChecker.successCandidates() as List<ConeCallableSymbol>
|
||||||
)
|
)
|
||||||
explicitReceiver = functionCall.explicitReceiver
|
explicitReceiver = functionCall.explicitReceiver
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,12 +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.ConeClassifierSymbol
|
import org.jetbrains.kotlin.fir.symbols.ConeClassifierSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
|
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
|
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
interface FirScope {
|
interface FirScope {
|
||||||
|
@Deprecated(
|
||||||
|
"obsolete",
|
||||||
|
replaceWith = ReplaceWith("processClassifiersByNameWithAction(name, position) { if (processor()) ProcessorAction.NEXT else ProcessorAction.STOP }.next()")
|
||||||
|
)
|
||||||
fun processClassifiersByName(
|
fun processClassifiersByName(
|
||||||
name: Name,
|
name: Name,
|
||||||
position: FirPosition,
|
position: FirPosition,
|
||||||
@@ -29,6 +34,18 @@ interface FirScope {
|
|||||||
): ProcessorAction = NEXT
|
): ProcessorAction = NEXT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline fun FirScope.processClassifiersByNameWithAction(
|
||||||
|
name: Name,
|
||||||
|
position: FirPosition,
|
||||||
|
crossinline processor: (ConeClassifierSymbol) -> 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