From 3eeddf70775f5fc9a3f1136f9d649fdad250dfb1 Mon Sep 17 00:00:00 2001 From: Andrey Zinovyev Date: Mon, 7 Jun 2021 17:32:46 +0300 Subject: [PATCH] [FIR] Use member scope to look up function/property by name --- .../checkers/declaration/FirImportsChecker.kt | 44 ++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImportsChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImportsChecker.kt index 7e9224a4ed7..380a881da26 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImportsChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImportsChecker.kt @@ -12,9 +12,11 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.resolve.symbolProvider +import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.expressions.OperatorConventions object FirImportsChecker : FirFileChecker() { @@ -55,16 +57,15 @@ object FirImportsChecker : FirFileChecker() { val classFir = classId.resolveToClass(context) ?: return if (classFir.classKind.isSingleton) return - val illegalImport = classFir.declarations.any { - it is FirSimpleFunction && !it.isStatic && it.name == importedName || - it is FirProperty && it.name == importedName + val illegalImport = classFir.hasFunctionOrProperty(context, importedName) { + it is FirSimpleFunction && !it.isStatic || it is FirProperty } if (illegalImport) { reporter.reportOn(import.source, FirErrors.CANNOT_BE_IMPORTED, importedName, context) } } else { val importedClassId = ClassId.topLevel(importedFqName) - if (context.session.symbolProvider.getClassLikeSymbolByFqName(importedClassId) != null) { + if (importedClassId.resolveToClass(context) != null) { return } context.session.symbolProvider.getPackage(importedFqName)?.let { @@ -99,7 +100,7 @@ object FirImportsChecker : FirFileChecker() { val classId = import.resolvedClassId val illegalRename = if (classId != null) { val classFir = classId.resolveToClass(context) ?: return - classFir.classKind.isSingleton && classFir.declarations.any { it is FirSimpleFunction && it.isOperator} + classFir.classKind.isSingleton && classFir.hasFunction(context, importedName) { it.isOperator } } else { context.session.symbolProvider.getTopLevelFunctionSymbols(import.packageFqName, importedName).any { it.fir.isOperator @@ -134,4 +135,37 @@ object FirImportsChecker : FirFileChecker() { else -> null } } + + private fun FirRegularClass.hasFunction(context: CheckerContext, name: Name, predicate: (FirSimpleFunction) -> Boolean): Boolean { + var result = false + context.session.declaredMemberScope(this).processFunctionsByName(name) { sym -> + if (!result) { + result = predicate(sym.fir) + } + } + return result + } + + private fun FirRegularClass.hasFunctionOrProperty( + context: CheckerContext, + name: Name, + predicate: (FirDeclaration) -> Boolean + ): Boolean { + var result = false + val scope = context.session.declaredMemberScope(this) + scope.processFunctionsByName(name) { sym -> + if (!result) { + result = predicate(sym.fir) + } + } + if (result) return true + + scope.processPropertiesByName(name) { sym -> + if (!result) { + result = predicate(sym.fir) + } + } + + return result + } } \ No newline at end of file