Code Monkey home page Code Monkey logo

silencer's Introduction

Silencer: Scala compiler plugin for warning suppression

Build Status Maven Central

NOTE: Scala 2.13.2 and 2.12.13 introduced configurable warnings. This means that unless you're still cross compiling for Scala 2.11, this plugin is obsolete, and you should use @nowarn.

If you're still cross compiling for 2.11 then this plugin can be used in conjunction with scala-collection-compat in order to suppress warnings in all Scala versions using @nowarn.

Setup

If you're using SBT, add this to your project definition:

ThisBuild / libraryDependencies ++= Seq(
  compilerPlugin("com.github.ghik" % "silencer-plugin" % silencerVersion cross CrossVersion.full),
  "com.github.ghik" % "silencer-lib" % silencerVersion % Provided cross CrossVersion.full
)

If you're using Gradle:

ext {
    scalaVersion = "..." // e.g. "2.13.0"
    silencerVersion = "..." // appropriate silencer version
}
configurations {
    scalacPlugin {
        transitive = false
    }
}
dependencies {
    compile "com.github.ghik:silencer-lib_$scalaVersion:$silencerVersion"
    scalacPlugin "com.github.ghik:silencer-plugin_$scalaVersion:$silencerVersion"
}
tasks.withType(ScalaCompile) {
    scalaCompileOptions.additionalParameters =
            configurations.scalacPlugin.collect { "-Xplugin:" + it.absolutePath }
}

Note that since both silencer-plugin and silencer-lib are compile time only dependencies, Silencer can be used in ScalaJS and Scala Native without having to be cross compiled for them.

Annotation-based suppression

With the plugin enabled, warnings can be suppressed using the @com.github.ghik.silencer.silent or @scala.annotation.nowarn annotation. It can be applied on a single statement or expression, entire def/val/var definition or entire class/object/trait definition.

import com.github.ghik.silencer.silent

@silent class someClass { ... }
@silent def someMethod() = { ... }
someDeprecatedApi("something"): @silent

Message pattern

By default the @silent annotation suppresses all warnings in some code fragment. You can limit the suppression to some specific classes of warnings by passing a message pattern (regular expression) to the annotation, e.g.

@silent("deprecated") 
def usesDeprecatedApi(): Unit = {
  someDeprecatedApi("something")
}

Using @nowarn

Scala 2.13.2 and 2.12.13 introduced configurable warnings using -Wconf compiler option and @scala.annotation.nowarn. annotation. For Scala 2.11, this annotation is provided by the scala-collection-compat library and interpreted by the silencer plugin.

NOTE: @nowarn in Scala 2.13.2 supports various fine-grained filters (e.g. warning category, message patttern, etc.). Silencer only supports the msg=<pattern> filter - all other filters simply suppress everything, as if there were no filters specified.

Detecting unused annotations

If a @silent annotation does not actually suppress any warnings, you can make silencer report an error in such situation. This can be enabled by passing the checkUnused option to the plugin:

scalacOptions += "-P:silencer:checkUnused"

Global regex-based suppression

You can also suppress warnings globally based on a warning message regex. In order to do that, pass this option to scalac:

scalacOptions += "-P:silencer:globalFilters=<semicolon separated message regexes>"

Line content based suppression

Filtering may also be based on the content of source line that generated the warning. This is particularly useful for suppressing 'unused import' warnings based on what's being imported.

scalacOptions += "-P:silencer:lineContentFilters=<semicolon separated line content regexes>"

Filename based suppression

Another option is to suppress all warnings in selected source files. This can be done by specifying a list of file path regexes:

scalacOptions += "-P:silencer:pathFilters=<semicolon separated file path regexes>"

NOTE: In order to make builds independent of environment, filename separators are normalized to UNIX style (/) before the path is matched against path patterns.

By default, absolute file path is matched against path patterns. In order to make your build independent of where your project is checked out, you can specify a list of source root directories. Source file paths will be relativized with respect to them before being matched against path patterns. Usually it should be enough to pass project base directory as source root (i.e. baseDirectory.value in SBT):

scalacOptions += s"-P:silencer:sourceRoots=${baseDirectory.value.getCanonicalPath}"

Another good choice for source roots may be actual SBT source directories:

scalacOptions += s"-P:silencer:sourceRoots=${sourceDirectories.value.map(_.getCanonicalPath).mkString(";")}"

Searching macro expansions

By default (starting from version 1.6.0) silencer does not look for @silent annotations in macro expansions. If you want to bring back the old behaviour where both macro expansions and expandees are searched, use the -P:silencer:searchMacroExpansions option.

silencer's People

Contributors

alexandervanhecke avatar ddworak avatar dongjoon-hyun avatar dwijnand avatar ghik avatar giabao avatar lrytz avatar luciferyang avatar mihaisoloi avatar mkurz avatar raboof avatar retronym avatar rogach avatar sanjivsahayamrea avatar sethtisue avatar sideeffffect avatar xuwei-k avatar yanns avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

silencer's Issues

dotty support

It's required by any project using silencer and try to support Dotty.

The compiler plugin should be fully cross-versioned

Unlike scala-library.jar, the scala compiler is not binary compatible between minor releases. Therefore, compiler plugins should in principle be released with full cross versioning, and a new release is needed for every minor Scala release. See https://github.com/scalamacros/paradise/blob/2.12.8/build.sbt for example, https://search.maven.org/search?q=g:org.scalamacros.

Similar: cb372/scala-typed-holes#6, typelevel/kind-projector#15, softwaremill/scala-clippy#65

Install instructions are not universal

The docs say to add this to build.sbt:

libraryDependencies ++= Seq(
  compilerPlugin("com.github.ghik" % "silencer-plugin" % silencerVersion cross CrossVersion.full),
  "com.github.ghik" % "silencer-lib" % silencerVersion % Provided cross CrossVersion.full
)

This didn't work for me. I kept getting this:

[error] silencer-plugin was enabled but @silent annotation was not found on classpath - have you added silencer-lib as a library dependency?

It turns out my issue was the % Provided in there. Remove that, and everything works. I don't know exactly what part of my build configuration is the issue, but that solved it.

I'm suspect my issue was related to this image: SBT configuration graph

