Fix #KT-12047 (Kotlin Lint: "Missing @JavascriptInterface on methods" does not report anything)
(cherry picked from commit 61e8e01) (cherry picked from commit dbc54e2)
This commit is contained in:
+1
-1
@@ -96,7 +96,7 @@ public class JavaScriptInterfaceDetector extends Detector implements UastScanner
|
|||||||
}
|
}
|
||||||
|
|
||||||
UExpression first = node.getValueArguments().get(0);
|
UExpression first = node.getValueArguments().get(0);
|
||||||
UElement resolved = node.resolve(context);
|
UElement resolved = UastUtils.resolveIfCan(first, context);
|
||||||
if (resolved instanceof UVariable) {
|
if (resolved instanceof UVariable) {
|
||||||
// We're passing in a variable to the addJavaScriptInterface method;
|
// We're passing in a variable to the addJavaScriptInterface method;
|
||||||
// the variable may be of a more generic type than the actual
|
// the variable may be of a more generic type than the actual
|
||||||
|
|||||||
+12
@@ -16,9 +16,15 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.uast
|
package org.jetbrains.kotlin.uast
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
import org.jetbrains.kotlin.psi.KtObjectLiteralExpression
|
import org.jetbrains.kotlin.psi.KtObjectLiteralExpression
|
||||||
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny
|
||||||
|
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||||
import org.jetbrains.uast.UElement
|
import org.jetbrains.uast.UElement
|
||||||
import org.jetbrains.uast.UObjectLiteralExpression
|
import org.jetbrains.uast.UObjectLiteralExpression
|
||||||
|
import org.jetbrains.uast.UType
|
||||||
import org.jetbrains.uast.psi.PsiElementBacked
|
import org.jetbrains.uast.psi.PsiElementBacked
|
||||||
|
|
||||||
class KotlinUObjectLiteralExpression(
|
class KotlinUObjectLiteralExpression(
|
||||||
@@ -26,4 +32,10 @@ class KotlinUObjectLiteralExpression(
|
|||||||
override val parent: UElement
|
override val parent: UElement
|
||||||
) : UObjectLiteralExpression, PsiElementBacked, KotlinUElementWithType {
|
) : UObjectLiteralExpression, PsiElementBacked, KotlinUElementWithType {
|
||||||
override val declaration by lz { KotlinUClass(psi.objectDeclaration, this, true) }
|
override val declaration by lz { KotlinUClass(psi.objectDeclaration, this, true) }
|
||||||
|
override fun getExpressionType(): UType? {
|
||||||
|
val obj = psi.objectDeclaration
|
||||||
|
val bindingContext = obj.analyze(BodyResolveMode.PARTIAL)
|
||||||
|
val descriptor = bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, obj] as? ClassDescriptor ?: return null
|
||||||
|
return KotlinConverter.convert(descriptor.getSuperClassOrAny().defaultType, psi.project, null)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -12,6 +12,10 @@ class JavaScriptTestK {
|
|||||||
webview.addJavascriptInterface(InheritsFromAnnotated(), "myobj")
|
webview.addJavascriptInterface(InheritsFromAnnotated(), "myobj")
|
||||||
webview.addJavascriptInterface(NonAnnotatedObject(), "myobj")
|
webview.addJavascriptInterface(NonAnnotatedObject(), "myobj")
|
||||||
|
|
||||||
|
webview.addJavascriptInterface(null, "nothing")
|
||||||
|
webview.addJavascriptInterface(object : Any() { @JavascriptInterface fun method() {} }, "nothing")
|
||||||
|
webview.addJavascriptInterface(JavascriptFace(), "nothing")
|
||||||
|
|
||||||
var o: Any = NonAnnotatedObject()
|
var o: Any = NonAnnotatedObject()
|
||||||
webview.addJavascriptInterface(o, "myobj")
|
webview.addJavascriptInterface(o, "myobj")
|
||||||
o = InheritsFromAnnotated()
|
o = InheritsFromAnnotated()
|
||||||
@@ -56,3 +60,7 @@ class JavaScriptTestK {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class JavascriptFace {
|
||||||
|
fun method() {}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user