Lint: Support visitResourceReference() in Uast
This commit is contained in:
@@ -74,6 +74,8 @@ object UastChecker {
|
|||||||
val applicableSuperClasses = scanner.applicableSuperClasses ?: emptyList()
|
val applicableSuperClasses = scanner.applicableSuperClasses ?: emptyList()
|
||||||
val applicableConstructorTypes = scanner.applicableConstructorTypes ?: emptyList()
|
val applicableConstructorTypes = scanner.applicableConstructorTypes ?: emptyList()
|
||||||
|
|
||||||
|
val appliesToResourcesRefs = scanner.appliesToResourceRefs()
|
||||||
|
|
||||||
val additionalCheckers = plugins.fold(mutableListOf<UastAdditionalChecker>()) { list, plugin ->
|
val additionalCheckers = plugins.fold(mutableListOf<UastAdditionalChecker>()) { list, plugin ->
|
||||||
for (checker in plugin.additionalCheckers) {
|
for (checker in plugin.additionalCheckers) {
|
||||||
if (checker is AndroidUastAdditionalChecker) list += checker
|
if (checker is AndroidUastAdditionalChecker) list += checker
|
||||||
@@ -106,6 +108,28 @@ object UastChecker {
|
|||||||
scanner.visitClass(context, element)
|
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) {
|
for (checker in additionalCheckers) {
|
||||||
|
|||||||
Reference in New Issue
Block a user