ProtectedInFinalInspection: don't report for finalize() method #KT-13311 Fixed

This commit is contained in:
Toshiaki Kameyama
2018-11-08 13:13:40 +09:00
committed by Mikhail Glukhikh
parent b935f52a63
commit 0bfcfb5716
2 changed files with 17 additions and 4 deletions
@@ -9,15 +9,16 @@ import com.intellij.codeInsight.FileModificationService
import com.intellij.codeInspection.*
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElementVisitor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.idea.core.implicitVisibility
import org.jetbrains.kotlin.idea.core.isInheritable
import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtModifierListOwner
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.addRemoveModifier.addModifier
import org.jetbrains.kotlin.psi.declarationVisitor
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.psi.psiUtil.visibilityModifier
import org.jetbrains.kotlin.types.typeUtil.isUnit
class ProtectedInFinalInspection : AbstractKotlinInspection() {
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor {
@@ -27,7 +28,8 @@ class ProtectedInFinalInspection : AbstractKotlinInspection() {
if (modifierType == KtTokens.PROTECTED_KEYWORD) {
val parentClass = declaration.getParentOfType<KtClass>(true) ?: return
if (!parentClass.isInheritable() && !parentClass.isEnum() &&
declaration.implicitVisibility() != KtTokens.PROTECTED_KEYWORD
declaration.implicitVisibility() != KtTokens.PROTECTED_KEYWORD &&
!declaration.isFinalizeMethod()
) {
holder.registerProblem(
visibilityModifier,
@@ -41,6 +43,13 @@ class ProtectedInFinalInspection : AbstractKotlinInspection() {
})
}
private fun KtDeclaration.isFinalizeMethod(): Boolean {
val function = this as? KtNamedFunction ?: return false
return function.name == "finalize"
&& function.valueParameters.isEmpty()
&& (function.descriptor as? FunctionDescriptor)?.returnType?.isUnit() == true
}
class MakePrivateFix : LocalQuickFix {
override fun getName(): String = "Make private"
@@ -0,0 +1,4 @@
class C {
protected fun finalize() {
}
}