KT-8273 Don't mark serialVersionUID as unused

#KT-8273 fixed
This commit is contained in:
Evgeny Gerashchenko
2015-07-09 23:17:27 +03:00
parent 50dbf080f7
commit fe1d4e38b3
2 changed files with 30 additions and 0 deletions
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.inspections
import com.intellij.codeInsight.FileModificationService
import com.intellij.codeInsight.daemon.QuickFixBundle
import com.intellij.codeInsight.daemon.impl.analysis.HighlightUtil
import com.intellij.codeInspection.*
import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection
import com.intellij.codeInspection.ex.EntryPointsManager
@@ -45,6 +46,7 @@ import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.kotlin.psi.psiUtil.isAncestor
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.types.expressions.OperatorConventions
@@ -77,6 +79,19 @@ public class UnusedSymbolInspection : AbstractKotlinInspection() {
return lightElement != null && javaInspection.isEntryPoint(lightElement)
}
private fun JetProperty.isSerializationImplicitlyUsedField(): Boolean {
val ownerObject = getNonStrictParentOfType<JetClassOrObject>()
if (ownerObject is JetObjectDeclaration && ownerObject.isCompanion()) {
val lightClass = ownerObject.getNonStrictParentOfType<JetClass>()?.toLightClass() ?: return false
return lightClass.getFields().any { it.getName() == getName() && HighlightUtil.isSerializationImplicitlyUsedField(it) }
}
return false
}
private fun JetObjectDeclaration.hasSerializationImplicitlyUsedField(): Boolean {
return getDeclarations().any { it is JetProperty && it.isSerializationImplicitlyUsedField() }
}
// variation of IDEA's AnnotationUtil.checkAnnotatedUsingPatterns()
private fun checkAnnotatedUsingPatterns(annotated: Annotated, annotationPatterns: Collection<String>): Boolean {
val annotationsPresent = annotated.getAnnotations()
@@ -141,6 +156,8 @@ public class UnusedSymbolInspection : AbstractKotlinInspection() {
// More expensive, resolve-based checks
if (isEntryPoint(declaration)) return
if (declaration is JetProperty && declaration.isSerializationImplicitlyUsedField()) return
if (isCompanionObject && (declaration as JetObjectDeclaration).hasSerializationImplicitlyUsedField()) return
// properties can be referred by component1/component2, which is too expensive to search, don't mark them as unused
if (declaration is JetParameter && declaration.dataClassComponentFunctionName() != null) return
@@ -0,0 +1,13 @@
// FULL_JDK
import kotlin.platform.platformStatic
class Klass : java.io.Serializable {
companion object {
private platformStatic val serialVersionUID: Long = 239
}
}
fun main(args: Array<String>) {
Klass()
}