Don't mark magic Serializable methods as unused
Fixes #KT-10635
This commit is contained in:
@@ -20,6 +20,7 @@ import com.intellij.codeInsight.AnnotationUtil
|
|||||||
import com.intellij.codeInsight.FileModificationService
|
import com.intellij.codeInsight.FileModificationService
|
||||||
import com.intellij.codeInsight.daemon.QuickFixBundle
|
import com.intellij.codeInsight.daemon.QuickFixBundle
|
||||||
import com.intellij.codeInsight.daemon.impl.analysis.HighlightUtil
|
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.codeInsight.intention.QuickFixFactory
|
||||||
import com.intellij.codeInspection.*
|
import com.intellij.codeInspection.*
|
||||||
import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection
|
import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection
|
||||||
@@ -40,6 +41,7 @@ import com.intellij.psi.search.searches.ReferencesSearch
|
|||||||
import com.intellij.refactoring.safeDelete.SafeDeleteHandler
|
import com.intellij.refactoring.safeDelete.SafeDeleteHandler
|
||||||
import org.jetbrains.kotlin.asJava.LightClassUtil
|
import org.jetbrains.kotlin.asJava.LightClassUtil
|
||||||
import org.jetbrains.kotlin.asJava.toLightClass
|
import org.jetbrains.kotlin.asJava.toLightClass
|
||||||
|
import org.jetbrains.kotlin.asJava.toLightMethods
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotated
|
import org.jetbrains.kotlin.descriptors.annotations.Annotated
|
||||||
import org.jetbrains.kotlin.idea.KotlinBundle
|
import org.jetbrains.kotlin.idea.KotlinBundle
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
@@ -95,6 +97,10 @@ class UnusedSymbolInspection : AbstractKotlinInspection() {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun KtNamedFunction.isSerializationImplicitlyUsedMethod(): Boolean {
|
||||||
|
return toLightMethods().any { JavaHighlightUtil.isSerializationRelatedMethod(it, it.containingClass) }
|
||||||
|
}
|
||||||
|
|
||||||
// variation of IDEA's AnnotationUtil.checkAnnotatedUsingPatterns()
|
// variation of IDEA's AnnotationUtil.checkAnnotatedUsingPatterns()
|
||||||
private fun checkAnnotatedUsingPatterns(annotated: Annotated, annotationPatterns: Collection<String>): Boolean {
|
private fun checkAnnotatedUsingPatterns(annotated: Annotated, annotationPatterns: Collection<String>): Boolean {
|
||||||
val annotationsPresent = annotated.annotations
|
val annotationsPresent = annotated.annotations
|
||||||
@@ -147,6 +153,7 @@ class UnusedSymbolInspection : AbstractKotlinInspection() {
|
|||||||
if (declaration.resolveToDescriptorIfAny() == null) return
|
if (declaration.resolveToDescriptorIfAny() == null) return
|
||||||
if (isEntryPoint(declaration)) return
|
if (isEntryPoint(declaration)) return
|
||||||
if (declaration is KtProperty && declaration.isSerializationImplicitlyUsedField()) 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
|
// 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
|
if (declaration is KtParameter && declaration.dataClassComponentFunction() != null) return
|
||||||
|
|
||||||
|
|||||||
@@ -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<String>) {
|
||||||
|
Foo()
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user