<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>