From 8f75ababde030c03c7cd6f15cd9ac9352f3bad85 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 15 Jun 2016 22:58:40 +0300 Subject: [PATCH] KT-12674 "Calling new methods on older versions" errors for inlined constants Inlined constants from Java should not be detected. (cherry picked from commit b34ee4e) --- .../com/android/tools/klint/checks/ApiDetector.kt | 12 ++++++++++++ .../jetbrains/uast/java/declarations/JavaUType.kt | 7 +++++++ plugins/uast-kotlin/testData/lint/apiCheck.kt | 10 ++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) 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