On Apr 18, 2011, at 12:14 PM, Isaac Schlueter wrote:

> [snip, and huzzah! ;-)]

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

Ding ding ding...


> 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"
>    };

Right, and crock has made this point too. Style rule with substance (like it or 
not) backing it, better than mere (and endless) aesthetic arguments.


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

Yes, this is a good point too, I forgot to raise it. It is why people are told 
to start separate JS files which may end up in a concatenation with a lone ;. 
Thanks for raising it.


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

I agree, but in a friendly spirit suggest typing ; is a tax too, however much 
lesser.


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

Agree emphatically. We have had similar experiences!


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

Agreed. See my 'with' strict warning story.


> 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

Some expressions that do not involve calling, assigning, or otherwise 
potentially having effects (declaring, where the declaration is a misplaced 
function expression) still may have effects (e.g. getters).

Your suggestion seems to be to avoid analysis and warn based only the syntax of 
the expression that follows on a separate line a bare, unterminated return. I 
think I agree, but I wanted to call this choice out for more discussion.


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

Indentation, yay. Necessary in your view, or could you just ignore everything 
except the separation by a line terminator?

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

Reply via email to