|
887 | 887 | !(isIdentifierChar(after=this.input.charCodeAt(next+8))||after>0xd7ff&&after<0xdc00)) |
888 | 888 | }; |
889 | 889 |
|
| 890 | +pp$8.isUsingKeyword=function(isAwaitUsing,isFor){ |
| 891 | +if(this.options.ecmaVersion<17||!this.isContextual(isAwaitUsing ? "await" : "using")) |
| 892 | +{returnfalse} |
| 893 | + |
| 894 | +skipWhiteSpace.lastIndex=this.pos; |
| 895 | +varskip=skipWhiteSpace.exec(this.input); |
| 896 | +varnext=this.pos+skip[0].length; |
| 897 | + |
| 898 | +if(lineBreak.test(this.input.slice(this.pos,next))){returnfalse} |
| 899 | + |
| 900 | +if(isAwaitUsing){ |
| 901 | +varawaitEndPos=next+5/* await */,after; |
| 902 | +if(this.input.slice(next,awaitEndPos)!=="using"|| |
| 903 | +awaitEndPos===this.input.length|| |
| 904 | +isIdentifierChar(after=this.input.charCodeAt(awaitEndPos))|| |
| 905 | +(after>0xd7ff&&after<0xdc00) |
| 906 | +){returnfalse} |
| 907 | + |
| 908 | +skipWhiteSpace.lastIndex=awaitEndPos; |
| 909 | +varskipAfterUsing=skipWhiteSpace.exec(this.input); |
| 910 | +if(skipAfterUsing&&lineBreak.test(this.input.slice(awaitEndPos,awaitEndPos+skipAfterUsing[0].length))){returnfalse} |
| 911 | +} |
| 912 | + |
| 913 | +if(isFor){ |
| 914 | +varofEndPos=next+2/* of */,after$1; |
| 915 | +if(this.input.slice(next,ofEndPos)==="of"){ |
| 916 | +if(ofEndPos===this.input.length|| |
| 917 | +(!isIdentifierChar(after$1=this.input.charCodeAt(ofEndPos))&&!(after$1>0xd7ff&&after$1<0xdc00))){returnfalse} |
| 918 | +} |
| 919 | +} |
| 920 | + |
| 921 | +varch=this.input.charCodeAt(next); |
| 922 | +returnisIdentifierStart(ch,true)||ch===92// '\' |
| 923 | +}; |
| 924 | + |
| 925 | +pp$8.isAwaitUsing=function(isFor){ |
| 926 | +returnthis.isUsingKeyword(true,isFor) |
| 927 | +}; |
| 928 | + |
| 929 | +pp$8.isUsing=function(isFor){ |
| 930 | +returnthis.isUsingKeyword(false,isFor) |
| 931 | +}; |
| 932 | + |
890 | 933 | // Parse a single statement. |
891 | 934 | // |
892 | 935 | // If expecting a statement and finding a slash operator, parse a |
|
963 | 1006 | returnthis.parseFunctionStatement(node,true,!context) |
964 | 1007 | } |
965 | 1008 |
|
| 1009 | +varusingKind=this.isAwaitUsing(false) ? "await using" : this.isUsing(false) ? "using" : null; |
| 1010 | +if(usingKind){ |
| 1011 | +if(topLevel&&this.options.sourceType==="script"){ |
| 1012 | +this.raise(this.start,"Using declaration cannot appear in the top level when source type is `script`"); |
| 1013 | +} |
| 1014 | +if(usingKind==="await using"){ |
| 1015 | +if(!this.canAwait){ |
| 1016 | +this.raise(this.start,"Await using cannot appear outside of async function"); |
| 1017 | +} |
| 1018 | +this.next(); |
| 1019 | +} |
| 1020 | +this.next(); |
| 1021 | +this.parseVar(node,false,usingKind); |
| 1022 | +this.semicolon(); |
| 1023 | +returnthis.finishNode(node,"VariableDeclaration") |
| 1024 | +} |
| 1025 | + |
966 | 1026 | varmaybeName=this.value,expr=this.parseExpression(); |
967 | 1027 | if(starttype===types$1.name&&expr.type==="Identifier"&&this.eat(types$1.colon)) |
968 | 1028 | {returnthis.parseLabeledStatement(node,maybeName,expr,context)} |
|
1038 | 1098 | this.next(); |
1039 | 1099 | this.parseVar(init$1,true,kind); |
1040 | 1100 | this.finishNode(init$1,"VariableDeclaration"); |
1041 | | -if((this.type===types$1._in||(this.options.ecmaVersion>=6&&this.isContextual("of")))&&init$1.declarations.length===1){ |
1042 | | -if(this.options.ecmaVersion>=9){ |
1043 | | -if(this.type===types$1._in){ |
1044 | | -if(awaitAt>-1){this.unexpected(awaitAt);} |
1045 | | -}else{node.await=awaitAt>-1;} |
1046 | | -} |
1047 | | -returnthis.parseForIn(node,init$1) |
1048 | | -} |
1049 | | -if(awaitAt>-1){this.unexpected(awaitAt);} |
1050 | | -returnthis.parseFor(node,init$1) |
| 1101 | +returnthis.parseForAfterInit(node,init$1,awaitAt) |
1051 | 1102 | } |
1052 | 1103 | varstartsWithLet=this.isContextual("let"),isForOf=false; |
| 1104 | + |
| 1105 | +varusingKind=this.isUsing(true) ? "using" : this.isAwaitUsing(true) ? "await using" : null; |
| 1106 | +if(usingKind){ |
| 1107 | +varinit$2=this.startNode(); |
| 1108 | +this.next(); |
| 1109 | +if(usingKind==="await using"){this.next();} |
| 1110 | +this.parseVar(init$2,true,usingKind); |
| 1111 | +this.finishNode(init$2,"VariableDeclaration"); |
| 1112 | +returnthis.parseForAfterInit(node,init$2,awaitAt) |
| 1113 | +} |
1053 | 1114 | varcontainsEsc=this.containsEsc; |
1054 | 1115 | varrefDestructuringErrors=newDestructuringErrors; |
1055 | 1116 | varinitPos=this.start; |
|
1075 | 1136 | returnthis.parseFor(node,init) |
1076 | 1137 | }; |
1077 | 1138 |
|
| 1139 | +// Helper method to parse for loop after variable initialization |
| 1140 | +pp$8.parseForAfterInit=function(node,init,awaitAt){ |
| 1141 | +if((this.type===types$1._in||(this.options.ecmaVersion>=6&&this.isContextual("of")))&&init.declarations.length===1){ |
| 1142 | +if(this.options.ecmaVersion>=9){ |
| 1143 | +if(this.type===types$1._in){ |
| 1144 | +if(awaitAt>-1){this.unexpected(awaitAt);} |
| 1145 | +}else{node.await=awaitAt>-1;} |
| 1146 | +} |
| 1147 | +returnthis.parseForIn(node,init) |
| 1148 | +} |
| 1149 | +if(awaitAt>-1){this.unexpected(awaitAt);} |
| 1150 | +returnthis.parseFor(node,init) |
| 1151 | +}; |
| 1152 | + |
1078 | 1153 | pp$8.parseFunctionStatement=function(node,isAsync,declarationPosition){ |
1079 | 1154 | this.next(); |
1080 | 1155 | returnthis.parseFunction(node,FUNC_STATEMENT|(declarationPosition ? 0 : FUNC_HANGING_STATEMENT),false,isAsync) |
|
1331 | 1406 | decl.init=this.parseMaybeAssign(isFor); |
1332 | 1407 | }elseif(!allowMissingInitializer&&kind==="const"&&!(this.type===types$1._in||(this.options.ecmaVersion>=6&&this.isContextual("of")))){ |
1333 | 1408 | this.unexpected(); |
| 1409 | +}elseif(!allowMissingInitializer&&(kind==="using"||kind==="await using")&&this.options.ecmaVersion>=17&&this.type!==types$1._in&&!this.isContextual("of")){ |
| 1410 | +this.raise(this.lastTokEnd,("Missing initializer in "+kind+" declaration")); |
1334 | 1411 | }elseif(!allowMissingInitializer&&decl.id.type!=="Identifier"&&!(isFor&&(this.type===types$1._in||this.isContextual("of")))){ |
1335 | 1412 | this.raise(this.lastTokEnd,"Complex binding patterns require an initialization value"); |
1336 | 1413 | }else{ |
|
1343 | 1420 | }; |
1344 | 1421 |
|
1345 | 1422 | pp$8.parseVarId=function(decl,kind){ |
1346 | | -decl.id=this.parseBindingAtom(); |
| 1423 | +decl.id=kind==="using"||kind==="await using" |
| 1424 | + ? this.parseIdent() |
| 1425 | + : this.parseBindingAtom(); |
| 1426 | + |
1347 | 1427 | this.checkLValPattern(decl.id,kind==="var" ? BIND_VAR : BIND_LEXICAL,false); |
1348 | 1428 | }; |
1349 | 1429 |
|
|
3074 | 3154 | varnode=this.startNode(); |
3075 | 3155 | node.value=value; |
3076 | 3156 | node.raw=this.input.slice(this.start,this.end); |
3077 | | -if(node.raw.charCodeAt(node.raw.length-1)===110){node.bigint=node.raw.slice(0,-1).replace(/_/g,"");} |
| 3157 | +if(node.raw.charCodeAt(node.raw.length-1)===110) |
| 3158 | +{node.bigint=node.value!=null ? node.value.toString() : node.raw.slice(0,-1).replace(/_/g,"");} |
3078 | 3159 | this.next(); |
3079 | 3160 | returnthis.finishNode(node,"Literal") |
3080 | 3161 | }; |
|
6104 | 6185 | // Please use the [github bug tracker][ghbt] to report issues. |
6105 | 6186 | // |
6106 | 6187 | // [ghbt]: https://github.com/acornjs/acorn/issues |
6107 | | -// |
6108 | | -// [walk]: util/walk.js |
6109 | 6188 |
|
6110 | 6189 |
|
6111 | | -varversion="8.14.1"; |
| 6190 | +varversion="8.15.0"; |
6112 | 6191 |
|
6113 | 6192 | Parser.acorn={ |
6114 | 6193 | Parser: Parser, |
|
0 commit comments