From 01c39b3204d927e1e52b8b90ce109a275b0ad845 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Kozak?= Date: Thu, 22 Aug 2024 16:41:37 +0200 Subject: [PATCH] add byNameImplicitParameter rule --- .../commons/analyzer/AnalyzerPlugin.scala | 1 + .../analyzer/ByNameImplicitParameter.scala | 18 +++++++++++ .../analyzer/ByNameParametersTest.scala | 32 +++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 analyzer/src/main/scala/com/avsystem/commons/analyzer/ByNameImplicitParameter.scala create mode 100644 analyzer/src/test/scala/com/avsystem/commons/analyzer/ByNameParametersTest.scala diff --git a/analyzer/src/main/scala/com/avsystem/commons/analyzer/AnalyzerPlugin.scala b/analyzer/src/main/scala/com/avsystem/commons/analyzer/AnalyzerPlugin.scala index e91ef8d0c..a3221f2c9 100644 --- a/analyzer/src/main/scala/com/avsystem/commons/analyzer/AnalyzerPlugin.scala +++ b/analyzer/src/main/scala/com/avsystem/commons/analyzer/AnalyzerPlugin.scala @@ -59,6 +59,7 @@ final class AnalyzerPlugin(val global: Global) extends Plugin { plugin => new BadSingletonComponent(global), new ConstantDeclarations(global), new BasePackage(global), + new ByNameImplicitParameter(global), ) private lazy val rulesByName = rules.map(r => (r.name, r)).toMap diff --git a/analyzer/src/main/scala/com/avsystem/commons/analyzer/ByNameImplicitParameter.scala b/analyzer/src/main/scala/com/avsystem/commons/analyzer/ByNameImplicitParameter.scala new file mode 100644 index 000000000..57bf69f00 --- /dev/null +++ b/analyzer/src/main/scala/com/avsystem/commons/analyzer/ByNameImplicitParameter.scala @@ -0,0 +1,18 @@ +package com.avsystem.commons +package analyzer + +import scala.tools.nsc.Global + +final class ByNameImplicitParameter(g: Global) extends AnalyzerRule(g, "byNameImplicitParameter") { + + import global.* + + private def isByNameImplicit(x: ValDef): Boolean = + x.symbol.isImplicit && x.symbol.isByNameParam && !x.symbol.isSynthetic + def analyze(unit: CompilationUnit): Unit = unit.body.foreach { + case tree: DefDef if !tree.symbol.isSynthetic && tree.vparamss.flatten.exists(isByNameImplicit) => + report(tree.pos, "Implicit by-name parameters are disabled") + case _ => + } + +} \ No newline at end of file diff --git a/analyzer/src/test/scala/com/avsystem/commons/analyzer/ByNameParametersTest.scala b/analyzer/src/test/scala/com/avsystem/commons/analyzer/ByNameParametersTest.scala new file mode 100644 index 000000000..89e32be68 --- /dev/null +++ b/analyzer/src/test/scala/com/avsystem/commons/analyzer/ByNameParametersTest.scala @@ -0,0 +1,32 @@ +package com.avsystem.commons +package analyzer + +import org.scalatest.funsuite.AnyFunSuite + +final class ByNameParametersTest extends AnyFunSuite with AnalyzerTest { + test("should report by-name implicit parameters") { + assertErrors(2, + //language=Scala + """ + |object whatever { + | def byName(x: => Int) = x + | def byName(implicit x: => String) = x + | def byName(x: => Int)(implicit y: => Int) = x + | def byName(implicit x: Int) = x + |} + """.stripMargin + ) + } + + test("should report by-name implicit constructor parameters") { + assertErrors(2, + //language=Scala + """ + |object whatever { + | class C(x: => Int)(implicit y: => Int, z: String) + | class D(implicit y: => Int, z: => String) + |} + |""".stripMargin + ) + } +} \ No newline at end of file