On Nov 12, 2013, at 9:27 AM, Brendan Eich wrote:
> ...
> We have problems with paren-free heads for if, while, etc. because statement 
> bodies need not be braced in the paren-ful case:
> 
> https://mail.mozilla.org/pipermail/es-discuss/2011-September/016804.html
> 
> I don't see a similar problem here, yet, but it's a possibility. If class 
> body always starts with { and no expression can adjoin a braced form and make 
> a larger expression, we're ok. This prohibition must be kept in all future 
> editions.
> 
> ...
> If your grammar parameterization only prohibits unparenthesized yield at the 
> end of the extends RHS, that may be worth the ugliness in the spec.
> 
> But first let's make sure we aren't going wrong in allowing arbitrary 
> AssignmentExpression after 'extends'. The paren-free gotcha needs another 
> look.
> 

The { is a mandatory part of the class declaration syntax, not part of the 
class body.  In that regard, it is more like:
    CaseClause :
          'case' Expression ':' StatementList

which has a mandatory delimiter after the Expression, then it is like 
IfExpression and friends that have an undelimted Statement as their tail.

But the message you referenced above is more about refactoring/editing hazards 
so lets look at those types of hazards with 'extends' AssignmentExpression

Assume we start with

     class foo extends bar {}

If somebody added an binary operator after 'bar' but forgot to add its right 
operand

we would have

    class foo extends bar+ {}

The braces would be interpreter as an object literal that was part of the 
expression.  But the class body braces are still mandatory so  if the next 
meaningful line starts with anything other than a { we have a syntax error (and 
one that ASI can't fix).

Assuming the program was syntactically valid before inserting the + the only 
thing that could be on the next line starting with a { is a Block.

If the following Block was empty it would be interpreter as the class body and 
the program would parse correctly.  Of course, a runtime error will occur when 
the extends expression evaluates to a non-function (but perhaps if 'bar' was a 
value object with operator overloading, the + might evaluate to a function, but 
it still seems unlikely).

If the following Block looked like this:

   {f(a)  /*ASI here */
    {/*any Valid StatementList */}
   }

the ClassDeclaration would also parses correctly using the following Block as 
the class body. EG,
   class foo extends bar+ {}
   {f(a)  /*no ASI here in a ClassBody*/
    {/*any Valid StatementList */}
   }

Note that the hazard of this occurring is essentially the same as if somebody 
inadvertently inserted a '+' after the 'foo()' in:
   foo() /*ASI here */
   {f(a)  /*ASI here */
    {/*any Valid StatementList */}
   }

except the class declaration case still has the runtime check that the 
'extends' expression evaluates to a function.

My conclusion from the above is that 'extends' AssignmentExpression, assuming 
we fix the 'yield' ambiguity, doesn't introduce any editing/refactoring hazards 
that don't already exist for common ES language constructs and my impression is 
that those hazards don't appear to be significant issues for developers using 
the current language.

Allen

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to