From fb372dc4b1472301c5ba822b96ea97d00de4f802 Mon Sep 17 00:00:00 2001 From: teble Date: Mon, 11 Dec 2023 13:55:09 +0800 Subject: [PATCH] Optimize lint checker --- .../dexkit/lint/DexKitIssueRegistry.kt | 2 ++ .../{ => detector}/DexKitCreateDetector.kt | 9 +++--- .../{ => detector}/DexKitDataFirstDetector.kt | 30 ++++++++++--------- .../org/luckypray/dexkit/lint/util/Utils.kt | 29 ++++++++++++++++++ 4 files changed, 52 insertions(+), 18 deletions(-) rename lint-rules/src/main/java/org/luckypray/dexkit/lint/{ => detector}/DexKitCreateDetector.kt (90%) rename lint-rules/src/main/java/org/luckypray/dexkit/lint/{ => detector}/DexKitDataFirstDetector.kt (76%) create mode 100644 lint-rules/src/main/java/org/luckypray/dexkit/lint/util/Utils.kt diff --git a/lint-rules/src/main/java/org/luckypray/dexkit/lint/DexKitIssueRegistry.kt b/lint-rules/src/main/java/org/luckypray/dexkit/lint/DexKitIssueRegistry.kt index 470b1aec..a41491c0 100644 --- a/lint-rules/src/main/java/org/luckypray/dexkit/lint/DexKitIssueRegistry.kt +++ b/lint-rules/src/main/java/org/luckypray/dexkit/lint/DexKitIssueRegistry.kt @@ -4,6 +4,8 @@ import com.android.tools.lint.client.api.IssueRegistry import com.android.tools.lint.client.api.Vendor import com.android.tools.lint.detector.api.CURRENT_API import com.android.tools.lint.detector.api.Issue +import org.luckypray.dexkit.lint.detector.DexKitCreateDetector +import org.luckypray.dexkit.lint.detector.DexKitDataFirstDetector class DexKitIssueRegistry : IssueRegistry() { override val issues: List diff --git a/lint-rules/src/main/java/org/luckypray/dexkit/lint/DexKitCreateDetector.kt b/lint-rules/src/main/java/org/luckypray/dexkit/lint/detector/DexKitCreateDetector.kt similarity index 90% rename from lint-rules/src/main/java/org/luckypray/dexkit/lint/DexKitCreateDetector.kt rename to lint-rules/src/main/java/org/luckypray/dexkit/lint/detector/DexKitCreateDetector.kt index 502048fd..34dfe756 100644 --- a/lint-rules/src/main/java/org/luckypray/dexkit/lint/DexKitCreateDetector.kt +++ b/lint-rules/src/main/java/org/luckypray/dexkit/lint/detector/DexKitCreateDetector.kt @@ -1,4 +1,4 @@ -package org.luckypray.dexkit.lint +package org.luckypray.dexkit.lint.detector import com.android.tools.lint.detector.api.Category import com.android.tools.lint.detector.api.Context @@ -10,12 +10,12 @@ import com.android.tools.lint.detector.api.Scope import com.android.tools.lint.detector.api.Severity import com.intellij.psi.PsiMethod import org.jetbrains.uast.UCallExpression -import java.util.Locale +import org.luckypray.dexkit.lint.util.lang +import org.luckypray.dexkit.lint.util.log class DexKitCreateDetector : Detector(), Detector.UastScanner { companion object { - private val lang: String = runCatching { Locale.getDefault().language }.getOrElse { "en" } val title = when (lang) { "zh" -> "请不要重复创建相同的 DexKitBridge 对象!" else -> "Don't create the same DexKitBridge object repeatedly! " @@ -25,7 +25,7 @@ class DexKitCreateDetector : Detector(), Detector.UastScanner { else -> "Creating DexKitBridge is a time-consuming operation, and you should maintain a global object instead of calling `create()` every time you search." } - private const val ISSUE_ID = "DuplicateCreationDexKit" + private const val ISSUE_ID = "DuplicateCreateDexKit" val ISSUE = Issue.create( ISSUE_ID, title, @@ -54,6 +54,7 @@ class DexKitCreateDetector : Detector(), Detector.UastScanner { if (createParamSet.contains(params)) { val location = context.getLocation(node) context.report(ISSUE, node, location, title + explanation) + context.log(title, explanation, node, location) } else { createParamSet.add(params) } diff --git a/lint-rules/src/main/java/org/luckypray/dexkit/lint/DexKitDataFirstDetector.kt b/lint-rules/src/main/java/org/luckypray/dexkit/lint/detector/DexKitDataFirstDetector.kt similarity index 76% rename from lint-rules/src/main/java/org/luckypray/dexkit/lint/DexKitDataFirstDetector.kt rename to lint-rules/src/main/java/org/luckypray/dexkit/lint/detector/DexKitDataFirstDetector.kt index ca0a6f9e..70d50096 100644 --- a/lint-rules/src/main/java/org/luckypray/dexkit/lint/DexKitDataFirstDetector.kt +++ b/lint-rules/src/main/java/org/luckypray/dexkit/lint/detector/DexKitDataFirstDetector.kt @@ -1,4 +1,4 @@ -package org.luckypray.dexkit.lint +package org.luckypray.dexkit.lint.detector import com.android.tools.lint.detector.api.Category import com.android.tools.lint.detector.api.Detector @@ -9,27 +9,27 @@ import com.android.tools.lint.detector.api.Scope import com.android.tools.lint.detector.api.Severity import com.intellij.psi.PsiMethod import org.jetbrains.uast.UCallExpression -import java.util.Locale +import org.luckypray.dexkit.lint.util.lang +import org.luckypray.dexkit.lint.util.log class DexKitDataFirstDetector : Detector(), Detector.UastScanner { companion object { - private val lang: String = runCatching { Locale.getDefault().language }.getOrElse { "en" } val title = when (lang) { - "zh" -> "结果可能不唯一!" - else -> "The result may not be unique! " + "zh" -> "返回结果不唯一!" + else -> "The result is not unique! " } val explanation = when (lang) { "zh" -> "可能会导致预期外的问题,不推荐使用。" - else -> "May cause unexpected problems and are not recommended" + else -> "May cause unexpected problems and are not recommended." } - private const val ISSUE_ID = "DataMayNonUnique" + private const val ISSUE_ID = "NonUniqueDexKitData" val ISSUE = Issue.create( ISSUE_ID, title, explanation, category = Category.CORRECTNESS, - priority = 9, + priority = 5, severity = Severity.WARNING, implementation = Implementation( DexKitDataFirstDetector::class.java, @@ -56,18 +56,20 @@ class DexKitDataFirstDetector : Detector(), Detector.UastScanner { .text(method.name) .with(fixMap[method.name]!!) .build() + val location = context.uastParser.getCallLocation( + context, + node, + includeReceiver = false, + includeArguments = false + ) context.report( ISSUE, node, - context.uastParser.getCallLocation( - context, - node, - includeReceiver = false, - includeArguments = false - ), + location, title + explanation, replaceFix ) + context.log(title, explanation, node, location) } } } \ No newline at end of file diff --git a/lint-rules/src/main/java/org/luckypray/dexkit/lint/util/Utils.kt b/lint-rules/src/main/java/org/luckypray/dexkit/lint/util/Utils.kt new file mode 100644 index 00000000..b8dbf0ab --- /dev/null +++ b/lint-rules/src/main/java/org/luckypray/dexkit/lint/util/Utils.kt @@ -0,0 +1,29 @@ +package org.luckypray.dexkit.lint.util + +import com.android.tools.lint.detector.api.JavaContext +import com.android.tools.lint.detector.api.Location +import org.jetbrains.uast.UElement +import org.jetbrains.uast.getContainingUFile +import org.jetbrains.uast.getIoFile +import java.util.Locale + +internal val lang: String = runCatching { Locale.getDefault().language }.getOrElse { "en" } + +internal fun loge(format: String, vararg args: Any?) { + System.err.println(String.format(format, *args)) + System.out.flush() +} + +internal fun JavaContext.log(title: String, explanation: String, node: UElement, location: Location) { + loge(buildString { + append(title) + append(explanation) + append("\n\t") + append(node.getContainingUFile()?.getIoFile()?.absolutePath) + append(":") + append(location.start?.line?.let { it + 1 }) + append(":") + append(location.start?.column?.let { it + 1 }) + append(": '${node.asSourceString()}'") + }) +} \ No newline at end of file