<div dir="ltr">> IDEs have arguably more context to do it better, providing GUI support for "suggestions" on how to change the code.<br><br>I've been thinking about this for a while and trying to zero in on why the idea of leaving it to the IDE doesn't satisfy me.<br><br>I still struggle to put it into words, but I wanted to share (with participants permission) an interaction I witnessed online that I think is somewhat relevant.<br><br>-----<br><br><br>Student: Hello, I'm 16, and in AP computer science  in highschool. Currently I have a <a href="http://repl.it">repl.it</a> project and have errors which I would appreciate could be explained to me and help clarify the concepts if possible. Thank you!<br>Student: I'm sry i am not very verse with code and am still trying to learn and understand the error messages<br><br><font face="monospace">./bank.java:101: error: class, interface, enum, or record expected<br>  double withdraw(){<br>  ^<br>./bank.java:103: error: class, interface, enum, or record expected<br>    double withdraw = 0;<br>    ^<br>./bank.java:104: error: class, interface, enum, or record expected<br>     double withdraw = scan.nextDouble();<br>     ^<br>./bank.java:105: error: class, interface, enum, or record expected<br>    while(withdraw >= 0){<br>    ^<br>./bank.java:108: error: class, interface, enum, or record expected<br>        withdraw = 0;<br>        ^<br>./bank.java:109: error: class, interface, enum, or record expected<br>      }<br>      ^<br>./bank.java:112: error: class, interface, enum, or record expected<br>          break;<br>          ^<br>./bank.java:113: error: class, interface, enum, or record expected<br>      }<br>      ^<br>./bank.java:116: error: class, interface, enum, or record expected<br>  }<br>  ^</font><br><br>Student: may i send you the assignment doc so you know what im trying to do?<br><br>Helper: would be helpful<br>Helper: also why not using an IDE for programming?<br><br>Student: im not sure what that is<br><br>Helper: Intellij or Eclipse etc?<br><br>Student: never heard of it. I use replit because its what my teacher tells me to use<br><br>---------<br><br>In this there are two I think are of note<br><br>1. The error messages that the student got were not helpful for them seeing their error. I don't have their original code so I can't dive in to why and say "ah, we could obviously make this case better", but I choose to believe there was some way to not vomit "<span style="font-family:monospace">class, interface, enum, or record expected" </span><font face="arial, sans-serif">nine times.<br><br>2. They are not using an IDE. They are using <a href="http://repl.it">repl.it</a>. This is really common for early learners, as the hardware requirements of platforms like that are lower and school systems will choose them for a myriad of reasons (cheaper to buy chrome books, ability to share starter templates, etc.) Even *if* IDEs are in a hypothetically better position to provide give corrective feedback, they aren't always "in the room" for the sort of person that needs it most.<br><br></font></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Nov 10, 2022 at 5:38 PM Jonathan Gibbons <<a href="mailto:jonathan.gibbons@oracle.com">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>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>On 11/10/22 2:21 PM, Ethan McCue wrote:<br>
    </div>
    <blockquote type="cite">
      
      <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">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">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">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">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">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>
  </div>

</blockquote></div>