In fact, replacing % Provided with % Compile seems to work. I imagine that's potentially better than removing the specifier entirely?

Compilation does not finish

Hi.

My build.sbt:

val silencerVersion = "1.2.1"

libraryDependencies ++= Seq(
  compilerPlugin("com.github.ghik" %% "silencer-plugin" % silencerVersion),
  "com.github.ghik" %% "silencer-lib" % silencerVersion % Provided,
  ...
)

I am using SBT 1.2.6, Scala 2.12.7.

When running Test/compile the compilation just does not finish:
shot-2018-11-05_085547

Can CrossBuilding full for silencer-lib be avoided?

Since silencer-lib is not provided for all minor Scala versions, matching Scala version and silencer-lib version can be quite a hassle in CI environments where the Scala library can be overwritten from the outside.

Is there a good reason for the weird publishing (i.e. only for the library, for the compiler plugin it is expected)?

Compiling with gradle 4.10.2 and turning off deprecation warning throws NPE

When I turn off the deprecation warnings in my project (that admittedly has a fairly complex structure), knowing it has deprecated usages, I get the following NPE when running the plugin with the pathFilters parameter set.
Everything works just fine if I enable the deprecation option or remove the pathFilters parameter
My understanding is that the file val in SuppressingReporter#info0 is returned as null.
I can try to replicate this on a smaller project if/when I have time.

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':compileSystemTestsScala'.
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:110)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:77)
	at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
	at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
	at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
	at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:59)
	at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
	at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
	at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:59)
	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
	at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.run(EventFiringTaskExecuter.java:51)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:46)
	at org.gradle.execution.taskgraph.LocalTaskInfoExecutor.execute(LocalTaskInfoExecutor.java:42)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:277)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareWorkItemExecutor.execute(DefaultTaskExecutionGraph.java:262)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:135)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:130)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.execute(DefaultTaskPlanExecutor.java:200)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.executeWithWork(DefaultTaskPlanExecutor.java:191)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$ExecutorWorker.run(DefaultTaskPlanExecutor.java:130)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:74)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.execute(DefaultTaskExecutionGraph.java:143)
	at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:40)
	at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:40)
	at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:24)
	at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:46)
	at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:49)
	at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:40)
	at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:33)
	at org.gradle.initialization.DefaultGradleLauncher$ExecuteTasks.run(DefaultGradleLauncher.java:355)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.initialization.DefaultGradleLauncher.runTasks(DefaultGradleLauncher.java:219)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149)
	at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:124)
	at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:77)
	at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:74)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:154)
	at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:38)
	at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:96)
	at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:74)
	at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:55)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.run(RunAsBuildOperationBuildActionRunner.java:50)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:45)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:51)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:47)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:44)
	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:79)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:44)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:30)
	at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:39)
	at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:25)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:80)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:53)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:62)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:34)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
	at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
	at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:59)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:59)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:44)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:46)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:30)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
	at org.gradle.util.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:81)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.lang.NullPointerException
	at com.github.ghik.silencer.SuppressingReporter.$anonfun$info0$1(SuppressingReporter.scala:37)
	at scala.collection.mutable.HashMap.getOrElseUpdate(HashMap.scala:82)
	at com.github.ghik.silencer.SuppressingReporter.matchesPathFilter$1(SuppressingReporter.scala:34)
	at com.github.ghik.silencer.SuppressingReporter.info0(SuppressingReporter.scala:46)
	at com.github.ghik.silencer.SuppressingReporter.info0(SuppressingReporter.scala:11)
	at scala.reflect.internal.Reporter.warning(Reporting.scala:83)
	at scala.tools.nsc.Reporting$PerRunReporting$ConditionalWarning.$anonfun$summarize$2(Reporting.scala:51)
	at scala.tools.nsc.Reporting$PerRunReporting$ConditionalWarning.$anonfun$summarize$2$adapted(Reporting.scala:46)
	at scala.collection.mutable.RedBlackTree$.foreachNodeNonNull(RedBlackTree.scala:431)
	at scala.collection.mutable.RedBlackTree$.foreach(RedBlackTree.scala:427)
	at scala.collection.mutable.TreeMap.foreach(TreeMap.scala:92)
	at scala.tools.nsc.Reporting$PerRunReporting$ConditionalWarning.summarize(Reporting.scala:46)
	at scala.tools.nsc.Reporting$PerRunReporting.$anonfun$summarizeErrors$1(Reporting.scala:116)
	at scala.tools.nsc.Reporting$PerRunReporting.summarizeErrors(Reporting.scala:116)
	at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1512)
	at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1451)
	at scala.tools.nsc.Global$Run.compileSources(Global.scala:1444)
	at scala.tools.nsc.Global$Run.compile(Global.scala:1567)
	at xsbt.CachedCompiler0.run(CompilerInterface.scala:116)
	at xsbt.CachedCompiler0.run(CompilerInterface.scala:95)
	at xsbt.CompilerInterface.run(CompilerInterface.scala:26)
	at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:101)
	at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:47)
	at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:41)
	at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileScala$1$1.apply$mcV$sp(AggressiveCompile.scala:95)
	at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileScala$1$1.apply(AggressiveCompile.scala:95)
	at sbt.compiler.AggressiveCompile$$anonfun$3$$anonfun$compileScala$1$1.apply(AggressiveCompile.scala:95)
	at sbt.compiler.AggressiveCompile.sbt$compiler$AggressiveCompile$$timed(AggressiveCompile.scala:165)
	at sbt.compiler.AggressiveCompile$$anonfun$3.compileScala$1(AggressiveCompile.scala:94)
	at sbt.compiler.AggressiveCompile$$anonfun$3.apply(AggressiveCompile.scala:142)
	at sbt.compiler.AggressiveCompile$$anonfun$3.apply(AggressiveCompile.scala:84)
	at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:66)
	at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:64)
	at sbt.inc.IncrementalCommon.cycle(IncrementalCommon.scala:31)
	at sbt.inc.Incremental$$anonfun$1.apply(Incremental.scala:62)
	at sbt.inc.Incremental$$anonfun$1.apply(Incremental.scala:61)
	at sbt.inc.Incremental$.manageClassfiles(Incremental.scala:89)
	at sbt.inc.Incremental$.compile(Incremental.scala:61)
	at sbt.inc.IncrementalCompile$.apply(Compile.scala:54)
	at sbt.compiler.AggressiveCompile.compile2(AggressiveCompile.scala:156)
	at sbt.compiler.AggressiveCompile.compile1(AggressiveCompile.scala:68)
	at com.typesafe.zinc.Compiler.compile(Compiler.scala:201)
	at com.typesafe.zinc.Compiler.compile(Compiler.scala:183)
	at com.typesafe.zinc.Compiler.compile(Compiler.scala:174)
	at com.typesafe.zinc.Compiler.compile(Compiler.scala:165)
	at org.gradle.api.internal.tasks.scala.ZincScalaCompiler$Compiler.execute(ZincScalaCompiler.java:81)
	at org.gradle.api.internal.tasks.scala.ZincScalaCompiler.execute(ZincScalaCompiler.java:52)
	at org.gradle.api.internal.tasks.scala.ZincScalaCompiler.execute(ZincScalaCompiler.java:38)
	at org.gradle.api.internal.tasks.compile.daemon.AbstractDaemonCompiler$CompilerCallable.call(AbstractDaemonCompiler.java:88)
	at org.gradle.api.internal.tasks.compile.daemon.AbstractDaemonCompiler$CompilerCallable.call(AbstractDaemonCompiler.java:76)
	at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:42)
	at org.gradle.workers.internal.WorkerDaemonServer.execute(WorkerDaemonServer.java:46)
	at org.gradle.workers.internal.WorkerDaemonServer.execute(WorkerDaemonServer.java:30)
	at org.gradle.process.internal.worker.request.WorkerAction.run(WorkerAction.java:101)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:155)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:137)
	at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)

