diff --git a/plugins/lint/lint-checks/src/com/android/tools/klint/checks/ApiDetector.kt b/plugins/lint/lint-checks/src/com/android/tools/klint/checks/ApiDetector.kt
index 84917df3f38..8dfb03dc513 100755
--- a/plugins/lint/lint-checks/src/com/android/tools/klint/checks/ApiDetector.kt
+++ b/plugins/lint/lint-checks/src/com/android/tools/klint/checks/ApiDetector.kt
@@ -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)
}
}
diff --git a/plugins/uast-java/src/org/jetbrains/uast/java/declarations/JavaUType.kt b/plugins/uast-java/src/org/jetbrains/uast/java/declarations/JavaUType.kt
index 175bbb9db26..c9f1bb42836 100644
--- a/plugins/uast-java/src/org/jetbrains/uast/java/declarations/JavaUType.kt
+++ b/plugins/uast-java/src/org/jetbrains/uast/java/declarations/JavaUType.kt
@@ -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 =
diff --git a/plugins/uast-kotlin/testData/lint/apiCheck.kt b/plugins/uast-kotlin/testData/lint/apiCheck.kt
index 74a6a6b3dcb..2eef109c83d 100644
--- a/plugins/uast-kotlin/testData/lint/apiCheck.kt
+++ b/plugins/uast-kotlin/testData/lint/apiCheck.kt
@@ -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
getActionBar() // API 11
actionBar // API 11
@@ -110,6 +113,9 @@ class ApiCallTest: Activity() {
}
fun test(priority: Boolean, layout: ViewGroup) {
+ if (layout is LinearLayout) {}
+ layout as? LinearLayout
+
if (layout is GridLayout) {}
layout as? GridLayout