From 3a7f29bfc565a10a334b0ee4c1d82562c17ffb69 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 22 Mar 2016 15:39:12 +0300 Subject: [PATCH] Lint: Support visitResourceReference() in Uast --- .../org/jetbrains/uast/check/UastChecker.kt | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/plugins/lint/uast-android/src/org/jetbrains/uast/check/UastChecker.kt b/plugins/lint/uast-android/src/org/jetbrains/uast/check/UastChecker.kt index bb93c7a1169..5fe613fc862 100644 --- a/plugins/lint/uast-android/src/org/jetbrains/uast/check/UastChecker.kt +++ b/plugins/lint/uast-android/src/org/jetbrains/uast/check/UastChecker.kt @@ -74,6 +74,8 @@ object UastChecker { val applicableSuperClasses = scanner.applicableSuperClasses ?: emptyList() val applicableConstructorTypes = scanner.applicableConstructorTypes ?: emptyList() + val appliesToResourcesRefs = scanner.appliesToResourceRefs() + val additionalCheckers = plugins.fold(mutableListOf()) { list, plugin -> for (checker in plugin.additionalCheckers) { if (checker is AndroidUastAdditionalChecker) list += checker @@ -106,6 +108,28 @@ object UastChecker { scanner.visitClass(context, element) } } + is UQualifiedExpression -> { + if (appliesToResourcesRefs && element.receiver is UQualifiedExpression) { + val parentQualifiedExpr = element.receiver as UQualifiedExpression + val resourceName = element.selector + val resourceType = parentQualifiedExpr.selector + val receiver = parentQualifiedExpr.receiver + + val receiverIsResourceClass = when (receiver) { + is USimpleReferenceExpression -> receiver.identifier == "R" + is UQualifiedExpression -> receiver.selectorMatches("R") + else -> false + } + + if (resourceName is USimpleReferenceExpression && resourceType is USimpleReferenceExpression + && receiverIsResourceClass && receiver is UResolvable) { + val resolvedReceiver = receiver.resolve(context) + val isFramework = (resolvedReceiver as? UClass)?.matchesFqName("android.R") ?: false + + scanner.visitResourceReference(context, element, resourceType.identifier, resourceName.identifier, isFramework) + } + } + } } for (checker in additionalCheckers) {