Plugin doesn't work within macro quasiquote

To illustrate the issue I'm running into, I have a simple example:

package object mymacro {
  def mac(a: Int): Unit = macro mac_impl

  def mac_impl(c: blackbox.Context)(a: c.Expr[Int]): c.Tree = {
    import c.universe._
    val tree =
      q"""{
         import scala.math.sqrt
         println("TEST MACRO")
       }: @com.github.ghik.silencer.silent
       """
    tree
  }
}

In a separate project I call the macro as follows:

object Test {
  <path>.<to>.<macro>.<file>.mymacro.mac(0)
}

In this example, I expect to silence the Unused import warning generated by importing scala.math.sqrt and not using it. However, when I compile my project, I still get an Unused import warning. Please let me know if I can provide any more details. Thanks!

support suppression of warning on `import`

typically the warning would be a deprecation warning

imports can't have annotations, so it would have to be via some other mechanism:

  • a special comment?
  • a setting where you specify what deprecated things you want to be able to import warning-free?

(opening the issue partly as documentation that there isn't any support currently)

v1.6.0 has issues

Sorry, I don't have much information, but my setup VSCode + Metals 0.8.2 + Gradle stops working when using 1.6.0.

Reverting to 1.5.0 works.

P.S: 1.6.0 works find building with Gradle from command line, it's on the VSCode + Metals combo that stops compiling.

support supression of warnings on annotations

I have this piece of code:

@js.native
@JSGlobal("$crisp")
object crisp extends js.Object {
  def push(options: js.Array[js.Any]): Unit = js.native
}

@JSGlobal is expecting a string literal. But the compiler raises the warning: possible missing interpolator. I was not able to suppress it using @silent.

NullPointerException

[error] java.lang.NullPointerException
[error] 	at com.github.ghik.silencer.SuppressingReporter.relativize(SuppressingReporter.scala:62)
[error] 	at com.github.ghik.silencer.SuppressingReporter.$anonfun$info0$2(SuppressingReporter.scala:36)
[error] 	at scala.collection.Iterator$$anon$11.nextCur(Iterator.scala:484)
[error] 	at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:490)
[error] 	at com.github.ghik.silencer.SuppressingReporter.$anonfun$info0$1(SuppressingReporter.scala:37)
[error] 	at scala.collection.mutable.HashMap.getOrElseUpdate(HashMap.scala:86)
[error] 	at com.github.ghik.silencer.SuppressingReporter.matchesPathFilter$1(SuppressingReporter.scala:34)
[error] 	at com.github.ghik.silencer.SuppressingReporter.info0(SuppressingReporter.scala:46)
[error] 	at com.github.ghik.silencer.SuppressingReporter.info0(SuppressingReporter.scala:11)
[error] 	at scala.reflect.internal.Reporter.warning(Reporting.scala:90)
[error] 	at scala.tools.nsc.Reporting$PerRunReporting$ConditionalWarning.$anonfun$summarize$2(Reporting.scala:58)
[error] 	at scala.tools.nsc.Reporting$PerRunReporting$ConditionalWarning.$anonfun$summarize$2$adapted(Reporting.scala:53)
[error] 	at scala.collection.mutable.RedBlackTree$.foreachNodeNonNull(RedBlackTree.scala:443)
[error] 	at scala.collection.mutable.RedBlackTree$.foreachNodeNonNull(RedBlackTree.scala:442)
[error] 	at scala.collection.mutable.RedBlackTree$.foreach(RedBlackTree.scala:439)
[error] 	at scala.collection.mutable.TreeMap.foreach(TreeMap.scala:104)
[error] 	at scala.tools.nsc.Reporting$PerRunReporting$ConditionalWarning.summarize(Reporting.scala:53)
[error] 	at scala.tools.nsc.Reporting$PerRunReporting.$anonfun$summarizeErrors$1(Reporting.scala:123)
[error] 	at scala.tools.nsc.Reporting$PerRunReporting.summarizeErrors(Reporting.scala:123)
[error] 	at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1543)
[error] 	at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1482)
[error] 	at scala.tools.nsc.Global$Run.compileSources(Global.scala:1475)
[error] 	at scala.tools.nsc.Global$Run.compile(Global.scala:1598)
[error] 	at xsbt.CachedCompiler0.run(CompilerInterface.scala:130)
[error] 	at xsbt.CachedCompiler0.run(CompilerInterface.scala:105)
[error] 	at xsbt.CompilerInterface.run(CompilerInterface.scala:31)
[error] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error] 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error] 	at java.lang.reflect.Method.invoke(Method.java:498)
[error] 	at sbt.internal.inc.AnalyzingCompiler.call(AnalyzingCompiler.scala:237)
[error] 	at sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:111)
[error] 	at sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:90)
[error] 	at sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$3(MixedAnalyzingCompiler.scala:82)
[error] 	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[error] 	at sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:133)
[error] 	at sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:73)
[error] 	at sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:116)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:307)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:307)
[error] 	at sbt.internal.inc.Incremental$.doCompile(Incremental.scala:106)
[error] 	at sbt.internal.inc.Incremental$.$anonfun$compile$4(Incremental.scala:87)
[error] 	at sbt.internal.inc.IncrementalCommon.recompileClasses(IncrementalCommon.scala:116)
[error] 	at sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:63)
[error] 	at sbt.internal.inc.Incremental$.$anonfun$compile$3(Incremental.scala:89)
[error] 	at sbt.internal.inc.Incremental$.manageClassfiles(Incremental.scala:134)
[error] 	at sbt.internal.inc.Incremental$.compile(Incremental.scala:80)
[error] 	at sbt.internal.inc.IncrementalCompile$.apply(Compile.scala:67)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:311)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:269)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:159)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:238)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:69)
[error] 	at sbt.Defaults$.compileIncrementalTaskImpl(Defaults.scala:1549)
[error] 	at sbt.Defaults$.$anonfun$compileIncrementalTask$1(Defaults.scala:1523)
[error] 	at scala.Function1.$anonfun$compose$1(Function1.scala:44)
[error] 	at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:40)
[error] 	at sbt.std.Transform$$anon$4.work(System.scala:67)
[error] 	at sbt.Execute.$anonfun$submit$2(Execute.scala:269)
[error] 	at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
[error] 	at sbt.Execute.work(Execute.scala:278)
[error] 	at sbt.Execute.$anonfun$submit$1(Execute.scala:269)
[error] 	at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:178)
[error] 	at sbt.CompletionService$$anon$2.call(CompletionService.scala:37)
[error] 	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] 	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error] 	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[error] 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[error] 	at java.lang.Thread.run(Thread.java:745)

