@@ -107,6 +107,14 @@ class ScoverageInstrumentationComponent(val global: Global, extraAfterPhase: Opt
107
107
private var options : ScoverageOptions = new ScoverageOptions ()
108
108
private var coverageFilter : CoverageFilter = AllCoverageFilter
109
109
110
+ private val isScalaJsEnabled : Boolean = {
111
+ try {
112
+ rootMirror.getClassIfDefined(" scala.scalajs.js.Any" ) != NoSymbol
113
+ } catch {
114
+ case _ : Throwable => false
115
+ }
116
+ }
117
+
110
118
def setOptions (options : ScoverageOptions ): Unit = {
111
119
this .options = options
112
120
coverageFilter = new RegexCoverageFilter (options.excludedPackages, options.excludedFiles, options.excludedSymbols)
@@ -215,6 +223,10 @@ class ScoverageInstrumentationComponent(val global: Global, extraAfterPhase: Opt
215
223
if (tree.pos.isDefined && ! isStatementIncluded(tree.pos)) {
216
224
coverage.add(statement.copy(ignored = true ))
217
225
tree
226
+ } else if (isUndefinedParameterInScalaJs(tree.symbol)) {
227
+ coverage.add(statement.copy(ignored = true ))
228
+ statementIds.decrementAndGet()
229
+ tree
218
230
} else {
219
231
coverage.add(statement)
220
232
@@ -225,6 +237,11 @@ class ScoverageInstrumentationComponent(val global: Global, extraAfterPhase: Opt
225
237
}
226
238
}
227
239
240
+ def isUndefinedParameterInScalaJs (symbol : Symbol ): Boolean = {
241
+ isScalaJsEnabled && symbol != null && symbol.isSynthetic && symbol.isMethod &&
242
+ symbol.nameString.contains(" $default$" ) &&
243
+ symbol.tpe.resultType.annotations.exists(_.symbol.nameString == " uncheckedVariance" )
244
+ }
228
245
def isClassIncluded (symbol : Symbol ): Boolean = coverageFilter.isClassIncluded(symbol.fullNameString)
229
246
def isFileIncluded (source : SourceFile ): Boolean = coverageFilter.isFileIncluded(source)
230
247
def isStatementIncluded (pos : Position ): Boolean = coverageFilter.isLineIncluded(pos)
0 commit comments