From 6ae4c3f2813ccedcade098d3673448cb495b449f Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 20 Apr 2021 16:28:44 +0300 Subject: [PATCH] Drop state from FirMethodOfAnyImplementedInInterfaceChecker --- ...ethodOfAnyImplementedInInterfaceChecker.kt | 50 +++++++++---------- .../fir/checkers/CommonDeclarationCheckers.kt | 2 +- 2 files changed, 24 insertions(+), 28 deletions(-) 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 88c613f9d1a..d21c0ac8912 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 @@ -5,35 +5,20 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration -import org.jetbrains.kotlin.fir.analysis.checkers.FirDeclarationInspector +import org.jetbrains.kotlin.fir.HASHCODE_NAME import org.jetbrains.kotlin.fir.analysis.checkers.FirDeclarationPresenter import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.diagnostics.withSuppressedDiagnostics import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.resolve.symbolProvider +import org.jetbrains.kotlin.fir.types.isNullableAny import org.jetbrains.kotlin.name.CallableId -import org.jetbrains.kotlin.utils.addToStdlib.safeAs - -class FirMethodOfAnyImplementedInInterfaceChecker : FirRegularClassChecker(), FirDeclarationPresenter { - private var inspector: FirDeclarationInspector? = null - - private fun getInspector(context: CheckerContext) = inspector ?: FirDeclarationInspector(this).apply { - val anyClassId = context.session.builtinTypes.anyType.id - - context.session.symbolProvider.getClassLikeSymbolByFqName(anyClassId) - ?.fir.safeAs() - ?.declarations - ?.filterIsInstance() - ?.filter { it !is FirConstructor } - ?.forEach { - collect(it) - } - - inspector = this - } +import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS +import org.jetbrains.kotlin.util.OperatorNameConventions.TO_STRING +object FirMethodOfAnyImplementedInInterfaceChecker : FirRegularClassChecker(), FirDeclarationPresenter { // 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) @@ -49,13 +34,24 @@ class FirMethodOfAnyImplementedInInterfaceChecker : FirRegularClassChecker(), Fi return } - for (it in declaration.declarations) { - if (it !is FirSimpleFunction || !it.isOverride || !it.hasBody) continue + for (function in declaration.declarations) { + if (function !is FirSimpleFunction || !function.isOverride || !function.hasBody) continue + var methodOfAny = false + if (function.valueParameters.isEmpty() && + (function.name == HASHCODE_NAME || function.name == TO_STRING) + ) { + methodOfAny = true + } else { + val singleParameter = function.valueParameters.singleOrNull() ?: continue + if (singleParameter.returnTypeRef.isNullableAny && function.name == EQUALS) { + methodOfAny = true + } + } - val inspector = getInspector(context) - - if (inspector.contains(it)) { - reporter.reportOn(it.source, FirErrors.METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE, context) + if (methodOfAny) { + withSuppressedDiagnostics(function, context) { + reporter.reportOn(function.source, FirErrors.METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE, context) + } } } } diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt index e8616cb0b2a..e6c233e5b80 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/checkers/CommonDeclarationCheckers.kt @@ -74,7 +74,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() { FirInterfaceWithSuperclassChecker, FirLocalEntityNotAllowedChecker, FirManyCompanionObjectsChecker, - FirMethodOfAnyImplementedInInterfaceChecker(), + FirMethodOfAnyImplementedInInterfaceChecker, FirDataClassPrimaryConstructorChecker, FirPrimaryConstructorSuperTypeChecker, FirTypeParametersInObjectChecker,