Skip to content

Commit

Permalink
Optimize lint checker
Browse files Browse the repository at this point in the history
  • Loading branch information
teble committed Dec 11, 2023
1 parent 8b2a3ed commit fb372dc
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<Issue>
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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! "
Expand All @@ -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,
Expand Down Expand Up @@ -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)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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,
Expand All @@ -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)
}
}
}
29 changes: 29 additions & 0 deletions lint-rules/src/main/java/org/luckypray/dexkit/lint/util/Utils.kt
Original file line number Diff line number Diff line change
@@ -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()}'")
})
}

0 comments on commit fb372dc

Please sign in to comment.