On Mon, Apr 18, 2011 at 05:42, Jorge <jo...@jorgechamorro.com> wrote:
> I understand that it would be quite interesting to get a warning/error in
> this case:
> a= b
> (c= d)();
> ...only that there's no ASI in this case !

Jorge touches on the reason why the whole debate about ASI is a bit
misguided, in my opinion.

The "} or \n ended a statement" ASI doesn't usually bite, except in
the case of restricted productions, where it looks like it wouldn't
end.

   return
     { a : 1 };

This is a situation that's extremely easy to avoid with a simple and
easily lint-able rule: "return\n<expression> is an error".

However, is it reasonable to treat strike this ASI with the same hammer?

   b.on("click", function () { alert("hi!") });

I don't think so.  No reasonable JavaScripter would be surprised that
the alert line ended at the }.

Furthermore, it is not the existence of ASI, but rather the lack of it
that causes problems even more frequently than the restricted
productions issue.

   var a = 1;
   var b = 2;
   var c = { foo : "bar" }
   [a, b].forEach(alert); // cannot call method 'forEach' of undefined

A "disable ASI" pragma will not catch this error.  No ASI occurred!

In my years writing JavaScript, I can count on one finger the number
of times that restricted production ASI has bitten me.  I immediately
abandoned the Allman style in favor of a BSD-KNF
brace-goes-with-the-start-thing style, and all was well with the
world.  This no longer looked strange to me:

   return {
     foo : "bar"
   };

I can also count on one finger the number of restricted productions
where this is an issue: throw will issue a syntax error, since the
expression is not optional, and named continue/break are very rare.

However, the "non-ASI" error above (where there is a \n followed by a
[, (, +, etc) bites a *lot*, and is almost impossible to see when
parsing the code with human eyes and brains.

The proliferation of ; is not a keyboard-tax.  It is an
eyeball/brain-tax.  "Why complain about semicolons?  You don't even
see them."  That's why.  Because I want to see the relevant parts of
my code.  If you put them on every line, and worse, at the
jagged-right edge of the line,

The options are to either:

* use a lint step in your development process to catch these issues
(and it's gonna have to be a pretty clever linter to know you didn't
mean to do that)
* adopt a style where such things jump out at you because they look
wrong (as I have done with npm's leading semicolon/comma style), or
* Be Very Careful about using array literals and parenthesized constructions.

I find linters to be somewhat unpleasant housepets, and thus do not
keep them in my own home, though I of course respect their place when
contributing to others' projects, and I have found that Being Very
Careful is not sustainable on teams of 1 or more humans.

Any approach that does not handle the "non-ASI error" case is not a solution.

Every time a warning prints about something that was intended, the
value of warnings is reduced.  That's a bad idea.  In the onclick ASI
example above, printing a warning about the ASI in that code would be
worse than useless.

If we are going to build a less wicked language, and the idea of a
warning-generating pragma seems wise, then we ought to make every
warning as relevant as possible, and not just support
backwards-compatibility, but also do our best to support the intent of
those using the language.  Here's a few situations where (in my
opinion) warnings would be useful:

1. Restricted production followed by \n and an expression which is not
a method or function call, assignment, or function declaration.

   // these would warn:
   return
   { a: b }
   /////
   return
       10 + 5

2. Expression followed by \n and a +, (, [, -, *, / at the same indention level.

   // this would warn:
   x = y
   (c + d).print()
   // this would not:
   chain
     ( [some, long, thing]
     , [the, next, chain, link]
     , cb )


--i
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to