<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <font size="4" face="monospace">In addition, we should look into
      making the error mode more obvious; an IAE like this one looks
      very much like an internal bug.  It would be good if the exception
      was (a) a more specific type of exception, and (b) had more detail
      of the sort "I needed class hierarchy information for X but it
      wasn't provided."</font><br>
    <br>
    <div class="moz-cite-prefix">On 4/29/2024 3:54 AM, Adam Sotona
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:DS0PR10MB6847ACBEEC8652CF7B897DDD8C1B2@DS0PR10MB6847.namprd10.prod.outlook.com">
      
      <meta name="Generator" content="Microsoft Word 15 (filtered medium)">
      <style>@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;}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;}div.WordSection1
        {page:WordSection1;}</style>
      <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" moz-do-not-send="true">
              ClassHierarchyInfo</a> using functional interface <a href="https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/lang/classfile/ClassHierarchyResolver.html" moz-do-not-send="true">
              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()" moz-do-not-send="true">
              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" moz-do-not-send="true">
              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
                  <a class="moz-txt-link-rfc2396E" href="mailto:classfile-api-dev-retn@openjdk.org"><classfile-api-dev-retn@openjdk.org></a> on behalf
                  of Øystein Myhre Andersen <a class="moz-txt-link-rfc2396E" href="mailto:o.myhre@gmail.com"><o.myhre@gmail.com></a><br>
                  <b>Date: </b>Sunday, 28 April 2024 at 12:53<br>
                  <b>To: </b><a class="moz-txt-link-abbreviated" href="mailto:classfile-api-dev@openjdk.org">classfile-api-dev@openjdk.org</a>
                  <a class="moz-txt-link-rfc2396E" href="mailto:classfile-api-dev@openjdk.org"><classfile-api-dev@openjdk.org></a><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>
    </blockquote>
    <br>
  </body>
</html>