@@ -939,7 +939,7 @@ export class Parser extends DiagnosticEmitter {
939
939
} while ( tn . skip ( Token . Comma ) ) ;
940
940
941
941
let ret = Node . createVariableStatement ( decorators , declarations , tn . range ( startPos , tn . pos ) ) ;
942
- tn . skip ( Token . Semicolon ) ;
942
+ if ( ! tn . skip ( Token . Semicolon ) && ! isFor ) this . checkASI ( tn ) ;
943
943
return ret ;
944
944
}
945
945
@@ -1122,7 +1122,7 @@ export class Parser extends DiagnosticEmitter {
1122
1122
}
1123
1123
1124
1124
let ret = Node . createReturnStatement ( expr , tn . range ( startPos , tn . pos ) ) ;
1125
- tn . skip ( Token . Semicolon ) ;
1125
+ if ( ! tn . skip ( Token . Semicolon ) ) this . checkASI ( tn ) ;
1126
1126
return ret ;
1127
1127
}
1128
1128
@@ -3009,7 +3009,7 @@ export class Parser extends DiagnosticEmitter {
3009
3009
}
3010
3010
}
3011
3011
let ret = Node . createBlockStatement ( statements , tn . range ( startPos , tn . pos ) ) ;
3012
- tn . skip ( Token . Semicolon ) ;
3012
+ if ( topLevel ) tn . skip ( Token . Semicolon ) ;
3013
3013
return ret ;
3014
3014
}
3015
3015
@@ -3417,7 +3417,7 @@ export class Parser extends DiagnosticEmitter {
3417
3417
let expression = this . parseExpression ( tn ) ;
3418
3418
if ( ! expression ) return null ;
3419
3419
let ret = Node . createThrowStatement ( expression , tn . range ( startPos , tn . pos ) ) ;
3420
- tn . skip ( Token . Semicolon ) ;
3420
+ if ( ! tn . skip ( Token . Semicolon ) ) this . checkASI ( tn ) ;
3421
3421
return ret ;
3422
3422
}
3423
3423
@@ -4401,6 +4401,18 @@ export class Parser extends DiagnosticEmitter {
4401
4401
return expr ;
4402
4402
}
4403
4403
4404
+ private checkASI (
4405
+ tn : Tokenizer
4406
+ ) : void {
4407
+ // see: https://tc39.es/ecma262/#sec-automatic-semicolon-insertion
4408
+ let token = tn . peek ( true ) ;
4409
+ if ( tn . nextTokenOnNewLine || token == Token . EndOfFile || token == Token . CloseBrace ) return ;
4410
+ this . error (
4411
+ DiagnosticCode . Unexpected_token ,
4412
+ tn . range ( tn . nextTokenPos )
4413
+ ) ;
4414
+ }
4415
+
4404
4416
/** Skips over a statement on errors in an attempt to reduce unnecessary diagnostic noise. */
4405
4417
skipStatement ( tn : Tokenizer ) : void {
4406
4418
tn . peek ( true ) ;
0 commit comments