Lint: Support visitResourceReference() in Uast

This commit is contained in:
Yan Zhulanow
2016-03-22 15:39:12 +03:00
parent 514e3859da
commit 3a7f29bfc5
@@ -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<UastAdditionalChecker>()) { 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) {