<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
To be more explicit: all the format strings go away, replaced by some mechanical logic about “lists are rendered in [ … ], maps are rendered in { … }”.
<div class=""><br class="">
</div>
<div class="">And the code like:</div>
<div class=""><br class="">
</div>
<div class=""><br class="">
<div>
<blockquote type="cite" class="">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
<div class="">
<blockquote type="cite" class="">
<div class="">
<div class="WordSection1" style="page: WordSection1; caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">
<div class="">
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;" class="">
<span class="" style="font-family: "Courier New"; font-size: 10pt; background-color: white;"> </span><span class="literal" style="font-family: "Courier New"; font-size: 10pt; background-color: white;"><span style="color: rgb(51, 107, 221);" class="">case</span></span><span class="" style="font-family: "Courier New"; font-size: 10pt; background-color: white;">
ModuleAttribute ma -> {</span></div>
<pre style="margin: 0cm 0cm 0.0001pt; font-size: 10pt; font-family: "Courier New"; background-color: white;" class=""><span style="" class=""> </span><span class="st0"><span style="color: rgb(206, 84, 184);" class="">out</span></span><span style="" class="">.accept(</span><span class="st0"><span style="color: rgb(206, 84, 184);" class="">template</span></span><span style="" class="">.</span><span class="st0"><span style="color: rgb(206, 84, 184);" class="">module</span></span><span style="" class="">.</span><span class="st0"><span style="color: rgb(206, 84, 184);" class="">header</span></span><span style="" class="">.formatted(ma.moduleName().name().stringValue(), quoteFlags(ma.moduleFlags()), ma.moduleVersion().map(Utf8Entry::stringValue).orElse(</span><span class="string"><span style="color: rgb(30, 147, 71);" class="">""</span></span><span style="" class="">), typesToString(ma.uses().stream().map(ce -> ce.asInternalName()))));<o:p class=""></o:p></span></pre>
<pre style="margin: 0cm 0cm 0.0001pt; font-size: 10pt; font-family: "Courier New"; background-color: white;" class=""><span style="" class=""> printTable(</span><span class="st0"><span style="color: rgb(206, 84, 184);" class="">template</span></span><span style="" class="">.</span><span class="st0"><span style="color: rgb(206, 84, 184);" class="">requires</span></span><span style="" class="">, ma.requires(), req -> </span><span class="literal"><span style="color: rgb(51, 107, 221);" class="">new</span></span><span style="" class=""> Object[] {req.requires().name().stringValue(), quoteFlags(req.requiresFlags()), req.requiresVersion().map(Utf8Entry::stringValue).orElse(</span><span class="literal"><span style="color: rgb(51, 107, 221);" class="">null</span></span><span style="" class="">)});<o:p class=""></o:p></span></pre>
<pre style="margin: 0cm 0cm 0.0001pt; font-size: 10pt; font-family: "Courier New"; background-color: white;" class=""><span style="" class=""> printTable(</span><span class="st0"><span style="color: rgb(206, 84, 184);" class="">template</span></span><span style="" class="">.</span><span class="st0"><span style="color: rgb(206, 84, 184);" class="">exports</span></span><span style="" class="">, ma.exports(), exp -> </span><span class="literal"><span style="color: rgb(51, 107, 221);" class="">new</span></span><span style="" class=""> Object[] {exp.exportedPackage().name().stringValue(), quoteFlags(exp.exportsFlags()), typesToString(exp.exportsTo().stream().map(me -> me.name().stringValue()))});<o:p class=""></o:p></span></pre>
<pre style="margin: 0cm 0cm 0.0001pt; font-size: 10pt; font-family: "Courier New"; background-color: white;" class=""><span style="" class=""> printTable(</span><span class="st0"><span style="color: rgb(206, 84, 184);" class="">template</span></span><span style="" class="">.</span><span class="st0"><span style="color: rgb(206, 84, 184);" class="">opens</span></span><span style="" class="">, ma.opens(), open -> </span><span class="literal"><span style="color: rgb(51, 107, 221);" class="">new</span></span><span style="" class=""> Object[] {open.openedPackage().name().stringValue(), quoteFlags(open.opensFlags()), typesToString(open.opensTo().stream().map(me -> me.name().stringValue()))});<o:p class=""></o:p></span></pre>
<pre style="margin: 0cm 0cm 0.0001pt; font-size: 10pt; font-family: "Courier New"; background-color: white;" class=""><span style="" class=""> printTable(</span><span class="st0"><span style="color: rgb(206, 84, 184);" class="">template</span></span><span style="" class="">.</span><span class="st0"><span style="color: rgb(206, 84, 184);" class="">provides</span></span><span style="" class="">, ma.provides(), provide -> </span><span class="literal"><span style="color: rgb(51, 107, 221);" class="">new</span></span><span style="" class=""> Object[] {provide.provides().asInternalName(), typesToString(provide.providesWith().stream().map(me -> me.asInternalName()))});<o:p class=""></o:p></span></pre>
<pre style="margin: 0cm 0cm 0.0001pt; font-size: 10pt; font-family: "Courier New"; background-color: white;" class=""><span style="" class=""> </span><span class="st0"><span style="color: rgb(206, 84, 184);" class="">out</span></span><span style="" class="">.accept(</span><span class="st0"><span style="color: rgb(206, 84, 184);" class="">template</span></span><span style="" class="">.</span><span class="st0"><span style="color: rgb(206, 84, 184);" class="">module</span></span><span style="" class="">.</span><span class="st0"><span style="color: rgb(206, 84, 184);" class="">footer</span></span><span style="" class="">.formatted());<o:p class=""></o:p></span></pre>
<pre style="margin: 0cm 0cm 0.0001pt; font-size: 10pt; font-family: "Courier New"; background-color: white;" class=""><span style="" class=""> }</span></pre>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</blockquote>
<div><br class="">
</div>
Becomes adding the following to the map:</div>
<div><br class="">
</div>
<div> { moduleName -> ma.moduleName().name().stringValue(), …, requires -> ma.requires().stream().map(…).toList(), … }</div>
<div><br class="">
</div>
<div><br class="">
</div>
</div>
</body>
</html>