This mapping has 2 multi-map groups: several pairings are equally correct there. The code view shows one arbitrary valid pairing, not the only one.

Before

…lines 1–94 unchanged (94 lines)
95 s"""|import MillMiscInfo._
96 |import _root_.mill.util.TokenReaders.given
97 |import _root_.mill.runner.autooverride.AutoOverride
98 |""".stripMargin
99
100 def processDataRest[T](data: HeaderData)(
101 onProperty: (String, ujson.Value) => T,
102 onNestedObject: (String, HeaderData) => T
103 ): Seq[T] = {
104 for ((kString, v) <- data.rest.toSeq)
105 yield kString.split(" +") match {
106 case Array(k) => onProperty(k, v)
107 case Array("object", k) => onNestedObject(k, upickle.read[HeaderData](v))
108 case _ => sys.error("Invalid key: " + kString)
109 }
110 }
111
112 def writeBuildOverrides(data: HeaderData, path: Seq[String]): Unit = {
113 val resourcePath = resourceDest / path / "build-overrides.json"
114 val out = collection.mutable.Map.empty[String, ujson.Value]
115
116 processDataRest(data)(
117 onProperty = (k, v) => out(k) = v,
118 onNestedObject = (k, nestedData) => writeBuildOverrides(nestedData, path :+ k)
119 )
120 os.write.over(resourcePath, upickle.write(out), createFolders = true)
121 }
122
123 writeBuildOverrides(parsedHeaderData, segments)
124
125 val miscInfoWithResource = {
126 val header = if (pkg.isBlank()) "" else s"package $pkg"
127 val miscInfoBody = if (segments.isEmpty) {
128 rootMiscInfo(scriptFolderPath, millTopLevelProjectRoot, output)
129 } else {
…lines 130–478 unchanged (349 lines)

After

…lines 1–94 unchanged (94 lines)
95 s"""|import MillMiscInfo._
96 |import _root_.mill.util.TokenReaders.given
97 |import _root_.mill.runner.autooverride.AutoOverride
98 |""".stripMargin
99
100 def processDataRest[T](data: HeaderData)(
101 onProperty: (String, upickle.core.BufferedValue) => T,
102 onNestedObject: (String, HeaderData) => T
103 ): Seq[T] = {
104 for ((kString, v) <- data.rest.toSeq)
105 yield kString.split(" +") match {
106 case Array(k) => onProperty(k, v)
107 case Array("object", k) => onNestedObject(
108 k,
109 upickle.core.BufferedValue.transform(v, upickle.reader[HeaderData])
110 )
111 case _ => sys.error("Invalid key: " + kString)
112 }
113 }
114
115 val miscInfoWithResource = {
116 val header = if (pkg.isBlank()) "" else s"package $pkg"
117 val miscInfoBody = if (segments.isEmpty) {
118 rootMiscInfo(scriptFolderPath, millTopLevelProjectRoot, output)
119 } else {
120 subfolderMiscInfo(scriptFolderPath, segments)
…lines 121–468 unchanged (348 lines)

Before

compilation_unit
package_clause
package "package"
package_identifier
identifier "mill"
. "."
identifier "meta"
import_declaration
import "import"
identifier "scala"
. "."
identifier "jdk"
. "."
identifier "CollectionConverters"
. "."
identifier "CollectionHasAsScala"
import_declaration
import "import"
identifier "mill"
. "."
identifier "constants"
. "."
as_renamed_identifier
identifier "CodeGenConstants"
as "as"
identifier "CGConst"
import_declaration
import "import"
identifier "mill"
. "."
identifier "api"
. "."
identifier "Result"
import_declaration
import "import"
identifier "mill"
. "."
identifier "internal"
. "."
identifier "Util"
. "."
identifier "backtickWrap"
import_declaration
import "import"
identifier "pprint"
. "."
identifier "Util"
. "."
identifier "literalize"
import_declaration
import "import"
identifier "mill"
. "."
identifier "api"
. "."
identifier "daemon"
. "."
identifier "internal"
. "."
identifier "MillScalaParser"
import_declaration
import "import"
identifier "mill"
. "."
identifier "api"
. "."
identifier "ModuleCtx"
. "."
identifier "HeaderData"
import_declaration
import "import"
identifier "mill"
. "."
identifier "api"
. "."
identifier "daemon"
. "."
identifier "Segment"
import_declaration
import "import"
identifier "scala"
. "."
identifier "util"
. "."
identifier "control"
. "."
identifier "Breaks"
. "."
namespace_wildcard
* "*"
object_definition
object "object"
identifier "CodeGen"
template_body
{ "{"
val_definition (+24 nodes collapsed)
function_definition
def "def"
identifier "generateWrappedAndSupportSources"
parameters (+70 nodes collapsed)
: ":"
type_identifier "Unit"
= "="
block
{ "{"
val_definition
val "val"
identifier "scriptSources"
= "="
field_expression
field_expression
field_expression
identifier "allScriptCode"
. "."
identifier "keys"
. "."
identifier "toSeq"
. "."
identifier "sorted"
comment
// "//"
comment
// "//"
comment
// "//"
val_definition
val "val"
identifier "aliasImports"
= "="
string "\"import build_.{package_ => build}\""
for_expression
for "for"
( "("
enumerators
enumerator
identifier "scriptPath"
<- "<-"
identifier "scriptSources"
) ")"
block
{ "{"
val_definition
val "val"
identifier "scriptFolderPath"
= "="
infix_expression
identifier "scriptPath"
operator_identifier "/"
field_expression
identifier "os"
. "."
identifier "up"
val_definition
val "val"
identifier "packageSegments"
= "="
call_expression
field_expression
identifier "FileImportGraph"
. "."
identifier "fileImportToSegments"
arguments
( "("
identifier "projectRoot"
, ","
identifier "scriptPath"
) ")"
val_definition
val "val"
identifier "wrappedDestFile"
= "="
infix_expression
identifier "wrappedDest"
operator_identifier "/"
identifier "packageSegments"
val_definition (+21 nodes collapsed)
function_definition (+53 nodes collapsed)
val_definition
val "val"
identifier "pkg"
= "="
call_expression
identifier "pkgSelector0"
arguments
( "("
call_expression
identifier "Some"
arguments
( "("
field_expression
identifier "CGConst"
. "."
identifier "globalPackagePrefix"
) ")"
, ","
identifier "None"
) ")"
val_definition
val "val"
identifier "segments"
= "="
call_expression
identifier "calcSegments"
arguments
( "("
identifier "scriptFolderPath"
, ","
identifier "projectRoot"
) ")"
val_definition
val "val"
identifier "supportDestDir"
= "="
infix_expression
infix_expression
identifier "supportDest"
operator_identifier "/"
identifier "packageSegments"
operator_identifier "/"
field_expression
identifier "os"
. "."
identifier "up"
val_definition (+73 nodes collapsed)
function_definition (+42 nodes collapsed)
val_definition (+76 nodes collapsed)
if_expression (+45 nodes collapsed)
val_definition (+33 nodes collapsed)
if_expression
if "if"
parenthesized_expression
( "("
call_expression
field_expression
field_expression
identifier "scriptPath"
. "."
identifier "last"
. "."
identifier "endsWith"
arguments
( "("
string "\".yaml\""
) ")"
) ")"
block
{ "{"
val_definition
val "val"
identifier "newParent"
= "="
indented_block
if_expression
if "if"
parenthesized_expression
( "("
field_expression
identifier "segments"
. "."
identifier "isEmpty"
) ")"
string "\"_root_.mill.util.MainRootModule\""
else "else"
string "\"_root_.mill.api.internal.SubfolderModule(build.millDiscover"...
val_definition (+22 nodes collapsed)
val_definition
val "val"
identifier "prelude"
= "="
indented_block
field_expression
interpolated_string_expression
identifier "s"
interpolated_string
""" "\"\"\""
. "."
identifier "stripMargin"
function_definition
def "def"
identifier "processDataRest"
type_parameters
[ "["
identifier "T"
] "]"
parameters
( "("
parameter
identifier "data"
: ":"
type_identifier "HeaderData"
) ")"
parameters
( "("
parameter
identifier "onProperty"
: ":"
function_type
parameter_types
( "("
type_identifier "String"
, ","
stable_type_identifier
identifier "ujson" any 1:2
. "." any 1:2
type_identifier "Value"
) ")"
=> "=>"
type_identifier "T"
, ","
parameter
identifier "onNestedObject"
: ":"
function_type
parameter_types
( "("
type_identifier "String"
, ","
type_identifier "HeaderData"
) ")"
=> "=>"
type_identifier "T"
) ")"
: ":"
generic_type
type_identifier "Seq"
type_arguments
[ "["
type_identifier "T"
] "]"
= "="
block
{ "{"
for_expression
for "for"
( "("
enumerators
enumerator
tuple_pattern
( "("
identifier "kString"
, ","
identifier "v"
) ")"
<- "<-"
field_expression
field_expression
identifier "data"
. "."
identifier "rest"
. "."
identifier "toSeq"
) ")"
yield "yield"
match_expression
call_expression
field_expression
identifier "kString"
. "."
identifier "split"
arguments
( "("
string "\" +\""
) ")"
match "match"
case_block
{ "{"
case_clause
case "case"
case_class_pattern
type_identifier "Array"
( "("
identifier "k"
) ")"
=> "=>"
call_expression
identifier "onProperty"
arguments
( "("
identifier "k"
, ","
identifier "v"
) ")"
case_clause
case "case"
case_class_pattern
type_identifier "Array"
( "("
string "\"object\""
, ","
identifier "k"
) ")"
=> "=>"
call_expression
identifier "onNestedObject"
arguments
( "("
identifier "k"
, ","
call_expression
generic_function
field_expression
identifier "upickle"
. "."
identifier "read"
type_arguments
[ "["
type_identifier "HeaderData"
] "]"
arguments
( "("
identifier "v"
) ")"
) ")"
case_clause
case "case"
wildcard
_ "_"
=> "=>"
call_expression
field_expression
identifier "sys"
. "."
identifier "error"
arguments
( "("
infix_expression
string "\"Invalid key: \""
operator_identifier "+"
identifier "kString"
) ")"
} "}"
} "}"
function_definition
def "def"
identifier "writeBuildOverrides"
parameters
( "("
parameter
identifier "data"
: ":"
type_identifier "HeaderData"
, ","
parameter
identifier "path"
: ":"
generic_type
type_identifier "Seq"
type_arguments
[ "["
type_identifier "String"
] "]"
) ")"
: ":"
type_identifier "Unit"
= "="
block
{ "{"
val_definition
val "val"
identifier "resourcePath"
= "="
infix_expression
infix_expression
identifier "resourceDest"
operator_identifier "/"
identifier "path"
operator_identifier "/"
string "\"build-overrides.json\""
val_definition
val "val"
identifier "out"
= "="
generic_function
field_expression
field_expression
field_expression
identifier "collection"
. "."
identifier "mutable"
. "."
identifier "Map"
. "."
identifier "empty"
type_arguments
[ "["
type_identifier "String"
, ","
stable_type_identifier
identifier "ujson"
. "."
type_identifier "Value"
] "]"
call_expression
call_expression
identifier "processDataRest"
arguments
( "("
identifier "data"
) ")"
arguments
( "("
assignment_expression
identifier "onProperty"
= "="
lambda_expression
bindings
( "("
binding
identifier "k"
, ","
binding
identifier "v"
) ")"
=> "=>"
assignment_expression
call_expression
identifier "out"
arguments
( "("
identifier "k"
) ")"
= "="
identifier "v"
, ","
assignment_expression
identifier "onNestedObject"
= "="
lambda_expression
bindings
( "("
binding
identifier "k"
, ","
binding
identifier "nestedData"
) ")"
=> "=>"
call_expression
identifier "writeBuildOverrides"
arguments
( "("
identifier "nestedData"
, ","
infix_expression
identifier "path"
operator_identifier ":+"
identifier "k"
) ")"
) ")"
call_expression
field_expression
field_expression
identifier "os"
. "."
identifier "write"
. "."
identifier "over"
arguments
( "("
identifier "resourcePath"
, ","
call_expression
field_expression
identifier "upickle"
. "."
identifier "write"
arguments
( "("
identifier "out"
) ")"
, ","
assignment_expression
identifier "createFolders"
= "="
boolean_literal
true "true"
) ")"
} "}"
call_expression
identifier "writeBuildOverrides"
arguments
( "("
identifier "parsedHeaderData"
, ","
identifier "segments"
) ")"
val_definition (+87 nodes collapsed)
call_expression (+23 nodes collapsed)
function_definition (+559 nodes collapsed)
call_expression (+99 nodes collapsed)
} "}"
else "else"
block (+465 nodes collapsed)
} "}"
} "}"
function_definition (+38 nodes collapsed)
function_definition (+128 nodes collapsed)
function_definition (+36 nodes collapsed)
function_definition (+740 nodes collapsed)
function_definition (+78 nodes collapsed)
function_definition (+39 nodes collapsed)
function_definition (+84 nodes collapsed)
} "}"

After

compilation_unit
package_clause
package "package"
package_identifier
identifier "mill"
. "."
identifier "meta"
import_declaration
import "import"
identifier "scala"
. "."
identifier "jdk"
. "."
identifier "CollectionConverters"
. "."
identifier "CollectionHasAsScala"
import_declaration
import "import"
identifier "mill"
. "."
identifier "constants"
. "."
as_renamed_identifier
identifier "CodeGenConstants"
as "as"
identifier "CGConst"
import_declaration
import "import"
identifier "mill"
. "."
identifier "api"
. "."
identifier "Result"
import_declaration
import "import"
identifier "mill"
. "."
identifier "internal"
. "."
identifier "Util"
. "."
identifier "backtickWrap"
import_declaration
import "import"
identifier "pprint"
. "."
identifier "Util"
. "."
identifier "literalize"
import_declaration
import "import"
identifier "mill"
. "."
identifier "api"
. "."
identifier "daemon"
. "."
identifier "internal"
. "."
identifier "MillScalaParser"
import_declaration
import "import"
identifier "mill"
. "."
identifier "api"
. "."
identifier "ModuleCtx"
. "."
identifier "HeaderData"
import_declaration
import "import"
identifier "mill"
. "."
identifier "api"
. "."
identifier "daemon"
. "."
identifier "Segment"
import_declaration
import "import"
identifier "scala"
. "."
identifier "util"
. "."
identifier "control"
. "."
identifier "Breaks"
. "."
namespace_wildcard
* "*"
object_definition
object "object"
identifier "CodeGen"
template_body
{ "{"
val_definition (+24 nodes collapsed)
function_definition
def "def"
identifier "generateWrappedAndSupportSources"
parameters (+70 nodes collapsed)
: ":"
type_identifier "Unit"
= "="
block
{ "{"
val_definition
val "val"
identifier "scriptSources"
= "="
field_expression
field_expression
field_expression
identifier "allScriptCode"
. "."
identifier "keys"
. "."
identifier "toSeq"
. "."
identifier "sorted"
comment
// "//"
comment
// "//"
comment
// "//"
val_definition
val "val"
identifier "aliasImports"
= "="
string "\"import build_.{package_ => build}\""
for_expression
for "for"
( "("
enumerators
enumerator
identifier "scriptPath"
<- "<-"
identifier "scriptSources"
) ")"
block
{ "{"
val_definition
val "val"
identifier "scriptFolderPath"
= "="
infix_expression
identifier "scriptPath"
operator_identifier "/"
field_expression
identifier "os"
. "."
identifier "up"
val_definition
val "val"
identifier "packageSegments"
= "="
call_expression
field_expression
identifier "FileImportGraph"
. "."
identifier "fileImportToSegments"
arguments
( "("
identifier "projectRoot"
, ","
identifier "scriptPath"
) ")"
val_definition
val "val"
identifier "wrappedDestFile"
= "="
infix_expression
identifier "wrappedDest"
operator_identifier "/"
identifier "packageSegments"
val_definition (+21 nodes collapsed)
function_definition (+53 nodes collapsed)
val_definition
val "val"
identifier "pkg"
= "="
call_expression
identifier "pkgSelector0"
arguments
( "("
call_expression
identifier "Some"
arguments
( "("
field_expression
identifier "CGConst"
. "."
identifier "globalPackagePrefix"
) ")"
, ","
identifier "None"
) ")"
val_definition
val "val"
identifier "segments"
= "="
call_expression
identifier "calcSegments"
arguments
( "("
identifier "scriptFolderPath"
, ","
identifier "projectRoot"
) ")"
val_definition
val "val"
identifier "supportDestDir"
= "="
infix_expression
infix_expression
identifier "supportDest"
operator_identifier "/"
identifier "packageSegments"
operator_identifier "/"
field_expression
identifier "os"
. "."
identifier "up"
val_definition (+73 nodes collapsed)
function_definition (+42 nodes collapsed)
val_definition (+76 nodes collapsed)
if_expression (+45 nodes collapsed)
val_definition (+33 nodes collapsed)
if_expression
if "if"
parenthesized_expression
( "("
call_expression
field_expression
field_expression
identifier "scriptPath"
. "."
identifier "last"
. "."
identifier "endsWith"
arguments
( "("
string "\".yaml\""
) ")"
) ")"
block
{ "{"
val_definition
val "val"
identifier "newParent"
= "="
indented_block
if_expression
if "if"
parenthesized_expression
( "("
field_expression
identifier "segments"
. "."
identifier "isEmpty"
) ")"
string "\"_root_.mill.util.MainRootModule\""
else "else"
string "\"_root_.mill.api.internal.SubfolderModule(build.millDiscover"...
val_definition (+22 nodes collapsed)
val_definition
val "val"
identifier "prelude"
= "="
indented_block
field_expression
interpolated_string_expression
identifier "s"
interpolated_string
""" "\"\"\""
. "."
identifier "stripMargin"
function_definition
def "def"
identifier "processDataRest"
type_parameters
[ "["
identifier "T"
] "]"
parameters
( "("
parameter
identifier "data"
: ":"
type_identifier "HeaderData"
) ")"
parameters
( "("
parameter
identifier "onProperty"
: ":"
function_type
parameter_types
( "("
type_identifier "String"
, ","
stable_type_identifier
stable_identifier
identifier "upickle" any 1:2
. "." any 1:2
identifier "core" any 1:2
. "." any 1:2
type_identifier "BufferedValue"
) ")"
=> "=>"
type_identifier "T"
, ","
parameter
identifier "onNestedObject"
: ":"
function_type
parameter_types
( "("
type_identifier "String"
, ","
type_identifier "HeaderData"
) ")"
=> "=>"
type_identifier "T"
) ")"
: ":"
generic_type
type_identifier "Seq"
type_arguments
[ "["
type_identifier "T"
] "]"
= "="
block
{ "{"
for_expression
for "for"
( "("
enumerators
enumerator
tuple_pattern
( "("
identifier "kString"
, ","
identifier "v"
) ")"
<- "<-"
field_expression
field_expression
identifier "data"
. "."
identifier "rest"
. "."
identifier "toSeq"
) ")"
yield "yield"
match_expression
call_expression
field_expression
identifier "kString"
. "."
identifier "split"
arguments
( "("
string "\" +\""
) ")"
match "match"
case_block
{ "{"
case_clause
case "case"
case_class_pattern
type_identifier "Array"
( "("
identifier "k"
) ")"
=> "=>"
call_expression
identifier "onProperty"
arguments
( "("
identifier "k"
, ","
identifier "v"
) ")"
case_clause
case "case"
case_class_pattern
type_identifier "Array"
( "("
string "\"object\""
, ","
identifier "k"
) ")"
=> "=>"
call_expression
identifier "onNestedObject"
arguments
( "("
identifier "k"
, ","
call_expression
field_expression
field_expression
field_expression
identifier "upickle"
. "."
identifier "core"
. "."
identifier "BufferedValue"
. "."
identifier "transform"
arguments
( "("
identifier "v"
, ","
generic_function
field_expression
identifier "upickle"
. "."
identifier "reader"
type_arguments
[ "["
type_identifier "HeaderData"
] "]"
) ")"
) ")"
case_clause
case "case"
wildcard
_ "_"
=> "=>"
call_expression
field_expression
identifier "sys"
. "."
identifier "error"
arguments
( "("
infix_expression
string "\"Invalid key: \""
operator_identifier "+"
identifier "kString"
) ")"
} "}"
} "}"
val_definition (+87 nodes collapsed)
call_expression (+23 nodes collapsed)
function_definition (+559 nodes collapsed)
call_expression (+99 nodes collapsed)
} "}"
else "else"
block (+465 nodes collapsed)
} "}"
} "}"
function_definition (+38 nodes collapsed)
function_definition (+128 nodes collapsed)
function_definition (+36 nodes collapsed)
function_definition (+740 nodes collapsed)
function_definition (+78 nodes collapsed)
function_definition (+39 nodes collapsed)
function_definition (+84 nodes collapsed)
} "}"