My own favourite approach would link ASI to layout/indentation,
and introduce warnings instead of breaking code:

1 if ASI kicks in, but indentation suggests statement continuation,
   issue a warning
2 if ASI does not kick in, but indentation suggests new statement,
   issue a warning

I did once try to implement this, by instrumenting esprima to
keep track of indents and ASI and other side-conditions, but got somewhat distracted/disillusioned by the number of
special cases that kept popping up. Nevertheless, that sketch
is now available as a gist:

https://gist.github.com/2973296

Perhaps it inspires someone to do it right?-)
Claus

// ----------------- output
$ node basil.js sample.js
ASI at line 5(2) before indented line 6(8)
multiline VariableDeclaration 12(2), not indented: line 13(2)
multiline VariableDeclaration 21(2), not indented: line 22(2)
ASI at line 23(2) before indented line 24(11)
multiline IfStatement 33(2), not indented: line 34(2)
ASI at line 37(2) before indented line 38(4)
multiline ExpressionStatement 40(2), not indented: line 42(2)
multiline WhileStatement 44(2), not indented: line 45(2)-line 47(2)

// ----------------- sample.js
$ cat sample.js

// examples

function restricted_production() {
 return  //;
       "hi"; // warn here
 return  //;
 "hi";   // don't warn here
}

function newline_no_asi() {
 var x = ["hi"] //;
 [1];  // warn here
 var y = ["hi"] //;
   [1];  // don't warn here
}

function newline_error_asi(alp,ha) {
 var a1 = "hi"+
          "ho"; // don't warn here
 var a2 = "hi"+
 "ho";          // warn here
 var b1 = "hi"  //;
          "ho"; // warn here
 var b2 = "hi"  //;
 "ho";          // don't warn here
}

function continued_statements() {
 if (condition) {
 } else {  // don't warn here
 }         // don't warn here
 if (condition) f
 ()        // warn here
 if (condition) f
   ()      // don't warn here
 if (condition) return
   ""      // warn here
 if (condition) return
 ""        // don't warn here
           // don't warn here (comment/empty multiline) FIXME
 while (condition) {
 }         // don't warn here
 while (condition) f
 ()        // warn here

 function f() {
 }         // don't warn here
} _______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to