From 5b6a8dcfd3f21a11d5a339288da9dacda3e40bba Mon Sep 17 00:00:00 2001 From: Kirill Date: Tue, 3 May 2016 20:46:45 +0200 Subject: [PATCH] Don't mark magic Serializable methods as unused Fixes #KT-10635 --- .../inspections/UnusedSymbolInspection.kt | 7 +++++++ .../function/implicitForSerialization.kt | 21 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 idea/testData/inspections/unusedSymbol/function/implicitForSerialization.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt index 56a2b3173c8..7c6ae523ae1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt @@ -20,6 +20,7 @@ import com.intellij.codeInsight.AnnotationUtil import com.intellij.codeInsight.FileModificationService import com.intellij.codeInsight.daemon.QuickFixBundle import com.intellij.codeInsight.daemon.impl.analysis.HighlightUtil +import com.intellij.codeInsight.daemon.impl.analysis.JavaHighlightUtil import com.intellij.codeInsight.intention.QuickFixFactory import com.intellij.codeInspection.* import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection @@ -40,6 +41,7 @@ import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.refactoring.safeDelete.SafeDeleteHandler import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.toLightClass +import org.jetbrains.kotlin.asJava.toLightMethods import org.jetbrains.kotlin.descriptors.annotations.Annotated import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.analyze @@ -95,6 +97,10 @@ class UnusedSymbolInspection : AbstractKotlinInspection() { return false } + private fun KtNamedFunction.isSerializationImplicitlyUsedMethod(): Boolean { + return toLightMethods().any { JavaHighlightUtil.isSerializationRelatedMethod(it, it.containingClass) } + } + // variation of IDEA's AnnotationUtil.checkAnnotatedUsingPatterns() private fun checkAnnotatedUsingPatterns(annotated: Annotated, annotationPatterns: Collection): Boolean { val annotationsPresent = annotated.annotations @@ -147,6 +153,7 @@ class UnusedSymbolInspection : AbstractKotlinInspection() { if (declaration.resolveToDescriptorIfAny() == null) return if (isEntryPoint(declaration)) return if (declaration is KtProperty && declaration.isSerializationImplicitlyUsedField()) return + if (declaration is KtNamedFunction && declaration.isSerializationImplicitlyUsedMethod()) return // properties can be referred by component1/component2, which is too expensive to search, don't mark them as unused if (declaration is KtParameter && declaration.dataClassComponentFunction() != null) return diff --git a/idea/testData/inspections/unusedSymbol/function/implicitForSerialization.kt b/idea/testData/inspections/unusedSymbol/function/implicitForSerialization.kt new file mode 100644 index 00000000000..8d96a0a0a6d --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/function/implicitForSerialization.kt @@ -0,0 +1,21 @@ +// FULL_JDK + +class Foo : java.io.Serializable { + private fun writeObject(s: java.io.ObjectOutputStream) { + s.toString() + } + + private fun readObject(s: java.io.ObjectInputStream) { + s.toString() + } + + fun writeReplace(): Any = Any() + fun readResolve(): Any = Any() + + fun readObjectNoData() { + } +} + +fun main(args: Array) { + Foo() +} \ No newline at end of file