2

This question is similar to How do I get the Scala version from within Scala itself?, except I want to support Scala.js as well.

I tried the util.Properties approach. Unfortunately it is not available on Scala.js:

https://scalafiddle.io/sf/dzNAhWB/0

ScalaFiddle.scala:-5: ERROR: There were linking errors
Referring to non-existent class java.util.jar.Attributes$Name
  called from scala.util.Properties$.()
  called from ScalaFiddle$.()
  exported to JavaScript with @JSExport
Referring to non-existent method java.util.Properties.load(java.io.InputStream)scala.Unit
  called from scala.util.PropertiesTrait.$$anonfun$scalaProps$1(java.util.Properties,java.io.InputStream)scala.Unit
  called from scala.util.Properties$.$$anonfun$scalaProps$1(java.util.Properties,java.io.InputStream)scala.Unit
  called from scala.util.PropertiesTrait.scalaProps()java.util.Properties
  called from scala.util.Properties$.scalaProps$lzycompute()java.util.Properties
  called from scala.util.Properties$.scalaProps()java.util.Properties
  called from scala.util.PropertiesTrait.scalaPropOrNone(java.lang.String)scala.Option
  called from scala.util.Properties$.scalaPropOrNone(java.lang.String)scala.Option
  called from scala.util.PropertiesTrait.$$init$()scala.Unit
  called from scala.util.Properties$.()
  called from ScalaFiddle$.()
  exported to JavaScript with @JSExport
involving instantiated classes:
  scala.util.Properties$
Referring to non-existent method java.lang.Class.getResourceAsStream(java.lang.String)java.io.InputStream
  called from scala.util.PropertiesTrait.scalaProps()java.util.Properties
  called from scala.util.Properties$.scalaProps$lzycompute()java.util.Properties
  called from scala.util.Properties$.scalaProps()java.util.Properties
  called from scala.util.PropertiesTrait.scalaPropOrNone(java.lang.String)scala.Option
  called from scala.util.Properties$.scalaPropOrNone(java.lang.String)scala.Option
  called from scala.util.PropertiesTrait.$$init$()scala.Unit
  called from scala.util.Properties$.()
  called from ScalaFiddle$.()
  exported to JavaScript with @JSExport
involving instantiated classes:
  scala.util.Properties$
Referring to non-existent method java.util.jar.Attributes$Name.(java.lang.String)
  called from scala.util.Properties$.()
  called from ScalaFiddle$.()
  exported to JavaScript with @JSExport

So, how to determine Scala version at run-time for all Scala backends?

Yang Bo
  • 3,586
  • 3
  • 22
  • 35
  • What would be the goal? To check something at runtime or juste display? The version van ne generated in a (re)source file at compile ans then use as-is – cchantep Jan 30 '18 at 08:30

1 Answers1

4

I'm afraid there is no way to do that in Scala.js to begin with, let alone a platform-independent solution.

What you can do is write a small task in your build tool (sbt?) that will generate a small source file encoding the information.

For example, paraphrasing the sbt documentation on source generators:

sourceGenerators in Compile += Def.task {
  val file = (sourceManaged in Compile).value / "scalaversion" / "ScalaVersion.scala"
  val scalaV = scalaVersion.value
  IO.write(file,
      s"""
        object ScalaVersion {
          val Full = "$scalaV"
        }
      """)
  Seq(file)
}.taskValue

You can then read ScalaVersion.Full from your code.

sjrd
  • 21,805
  • 2
  • 61
  • 91