suppressing the warning but not the error

In this code https://github.com/scalaz/ioeffect/blob/6f57538969e38f62f942a05d0b7734483629dc62/src/main/scala/scalaz/ioeffect/Void.scala#L34-L35

we are able to suppress this warning

[error] src/main/scala/scalaz/ioeffect/Void.scala:33:26: dead code following this construct
[error] private[ioeffect] object VoidImpl extends VoidModule with VoidSyntax {
[error]                          ^

but when scalacOptions in Compile += "-Xfatal-warnings" is added, we get

[info] Compiling 13 Scala sources to /tmp/fommil-sbt/home/fommil/Projects/scalaz-ioeffect/target/scala-2.12/classes ...
[error] No warnings can be incurred under -Xfatal-warnings.
[error] one error found

Fails when used with scoverage

Seems like the plugin doesn't preserve tree positions. I see this error when I use it with scoverage:

[info] [info] ======= Position error
[info] [info] Unpositioned tree #1858
[info] [info]    unpositioned [L   0 P# 1906] #1858   [NoPosition]    Typed      // Typed
[info] [info]       enclosing [L   7        ] #1906   [120:334]       Template   // {
[info] [info]         sibling [L  12 P# 1906] #72     [334]           Select     // Select(Ident(scala), AnyRef)
[info] [info]         sibling [L   0 P# 1906] #21     [NoPosition]    noSelfType // term _
[info] [info]         sibling [L  12 P# 1906] #330    [334]           DefDef     // term <init>
[info] [info]         sibling [L   8 P# 1906] #853    [124:158]       ClassDef   // Wrapper(i: Option[Int])
[info] [info]         sibling [L   8 P# 1906] #1905   [135]           ModuleDef  // term Wrapper
[info] [info]         sibling [L   9 P# 1906] #1024   [161:189]       ValDef     // i: java.lang.Integer = 1
[info] [info]         sibling [L   9 P# 1906] #323    [165]           DefDef     // term i
[info] [info]         sibling [L   0 P# 1906] #1858   [NoPosition]    Typed      // Typed
[info] [info]
[info] [info] While validating #1908
[info] [info] [L   5        ] #1908   [65:334]        PackageDef // import com.github.ghik.silencer.silent
[info] [info]
[info] [info] Children:
[info] [info]   [L   5 P# 1908] #79     [65:65]         Ident      // i
[info] [info]   [L   5 P# 1908] #27     [65:103]        Import     // com.github.ghik.silencer.silent
[info] [info]   [L   7 P# 1908] #1907   [105:334]       ModuleDef  // Silence {
[info] [info] =======
[info] scala.reflect.internal.Positions$ValidateException: Unpositioned tree #1858
[info]  at scala.reflect.internal.Positions$class.positionError$1(Positions.scala:102)
[info]  at scala.reflect.internal.Positions$class.validate$1(Positions.scala:112)
[info]  at scala.reflect.internal.Positions$class.validate$1(Positions.scala:142)
[info]  at scala.reflect.internal.Positions$class.validate$1(Positions.scala:142)
[info]  at scala.reflect.internal.Positions$class.validate$1(Positions.scala:142)
[info]  at scala.reflect.internal.Positions$class.validatePositions(Positions.scala:147)
[info]  at scala.reflect.internal.SymbolTable.validatePositions(SymbolTable.scala:16)
[info]  at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.apply(Analyzer.scala:103)
[info]  at scala.tools.nsc.Global$GlobalPhase$$anonfun$applyPhase$1.apply$mcV$sp(Global.scala:441)
[info]  at scala.tools.nsc.Global$GlobalPhase.withCurrentUnit(Global.scala:432)
[info]  at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:441)
[info]  at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3$$anonfun$run$1.apply(Analyzer.scala:94)
[info]  at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3$$anonfun$run$1.apply(Analyzer.scala:93)
[info]  at scala.collection.Iterator$class.foreach(Iterator.scala:750)
[info]  at scala.collection.AbstractIterator.foreach(Iterator.scala:1202)
[info]  at scala.tools.nsc.typechecker.Analyzer$typerFactory$$anon$3.run(Analyzer.scala:93)
[info]  at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1500)
[info]  at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1487)

Do not require silencer-lib on classpath

Firstly, just wanted to say thanks for this plugin! I found it through this bug report in Play.

When using the plugin as described there, I don't need the @silent annotation, since I'm only excluding files based on paths rather than with the annotations - so it's a bit annoying (and ironic :P) that the plugin generates the following warning:

[warn] `silencer-plugin` was enabled but the @silent annotation was not found on classpath - have you added `silencer-lib` as a library dependency?

Would it be sensible to remove this warning?

Silence warnings based on line content

This would be particularly useful in order to silence "unused import" warnings (#30) based on what's being imported, e.g. with regex-based compiler option like:

-P:silencer:lineContentFilters=import scala\.collection\.compat\._

Extremely slow compilation when silencer plugin enabled

Next lines of code compiles at least 25 seconds when silencer plugin enabled and just 1 seconds with disabled plugin

import sttp.tapir._

case class Foo(a: Int)

object Main extends App {
  val a = implicitly[Schema[Foo]]
    .modify(_.a)(_.description("foo")) // 1s with silencer and 1s without
    .modify(_.a)(_.description("foo")) // 1s with silencer and 1s without
    .modify(_.a)(_.description("foo")) // 1s with silencer and 1s without
    .modify(_.a)(_.description("foo")) // 1s with silencer and 1s without
    .modify(_.a)(_.description("foo")) // 1s with silencer and 1s without
    .modify(_.a)(_.description("foo")) // 1s with silencer and 1s without
    .modify(_.a)(_.description("foo")) // 1s with silencer and 1s without
    .modify(_.a)(_.description("foo")) // 1s with silencer and 1s without
    .modify(_.a)(_.description("foo")) // 1s with silencer and 1s without
    .modify(_.a)(_.description("foo")) // 1s with silencer and 1s without
    .modify(_.a)(_.description("foo")) // 2s with silencer and 1s without
    .modify(_.a)(_.description("foo")) // 6s with silencer and 1s without
    .modify(_.a)(_.description("foo")) // 16s with silencer and 1s without
    .modify(_.a)(_.description("foo")) // 25s with silencer and 1s without
}

where modify - is macro function from tapir library.

Repo with simple reproducer: https://github.com/igrocki/slow-silencer-tapir

I found ugly workaround: breaking method chain into two or more chains like:

val a = implicitly[Schema[Foo]]
    .modify(_.a)(_.description("foo")) 
    .modify(_.a)(_.description("foo")) 
    .modify(_.a)(_.description("foo")) 
    .modify(_.a)(_.description("foo")) 
    .modify(_.a)(_.description("foo")) 
    .modify(_.a)(_.description("foo")) 

val b = a.modify(_.a)(_.description("foo"))
    .modify(_.a)(_.description("foo")) 
    .modify(_.a)(_.description("foo")) 
    .modify(_.a)(_.description("foo")) 
    .modify(_.a)(_.description("foo")) 
    .modify(_.a)(_.description("foo")) 
    .modify(_.a)(_.description("foo")) 
    .modify(_.a)(_.description("foo")) 

cannot suppress scala 2.12.2 -Ywarn-unused:params for Scala.js js.native method

See JsCryptoNative.getRandomValues at the bottom. @silent doesn't seem to work no matter where I put it.

import scala.scalajs.js
import scala.scalajs.js.annotation._
import scala.scalajs.js.typedarray.ArrayBufferView

import com.github.ghik.silencer.silent

@js.native
@JSGlobalScope
object WindowGlobalScope extends js.Object {
  def window: js.UndefOr[JsWindowNative] = js.native
}

@js.native
trait JsWindowNative extends js.Object {
  def crypto: js.UndefOr[JsCryptoNative] = js.native
  def msCrypto: js.UndefOr[JsCryptoNative] = js.native
}

@js.native
@silent
trait JsCryptoNative extends js.Object {
  @silent
  def getRandomValues( // linter:ignore UnusedParameter
      @silent t: ArrayBufferView @silent
    ): Unit @silent = js.native
}

Any idea as to why and any suggestions on a workaround?
Much thanks.

NullPointerException at SilencerPlugin's FindSuppressions.addSuppression

When compile zio on scala 2.13.3 using silencer 1.7.0:

[error] java.lang.NullPointerException
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$FindSuppressions$1$.addSuppression(SilencerPlugin.scala:156)
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$FindSuppressions$1$.traverse(SilencerPlugin.scala:179)
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$FindSuppressions$1$.traverse(SilencerPlugin.scala:150)
[error] scala.reflect.internal.Trees$Match.traverse(Trees.scala:693)
[error] scala.reflect.internal.Trees.itraverse(Trees.scala:1606)
[error] scala.reflect.internal.Trees.itraverse$(Trees.scala:1605)
[error] scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:28)
[error] scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:28)
[error] scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2497)
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$FindSuppressions$1$.traverse(SilencerPlugin.scala:176)
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$FindSuppressions$1$.traverse(SilencerPlugin.scala:150)
[error] scala.reflect.internal.Trees$Function.$anonfun$traverse$7(Trees.scala:649)
[error] scala.reflect.api.Trees$Traverser.atOwner(Trees.scala:2529)
[error] scala.reflect.internal.Trees$Function.traverse(Trees.scala:648)
[error] scala.reflect.internal.Trees.itraverse(Trees.scala:1606)
[error] scala.reflect.internal.Trees.itraverse$(Trees.scala:1605)
[error] scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:28)
[error] scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:28)
[error] scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2497)
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$FindSuppressions$1$.traverse(SilencerPlugin.scala:176)
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$FindSuppressions$1$.traverse(SilencerPlugin.scala:150)
[error] scala.reflect.api.Trees$Traverser.traverseTrees(Trees.scala:2506)
[error] scala.reflect.internal.Trees$Apply.traverse(Trees.scala:789)
[error] scala.reflect.internal.Trees.itraverse(Trees.scala:1606)
[error] scala.reflect.internal.Trees.itraverse$(Trees.scala:1605)
[error] scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:28)
[error] scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:28)
[error] scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2497)
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$FindSuppressions$1$.traverse(SilencerPlugin.scala:176)
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$FindSuppressions$1$.traverse(SilencerPlugin.scala:150)
[error] scala.reflect.api.Trees$Traverser.$anonfun$traverseStats$1(Trees.scala:2521)
[error] scala.reflect.api.Trees$Traverser.traverseStats(Trees.scala:2519)
[error] scala.reflect.internal.Trees$Template.traverse(Trees.scala:548)
[error] scala.reflect.internal.Trees.itraverse(Trees.scala:1606)
[error] scala.reflect.internal.Trees.itraverse$(Trees.scala:1605)
[error] scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:28)
[error] scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:28)
[error] scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2497)
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$FindSuppressions$1$.traverse(SilencerPlugin.scala:176)
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$FindSuppressions$1$.traverse(SilencerPlugin.scala:150)
[error] scala.reflect.internal.Trees$ModuleDef.$anonfun$traverse$2(Trees.scala:401)
[error] scala.reflect.api.Trees$Traverser.atOwner(Trees.scala:2529)
[error] scala.reflect.internal.Trees$ModuleDef.traverse(Trees.scala:398)
[error] scala.reflect.internal.Trees.itraverse(Trees.scala:1606)
[error] scala.reflect.internal.Trees.itraverse$(Trees.scala:1605)
[error] scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:28)
[error] scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:28)
[error] scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2497)
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$FindSuppressions$1$.traverse(SilencerPlugin.scala:176)
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$FindSuppressions$1$.traverse(SilencerPlugin.scala:150)
[error] scala.reflect.api.Trees$Traverser.traverseTrees(Trees.scala:2506)
[error] scala.reflect.internal.Trees$Apply.traverse(Trees.scala:789)
[error] scala.reflect.internal.Trees.itraverse(Trees.scala:1606)
[error] scala.reflect.internal.Trees.itraverse$(Trees.scala:1605)
[error] scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:28)
[error] scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:28)
[error] scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2497)
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$FindSuppressions$1$.traverse(SilencerPlugin.scala:176)
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$FindSuppressions$1$.traverse(SilencerPlugin.scala:168)
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$FindSuppressions$1$.traverse(SilencerPlugin.scala:150)
[error] scala.reflect.api.Trees$Traverser.$anonfun$traverseStats$2(Trees.scala:2520)
[error] scala.reflect.api.Trees$Traverser.atOwner(Trees.scala:2529)
[error] scala.reflect.api.Trees$Traverser.$anonfun$traverseStats$1(Trees.scala:2520)
[error] scala.reflect.api.Trees$Traverser.traverseStats(Trees.scala:2519)
[error] scala.reflect.internal.Trees$PackageDef.traverse(Trees.scala:347)
[error] scala.reflect.internal.Trees.itraverse(Trees.scala:1606)
[error] scala.reflect.internal.Trees.itraverse$(Trees.scala:1605)
[error] scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:28)
[error] scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:28)
[error] scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2497)
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$FindSuppressions$1$.traverse(SilencerPlugin.scala:176)
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$.applySuppressions(SilencerPlugin.scala:197)
[error] com.github.ghik.silencer.SilencerPlugin$extractSuppressions$$anon$1.apply(SilencerPlugin.scala:96)
[error] scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:454)
[error] scala.tools.nsc.Global$GlobalPhase.run(Global.scala:401)
[error] scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1515)
[error] scala.tools.nsc.Global$Run.compileUnits(Global.scala:1499)
[error] scala.tools.nsc.Global$Run.compileSources(Global.scala:1491)
[error] scala.tools.nsc.Global$Run.compile(Global.scala:1626)
[error] xsbt.CachedCompiler0.run(CompilerInterface.scala:153)
[error] xsbt.CachedCompiler0.run(CompilerInterface.scala:125)
[error] xsbt.CompilerInterface.run(CompilerInterface.scala:39)
[error] sun.reflect.GeneratedMethodAccessor19.invoke(Unknown Source)
[error] sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error] java.lang.reflect.Method.invoke(Method.java:498)
[error] sbt.internal.inc.AnalyzingCompiler.call(AnalyzingCompiler.scala:248)
[error] sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:122)
[error] sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:95)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4(MixedAnalyzingCompiler.scala:91)
[error] scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
[error] sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:186)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$3(MixedAnalyzingCompiler.scala:82)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$3$adapted(MixedAnalyzingCompiler.scala:77)
[error] sbt.internal.inc.JarUtils$.withPreviousJar(JarUtils.scala:215)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:77)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:146)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:343)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:343)
[error] sbt.internal.inc.Incremental$.doCompile(Incremental.scala:120)
[error] sbt.internal.inc.Incremental$.$anonfun$compile$4(Incremental.scala:100)
[error] sbt.internal.inc.IncrementalCommon.recompileClasses(IncrementalCommon.scala:180)
[error] sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:98)
[error] sbt.internal.inc.Incremental$.$anonfun$compile$3(Incremental.scala:102)
[error] sbt.internal.inc.Incremental$.manageClassfiles(Incremental.scala:155)
[error] sbt.internal.inc.Incremental$.compile(Incremental.scala:92)
[error] sbt.internal.inc.IncrementalCompile$.apply(Compile.scala:75)
[error] sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:348)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:301)
[error] sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:168)
[error] sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:248)
[error] sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:74)
[error] sbt.Defaults$.compileIncrementalTaskImpl(Defaults.scala:1765)
[error] sbt.Defaults$.$anonfun$compileIncrementalTask$1(Defaults.scala:1738)
[error] scala.Function1.$anonfun$compose$1(Function1.scala:49)
[error] sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:62)
[error] sbt.std.Transform$$anon$4.work(Transform.scala:67)
[error] sbt.Execute.$anonfun$submit$2(Execute.scala:281)
[error] sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:19)
[error] sbt.Execute.work(Execute.scala:290)
[error] sbt.Execute.$anonfun$submit$1(Execute.scala:281)
[error] sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:178)
[error] sbt.CompletionService$$anon$2.call(CompletionService.scala:37)
[error] java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error] java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[error] java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[error] java.lang.Thread.run(Thread.java:748)

