From 0e9474342dbacbfff1c99d24911ff450c156a11a Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Thu, 11 Feb 2021 22:25:52 -0800 Subject: [PATCH] Simplify FirMethodOfAnyImplementedInInterfaceChecker * Override CallableId and operator tag parts only, not entire function representation * Even more lazyness for inspector creation --- .../checkers/FirDeclarationInspector.kt | 10 ++++-- ...ethodOfAnyImplementedInInterfaceChecker.kt | 33 +++++++------------ 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirDeclarationInspector.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirDeclarationInspector.kt index b479b4517b4..735c8f69bfe 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirDeclarationInspector.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirDeclarationInspector.kt @@ -149,6 +149,12 @@ interface FirDeclarationPresenter { appendRepresentation(it.symbol.callableId) } + fun StringBuilder.appendOperatorTag(it: FirSimpleFunction) { + if (it.isOperator) { + append("operator ") + } + } + fun represent(it: FirSimpleFunction) = buildString { append('<') it.typeParameters.forEach { @@ -161,9 +167,7 @@ interface FirDeclarationPresenter { appendRepresentation(it) } append(']') - if (it.isOperator) { - append("operator ") - } + appendOperatorTag(it) appendRepresentation(it.symbol.callableId) append('(') it.valueParameters.forEach { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMethodOfAnyImplementedInInterfaceChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMethodOfAnyImplementedInInterfaceChecker.kt index 295e05ad245..444e8b07297 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMethodOfAnyImplementedInInterfaceChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMethodOfAnyImplementedInInterfaceChecker.kt @@ -13,6 +13,7 @@ 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.symbols.CallableId import org.jetbrains.kotlin.utils.addToStdlib.safeAs object FirMethodOfAnyImplementedInInterfaceChecker : FirRegularClassChecker(), FirDeclarationPresenter { @@ -33,26 +34,14 @@ object FirMethodOfAnyImplementedInInterfaceChecker : FirRegularClassChecker(), F inspector = this } - @Suppress("DuplicatedCode") - override fun represent(it: FirSimpleFunction) = buildString { - append('<') - it.typeParameters.forEach { - appendRepresentation(it) - append(',') - } - append('>') - append('[') - it.receiverTypeRef?.let { - appendRepresentation(it) - } - append(']') - append(it.name.asString()) - append('(') - it.valueParameters.forEach { - appendRepresentation(it) - append(',') - } - append(')') + // We need representations that look like JVM signatures. Thus, just function names, not fully qualified ones. + override fun StringBuilder.appendRepresentation(it: CallableId) { + append(it.callableName) + } + + // We need representations that look like JVM signatures. Hence, no need to represent operator. + override fun StringBuilder.appendOperatorTag(it: FirSimpleFunction) { + // Intentionally empty } override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) { @@ -61,9 +50,11 @@ object FirMethodOfAnyImplementedInInterfaceChecker : FirRegularClassChecker(), F } for (it in declaration.declarations) { + if (it !is FirSimpleFunction || !it.isOverride || !it.hasBody) continue + val inspector = getInspector(context) - if (it is FirSimpleFunction && inspector.contains(it) && it.body != null && it.isOverride) { + if (inspector.contains(it)) { reporter.reportOn(it.source, FirErrors.ANY_METHOD_IMPLEMENTED_IN_INTERFACE, context) } }