<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <p>Thanks for all the extra info.</p>
    <p>Yes, the desire for JLS references was primarily for some of the
      more obscure messages about generic types, and bounds checking,
      etc.</p>
    <p>Giving advice about how to fix code is definitely a challenge. 
      Bad or incorrect advice is arguably worse than no advice at all.  
      Generally, the policy for javac over the past few years has been
      to provide more specific details about what is wrong, and the
      general context of the error, but stopping short of suggesting
      changes.  IDEs have arguably more context to do it better,
      providing GUI support for "suggestions" on how to change the code.<br>
    </p>
    <p>-- Jon<br>
    </p>
    <div class="moz-cite-prefix">On 11/10/22 2:21 PM, Ethan McCue wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:CA+NR86huXFfVZiPQM-6Q=44ezDQxPQqyq8cetGDV+ddSKhKpsw@mail.gmail.com">
      
      <div dir="ltr">
        <div>I think for the JLS justification in particular - that is
          something which fits within the "info" part of our model but
          also isn't particularly interesting for the target audience of
          "people who trigger compiler errors."<br>
          <br>
           A motivating example I sent to Vicente (almost 9 months ago!
          God I'm unproductive) was the contrast between the information
          conveyed in this message<br>
          <br>
          <span style="font-family:monospace">    import java.util.List;</span><br style="font-family:monospace">
          <br style="font-family:monospace">
          <span style="font-family:monospace">    enum Ex {</span><br style="font-family:monospace">
          <span style="font-family:monospace">        A,</span><br style="font-family:monospace">
          <span style="font-family:monospace">        B</span><br style="font-family:monospace">
          <span style="font-family:monospace">    }</span><br style="font-family:monospace">
          <br style="font-family:monospace">
          <span style="font-family:monospace">    public class MyClass {</span><br style="font-family:monospace">
          <span style="font-family:monospace">        public static void
            main(String args[]) {</span><br style="font-family:monospace">
          <span style="font-family:monospace">            var ex = B;</span><br style="font-family:monospace">
          <span style="font-family:monospace">        }</span><br style="font-family:monospace">
          <span style="font-family:monospace">    }</span></div>
        <div><font face="monospace"><br>
          </font></div>
        <div><font face="monospace"><br>
          </font><br>
          <span style="font-family:monospace">    /MyClass.java:10:
            error: cannot find symbol</span><br style="font-family:monospace">
          <span style="font-family:monospace">            var ex = B;</span><br style="font-family:monospace">
          <span style="font-family:monospace">                     ^</span><br style="font-family:monospace">
          <span style="font-family:monospace">      symbol:   variable B</span><br style="font-family:monospace">
          <span style="font-family:monospace">      location: class
            MyClass<br>
          </span><br>
          As compared to that emitted by rustc<br>
          <br>
          <span style="font-family:monospace">    enum Ex {</span><br style="font-family:monospace">
          <span style="font-family:monospace">        A,</span><br style="font-family:monospace">
          <span style="font-family:monospace">        B</span><br style="font-family:monospace">
          <span style="font-family:monospace">    }</span><br style="font-family:monospace">
          <br style="font-family:monospace">
          <span style="font-family:monospace">    pub fn main() {</span><br style="font-family:monospace">
          <span style="font-family:monospace">        let ex = A;</span><br style="font-family:monospace">
          <span style="font-family:monospace">    }<br>
          </span><br>
          <font face="monospace">    error[E0425]: cannot find value `A`
            in this scope</font><br>
          <font face="monospace">     --> src/main.rs:7:14</font><br>
          <font face="monospace">      |</font><br>
          <font face="monospace">    7 |     let ex = A;</font><br>
          <font face="monospace">      |              ^ not found in
            this scope</font><br>
          <font face="monospace">      |</font><br>
          <font face="monospace">    help: consider importing this unit
            variant</font><br>
          <font face="monospace">      |</font><br>
          <font face="monospace">    1 | use crate::Ex::A;</font><br>
          <font face="monospace">      |</font><br>
          <br>
          <font face="monospace">    For more information about this
            error, try `rustc --explain E0425`.</font><br>
          <br>
          Which could look like (ignoring the finer details of the ascii
          art)<br>
          <br>
          <span style="font-family:monospace">    error[E0123]: cannot
            find symbol `A` in this scope</span><br style="font-family:monospace">
          <span style="font-family:monospace">     -->
            src/Main.java:9:18</span><br style="font-family:monospace">
          <span style="font-family:monospace">      |</span><br style="font-family:monospace">
          <span style="font-family:monospace">    9 |     var ex = B;</span><br style="font-family:monospace">
          <span style="font-family:monospace">      |              ^ not
            found in this scope</span><br style="font-family:monospace">
          <span style="font-family:monospace">      |</span><br style="font-family:monospace">
          <span style="font-family:monospace">    help: consider
            importing this enum variant</span><br style="font-family:monospace">
          <span style="font-family:monospace">      |</span><br style="font-family:monospace">
          <span style="font-family:monospace">    1 | import static
            Ex.B;</span><br style="font-family:monospace">
          <span style="font-family:monospace">      |</span><br style="font-family:monospace">
          <br style="font-family:monospace">
          <span style="font-family:monospace">    For more information
            about this error, try `javac --explain E0123`.<br>
          </span><br>
          Where it is not enough to just "make a better message." There
          are structural deficiencies which preclude giving this sort of
          feedback.<br>
          <br>
          The *desire* to give a hint on how to fix something or extra
          context on why something is an error is what I think the true
          monster hiding under the bed of JDK-6397027 was. Language
          kinda has to be irregular in order to contain multiple of
          these semantic elements - y'know?<br>
          <br>
          (sorry if this isn't the most complete justification)<br>
          <br>
          ---</div>
        <div><br>
          My strategy for making progress has been to recruit the help
          of some students for whom working out a prototype is their
          senior design project. It's slow going, but we're all
          learning.</div>
      </div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr" class="gmail_attr">On Thu, Nov 10, 2022, 4:40 PM
          Ethan McCue <<a href="mailto:ethan@mccue.dev" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">ethan@mccue.dev</a>> wrote:<br>
        </div>
        <blockquote class="gmail_quote" style="margin:0px 0px 0px
          0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
          <div dir="auto">Pithy instant response: it's not too big for
            mainstream rustc 
            <div dir="auto"><br>
            </div>
            <div dir="auto"><br>
              <div dir="auto">
                <div class="gmail_quote" dir="auto">
                  <div dir="ltr" class="gmail_attr">On Thu, Nov 10,
                    2022, 4:31 PM Jonathan Gibbons <<a href="mailto:jonathan.gibbons@oracle.com" rel="noreferrer noreferrer" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">jonathan.gibbons@oracle.com</a>>
                    wrote:<br>
                  </div>
                  <blockquote class="gmail_quote" style="margin:0px 0px
                    0px 0.8ex;border-left:1px solid
                    rgb(204,204,204);padding-left:1ex">
                    <div>
                      <p> </p>
                      <blockquote type="cite">
                        <div dir="auto"><br>
                        </div>
                        <div dir="auto">Our current brain scratcher is
                          how to represent suggestions on how to fix
                          code that actually "makes the correction for
                          them" </div>
                        <div dir="auto"><br>
                        </div>
                        <div dir="auto">So like</div>
                        <div dir="auto"><br>
                        </div>
                        <div dir="auto">    int assert;</div>
                        <div dir="auto"><br>
                        </div>
                        <div dir="auto">How to model some code that can
                          be later formatted as a suggestion to rename
                          the "assert" variable to "assert_"</div>
                        <div dir="auto"><br>
                        </div>
                        <div dir="auto"><br>
                        </div>
                        <div dir="auto"><br>
                        </div>
                      </blockquote>
                      <p>While it sounds fun, it also sounds "too big"
                        for mainstream javac.   That suggests there
                        could be a plugin mechanism to add more info to
                        diagnostics.  Maybe.</p>
                      <p>-- Jon</p>
                      <p><br>
                      </p>
                      <p><br>
                      </p>
                      <div>On 11/10/22 11:42 AM, Ethan McCue wrote:<br>
                      </div>
                      <blockquote type="cite">
                        <div dir="auto">Thanks - we have been tracking
                          the PR. It will be helpful for us to track our
                          progress.
                          <div dir="auto"><br>
                          </div>
                          <div dir="auto">---</div>
                          <div dir="auto"><br>
                          </div>
                          <div dir="auto">To springboard into something
                            different but related:</div>
                          <div dir="auto"><br>
                          </div>
                          <div dir="auto">We have been working on
                            modeling how to add kinds of information to
                            JCDiagnostics that are semantically
                            different from a message as produced by
                            DiagnosticInfo.</div>
                          <div dir="auto"><br>
                          </div>
                          <div dir="auto">In the current hypothesis
                            there are two new categories of information
                            we are calling "help" and "info".</div>
                          <div dir="auto"><br>
                          </div>
                          <div dir="auto">"help" contains some
                            suggestions on how to rectify a given sort
                            of error. In the simplest form this is a
                            codification of the "try using
                            --enable-preview" type messages which exist
                            somewhat ad-hoc throughout the codebase. </div>
                          <div dir="auto"><br>
                          </div>
                          <div dir="auto">Our current brain scratcher is
                            how to represent suggestions on how to fix
                            code that actually "makes the correction for
                            them" </div>
                          <div dir="auto"><br>
                          </div>
                          <div dir="auto">So like</div>
                          <div dir="auto"><br>
                          </div>
                          <div dir="auto">    int assert;</div>
                          <div dir="auto"><br>
                          </div>
                          <div dir="auto">How to model some code that
                            can be later formatted as a suggestion to
                            rename the "assert" variable to "assert_"</div>
                          <div dir="auto"><br>
                          </div>
                          <div dir="auto"><br>
                          </div>
                          <div dir="auto"><br>
                          </div>
                          <div dir="auto"><br>
                          </div>
                        </div>
                        <br>
                        <div class="gmail_quote">
                          <div dir="ltr" class="gmail_attr">On Thu, Nov
                            10, 2022, 2:25 PM Jonathan Gibbons <<a href="mailto:jonathan.gibbons@oracle.com" rel="noreferrer noreferrer noreferrer" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">jonathan.gibbons@oracle.com</a>>
                            wrote:<br>
                          </div>
                          <blockquote class="gmail_quote" style="margin:0px 0px 0px
                            0.8ex;border-left:1px solid
                            rgb(204,204,204);padding-left:1ex">
                            <div>
                              <p>As a followup, the code to generate
                                diags-examples.html needed some TLC, and
                                was fixed in <a href="https://bugs.openjdk.org/browse/JDK-8296137" style="color:rgb(59,115,175);text-decoration:none" rel="noreferrer
                                  noreferrer noreferrer noreferrer" target="_blank" moz-do-not-send="true">JDK-8296137</a>.</p>
                              <p>The command to generate the report is
                                effectively this:</p>
                              <p>JAVA_HOME=$JDK $ANT \<br>
                                    -Dlangtools.jdk.home=$JDK \<br>
                                    -f make/langtools/diags-examples.xml<br>
                              </p>
                              <p>where: </p>
                              <ul>
                                <li>the current directory is the root of
                                  the OpenJDK repo</li>
                                <li>ANT refers to a recent executable
                                  for Ant,<br>
                                </li>
                                <li>JDK refers to a build of JDK in the
                                  same repo containing the examples
                                  directory</li>
                              </ul>
                              <p>The report will be written to <font face="monospace">build/langtools/diags-examples/</font><br>
                              </p>
                              <div>-- Jon<br>
                              </div>
                              <div><br>
                              </div>
                              <div>On 10/3/22 1:22 PM, Jonathan Gibbons
                                wrote:<br>
                              </div>
                              <blockquote type="cite">
                                <p>It's generated by the code in
                                  open/test/langtools/tools/javac/diags/.</p>
                                <p>There are various classes there, like
                                  RunExamples.java, CheckExamples.java
                                  etc. You are probably looking for
                                  RunExamples.java; there are comments
                                  in the code on how to use it.<br>
                                </p>
                                <p>-- Jon<br>
                                </p>
                                <div>On 10/3/22 7:31 AM, Ethan McCue
                                  wrote:<br>
                                </div>
                                <blockquote type="cite">
                                  <div dir="ltr">Hey all,<br>
                                    <br>
                                    My group stumbled upon this page
                                    with a bunch of error examples in a
                                    nice presentable format.<br>
                                    <br>
                                    <a title="https://cr.openjdk.java.net/~jjg/diags-examples.html" href="https://cr.openjdk.java.net/~jjg/diags-examples.html" rel="noreferrer noopener noreferrer noreferrer noreferrer noreferrer" role="button" style="margin:0px;padding:0px;border:0px;font-family:Whitney,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:16px;vertical-align:baseline;outline:0px;word-break:break-word;white-space:break-spaces;background-color:rgba(4,4,5,0.07)" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">https://cr.openjdk.java.net/~jjg/diags-examples.html</a><br>
                                    <br>
                                    My suspicion is that this was
                                    generated by something in the
                                    codebase - if so does anyone know
                                    the command of the top of their
                                    head?</div>
                                </blockquote>
                              </blockquote>
                            </div>
                          </blockquote>
                        </div>
                      </blockquote>
                    </div>
                  </blockquote>
                </div>
              </div>
            </div>
          </div>
        </blockquote>
      </div>
    </blockquote>
  </body>
</html>