Skip to content

Commit

Permalink
add abstract trait to scala3
Browse files Browse the repository at this point in the history
  • Loading branch information
fntz committed Oct 18, 2024
1 parent 16b1c9d commit 2a3bc47
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 4 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,12 +157,12 @@ To suppress warnings globally for the project, use `disabledInspections` or `ove

### Inspections

There are currently 122 inspections for Scala 2, and 1 for Scala 3.
There are currently 122 inspections for Scala 2, and 2 for Scala 3.
An overview list is given, followed by a more detailed description of each inspection after the list (todo: finish rest of detailed descriptions)

| Name | Brief Description | Default Level | Scala 2 | Scala 3 |
|---------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------|---------|---------|
| AbstractTrait | Check if trait is abstract | Info | Yes | No |
| AbstractTrait | Check if trait is abstract | Info | Yes | Yes |
| ArrayEquals | Checks for comparison of arrays using `==` which will always return false | Info | Yes | No |
| ArraysInFormat | Checks for arrays passed to String.format | Error | Yes | No |
| ArraysToString | Checks for explicit toString calls on arrays | Warning | Yes | No |
Expand Down
4 changes: 3 additions & 1 deletion src/main/scala-3/com/sksamuel/scapegoat/Inspections.scala
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.sksamuel.scapegoat

import com.sksamuel.scapegoat.inspections.option._
import com.sksamuel.scapegoat.inspections.traits._

object Inspections {

final val inspections: List[Inspection] = List(
new OptionGet
new OptionGet,
new AbstractTrait
)

}
1 change: 0 additions & 1 deletion src/main/scala-3/com/sksamuel/scapegoat/Plugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ class ScapegoatPhase(var configuration: Configuration, override val inspections:
extends PluginPhase
with ScapegoatBasePlugin {


private[scapegoat] var feedback: Option[FeedbackDotty] = None

override def phaseName: String = "scapegoat"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.sksamuel.scapegoat.inspections.traits

import com.sksamuel.scapegoat.*
import dotty.tools.dotc.ast.Trees.*
import dotty.tools.dotc.ast.tpd
import dotty.tools.dotc.core.Contexts.Context
import dotty.tools.dotc.core.Flags
import dotty.tools.dotc.core.StdNames.*
import dotty.tools.dotc.core.Types.TypeRef
import dotty.tools.dotc.core.Symbols.ClassSymbol
import dotty.tools.dotc.util.SourcePosition

class AbstractTrait
extends Inspection(
text = "Use of abstract trait",
defaultLevel = Levels.Info,
description = "Traits are automatically abstract.",
explanation = "The abstract modifier is used in class definitions. It is redundant for traits, and mandatory for all other classes which have incomplete members."
) {

import tpd.*

def inspect(feedback: Feedback[SourcePosition], tree: tpd.Tree)(using ctx: Context): Unit = {
val traverser = new InspectionTraverser {
def traverse(tree: Tree)(using Context): Unit = {
tree match {
case tDef: TypeDef =>
tDef.tpe match {
case TypeRef(_, kls: ClassSymbol) if kls.flags.is(Flags.Trait) && kls.flags.is(Flags.Abstract) =>
feedback.warn(tree.sourcePos, self, tree.asSnippet)
case _ =>
}

case _ =>
traverseChildren(tree)
}
}
}
traverser.traverse(tree)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.sksamuel.scapegoat.inspections.traits

import com.sksamuel.scapegoat.InspectionTest

class AbstractTraitTest extends InspectionTest(classOf[AbstractTrait]) {

"abstract trait use" - {
"should report warning" in {
val code = "abstract trait Test { }"

val feedback = runner.compileCodeSnippet(code)
feedback.warnings.assertable.size shouldBe 1
}

"should not report warning on sealed" in {
val code = "sealed trait Test { val x: Int = 1 }"

val feedback = runner.compileCodeSnippet(code)
feedback.warnings.assertable.size shouldBe 0
}

"should not report warning on trait without modifiers" in {
val code = "trait Test1 { val x: Int = 1 }"

val feedback = runner.compileCodeSnippet(code)
feedback.warnings.assertable.size shouldBe 0
}

"should not report on private trait" in {
val code = "private trait Test1 { val x: Int = 1 }"

val feedback = runner.compileCodeSnippet(code)
feedback.warnings.assertable.size shouldBe 0
}
}
}

0 comments on commit 2a3bc47

Please sign in to comment.