<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <font size="4"><font face="monospace">This is a good first step.  In
        fact, I was just tinkering with a similar patch -- I'll send you
        what I've got.  More inline.  <br>
      </font></font><br>
    <div class="moz-cite-prefix">On 3/22/2023 2:55 PM, Adam Sotona
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:CY4PR1001MB21503CBC6EBBFFD40D4334D98C869@CY4PR1001MB2150.namprd10.prod.outlook.com">
      
      <meta name="Generator" content="Microsoft Word 15 (filtered
        medium)">
      <style>@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}@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:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:10.0pt;
        font-family:"Calibri",sans-serif;}p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        font-size:10.0pt;
        font-family:"Calibri",sans-serif;}.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}div.WordSection1
        {page:WordSection1;}ol
        {margin-bottom:0cm;}ul
        {margin-bottom:0cm;}</style>
      <div class="WordSection1">
        <p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">Based on the discussion in this thread I
            propose to make a first step and adjust ClassHierarchy
            factory methods following way:<o:p></o:p></span></p>
        <p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US"><o:p> </o:p></span></p>
        <ul style="margin-top:0cm" type="disc">
          <li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level1 lfo1"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">ofCached(ClassHierarchyResolver resolver)</span></li>
        </ul>
      </div>
    </blockquote>
    <br>
    Yes, caching should be something that is wrapped around a CHR, not
    complected with resource parsing.  The one thing we lose is the
    optimization where we opportunistically infer that a class is an
    interface if we discover it in the `implements` section of a
    classfile -- but I don't mind saying goodbye to that optimization. 
    <br>
    <br>
    <blockquote type="cite" cite="mid:CY4PR1001MB21503CBC6EBBFFD40D4334D98C869@CY4PR1001MB2150.namprd10.prod.outlook.com">
      <div class="WordSection1">
        <ul style="margin-top:0cm" type="disc">
          <li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level1 lfo1"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">ofClassLoading(ClassLoader loader)<o:p></o:p></span></li>
          <li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level1 lfo1"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">ofResourceParsing(ClassLoader loader)<o:p></o:p></span></li>
          <li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level1 lfo1"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">ofParsing(Function<ClassDesc,
              InputStream> classStreamResolver)</span></li>
        </ul>
      </div>
    </blockquote>
    <br>
    How do these last two differ?  <br>
    <br>
    <blockquote type="cite" cite="mid:CY4PR1001MB21503CBC6EBBFFD40D4334D98C869@CY4PR1001MB2150.namprd10.prod.outlook.com">
      <div class="WordSection1">
        <ul style="margin-top:0cm" type="disc">
          <li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level1 lfo1"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">of(MethodHandles.Lookup lookup)<o:p></o:p></span></li>
          <li class="MsoListParagraph" style="margin-left:0cm;mso-list:l0 level1 lfo1"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">of(Collection<ClassDesc> interfaces,
              Map<ClassDesc, ClassDesc> classToSuperClass)<o:p></o:p></span></li>
        </ul>
        <p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">So the default can be defined as:<o:p></o:p></span></p>
        <p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">DEFAULT_CLASS_HIERARCHY_RESOLVER =
ofCached(ofResourceParsing(ClassLoader.getSystemClassLoader()).orElse(ofClassLoading(ClassLoader.getSystemClassLoader())));</span></p>
      </div>
    </blockquote>
    <br>
    I recommend making one more step: turn the static default field into
    a factory:<br>
    <div style="background-color:#ffffff;color:#000000;font-family:'JetBrains
      Mono',monospace;font-size:11.3pt;">
      <pre><span style="color:#000080;font-weight:bold;">static </span>ClassHierarchyResolver standardResolver() {
    <span style="color:#000080;font-weight:bold;">return </span>ClassHierarchyResolver.<span style="font-style:italic;">ofCached</span>(ClassHierarchyResolver.<span style="font-style:italic;">ofResource</span>(
            <span style="color:#000080;font-weight:bold;">new </span>Function<ClassDesc, InputStream>() {
                <span style="color:#808000;">@Override
</span><span style="color:#808000;">                </span><span style="color:#000080;font-weight:bold;">public </span>InputStream apply(ClassDesc classDesc) {
                    <span style="color:#000080;font-weight:bold;">return </span>ClassLoader.<span style="font-style:italic;">getSystemResourceAsStream</span>(Util.<span style="font-style:italic;">toInternalName</span>(classDesc) + <span style="color:#008000;font-weight:bold;">".class"</span>);
                }
            }));
}

Also, I think ofCached() should optionally let you specify a Map factory; some users might prefer a bound LHM, or to forego
the synchronization if they know use will be single-threaded:

    CHR ofCached(CHR)
    CHR ofCached(CHR, Supplier<Map<ClassDesc, ClassHiearchyInfo>>)
</pre>
    </div>
    <br>
    <br>
    <blockquote type="cite" cite="mid:CY4PR1001MB21503CBC6EBBFFD40D4334D98C869@CY4PR1001MB2150.namprd10.prod.outlook.com">
      <div class="WordSection1">
        <p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US"><o:p></o:p></span></p>
        <p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">Please help me to polish exact methods naming.<o:p></o:p></span></p>
        <p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US"><o:p> </o:p></span></p>
        <p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">Thank you,<o:p></o:p></span></p>
        <p class="MsoNormal"><span style="font-size:11.0pt;mso-fareast-language:EN-US" lang="EN-US">Adam<o:p></o:p></span></p>
        <p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
      </div>
    </blockquote>
    <br>
  </body>
</html>