Drop state from FirMethodOfAnyImplementedInInterfaceChecker

This commit is contained in:
Mikhail Glukhikh
2021-04-20 16:28:44 +03:00
parent e0fe122ee9
commit 6ae4c3f281
2 changed files with 24 additions and 28 deletions
@@ -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<FirRegularClass>()
?.declarations
?.filterIsInstance<FirSimpleFunction>()
?.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)
}
}
}
}
@@ -74,7 +74,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
FirInterfaceWithSuperclassChecker,
FirLocalEntityNotAllowedChecker,
FirManyCompanionObjectsChecker,
FirMethodOfAnyImplementedInInterfaceChecker(),
FirMethodOfAnyImplementedInInterfaceChecker,
FirDataClassPrimaryConstructorChecker,
FirPrimaryConstructorSuperTypeChecker,
FirTypeParametersInObjectChecker,