Inspect

object FindSuppressions extends Traverser {
  def addSuppression(tree: Tree, annot: Tree,... =
    val annotSym = annot.tpe.typeSymbol // error here! (SilencerPlugin.scala:156)
    ...
  def traverse(t: Tree) =
    t match {
      case Annotated(annot, arg) => addSuppression(arg, annot, annot.pos)
      ...

Error when compiling zio.examples.macros.AccessibleMacroExample:

@zio.macros.accessible
object AccessibleMacroExample {
  trait Service {
    val foo: zio.UIO[Unit]
  }
  val program = for(_ <- AccessibleMacroExample.foo) yield ()
}

Note, AccessibleMacroExample.foo is auto generated by:

import scala.annotation.{ compileTimeOnly, StaticAnnotation }

@compileTimeOnly("enable macro paradise to expand macro annotations")
class accessible[A] extends StaticAnnotation {
  def macroTransform(annottees: Any*): Any = macro AccessibleMacro.apply
}
class AccessibleMacro(val c: whitebox.Context) {
  ...
  @silent("pattern var [^\\s]+ in method unapply is never used")
  def apply(annottees: c.Tree*): c.Tree = ...
}

Usage of `silencer:globalFilters` in Maven projects.

How can we use silencer:globalFilters in maven projects?

-P:silencer:globalFilters=<semicolon separated message regexes>

I am trying to pass the silencer flag option using scala-maven-plugin

<configuration>
<args>
<arg>-P:silencer:globalFilters=Unused import</arg>
<arg> ....<arg>
<arg>-Xfatal-warnings</arg>
<arg>-Ywarn-unused-import</arg>
</args>
</configuration>

False positive with "-P:silencer:checkUnused" flag and default parameters

-P:silencer:checkUnused flag enabled.
The following code

class A(b: B = DeprecatedBImpl)

compiles with a deprecation warning object DeprecatedBImpl in object A is deprecated. Adding @silent flag

class A(b: B = DeprecatedBImpl: @silent)

causes the following compilation error: this @silent annotation does not suppress any warnings.

Scalafix and Silencer crash with NoClassDefFoundError

When running Scalafix check with Silencer plugin enabled, it crashes with

[error] java.lang.NoClassDefFoundError: scala/tools/nsc/reporters/Reporter$Severity
[error] 	at com.github.ghik.silencer.SilencerPlugin.reporter$lzycompute(SilencerPlugin.scala:31)
[error] 	at com.github.ghik.silencer.SilencerPlugin.com$github$ghik$silencer$SilencerPlugin$$reporter(SilencerPlugin.scala:31)
[error] 	at com.github.ghik.silencer.SilencerPlugin.processOptions(SilencerPlugin.scala:59)
[error] 	at scala.tools.nsc.plugins.Plugin.init(Plugin.scala:70)
[error] 	at scala.tools.nsc.plugins.Plugins.$anonfun$loadPlugins$9(Plugins.scala:162)
[error] 	at scala.tools.nsc.plugins.Plugins.$anonfun$loadPlugins$9$adapted(Plugins.scala:162)

Examples:

This is triggered by upgrade of sbt-scalafix to 0.9.25. (Version of silencer is 1.7.1.)

Bug on the Scalafix side scalacenter/scalafix#1315

No artifact published under `silencer-lib_2.12` and `silencer-lib_2.13` for 1.4.3

There are artifacts published for individual versions of silencer for 2.13.0 and 2.12.10 but that requires adding them like this in SBT:

libraryDependencies ++= Seq(
  compilerPlugin("com.github.ghik" % "silencer-plugin_2.12.10" % silencerVersion cross CrossVersion.full),
  "com.github.ghik" % "silencer-lib_2.12.10" % silencerVersion % Provided cross CrossVersion.full
)

whereas if they would be published under the correct artifactId we could use the %% notation

This was fine for 1.4.2 but not so for 1.4.3. Example:
https://mvnrepository.com/artifact/com.github.ghik/silencer-lib_2.13/1.4.2
https://mvnrepository.com/artifact/com.github.ghik/silencer-lib_2.13.0/1.4.3

Support Java @SuppressWarnings annotation?

More a feature request than a bug, but could we make Silencer also support @SuppressWarnings? It comes built in with the JDK, doesn't need an import, and has a slightly more meaningful name than just @silent

Compilation should fail when `@silent` does not suppress anything

Currently it seems like @silent can be added anywhere, even if it's not needed. This is particularly bothersome when it's applied to classes; a code change could fix the initial warning that's being ignored, but leave @silent in place, opening up accidental regression on further code changes.

Can't configure the plugin

When I try to use this plugin, I get the following error on opening SBT:

[error] scala.ScalaReflectionException: object com.github.ghik.silencer.silent in compiler mirror not found.
[error] 	at scala.reflect.internal.Mirrors$RootsBase.staticClass(Mirrors.scala:122)
[error] 	at scala.reflect.internal.Mirrors$RootsBase.staticClass(Mirrors.scala:22)
[error] 	at com.github.ghik.silencer.SilencerPlugin$component$$typecreator1$1.apply(SilencerPlugin.scala:30)
[error] 	at scala.reflect.api.TypeTags$WeakTypeTagImpl.tpe$lzycompute(TypeTags.scala:230)
[error] 	at scala.reflect.api.TypeTags$WeakTypeTagImpl.tpe(TypeTags.scala:230)
[error] 	at scala.reflect.api.TypeTags.typeOf(TypeTags.scala:339)
[error] 	at scala.reflect.api.TypeTags.typeOf$(TypeTags.scala:339)
[error] 	at scala.reflect.api.Universe.typeOf(Universe.scala:61)
[error] 	at com.github.ghik.silencer.SilencerPlugin$component$.applySuppressions(SilencerPlugin.scala:30)
[error] 	at com.github.ghik.silencer.SilencerPlugin$component$$anon$1.apply(SilencerPlugin.scala:26)
[error] 	at scala.tools.nsc.Global$GlobalPhase.$anonfun$applyPhase$1(Global.scala:436)
[error] 	at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:429)
[error] 	at scala.tools.nsc.Global$GlobalPhase.$anonfun$run$1(Global.scala:400)
[error] 	at scala.tools.nsc.Global$GlobalPhase.$anonfun$run$1$adapted(Global.scala:400)
[error] 	at scala.collection.Iterator.foreach(Iterator.scala:929)
[error] 	at scala.collection.Iterator.foreach$(Iterator.scala:929)
[error] 	at scala.collection.AbstractIterator.foreach(Iterator.scala:1417)
[error] 	at scala.tools.nsc.Global$GlobalPhase.run(Global.scala:400)
[error] 	at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1452)
[error] 	at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1436)
[error] 	at scala.tools.nsc.Global$Run.compileSources(Global.scala:1429)
[error] 	at scala.tools.nsc.Global$Run.compile(Global.scala:1545)
[error] 	at xsbt.CachedCompiler0.run(CompilerInterface.scala:131)
[error] 	at xsbt.CachedCompiler0.run(CompilerInterface.scala:106)
[error] 	at xsbt.CompilerInterface.run(CompilerInterface.scala:32)
[error] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error] 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error] 	at java.lang.reflect.Method.invoke(Method.java:498)
[error] 	at sbt.internal.inc.AnalyzingCompiler.call(AnalyzingCompiler.scala:237)
[error] 	at sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:111)
[error] 	at sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:90)
[error] 	at sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$3(MixedAnalyzingCompiler.scala:83)
[error] 	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[error] 	at sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:134)
[error] 	at sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:74)
[error] 	at sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:117)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:305)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:305)
[error] 	at sbt.internal.inc.Incremental$.doCompile(Incremental.scala:101)
[error] 	at sbt.internal.inc.Incremental$.$anonfun$compile$4(Incremental.scala:82)
[error] 	at sbt.internal.inc.IncrementalCommon.recompileClasses(IncrementalCommon.scala:117)
[error] 	at sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:64)
[error] 	at sbt.internal.inc.Incremental$.$anonfun$compile$3(Incremental.scala:84)
[error] 	at sbt.internal.inc.Incremental$.manageClassfiles(Incremental.scala:129)
[error] 	at sbt.internal.inc.Incremental$.compile(Incremental.scala:75)
[error] 	at sbt.internal.inc.IncrementalCompile$.apply(Compile.scala:70)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:309)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:267)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:158)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:237)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:68)
[error] 	at sbt.Defaults$.compileIncrementalTaskImpl(Defaults.scala:1406)
[error] 	at sbt.Defaults$.$anonfun$compileIncrementalTask$1(Defaults.scala:1388)
[error] 	at scala.Function1.$anonfun$compose$1(Function1.scala:44)
[error] 	at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:42)
[error] 	at sbt.std.Transform$$anon$4.work(System.scala:64)
[error] 	at sbt.Execute.$anonfun$submit$2(Execute.scala:257)
[error] 	at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
[error] 	at sbt.Execute.work(Execute.scala:266)
[error] 	at sbt.Execute.$anonfun$submit$1(Execute.scala:257)
[error] 	at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:167)
[error] 	at sbt.CompletionService$$anon$2.call(CompletionService.scala:32)
[error] 	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] 	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error] 	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[error] 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[error] 	at java.lang.Thread.run(Thread.java:748)

