<div dir="ltr"><div dir="ltr">On Wed, Jan 25, 2023 at 3:24 PM Brian Goetz <<a href="mailto:brian.goetz@oracle.com">brian.goetz@oracle.com</a>> wrote:</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>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <div class="gmail_quote">
          <div>I'm still not understanding (sorry).</div>
          <div><br>
          </div>
          <div>The new rule for implicit supers would be syntactic as
            well.</div>
          <div><br>
          </div>
          <div>The rule is this: Add an implicit super() if there are NO
            occurrences of any this() or a super() anywhere in the
            constructor.</div>
        </div>
      </div>
    </blockquote>
    <br>
    So, let's look at the grammar.  Where does the production that
    matches `super(e)` come from?  Its from ConstructorBody:<br>
    <br>
        ConstructorBody:<br>
        { [ExplicitConstructorInvocation] [BlockStatements] }<br>
    <br>
    If you pull on the string for BlockStatements, you'll see a whole
    nest of statement forms, *none of which match this(e) or super(e)*. 
    So to allow one of these statements inside a block, you have to
    refactor all the statement productions in the language.  Then you
    have to go through the entire spec and prohibit these in the places
    where they can't be used (such as lambdas.)  <br></div></blockquote><div><br></div><div>OK now I understand - thanks for being patient :)</div><div><br></div><div>I didn't realize that the restriction that super()/this() must be first in a constructor was actually implemented using the language grammar.</div><div><br></div><div>But it doesn't have to be that way, does it? I mean, the grammar allows "foobar()" to appear in any method, even when "foobar()" cannot be resolved. The requirement for "foobar()" to be resolvable is stated elsewhere, outside of the grammar.<br></div><div><br></div><div>So why not, in the grammar, allow super()/this() to appear anywhere that any other method call can appear, and then layer on the restriction that they may only appear in constructors as a separate (English) sentence?<br></div></div><div><br></div><div>It makes intuitive sense that we would need to do it this way because (as the JEP describes) we're converting a syntactic requirement into a semantic one.<br></div><div><br></div><div>-Archie<br></div><br>-- <br><div dir="ltr" class="gmail_signature">Archie L. Cobbs<br></div></div>