Maybe I am missing some updated SIP document? In it’s current state, a lot of the proposal seems quite confusing to me.
The rest is a bit of a “documenting confusions as I go through the SIP”, with my conclusions at the end. Feel free to take this or leave it as you may, I bring no leverage beyond these words 
Note that this is specifically an answer to @bjornregnell’s conclusion – I skimmed parts of the thread, and seem to echo some concerns that have been raised aplenty, but I feel are ignored in the summary. I may be missing some other issues raised in the thread, as I have not read everything.
Confusions about abstract directive syntax in the SIP
Promote SIP-46 from experimental to stable, with the addition that using
is changed to use
The linked sip 46 does contain (unspecified) examples of multiline syntax, I assume from context that you support dropping those?
I don’t think arguments for changing to YAML or X or Y or Z are really that strong, as there are so many different configuration languages out there and on-boarding will only be easier for the ones that happen to know the particular language chosen.
I somewhat agree that compatibility with existing formats is not that strong.
However, I do agree that the current syntax is both ad-hoc and not well specified.
Examples from the SIP:
//> using "com.lihaoyi::os-lib:0.7.8"
No key? Is this a typo? A shorthand for libraries?
//> using scala 2.13.8
What is a bare 2.13.8
? Should that be a string?
It would be nice to not have it be a string, but the pseudo grammar does not include such.
//> using java-options "..."
/*> using
Scala 3
option "-Xfatal-warning"
*/
Multiline syntax that is likely dropped? Is it?
//> using someSettings { setting1 value 1; setting2; }
Example for multiple settings, would that also work without someSettings
i.e., can I rewrite the multiline example from above to: //> using { Scala 3; option "-Xfatal-warning" }
?
Proposed directives seem to not make use of the syntax
Most of the syntax seems to be due to “some experiment in scala-cli“. If I look at the “MUST have directives” I see the following points:
• ident.subident
is never used
• if anything could be considered a hierarchical key at all it would be java-options
and java-home
(latter is a should have). The “should have section” also includes many native-*
keys.
• The above all have to be quoted using `
.
• all directives use string arguments.
It seems that the directives just need
//> using some-key "value"
As the only supported format.
(Where some-key is an unquoted (Scala) string without whitespace, “value” is a quoted (Scala) string)
Scrolling through a search for //> using
on github the only exception I have seen are one target.platform "..."
and one publish.XXX "..."
None of which are supported by the SIP.
List of must/should have directives seems ad-hoc
• Directives do not always mirror the CLI use. There was some change from lib to dep to be more consistent. In general, I think it would be extremely valuable to have all directives mirror a CLI argument (so users don’t have to learn two new syntaxes).
• Directives seem to have tons of aliases, for example “javaOpt, javaOptions, java-opt, java-options”.
• Naming seems inconsistent, there is “native-mode”, and “jsMode”.
Concluding musings
The CLI part of the proposal (make scala-cli the default tool) seems fine to me. I think scala-cli has a lot of idiosyncrasies. But I don’t see how that would be a problem, as it is a tool not really a standard.
The using directives however introduce a standard Scala build file format. I think it is dangerous that people try to pretend that it does not. Are Metals, IntelliJ, sbt, mill, scastie, etc. recommended implementing this standard, or be recommended to not implement this standard? What is the intention here? What will be supported in the future?
Note, I think that scala-cli itself is well-scoped in this regard, but the impact of transitioning ad-hoc definitions needed by scala-cli the tool is not explored/discussed by this SIP.
If I could veto the proposal I would do so with the following conditions for acceptance:
• It should be made explicit if defining a standard Scala build definition format is the goal.
• The directive syntax should be well-defined (such that two independently written parsers are extremely likely to interpret it the same).
• The directive syntax should be scoped to address the concrete proposed use case.
• The naming of directives should be systematic, and there should be only one directive.