Drop state from FirMethodOfAnyImplementedInInterfaceChecker
This commit is contained in:
+23
-27
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -74,7 +74,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
|
||||
FirInterfaceWithSuperclassChecker,
|
||||
FirLocalEntityNotAllowedChecker,
|
||||
FirManyCompanionObjectsChecker,
|
||||
FirMethodOfAnyImplementedInInterfaceChecker(),
|
||||
FirMethodOfAnyImplementedInInterfaceChecker,
|
||||
FirDataClassPrimaryConstructorChecker,
|
||||
FirPrimaryConstructorSuperTypeChecker,
|
||||
FirTypeParametersInObjectChecker,
|
||||
|
||||
Reference in New Issue
Block a user