<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<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:Aptos;
panose-1:2 11 0 4 2 2 2 2 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:12.0pt;
font-family:"Aptos",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#467886;
text-decoration:underline;}
span.EmailStyle18
{mso-style-type:personal-reply;
font-family:"Aptos",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
mso-ligatures:none;}
@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="#467886" vlink="#96607D" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt">Your compiler reached the complexity where you reference generated classes from other generated classes.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Class-File API in certain circumstances needs to know some information about the classes referenced from the generated bytecode.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Such information is provided in
<a href="https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/lang/classfile/ClassHierarchyResolver.ClassHierarchyInfo.html">
ClassHierarchyInfo</a> using functional interface <a href="https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/lang/classfile/ClassHierarchyResolver.html">
ClassHierarchyResolver</a>.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">By <a href="https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/lang/classfile/ClassHierarchyResolver.html#defaultResolver()">
default</a> is the information obtained from system class loader. However, the classes you generate are probably not yet known to the system class loader.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">You should specify a custom <a href="https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/lang/classfile/ClassHierarchyResolver.html">
ClassHierarchyResolver</a> for your compiler as a Class-File API option `ClassFile.of(ClassFile.ClassHierarchyResolverOption.of(...))`.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Here you have multiple options how to provide the missing information using combinations of ClassHierarchyResolver factory methods and custom code:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">For example, if the required classes have been already generated and you can provide a physical access to them, you can compose the ClassHierarchyResolver this way:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">`ClassHierarchyResolver.defaultResolver().orElse(ClassHierarchyResolver.</span>
<span style="font-size:11.0pt">ofResourceParsing(Function<ClassDesc, InputStream>).cached())`<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Or if you know all the generated classes in advance, you can provide the missing info about the generated classes in a set and map form:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">`ClassHierarchyResolver.defaultResolver().orElse(ClassHierarchyResolver.</span>
<span style="font-size:11.0pt">of(Collection<ClassDesc> interfaces, Map<ClassDesc, ClassDesc> classToSuperClass))`
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Or in a form of dynamic direct implementation of the ClassHierarchyResolver:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">`ClassHierarchyResolver.defaultResolver().orElse(classDesc -> isInterface ? : ClassHierarchyInfo.ofInterface() : ClassHierarchyInfo.ofClass(ClassDesc superClass))`<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<div id="mail-editor-reference-message-container">
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span style="color:black">From:
</span></b><span style="color:black">classfile-api-dev <classfile-api-dev-retn@openjdk.org> on behalf of Øystein Myhre Andersen <o.myhre@gmail.com><br>
<b>Date: </b>Sunday, 28 April 2024 at 12:53<br>
<b>To: </b>classfile-api-dev@openjdk.org <classfile-api-dev@openjdk.org><br>
<b>Subject: </b>Got: IllegalArgumentException: Could not resolve class<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal">I'm writing a compiler for Simula (the very first oo language).<br>
Simula is block-oriented with nested blocks and each block is compiled into a classFile.<br>
At a certain level in the hierarchy I get an exception at the end of the classfile building.<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Exception in thread "main" java.lang.IllegalArgumentException:<br>
Could not resolve class adHoc000_adHoc000_PBLK39_Floor_activateIdleLift<br>
<br>
at java.base/jdk.internal.classfile.impl.ClassHierarchyImpl.resolve(ClassHierarchyImpl.java:75)<br>
at java.base/jdk.internal.classfile.impl.ClassHierarchyImpl.isInterface(ClassHierarchyImpl.java:85)<br>
at java.base/jdk.internal.classfile.impl.StackMapGenerator$Type.mergeReferenceFrom(StackMapGenerator.java:1363)<br>
at java.base/jdk.internal.classfile.impl.StackMapGenerator$Type.mergeFrom(StackMapGenerator.java:1331)<br>
at java.base/jdk.internal.classfile.impl.StackMapGenerator$Frame.merge(StackMapGenerator.java:1193)<br>
at java.base/jdk.internal.classfile.impl.StackMapGenerator$Frame.checkAssignableTo(StackMapGenerator.java:1135)<br>
at java.base/jdk.internal.classfile.impl.StackMapGenerator.checkJumpTarget(StackMapGenerator.java:280)<br>
at java.base/jdk.internal.classfile.impl.StackMapGenerator.processExceptionHandlerTargets(StackMapGenerator.java:678)<br>
at java.base/jdk.internal.classfile.impl.StackMapGenerator.processBlock(StackMapGenerator.java:667)<br>
at java.base/jdk.internal.classfile.impl.StackMapGenerator.processMethod(StackMapGenerator.java:440)<br>
at java.base/jdk.internal.classfile.impl.StackMapGenerator.generate(StackMapGenerator.java:317)<br>
at java.base/jdk.internal.classfile.impl.StackMapGenerator.<init>(StackMapGenerator.java:243)<br>
at java.base/jdk.internal.classfile.impl.StackMapGenerator.of(StackMapGenerator.java:156)<br>
at java.base/jdk.internal.classfile.impl.DirectCodeBuilder$4.generateStackMaps(DirectCodeBuilder.java:331)<br>
at java.base/jdk.internal.classfile.impl.DirectCodeBuilder$4.tryGenerateStackMaps(DirectCodeBuilder.java:340)<br>
at java.base/jdk.internal.classfile.impl.DirectCodeBuilder$4.writeBody(DirectCodeBuilder.java:382)<br>
at java.base/jdk.internal.classfile.impl.UnboundAttribute$AdHocAttribute.writeTo(UnboundAttribute.java:914)<br>
at java.base/jdk.internal.classfile.impl.AttributeHolder.writeTo(AttributeHolder.java:56)<br>
at java.base/jdk.internal.classfile.impl.DirectMethodBuilder.writeTo(DirectMethodBuilder.java:156)<br>
at java.base/jdk.internal.classfile.impl.BufWriterImpl.writeList(BufWriterImpl.java:207)<br>
at java.base/jdk.internal.classfile.impl.DirectClassBuilder.build(DirectClassBuilder.java:181)<br>
at java.base/jdk.internal.classfile.impl.ClassFileImpl.build(ClassFileImpl.java:114)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">... ...<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><br>
Is this a known problem?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">What am I doing wrong?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I am attaching a file with an edited trace leading up to the exception.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">- Øystein Myhre Andersen<o:p></o:p></p>
</div>
</div>
</div>
</div>
</div>
</body>
</html>