KT-12674 "Calling new methods on older versions" errors for inlined constants

Inlined constants from Java should not be detected.
This commit is contained in:
Yan Zhulanow
2016-06-15 22:58:40 +03:00
parent c0db8e0c0b
commit b34ee4ebb8
3 changed files with 27 additions and 2 deletions

View File

@@ -24,6 +24,7 @@ import com.android.tools.klint.detector.api.*
import org.jetbrains.uast.*
import org.jetbrains.uast.check.UastAndroidContext
import org.jetbrains.uast.check.UastScanner
import org.jetbrains.uast.java.JavaUVariable
import org.jetbrains.uast.visitor.AbstractUastVisitor
import org.jetbrains.uast.visitor.UastVisitor
import java.util.*
@@ -195,6 +196,17 @@ open class ApiDetector : Detector(), UastScanner {
}
is UVariable -> {
if (declaration.kind != UastVariableKind.MEMBER) return
if (declaration is JavaUVariable
&& declaration.hasModifier(UastModifier.IMMUTABLE)
&& declaration.hasModifier(UastModifier.STATIC)
&& declaration.visibility == UastVisibility.PUBLIC
&& declaration.initializer.evaluate() != null) {
val type = declaration.type
// Kotlin inlines Java field values with the primitive types, so we don't need to check its version.
if (type.isPrimitive || type.isString) {
return
}
}
check(db.getFieldVersion(parentInternalName, declaration.name), parentClass)
}
}

View File

@@ -16,6 +16,7 @@
package org.jetbrains.uast.java
import com.intellij.psi.PsiClassType
import com.intellij.psi.PsiPrimitiveType
import com.intellij.psi.PsiType
import org.jetbrains.uast.UClass
import org.jetbrains.uast.UElement
@@ -61,6 +62,12 @@ class JavaUType(
override val isByte: Boolean
get() = check("byte", "java.lang.Byte")
val isString: Boolean
get() = (psi as? PsiClassType)?.resolve()?.qualifiedName == "java.lang.String"
val isPrimitive: Boolean
get() = psi is PsiPrimitiveType
@Suppress("NOTHING_TO_INLINE")
private inline fun check(unboxedType: String, boxedType: String): Boolean =

View File

@@ -8,6 +8,7 @@ import org.w3c.dom.DOMError
import org.w3c.dom.DOMErrorHandler
import org.w3c.dom.DOMLocator
import android.view.View
import android.view.ViewGroup
import android.view.ViewGroup.LayoutParams
import android.app.Activity
@@ -15,8 +16,7 @@ import android.app.ApplicationErrorReport
import android.graphics.PorterDuff
import android.graphics.Rect
import android.os.Build
import android.widget.Chronometer
import android.widget.GridLayout
import android.widget.*
import dalvik.bytecode.OpcodeInfo
import android.os.Build.VERSION
@@ -36,6 +36,9 @@ class ApiCallTest: Activity() {
// Ok
Bundle().getInt("")
// Ok, this constant is inlined
View.SYSTEM_UI_FLAG_FULLSCREEN
// Virtual call
<error descr="Call requires API level 11 (current min is 1): `getActionBar`">getActionBar()</error> // API 11
<error descr="Call requires API level 11 (current min is 1): `getActionBar`">actionBar</error> // API 11
@@ -109,6 +112,9 @@ class ApiCallTest: Activity() {
}
fun test(priority: Boolean, layout: ViewGroup) {
if (layout is LinearLayout) {}
layout as? LinearLayout
if (layout is <error descr="Class requires API level 14 (current min is 1): `GridLayout`">GridLayout</error>) {}
layout as? <error descr="Class requires API level 14 (current min is 1): `GridLayout`">GridLayout</error>