sourcecode icon indicating copy to clipboard operation
sourcecode copied to clipboard

feature enhancement - implement unique ID generated at compile time

Open winitzki opened this issue 2 years ago • 5 comments

A "source UUID" is a unique ID generated at compile time at a given source code location. So, the value of SourceUUID depends only on the source code location and will be the same each time that code is executed.

    def generateUUIDs() = {
      val uuid1 = implicitly[sourcecode.SourceUUID].value // Generate some UUID.
      val uuid2 = implicitly[sourcecode.SourceUUID].value // This will be a different UUID.
      (uuid1, uuid2)
    }

    val (u1a, u2a) = generateUUIDs() // Generate a pair of UUIDs.
    val (u1b, u2b) = generateUUIDs() // This will be the same pair of UUID.

    assert(u1a != u2a) // Verify that the two UUIDs are different.
    assert(u1a == u1b) // The UUIDs are generated at compile time.
    assert(u2a == u2b) // So, calling `generateUUIDs()` several times will produce the same results.

Motivation for this feature is to be able to generate unique IDs at compile time for values created in a DSL. The IDs should remain unique even when values are created within a function that is being called several times. In this way, the IDs serve as unique labels on values created via DSL code.

winitzki avatar Jul 27 '23 14:07 winitzki

FYI - I am not able to run tests on my laptop because the command mill -i all __.test fails with:

Mill version 0.11.1 is different than configured for this directory!
Configured version is 0.10.12 (/Users/sergei.winitzki/Code/sourcecode/.mill-version)
[build.sc] [41/49] compile
[info] compiling 1 Scala source to /Users/sergei.winitzki/Code/sourcecode/out/mill-build/compile.dest/classes ...
[error] /Users/sergei.winitzki/Code/sourcecode/build.sc:6:26: object Util is not a member of package mill.scalalib.api
[error] import mill.scalalib.api.Util.isScala3
[error]                          ^
[error] /Users/sergei.winitzki/Code/sourcecode/build.sc:30:8: not found: value isScala3
[error]     if(isScala3(crossScalaVersion)) Agg.empty[Dep] else super.mimaPreviousArtifacts()
[error]        ^
[error] /Users/sergei.winitzki/Code/sourcecode/build.sc:75:11: not found: value CrossModuleBase
[error]       .++(CrossModuleBase.scalaVersionPaths(crossScalaVersion, s => millSourcePath / s"src-$s" ))
[error]           ^
[error] /Users/sergei.winitzki/Code/sourcecode/build.sc:87:49: type mismatch;
[error]  found   : List[String]
[error]  required: Seq[mill.define.Cross.Factory[millbuild.build.sourcecode.JvmSourcecodeModule]]
[error]   object jvm extends Cross[JvmSourcecodeModule](scalaVersions: _*)
[error]                                                 ^
[error] /Users/sergei.winitzki/Code/sourcecode/build.sc:98:47: type mismatch;
[error]  found   : List[(String, String)]
[error]  required: Seq[mill.define.Cross.Factory[millbuild.build.sourcecode.JsSourcecodeModule]]
[error]   object js extends Cross[JsSourcecodeModule](scalaJSVersions: _*)
[error]                                               ^
[error] /Users/sergei.winitzki/Code/sourcecode/build.sc:113:55: type mismatch;
[error]  found   : List[(String, String)]
[error]  required: Seq[mill.define.Cross.Factory[millbuild.build.sourcecode.NativeSourcecodeModule]]
[error]   object native extends Cross[NativeSourcecodeModule](scalaNativeVersions: _*)
[error]                                                       ^
[error] 6 errors found
1 targets failed
compile Compilation failed

I have tried to set MILL_VERSION=0.10.12 but I still get the same error.

The CI doesn't seem to run on this PR automatically either. I'm not sure how to proceed, please help.

winitzki avatar Jul 27 '23 17:07 winitzki

FYI - I am not able to run tests on my laptop because the command mill -i all __.test fails with:

Mill version 0.11.1 is different than configured for this directory!
Configured version is 0.10.12 (/Users/sergei.winitzki/Code/sourcecode/.mill-version)
[build.sc] [41/49] compile
[info] compiling 1 Scala source to /Users/sergei.winitzki/Code/sourcecode/out/mill-build/compile.dest/classes ...
[error] /Users/sergei.winitzki/Code/sourcecode/build.sc:6:26: object Util is not a member of package mill.scalalib.api
[error] import mill.scalalib.api.Util.isScala3
[error]                          ^
[error] /Users/sergei.winitzki/Code/sourcecode/build.sc:30:8: not found: value isScala3
[error]     if(isScala3(crossScalaVersion)) Agg.empty[Dep] else super.mimaPreviousArtifacts()
[error]        ^
[error] /Users/sergei.winitzki/Code/sourcecode/build.sc:75:11: not found: value CrossModuleBase
[error]       .++(CrossModuleBase.scalaVersionPaths(crossScalaVersion, s => millSourcePath / s"src-$s" ))
[error]           ^
[error] /Users/sergei.winitzki/Code/sourcecode/build.sc:87:49: type mismatch;
[error]  found   : List[String]
[error]  required: Seq[mill.define.Cross.Factory[millbuild.build.sourcecode.JvmSourcecodeModule]]
[error]   object jvm extends Cross[JvmSourcecodeModule](scalaVersions: _*)
[error]                                                 ^
[error] /Users/sergei.winitzki/Code/sourcecode/build.sc:98:47: type mismatch;
[error]  found   : List[(String, String)]
[error]  required: Seq[mill.define.Cross.Factory[millbuild.build.sourcecode.JsSourcecodeModule]]
[error]   object js extends Cross[JsSourcecodeModule](scalaJSVersions: _*)
[error]                                               ^
[error] /Users/sergei.winitzki/Code/sourcecode/build.sc:113:55: type mismatch;
[error]  found   : List[(String, String)]
[error]  required: Seq[mill.define.Cross.Factory[millbuild.build.sourcecode.NativeSourcecodeModule]]
[error]   object native extends Cross[NativeSourcecodeModule](scalaNativeVersions: _*)
[error]                                                       ^
[error] 6 errors found
1 targets failed
compile Compilation failed

I have tried to set MILL_VERSION=0.10.12 but I still get the same error.

The CI doesn't seem to run on this PR automatically either. I'm not sure how to proceed, please help.

looks like you're using the mill-assembly jar directly (which is supposed to be downloaded and used by the scripts), instead of a mill script (either to official mill script or millw).

lefou avatar Jul 27 '23 19:07 lefou

I did brew install mill, as per the official instructions for installing mill on a Mac. How else should I install mill on a Mac?

winitzki avatar Jul 28 '23 08:07 winitzki

Finally I figured out that I should have run ./mill instead of mill. This is confusing.

Tests pass now on my local machine.

winitzki avatar Jul 28 '23 09:07 winitzki

Looks like brew is not the best way to install Mill then. I opened issue https://github.com/com-lihaoyi/mill/issues/2674. Instead of brew, you can just install the mill script into your bin directory. See also https://mill-build.com/mill/Installation_IDE_Support.html#_bootstrap_scripts. My personal recommendation is to use millw, as it supports almost all legacy Mill versions and has also a script for Windows.

lefou avatar Jul 28 '23 09:07 lefou