From 0bfcfb57167d11b4c149a8df5d4dda3bca582b25 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Thu, 8 Nov 2018 13:13:40 +0900 Subject: [PATCH] ProtectedInFinalInspection: don't report for finalize() method #KT-13311 Fixed --- .../inspections/ProtectedInFinalInspection.kt | 17 +++++++++++++---- .../inspections/protectedInFinal/finalize.kt | 4 ++++ 2 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 idea/testData/inspections/protectedInFinal/finalize.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/ProtectedInFinalInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/ProtectedInFinalInspection.kt index d0f63d32e0d..4962e5b8182 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/ProtectedInFinalInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/ProtectedInFinalInspection.kt @@ -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(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" diff --git a/idea/testData/inspections/protectedInFinal/finalize.kt b/idea/testData/inspections/protectedInFinal/finalize.kt new file mode 100644 index 00000000000..9910da8f435 --- /dev/null +++ b/idea/testData/inspections/protectedInFinal/finalize.kt @@ -0,0 +1,4 @@ +class C { + protected fun finalize() { + } +}