Drop state from FirMethodOfAnyImplementedInInterfaceChecker
This commit is contained in:
+23
-27
@@ -5,35 +5,20 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
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.FirDeclarationPresenter
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn
|
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.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.name.CallableId
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS
|
||||||
|
import org.jetbrains.kotlin.util.OperatorNameConventions.TO_STRING
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
|
object FirMethodOfAnyImplementedInInterfaceChecker : FirRegularClassChecker(), FirDeclarationPresenter {
|
||||||
// We need representations that look like JVM signatures. Thus, just function names, not fully qualified ones.
|
// We need representations that look like JVM signatures. Thus, just function names, not fully qualified ones.
|
||||||
override fun StringBuilder.appendRepresentation(it: CallableId) {
|
override fun StringBuilder.appendRepresentation(it: CallableId) {
|
||||||
append(it.callableName)
|
append(it.callableName)
|
||||||
@@ -49,13 +34,24 @@ class FirMethodOfAnyImplementedInInterfaceChecker : FirRegularClassChecker(), Fi
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
for (it in declaration.declarations) {
|
for (function in declaration.declarations) {
|
||||||
if (it !is FirSimpleFunction || !it.isOverride || !it.hasBody) continue
|
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 (methodOfAny) {
|
||||||
|
withSuppressedDiagnostics(function, context) {
|
||||||
if (inspector.contains(it)) {
|
reporter.reportOn(function.source, FirErrors.METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE, context)
|
||||||
reporter.reportOn(it.source, FirErrors.METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE, context)
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -74,7 +74,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
|
|||||||
FirInterfaceWithSuperclassChecker,
|
FirInterfaceWithSuperclassChecker,
|
||||||
FirLocalEntityNotAllowedChecker,
|
FirLocalEntityNotAllowedChecker,
|
||||||
FirManyCompanionObjectsChecker,
|
FirManyCompanionObjectsChecker,
|
||||||
FirMethodOfAnyImplementedInInterfaceChecker(),
|
FirMethodOfAnyImplementedInInterfaceChecker,
|
||||||
FirDataClassPrimaryConstructorChecker,
|
FirDataClassPrimaryConstructorChecker,
|
||||||
FirPrimaryConstructorSuperTypeChecker,
|
FirPrimaryConstructorSuperTypeChecker,
|
||||||
FirTypeParametersInObjectChecker,
|
FirTypeParametersInObjectChecker,
|
||||||
|
|||||||
Reference in New Issue
Block a user