Skip to content

-coverage-out generates unlinkable code on Scala.js #15383

Open
@armanbilge

Description

@armanbilge

Compiler version

3.2.0-RC1-bin-20220604-13ce496-NIGHTLY

Minimized code

//> using scala "3.2.0-RC1-bin-20220604-13ce496-NIGHTLY"
//> using platform "js"
//> using option "-coverage-out:."

@main def main = ()

Output

Referring to non-existent class java.io.FileWriter
  called from scala.runtime.coverage.Invoker$.invoked(int,java.lang.String)void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  scala.runtime.coverage.Invoker$
  coverage$package$
Referring to non-existent class java.io.FileWriter
  called from scala.runtime.coverage.Invoker$.invoked(int,java.lang.String)void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  scala.runtime.coverage.Invoker$
  coverage$package$
Referring to non-existent method java.io.FileWriter.write(java.lang.String)void
  called from scala.runtime.coverage.Invoker$.invoked(int,java.lang.String)void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  scala.runtime.coverage.Invoker$
  coverage$package$
Referring to non-existent method java.io.FileWriter.write(int)void
  called from scala.runtime.coverage.Invoker$.invoked(int,java.lang.String)void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  scala.runtime.coverage.Invoker$
  coverage$package$
Referring to non-existent method java.io.FileWriter.flush()void
  called from scala.runtime.coverage.Invoker$.invoked(int,java.lang.String)void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  scala.runtime.coverage.Invoker$
  coverage$package$
Referring to non-existent class java.io.FileWriter
  called from private scala.runtime.coverage.Invoker$.$anonfun$2(java.lang.String)java.io.FileWriter
  called from scala.runtime.coverage.Invoker$.invoked(int,java.lang.String)void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  scala.runtime.coverage.Invoker$
  coverage$package$
Referring to non-existent method java.io.FileWriter.flush()void
  called from scala.runtime.coverage.Invoker$.invoked(int,java.lang.String)void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  scala.runtime.coverage.Invoker$
  coverage$package$
Referring to non-existent method java.io.FileWriter.write(int)void
  called from scala.runtime.coverage.Invoker$.invoked(int,java.lang.String)void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  scala.runtime.coverage.Invoker$
  coverage$package$
Referring to non-existent method java.io.FileWriter.write(java.lang.String)void
  called from scala.runtime.coverage.Invoker$.invoked(int,java.lang.String)void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  scala.runtime.coverage.Invoker$
  coverage$package$
Referring to non-existent class java.io.FileWriter
  called from private scala.runtime.coverage.Invoker$.$anonfun$2(java.lang.String)java.io.FileWriter
  called from scala.runtime.coverage.Invoker$.invoked(int,java.lang.String)void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  scala.runtime.coverage.Invoker$
  coverage$package$
Referring to non-existent class java.io.File
  called from scala.runtime.coverage.Invoker$.measurementFile(java.lang.String)java.io.File
  called from private scala.runtime.coverage.Invoker$.$anonfun$2(java.lang.String)java.io.FileWriter
  called from scala.runtime.coverage.Invoker$.invoked(int,java.lang.String)void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  scala.runtime.coverage.Invoker$
  coverage$package$
Referring to non-existent class java.io.File
  called from scala.runtime.coverage.Invoker$.measurementFile(java.lang.String)java.io.File
  called from private scala.runtime.coverage.Invoker$.$anonfun$2(java.lang.String)java.io.FileWriter
  called from scala.runtime.coverage.Invoker$.invoked(int,java.lang.String)void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  scala.runtime.coverage.Invoker$
  coverage$package$
Referring to non-existent class java.io.File
  called from scala.runtime.coverage.Invoker$.measurementFile(java.lang.String)java.io.File
  called from private scala.runtime.coverage.Invoker$.$anonfun$2(java.lang.String)java.io.FileWriter
  called from scala.runtime.coverage.Invoker$.invoked(int,java.lang.String)void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  scala.runtime.coverage.Invoker$
  coverage$package$
Referring to non-existent method constructor java.io.File.<init>(java.lang.String,java.lang.String)void
  called from scala.runtime.coverage.Invoker$.measurementFile(java.lang.String)java.io.File
  called from private scala.runtime.coverage.Invoker$.$anonfun$2(java.lang.String)java.io.FileWriter
  called from scala.runtime.coverage.Invoker$.invoked(int,java.lang.String)void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  scala.runtime.coverage.Invoker$
  coverage$package$
Referring to non-existent class java.io.FileWriter
  called from private scala.runtime.coverage.Invoker$.$anonfun$2(java.lang.String)java.io.FileWriter
  called from scala.runtime.coverage.Invoker$.invoked(int,java.lang.String)void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  scala.runtime.coverage.Invoker$
  coverage$package$
Referring to non-existent method constructor java.io.FileWriter.<init>(java.io.File,boolean)void
  called from private scala.runtime.coverage.Invoker$.$anonfun$2(java.lang.String)java.io.FileWriter
  called from scala.runtime.coverage.Invoker$.invoked(int,java.lang.String)void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  scala.runtime.coverage.Invoker$
  coverage$package$
Referring to non-existent class java.io.FileWriter
  called from scala.runtime.coverage.Invoker$.invoked(int,java.lang.String)void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  scala.runtime.coverage.Invoker$
  coverage$package$
Referring to non-existent class java.io.File
  called from private scala.runtime.coverage.Invoker$.$anonfun$2(java.lang.String)java.io.FileWriter
  called from scala.runtime.coverage.Invoker$.invoked(int,java.lang.String)void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  scala.runtime.coverage.Invoker$
  coverage$package$
Referring to non-existent class java.security.SecureRandom
  called from private java.util.UUID$.csprng$lzycompute()java.util.Random
  called from private java.util.UUID$.csprng()java.util.Random
  called from java.util.UUID$.randomUUID()java.util.UUID
  called from static java.util.UUID.randomUUID()java.util.UUID
  called from constructor scala.runtime.coverage.Invoker$.<init>()void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  java.util.UUID$
  coverage$package$
Referring to non-existent class java.security.SecureRandom
  called from private java.util.UUID$.csprng$lzycompute()java.util.Random
  called from private java.util.UUID$.csprng()java.util.Random
  called from java.util.UUID$.randomUUID()java.util.UUID
  called from static java.util.UUID.randomUUID()java.util.UUID
  called from constructor scala.runtime.coverage.Invoker$.<init>()void
  called from coverage$package$.main()void
  called from static main.main([java.lang.String)void
  called from core module module initializers
involving instantiated classes:
  java.util.UUID$
  coverage$package$
Not showing 179 more linking errors
Exception in thread "main" org.scalajs.linker.interface.LinkingException: There were linking errors
        at org.scalajs.linker.frontend.BaseLinker.reportErrors$1(BaseLinker.scala:91)
        at org.scalajs.linker.frontend.BaseLinker.$anonfun$analyze$5(BaseLinker.scala:100)
        at scala.concurrent.impl.Promise$Transformation.run(Promise.scala:467)
        at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395)
        at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
        at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
        at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
        at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:597)
        at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:194)
[error]  Error linking Scala.js

Expectation

Scoverage for Scala 2 is supported on Scala.js, so it should be on Scala 3 as well.

This is complicated by two things:

  1. The use of UUID. See:
  2. Varying APIs for filesystem access in JavaScript runtimes. See:

Either these changes need to be ported to Dotty, or I wonder if a better solution might be to shell out to the Scala 2 runtime with for3Use2_13.

/cc @ckipp01 @TheElectronWill

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions