@@ -107,6 +107,14 @@ class ScoverageInstrumentationComponent(val global: Global, extraAfterPhase: Opt
107107 private var options : ScoverageOptions = new ScoverageOptions ()
108108 private var coverageFilter : CoverageFilter = AllCoverageFilter
109109
110+ private val isScalaJsEnabled : Boolean = {
111+ try {
112+ rootMirror.getClassIfDefined(" scala.scalajs.js.Any" ) != NoSymbol
113+ } catch {
114+ case _ : Throwable => false
115+ }
116+ }
117+
110118 def setOptions (options : ScoverageOptions ): Unit = {
111119 this .options = options
112120 coverageFilter = new RegexCoverageFilter (options.excludedPackages, options.excludedFiles, options.excludedSymbols)
@@ -215,6 +223,10 @@ class ScoverageInstrumentationComponent(val global: Global, extraAfterPhase: Opt
215223 if (tree.pos.isDefined && ! isStatementIncluded(tree.pos)) {
216224 coverage.add(statement.copy(ignored = true ))
217225 tree
226+ } else if (isUndefinedParameterInScalaJs(tree.symbol)) {
227+ coverage.add(statement.copy(ignored = true ))
228+ statementIds.decrementAndGet()
229+ tree
218230 } else {
219231 coverage.add(statement)
220232
@@ -225,6 +237,11 @@ class ScoverageInstrumentationComponent(val global: Global, extraAfterPhase: Opt
225237 }
226238 }
227239
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+ }
228245 def isClassIncluded (symbol : Symbol ): Boolean = coverageFilter.isClassIncluded(symbol.fullNameString)
229246 def isFileIncluded (source : SourceFile ): Boolean = coverageFilter.isFileIncluded(source)
230247 def isStatementIncluded (pos : Position ): Boolean = coverageFilter.isLineIncluded(pos)
0 commit comments