mirror of
https://github.com/jlengrand/kotlin.git
synced 2026-04-03 15:52:00 +00:00
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:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 =
|
||||
|
||||
10
plugins/uast-kotlin/testData/lint/apiCheck.kt
vendored
10
plugins/uast-kotlin/testData/lint/apiCheck.kt
vendored
@@ -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>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user