<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="Generator" content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:"Calibri Light";
panose-1:2 15 3 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
code
{mso-style-priority:99;
font-family:"Courier New";}
span.EmailStyle21
{mso-style-type:personal-reply;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style></head><body lang="EN-US" link="#0563C1" vlink="#954F72" style="word-wrap:break-word"><div class="WordSection1"><p class="MsoNormal">This approach looks interesting. Just want to make sure I understand the control flow. </p><p class="MsoNormal"> </p><p class="MsoNormal">The empty ‘accept’ is the first transform that does nothing.</p><p class="MsoNormal">‘atEnd’ is the second transform</p><p class="MsoNormal">‘andThen is the third transform which will see any changes made by the second transform</p><p class="MsoNormal"> </p><p class="MsoNormal">Correct?</p><p class="MsoNormal"> </p><p class="MsoNormal">Thank you,</p><p class="MsoNormal">Mark</p><p class="MsoNormal"> </p><div><div style="border:none;border-top:solid #e1e1e1 1.0pt;padding:3.0pt 0in 0in 0in"><p class="MsoNormal"><b>From:</b> Chen Liang <<a href="mailto:chen.l.liang@oracle.com">chen.l.liang@oracle.com</a>> <br><b>Sent:</b> Tuesday, April 15, 2025 10:33 AM<br><b>To:</b> Mark Roberts <<a href="mailto:markro@cs.washington.edu">markro@cs.washington.edu</a>>; <a href="mailto:classfile-api-dev@openjdk.org">classfile-api-dev@openjdk.org</a><br><b>Subject:</b> Re: modifying a newly added method</p></div></div><p class="MsoNormal"> </p><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black">Hi Mark,</span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black">Unfortunately there is no easy way to do this, but it is doable.</span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black"> </span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black">One way can be that you start with a class transform with a dummy class model, and move your original class builder code into the </span><code><span style="font-size:10.0pt;color:black">atEnd</span></code><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black"> of your first transform. Then, you can call </span><code><span style="font-size:10.0pt;color:black">andThen</span></code><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black"> with the 2nd transform, which can get MethodModel views of methods built by your first transform.</span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black"> </span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black">Pseudocode:</span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black"> </span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black">Original:</span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black">cf.build(name, clb -> /* oldLambdaCode */)</span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black"> </span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black">Updated:</span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black">cf.build(clb -> clb.transform(dummyClassModel, new ClassTransform() {</span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black"> @Override public void accept(ClassBuilder b, ClassEement e) {} // throw away</span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black"> @Override public void atEnd(ClassBuilder clb) { /* oldLambdaCode */ }</span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black">}.andThen(/* your actual transform that can see your old lambda's methods as MethodModel*/))</span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black"> </span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black">That said, I had previously proposed to introduce something like </span><code><span style="font-size:10.0pt;color:black">CodeBuilder::transforming</span></code><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black"> to other models, which could have probably covered your use case; however, other builders require extra arguments to be constructed (class name, field/method name and types) so we did not add these APIs back.</span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black">If you have an idea how such additions can be done, feel free to share your ideas.</span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black"> </span></p></div><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Calibri Light",sans-serif;color:black">Regards, Chen</span></p></div><div class="MsoNormal" align="center" style="text-align:center"><hr size="2" width="98%" align="center"></div><div id="divRplyFwdMsg"><p class="MsoNormal"><b><span style="color:black">From:</span></b><span style="color:black"> classfile-api-dev <<a href="mailto:classfile-api-dev-retn@openjdk.org">classfile-api-dev-retn@openjdk.org</a>> on behalf of Mark Roberts <<a href="mailto:markro@cs.washington.edu">markro@cs.washington.edu</a>><br><b>Sent:</b> Tuesday, April 15, 2025 12:15 PM<br><b>To:</b> <a href="mailto:classfile-api-dev@openjdk.org">classfile-api-dev@openjdk.org</a> <<a href="mailto:classfile-api-dev@openjdk.org">classfile-api-dev@openjdk.org</a>><br><b>Subject:</b> modifying a newly added method</span> </p><div><p class="MsoNormal"> </p></div></div><div><div><p class="MsoNormal">If I have added a new method to my classfile with<br>ClassBuilder.withMethod(...) I know it is not added to ClassModel.methods()<br>as that is an immutable list from the original, unmodified classfile. Is<br>there any way to get a MethodModel for this new method in order to modify it<br>further?<br><br>Thank you,<br>Mark</p></div></div></div></body></html>