I'm using SBT 1.0.4 and I'm adding the library dependency to all subprojects (of which I have a few).

Global filter ignore rule by file name

For now the global filters ignore by error message patterns

scalacOptions += "-P:silencer:globalFilters=[semi-colon separated message patterns]"

it would be great if we could ignore by file name patterns as well.

This way we could handle issues where the compiler is used to generate some classes. An issue you can't use the silencer for is this:
playframework/playframework#7382

Using scala-collection-compat together with silencer-plugin is broken

When the scala-collection-compat library is used together with the silencer-plugin compiler plugin, you get errors like this:

[error] /home/runner/work/izumi-reflect/izumi-reflect/izumi-reflect/izumi-reflect/src/main/scala/izumi/reflect/internal/fundamentals/collections/IzMappings.scala:26:4: expected literal string as @nowarn annotation argument
[error]   @nowarn("msg=deprecated")
[error]    ^

Workaround is to drop silencer-plugin, but that might not be the desired solution.

It's worth to note that scala-collection-compat defines its own nowarn annotation: https://github.com/scala/scala-collection-compat/blob/master/compat/src/main/scala-2.11_2.12/scala/annotation/nowarn.scala

Related:
zio/izumi-reflect#121
scala/scala-collection-compat#413 (comment)
scala/scala-collection-compat#417

