Skip to content

Commit

Permalink
NoGeneralException
Browse files Browse the repository at this point in the history
  • Loading branch information
a-khakimov committed Nov 11, 2023
1 parent fb7b3de commit cbf1f7d
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 2 deletions.
27 changes: 27 additions & 0 deletions input/src/main/scala/fix/NoGeneralException.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/*
rule = NoGeneralException
*/
package fix

import scala.language.higherKinds

class CustomErrorType(message: String) extends Exception(message)

object NoGeneralException {

def raiseThrowable(error: Throwable): Unit = {}

def raiseException(error: Exception): Unit = {}

raiseException(new Exception("Message")) /* assert: NoGeneralException
^^^^^^^^^^^^^^^^^^^^^^^^
Exception is not allowed
*/

raiseThrowable(new Throwable("Message")) /* assert: NoGeneralException
^^^^^^^^^^^^^^^^^^^^^^^^
Exception is not allowed
*/

raiseThrowable(new CustomErrorType("Message"))
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
fix.MakeArgsNamed
fix.NoGeneralException
fix.NoHead
fix.NoMapApply
fix.NoOptionGet
Expand Down
49 changes: 49 additions & 0 deletions rules/src/main/scala/fix/NoGeneralException.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package fix

import fix.NoGeneralException._
import metaconfig.{ConfDecoder, Configured}
import metaconfig.generic.Surface
import scalafix.v1._

import scala.meta._

case class NoGeneralException(config: Config) extends SemanticRule("NoGeneralException") {

def this() = this(NoGeneralException.defaultConfig)

override def fix(implicit doc: SemanticDocument): Patch = {
doc.tree.collect {
case t@Term.New(_) => {
t.symbol.info.map(_.displayName) match {
case Some(exception) if config.forbidden.contains(exception) =>
Patch.lint(Diagnostic("", "Exception is not allowed", t.pos))
case _ => Patch.empty
}
}
}.asPatch
}

override def withConfiguration(config: Configuration): Configured[Rule] = {
config.conf.getOrElse("NoGeneralException")(defaultConfig).map(
config => NoGeneralException(config.copy(forbidden = forbidden ++ config.forbidden))
)
}
}

object NoGeneralException {

case class Config(forbidden: List[String])

private val forbidden = List(
"Exception",
"Throwable"
)

private val defaultConfig = Config(forbidden)

implicit val surface: Surface[Config] =
metaconfig.generic.deriveSurface[Config]

implicit val decoder: ConfDecoder[Config] =
metaconfig.generic.deriveDecoder(defaultConfig)
}
2 changes: 0 additions & 2 deletions rules/src/main/scala/fix/NoMapApply.scala
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,4 @@ class NoMapApply extends SemanticRule("NoMapApply") {
} => patch(t.pos)
}.asPatch
}

private val forbidden = "Map" :: "Map[" :: Nil
}

0 comments on commit cbf1f7d

Please sign in to comment.