- Notifications
You must be signed in to change notification settings - Fork33
Scala compiler plugin for warning suppression
License
ghik/silencer
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Silencer is available for Scala 2.11, 2.12, and 2.13.
NOTE: Scala 2.13.2 and 2.12.13 introducedconfigurable 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 withscala-collection-compat in order to suppress warnings in allScala versions using@nowarn
.
As a compiler plugin, Silencer must be separately built for every minor version of Scala. If you find that Silencer is notavailable for your version of Scala (most likely some newly released one), please contribute - the instructions on how to do it are below :)
- Fork and clone the repository.
- Edit
build.sbt
and add the new Scala version tocrossScalaVersions
. Make sure to keep the order of the list,which should start with the newest version. - Invoke
sbt githubWorkflowGenerate
- Commit changes in
build.sbt
and Github workflow definitions - Make a PR :)
If you're using SBT, add this to your project definition:
ThisBuild/ libraryDependencies++=Seq( compilerPlugin("com.github.ghik"%"silencer-plugin"% silencerVersion crossCrossVersion.full),"com.github.ghik"%"silencer-lib"% silencerVersion%Provided crossCrossVersion.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 bothsilencer-plugin
andsilencer-lib
are compile time only dependencies, Silencer can be usedin ScalaJS and Scala Native without having to be cross compiled for them.
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, entiredef
/val
/var
definition or entireclass
/object
/trait
definition.
importcom.github.ghik.silencer.silent@silentclasssomeClass { ... }@silentdefsomeMethod()= { ... }someDeprecatedApi("something"):@silent
By default the@silent
annotation suppressesall warnings in some code fragment. You can limit the suppression tosome specific classes of warnings by passing a message pattern (regular expression) to the annotation, e.g.
@silent("deprecated")defusesDeprecatedApi():Unit= { someDeprecatedApi("something")}
Scala 2.13.2 and 2.12.13 introducedconfigurable warnings using-Wconf
compiler option and@scala.annotation.nowarn
. annotation. For Scala 2.11, this annotation is provided by thescala-collection-compat library and interpreted by thesilencer
plugin.
NOTE:@nowarn
in Scala 2.13.2 supports various fine-grained filters (e.g. warning category, message pattern, etc.).Silencer only supports themsg=<pattern>
filter - all other filters simply suppress everything, as if there wereno filters specified.
If a@silent
annotation does not actually suppress any warnings, you can makesilencer
report an error in suchsituation. This can be enabled by passing thecheckUnused
option to the plugin:
scalacOptions+="-P:silencer:checkUnused"
You can also suppress warnings globally based on a warning message regex. In order to do that, pass this option toscalac
:
scalacOptions+="-P:silencer:globalFilters=<semicolon separated message regexes>"
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>"
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 yourproject is checked out, you can specify a list of source root directories. Source file paths will be relativized withrespect to them before being matched against path patterns. Usually it should be enough to pass project base directoryas 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(";")}"
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.
About
Scala compiler plugin for warning suppression