/cc @SethTisue @ekrich

continuation of scala/scala-collection-compat#418

Release for 2.12.13

Can you please release silencer for 2.12.13?

I know the new version includes @nowarn, but this plugin is still helpful for cross-compilation with 2.11

Silencer plugin suppresses compilation errors when scalafix semantic db is enabled

I had recently enabled the silencer sbt plugin and then started noticing really strange behaviour where I knew I had compilation errors but the sbt compile task would succeed. sbt test would also succeed but not actually run any tests.

It turns out that there is some sort of incompatibility between Silencer, Scalafix SemanticDB and Scala 2.13.1.

build.sbt:

scalaVersion := "2.13.1"
addCompilerPlugin(("com.github.ghik" % "silencer-plugin" % "1.4.4").cross(CrossVersion.full))
addCompilerPlugin(scalafixSemanticdb)

src/main/scala/Main.scala:

object Main extends App {
  asldfkhaklsdgjkldfjv
}

project/build.properties:

sbt.version=1.3.7

project/plugins.sbt:

addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.9.11")

[error] bad option: -P:silencer:checkUnused in Compile / doc

Just wanted to note that adding this flag to scalacOptions caused an error when trying to generate docs (sbt doc). To fix, I have removed this flag from Compile / doc scope in build.sbt like so:

scalacOptions in(Compile, doc) := scalacOptions.value.filterNot(Seq("-P:silencer:checkUnused").contains)

Although perhaps the flag could also only be applied to the Compile / compile scope:

scalacOptions in(Compile, compile) ++= Seq("-P:silencer:checkUnused")

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.