@@ -23,22 +23,8 @@ object ScoverageSbtPlugin extends AutoPlugin {
23
23
override def requires : JvmPlugin .type = plugins.JvmPlugin
24
24
override def trigger : PluginTrigger = allRequirements
25
25
26
- override lazy val projectSettings = Seq (
26
+ override def globalSettings : Seq [ Def . Setting [_]] = super .globalSettings ++ Seq (
27
27
coverageEnabled := false ,
28
- commands += Command .command(" coverage" , " enable compiled code with instrumentation" , " " )(toggleCoverage(true )),
29
- commands += Command .command(" coverageOff" , " disable compiled code with instrumentation" , " " )(toggleCoverage(false )),
30
- coverageReport <<= coverageReport0,
31
- coverageAggregate <<= coverageAggregate0,
32
- ivyConfigurations := ivyConfigurations.value :+ ScoveragePluginConfig ,
33
- coverageScalacPluginVersion := DefaultScoverageVersion ,
34
- libraryDependencies ++= {
35
- if (coverageEnabled.value) Seq (
36
- OrgScoverage %% (ScalacRuntimeArtifact + optionalScalaJsSuffix(libraryDependencies.value)) % coverageScalacPluginVersion.value,
37
- OrgScoverage %% ScalacPluginArtifact % coverageScalacPluginVersion.value % ScoveragePluginConfig .name
38
- ) else Nil
39
- },
40
- scalacOptions in(Compile , compile) ++= scoverageScalacOptions.value,
41
- aggregate in coverageAggregate := false ,
42
28
coverageExcludedPackages := " " ,
43
29
coverageExcludedFiles := " " ,
44
30
coverageMinimum := 0 , // default is no minimum
@@ -49,22 +35,60 @@ object ScoverageSbtPlugin extends AutoPlugin {
49
35
coverageOutputCobertura := true ,
50
36
coverageOutputDebug := false ,
51
37
coverageCleanSubprojectFiles := true ,
52
- coverageOutputTeamCity := false
38
+ coverageOutputTeamCity := false ,
39
+ coverageScalacPluginVersion := DefaultScoverageVersion
40
+ )
41
+
42
+ override def buildSettings : Seq [Setting [_]] = super .buildSettings ++
43
+ addCommandAlias(" coverage" , " ;set coverageEnabled in ThisBuild := true" ) ++
44
+ addCommandAlias(" coverageOn" , " ;set coverageEnabled in ThisBuild := true" ) ++
45
+ addCommandAlias(" coverageOff" , " ;set coverageEnabled in ThisBuild := false" )
46
+
47
+ override def projectSettings : Seq [Setting [_]] = Seq (
48
+ ivyConfigurations += ScoveragePluginConfig ,
49
+ coverageReport <<= coverageReport0,
50
+ coverageAggregate <<= coverageAggregate0
51
+ ) ++ coverageSettings ++ scalacSettings
52
+
53
+ private lazy val coverageSettings = Seq (
54
+ libraryDependencies ++= {
55
+ if (coverageEnabled.value)
56
+ Seq (
57
+ // We only add for "compile"" because of macros. This setting could be optimed to just "test" if the handling
58
+ // of macro coverage was improved.
59
+ OrgScoverage %% (scalacRuntime(libraryDependencies.value)) % coverageScalacPluginVersion.value,
60
+ // We don't want to instrument the test code itself, nor add to a pom when published with coverage enabled.
61
+ OrgScoverage %% ScalacPluginArtifact % coverageScalacPluginVersion.value % ScoveragePluginConfig .name
62
+ )
63
+ else
64
+ Nil
65
+ }
66
+ )
67
+
68
+ private lazy val scalacSettings = Seq (
69
+ scalacOptions in(Compile , compile) ++= {
70
+ if (coverageEnabled.value) {
71
+ val scoverageDeps : Seq [File ] = update.value matching configurationFilter(ScoveragePluginConfig .name)
72
+ val pluginPath : File = scoverageDeps.find(_.getAbsolutePath.contains(ScalacPluginArtifact )) match {
73
+ case None => throw new Exception (s " Fatal: $ScalacPluginArtifact not in libraryDependencies " )
74
+ case Some (pluginPath) => pluginPath
75
+ }
76
+ Seq (
77
+ Some (s " -Xplugin: ${pluginPath.getAbsolutePath}" ),
78
+ Some (s " -P:scoverage:dataDir: ${crossTarget.value.getAbsolutePath}/scoverage-data " ),
79
+ Option (coverageExcludedPackages.value.trim).filter(_.nonEmpty).map(v => s " -P:scoverage:excludedPackages: $v" ),
80
+ Option (coverageExcludedFiles.value.trim).filter(_.nonEmpty).map(v => s " -P:scoverage:excludedFiles: $v" ),
81
+ // rangepos is broken in some releases of scala so option to turn it off
82
+ if (coverageHighlighting.value) Some (" -Yrangepos" ) else None
83
+ ).flatten
84
+ } else {
85
+ Nil
86
+ }
87
+ }
53
88
)
54
89
55
- /**
56
- * The "coverage" command enables or disables instrumentation for all projects
57
- * in the build.
58
- */
59
- private def toggleCoverage (status : Boolean ): State => State = { state =>
60
- val extracted = Project .extract(state)
61
- val currentProjRef = extracted.currentRef
62
- val newSettings = extracted.structure.allProjectRefs.flatMap(proj =>
63
- Seq (coverageEnabled in proj := status)
64
- )
65
- val appendSettings = Load .transformSettings(Load .projectScope(currentProjRef), currentProjRef.build, extracted.rootProject, newSettings)
66
- val newSessionSettings = extracted.session.appendRaw(appendSettings)
67
- SessionSettings .reapply(newSessionSettings, state)
90
+ private def scalacRuntime (deps : Seq [ModuleID ]): String = {
91
+ ScalacRuntimeArtifact + optionalScalaJsSuffix(deps)
68
92
}
69
93
70
94
// returns "_sjs$sjsVersion" for Scala.js projects or "" otherwise
@@ -130,39 +154,6 @@ object ScoverageSbtPlugin extends AutoPlugin {
130
154
}
131
155
}
132
156
133
- private lazy val scoverageScalacOptions = Def .task {
134
- update.value
135
- .matching(configurationFilter(ScoveragePluginConfig .name))
136
- .find(_.getAbsolutePath.contains(ScalacPluginArtifact ))
137
- .fold[Seq [String ]](Nil )(pluginPath =>
138
- scalaArgs(coverageEnabled.value,
139
- pluginPath,
140
- crossTarget.value,
141
- coverageExcludedPackages.value,
142
- coverageExcludedFiles.value,
143
- coverageHighlighting.value))
144
- }
145
-
146
- private def scalaArgs (coverageEnabled : Boolean ,
147
- pluginPath : File ,
148
- target : File ,
149
- excludedPackages : String ,
150
- excludedFiles : String ,
151
- coverageHighlighting : Boolean ) = {
152
- if (coverageEnabled) {
153
- Seq (
154
- Some (s " -Xplugin: ${pluginPath.getAbsolutePath}" ),
155
- Some (s " -P:scoverage:dataDir: ${target.getAbsolutePath}/scoverage-data " ),
156
- Option (excludedPackages.trim).filter(_.nonEmpty).map(v => s " -P:scoverage:excludedPackages: $v" ),
157
- Option (excludedFiles.trim).filter(_.nonEmpty).map(v => s " -P:scoverage:excludedFiles: $v" ),
158
- // rangepos is broken in some releases of scala so option to turn it off
159
- if (coverageHighlighting) Some (" -Yrangepos" ) else None
160
- ).flatten
161
- } else {
162
- Nil
163
- }
164
- }
165
-
166
157
private def writeReports (crossTarget : File ,
167
158
compileSourceDirectories : Seq [File ],
168
159
coverage : Coverage ,
0 commit comments