<div dir="ltr"><div dir="ltr">On Wed, Nov 2, 2022 at 3:18 PM Archie Cobbs <<a href="mailto:archie.cobbs@gmail.com" target="_blank">archie.cobbs@gmail.com</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">On Wed, Nov 2, 2022 at 2:47 PM Alex Buckley <<a href="mailto:alex.buckley@oracle.com" target="_blank">alex.buckley@oracle.com</a>> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">JLS ch.16 is specific that only `foo` and `this.foo` cause an error. See <br>
the definition of "access" in the opening paragraphs of the chapter.<br></blockquote><div><br></div><div><div dir="ltr"><div>Thanks for pointing that out, which I forgot to do. The JLS language is:</div><div><br></div><div style="margin-left:40px">An access to its value consists of the simple name of the variable
             (or, for a field, the simple name of the field qualified
            by <code>this</code>)  occurring anywhere in an expression except as
            the left-hand operand of the simple assignment operator <code>=</code>
<code></code></div><div><br></div><div>In theory one could argue that MyClass<span style="font-family:monospace">.this.foo</span> is also an example of "the simple name of the field qualified
            by <code>this<span style="font-family:arial,sans-serif">" - just look at the latter part, no?</span><br></code></div><div><code><br></code></div>Regardless, it looks like there needs to be a spec change... 
right? I'm assuming we'd rather do that than continue to allow the current
 behavior.</div></div></div></div></blockquote><div> </div></div><div>Any further thoughts on this one?</div><div><br></div><div>It seems to me that regardless of what you think the right answer is, the current situation could use some improvement.<br></div><div><br></div><div>Here's how the compiler currently behaves:</div><div><br></div><div style="margin-left:40px"><span style="font-family:monospace">// This class compiles without error<br></span></div><div style="margin-left:40px"><span style="font-family:monospace">public class Example1 {</span><br><span style="font-family:monospace">    final int foo;</span><br><span style="font-family:monospace">    public Example1() {</span><br><span style="font-family:monospace">        System.err.println(Example1.this.foo);  // no error generated here</span><br><span style="font-family:monospace">        this.foo = 42;</span><br><span style="font-family:monospace">    }</span><br><span style="font-family:monospace">}</span><br><span style="font-family:monospace"></span></div><div style="margin-left:40px"><span style="font-family:monospace"><br></span></div><div style="margin-left:40px"><span style="font-family:monospace">// This class fails to compile<br></span></div><div style="margin-left:40px"><span style="font-family:monospace">public class Example2 {<br>    private final int foo;<br>    public Example2() {<br>        Example2.this.foo = 42; // "cannot assign a value to final variable foo"<br>    }<br>}<br></span></div><div><br></div><div>My thoughts...</div><div><ul><li>If the compiler is not following the spec, then we need to fix the compiler</li><li>If the compiler is following the spec, then shouldn't the spec be corrected so that it treats <span style="font-family:monospace">Foo.this</span> and <span style="font-family:monospace">this</span> the same way?<br></li></ul></div><div>In another email Alex said:</div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">DU/DA analysis is about whether names have bindings. `x.foo` and `new <br></blockquote><div class="gmail_quote"><span class="gmail-im"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
C().foo` and `m().foo` are expressions, not names, so we don't attempt <br>
the analysis on them. As Jan points out [1], access via expressions is <br>
hard to track. `this.foo` is an expression, but a very easy one, so we <br>
treat it like the name `foo` and do the analysis. `A.B.C.this.foo` is an <br>
expression with a qualified-this subexpression and now you need a bunch <br>
of analysis to figure out whether it means the same as the name `foo`.</blockquote></span></div></div><div><br></div><div>I don't see that you "need a bunch of analysis". The required analysis is already being done, for example, when handling expressions that could refer to outer 'this' instances. We're not talking about arbitrarily complex expressions. The only two options are 'this' or 'this' qualified by a type name.<br></div><div><br></div><div>Apologies if I'm missing something, just trying to understand what the issue is here.<br></div><div><br></div><div>Thanks,<br></div><div>-Archie<br></div><div><br>-- <br><div dir="ltr">Archie L. Cobbs<br></div></div></div>