Merge "Use the underlying language, instead of sourcePsi" into androidx-main
diff --git a/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/AnnotationRetentionDetector.kt b/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/AnnotationRetentionDetector.kt
index 50643b2..0b9a0bc 100644
--- a/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/AnnotationRetentionDetector.kt
+++ b/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/AnnotationRetentionDetector.kt
@@ -49,7 +49,7 @@
     private inner class AnnotationChecker(val context: JavaContext) : UElementHandler() {
         override fun visitAnnotation(node: UAnnotation) {
             val annotated = node.uastParent as? UAnnotated ?: return
-            val isKotlin = isKotlin(annotated.sourcePsi)
+            val isKotlin = isKotlin(annotated.lang)
             val qualifiedName = node.qualifiedName
 
             if (isKotlin && qualifiedName == JAVA_REQUIRES_OPT_IN_ANNOTATION) {
@@ -69,7 +69,7 @@
          * if it does not.
          */
         private fun validateAnnotationRetention(annotated: UAnnotated) {
-            val isKotlin = isKotlin(annotated.sourcePsi)
+            val isKotlin = isKotlin(annotated.lang)
             val annotations = context.evaluator.getAllAnnotations(annotated, false)
 
             val annotationClass: String
diff --git a/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/ExperimentalDetector.kt b/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/ExperimentalDetector.kt
index 719a480..7b3fab7 100644
--- a/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/ExperimentalDetector.kt
+++ b/annotation/annotation-experimental-lint/src/main/java/androidx/annotation/experimental/lint/ExperimentalDetector.kt
@@ -473,7 +473,7 @@
                 // compiler handles that already. Allow either Java or Kotlin annotations, since
                 // we can enforce both and it's possible that a Kotlin-sourced experimental library
                 // is being used from Java without the Kotlin stdlib in the classpath.
-                if (!isKotlin(usage.sourcePsi)) {
+                if (!isKotlin(usage.lang)) {
                     checkExperimentalUsage(
                         context,
                         annotation,
@@ -633,7 +633,7 @@
         val lintFixes = fix().alternatives()
         var addedFix = false
         usage.getContainingUMethod()?.let { containingMethod ->
-            val isKotlin = isKotlin(usage.sourcePsi)
+            val isKotlin = isKotlin(usage.lang)
             val optInAnnotation = if (isKotlin) {
                 "@androidx.annotation.OptIn($annotation::class)"
             } else {
diff --git a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/OnCreateDialogIncorrectCallbackDetector.kt b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/OnCreateDialogIncorrectCallbackDetector.kt
index 817bdc4..3c27b95 100644
--- a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/OnCreateDialogIncorrectCallbackDetector.kt
+++ b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/OnCreateDialogIncorrectCallbackDetector.kt
@@ -74,14 +74,14 @@
 
     private inner class UastHandler(val context: JavaContext) : UElementHandler() {
         override fun visitClass(node: UClass) {
-            if (isKotlin(context.psiFile) &&
+            if (isKotlin(node.lang) &&
                 (node.sourcePsi as? KtClassOrObject)?.getSuperNames()?.firstOrNull() !=
                 DIALOG_FRAGMENT_CLASS
             ) {
                 return
             }
 
-            if (!isKotlin(context.psiFile) &&
+            if (!isKotlin(node.lang) &&
                 (node.uastSuperTypes.firstOrNull()?.type as? PsiClassReferenceType)
                     ?.className != DIALOG_FRAGMENT_CLASS
             ) {
diff --git a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UnsafeFragmentLifecycleObserverDetector.kt b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UnsafeFragmentLifecycleObserverDetector.kt
index 8ed43ac..b07db9f 100644
--- a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UnsafeFragmentLifecycleObserverDetector.kt
+++ b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UnsafeFragmentLifecycleObserverDetector.kt
@@ -178,7 +178,7 @@
             ) {
                 val argType = PsiTypesUtil.getPsiClass(arg.getExpressionType())
                 if (argType == call.getContainingUClass()?.javaPsi) {
-                    val methodFix = if (isKotlin(context.psiFile)) {
+                    val methodFix = if (isKotlin(call.lang)) {
                         "viewLifecycleOwner"
                     } else {
                         "getViewLifecycleOwner()"
diff --git a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UseGetLayoutInflater.kt b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UseGetLayoutInflater.kt
index ffd14a5..853bac5 100644
--- a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UseGetLayoutInflater.kt
+++ b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UseGetLayoutInflater.kt
@@ -31,6 +31,7 @@
 import com.intellij.psi.PsiMethod
 import com.intellij.psi.PsiType
 import org.jetbrains.uast.UCallExpression
+import org.jetbrains.uast.UElement
 import org.jetbrains.uast.getContainingUClass
 
 /**
@@ -85,8 +86,8 @@
             issue = ISSUE,
             location = context.getLocation(node),
             message = "Use of LayoutInflater.from($methodParameter) detected. Consider using " +
-                "${correctMethod(context)} instead",
-            quickfixData = createFix(correctMethod(context), methodParameter)
+                "${correctMethod(node)} instead",
+            quickfixData = createFix(correctMethod(node), methodParameter)
         )
     }
 
@@ -105,13 +106,13 @@
             issue = ISSUE,
             location = context.getLocation(node),
             message = "Use of LayoutInflater.from(Context) detected. Consider using " +
-                "${correctMethod(context)} instead",
+                "${correctMethod(node)} instead",
             quickfixData = null
         )
     }
 
-    private fun correctMethod(context: JavaContext): String {
-        return if (isKotlin(context.psiFile)) {
+    private fun correctMethod(context: UElement): String {
+        return if (isKotlin(context.lang)) {
             "layoutInflater"
         } else {
             "getLayoutInflater()"
diff --git a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UseRequireInsteadOfGet.kt b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UseRequireInsteadOfGet.kt
index 193833b..82e4caf 100644
--- a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UseRequireInsteadOfGet.kt
+++ b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UseRequireInsteadOfGet.kt
@@ -99,7 +99,6 @@
     }
 
     override fun createUastHandler(context: JavaContext): UElementHandler? {
-        val isKotlin = isKotlin(context.psiFile)
         return object : UElementHandler() {
 
             /** This covers Kotlin accessor syntax expressions like "fragment.arguments" */
@@ -159,7 +158,7 @@
                 // Note we go up potentially two parents - the first one may just be the qualified reference expression
                 val nearestNonQualifiedReferenceParent =
                     skipParenthesizedExprUp(node.nearestNonQualifiedReferenceParent) ?: return
-                if (isKotlin && nearestNonQualifiedReferenceParent.isNullCheckBlock()) {
+                if (isKotlin(node.lang) && nearestNonQualifiedReferenceParent.isNullCheckBlock()) {
                     // We're a double-bang expression (!!)
                     val parentSourceToReplace =
                         nearestNonQualifiedReferenceParent.asSourceString()
@@ -216,7 +215,7 @@
                 nearestNonQualifiedRefParent: UCallExpression
             ) = enclosingMethodCall.parameterList.parametersCount == 1 ||
                 (
-                    isKotlin &&
+                    isKotlin(nearestNonQualifiedRefParent.lang) &&
                         nearestNonQualifiedRefParent.getArgumentForParameter(1) == null
                     )
 
diff --git a/lifecycle/lifecycle-livedata-core-lint/src/main/java/androidx/lifecycle/lint/NonNullableMutableLiveDataDetector.kt b/lifecycle/lifecycle-livedata-core-lint/src/main/java/androidx/lifecycle/lint/NonNullableMutableLiveDataDetector.kt
index ad4d5df..0a2556d 100644
--- a/lifecycle/lifecycle-livedata-core-lint/src/main/java/androidx/lifecycle/lint/NonNullableMutableLiveDataDetector.kt
+++ b/lifecycle/lifecycle-livedata-core-lint/src/main/java/androidx/lifecycle/lint/NonNullableMutableLiveDataDetector.kt
@@ -119,7 +119,7 @@
             }
 
             override fun visitCallExpression(node: UCallExpression) {
-                if (!isKotlin(node.sourcePsi) || !methods.contains(node.methodName) ||
+                if (!isKotlin(node.lang) || !methods.contains(node.methodName) ||
                     !context.evaluator.isMemberInSubClassOf(
                             node.resolve()!!, "androidx.lifecycle.LiveData", false
                         )
diff --git a/lifecycle/lifecycle-runtime-lint/src/main/java/androidx/lifecycle/lint/RepeatOnLifecycleDetector.kt b/lifecycle/lifecycle-runtime-lint/src/main/java/androidx/lifecycle/lint/RepeatOnLifecycleDetector.kt
index 7d42aa1..a2192eb 100644
--- a/lifecycle/lifecycle-runtime-lint/src/main/java/androidx/lifecycle/lint/RepeatOnLifecycleDetector.kt
+++ b/lifecycle/lifecycle-runtime-lint/src/main/java/androidx/lifecycle/lint/RepeatOnLifecycleDetector.kt
@@ -59,7 +59,7 @@
     override fun applicableSuperClasses(): List<String>? = listOf(FRAGMENT_CLASS, ACTIVITY_CLASS)
 
     override fun visitClass(context: JavaContext, declaration: UClass) {
-        if (!isKotlin(context.psiFile)) return // Check only Kotlin files
+        if (!isKotlin(declaration.lang)) return // Check only Kotlin files
 
         val visitedMethods = mutableSetOf<PsiMethod>()
         declaration.methods.forEach { method ->