Skip to content

Commit

Permalink
Replace abstract with non-final and check activities too
Browse files Browse the repository at this point in the history
  • Loading branch information
DHosseiny committed Feb 3, 2024
1 parent 5b8334e commit 052bceb
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@ package com.farsitel.bazaar.lintrules
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.farsitel.bazaar.lintrules.rules.PluginsOverrideInAbstractClassDetector
import com.farsitel.bazaar.lintrules.rules.PluginsOverrideInNonFinalClassDetector

/*
* The list of issues that will be checked when running <code>lint</code>.
*/
class BazaarIssueRegistry : IssueRegistry() {
override val issues = listOf(PluginsOverrideInAbstractClassDetector.ISSUE)
override val issues = listOf(PluginsOverrideInNonFinalClassDetector.ISSUE)

override val api: Int
get() = CURRENT_API
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ import org.jetbrains.uast.UClass
import org.jetbrains.uast.UElement

/**
* Detector spotting abstract classes that extends BaseFragment and overriding plugins function.
* Detector spotting non-final classes that extends BaseFragment and overriding plugins function.
*/
class PluginsOverrideInAbstractClassDetector : Detector(), UastScanner {
class PluginsOverrideInNonFinalClassDetector : Detector(), UastScanner {

override fun getApplicableUastTypes(): List<Class<out UElement?>> {
return listOf(UClass::class.java)
Expand All @@ -48,7 +48,8 @@ class PluginsOverrideInAbstractClassDetector : Detector(), UastScanner {
buildSet {
InheritanceUtil.getSuperClasses(node, this, false)
}.find {
it.name == "BaseFragment"
it.name == "BaseFragment" ||
it.name == "BaseActivity"
} ?: return

node.findMethodsByName("plugins", false)
Expand All @@ -60,8 +61,7 @@ class PluginsOverrideInAbstractClassDetector : Detector(), UastScanner {
ISSUE,
node,
context.getLocation(this),
"""abstract/open fragment should not override `plugins` function.
override in child classes instead."""
"""non-final fragment/activity should not override `plugins` function. `override` in child classes instead."""
)
}
}
Expand All @@ -76,20 +76,20 @@ class PluginsOverrideInAbstractClassDetector : Detector(), UastScanner {
@JvmField
val ISSUE: Issue = Issue.create(
// ID: used in @SuppressLint warnings etc
id = "PluginInAbstractClass",
id = "PluginsInNonFinalClass",
// Title -- shown in the IDE's preference dialog, as category headers in the
// Analysis results window, etc
briefDescription = "Plugins In Abstract class",
briefDescription = "Plugins override In non-final class",
// Full explanation of the issue; you can use some markdown markup such as
// `monospace`, *italic*, and **bold**.
explanation = """
This check mentions plugins function override in abstract classes.
This rules checks plugins function override in non-final classes.
""", // no need to .trimIndent(), lint does that automatically
category = Category.CORRECTNESS,
priority = 6,
severity = Severity.ERROR,
implementation = Implementation(
PluginsOverrideInAbstractClassDetector::class.java,
PluginsOverrideInNonFinalClassDetector::class.java,
Scope.JAVA_FILE_SCOPE // means Java/Kotlin
)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ import com.android.tools.lint.checks.infrastructure.TestFiles.kotlin
import com.android.tools.lint.checks.infrastructure.TestLintResult
import com.android.tools.lint.checks.infrastructure.TestLintTask.lint
import com.android.tools.lint.checks.infrastructure.TestMode
import com.farsitel.bazaar.lintrules.rules.PluginsOverrideInAbstractClassDetector
import com.farsitel.bazaar.lintrules.rules.PluginsOverrideInNonFinalClassDetector
import org.intellij.lang.annotations.Language
import org.junit.Test

class PluginsOverrideInAbstractClassDetectorTest {
class PluginsOverrideInNonFinalClassDetectorTest {

@Test
fun testError() {
fun testFragmentError() {
baseTest(
"""
abstract class MiddleClass: BaseFragment()
Expand All @@ -27,6 +27,25 @@ class PluginsOverrideInAbstractClassDetectorTest {
.expect(EXPECTED_ERROR_TEXT)
}

@Test
fun testActivityError() {
baseTest(
"""
abstract class BaseActivity {
open fun plugins(): Array<Any> = emptyArray()
}
abstract class TestClass : BaseActivity {
override fun plugins(): Array<Any> {
return emptyArray()
}
}
"""
)
.expectErrorCount(1)
}

@Test
fun testNoInheritance() {
baseTest(
Expand All @@ -53,7 +72,7 @@ class PluginsOverrideInAbstractClassDetectorTest {
}

@Test
fun testNotAbstract() {
fun testFinalClass() {
baseTest(
"""
class TestClass : BaseFragment {
Expand Down Expand Up @@ -85,7 +104,7 @@ class PluginsOverrideInAbstractClassDetectorTest {
private fun baseTest(@Language("kotlin") inheritedClass: String): TestLintResult {
return lint()
.files(kotlin(BASE_FRAGMENT + inheritedClass).indented())
.issues(PluginsOverrideInAbstractClassDetector.ISSUE)
.issues(PluginsOverrideInNonFinalClassDetector.ISSUE)
.skipTestModes(TestMode.SUPPRESSIBLE)
.run()
}
Expand All @@ -101,10 +120,9 @@ class PluginsOverrideInAbstractClassDetectorTest {
"""

const val EXPECTED_ERROR_TEXT = """
src/test/pkg/BaseFragment.kt:11: Error: abstract/open fragment should not override plugins function.
override in child classes instead. [PluginInAbstractClass]
override fun plugins(): Array<Any> {
^
1 errors, 0 warnings"""
src/test/pkg/BaseFragment.kt:11: Error: non-final fragment/activity should not override plugins function. override in child classes instead. [PluginsInNonFinalClass]
override fun plugins(): Array<Any> {
^
1 errors, 0 warnings"""
}
}

0 comments on commit 052bceb

Please sign in to comment.