parse.go 61 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339
  1. package js
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "io"
  7. "github.com/tdewolff/parse/v2"
  8. "github.com/tdewolff/parse/v2/buffer"
  9. )
  10. type Options struct {
  11. WhileToFor bool
  12. Inline bool
  13. }
  14. // Parser is the state for the parser.
  15. type Parser struct {
  16. l *Lexer
  17. o Options
  18. err error
  19. data []byte
  20. tt TokenType
  21. prevLT bool
  22. in, await, yield, deflt, retrn bool
  23. assumeArrowFunc bool
  24. allowDirectivePrologue bool
  25. stmtLevel int
  26. exprLevel int
  27. scope *Scope
  28. }
  29. // Parse returns a JS AST tree of.
  30. func Parse(r *parse.Input, o Options) (*AST, error) {
  31. ast := &AST{}
  32. p := &Parser{
  33. l: NewLexer(r),
  34. o: o,
  35. tt: WhitespaceToken, // trick so that next() works
  36. in: true,
  37. await: true,
  38. }
  39. if o.Inline {
  40. p.next()
  41. p.retrn = true
  42. p.allowDirectivePrologue = true
  43. p.enterScope(&ast.BlockStmt.Scope, true)
  44. for {
  45. if p.tt == ErrorToken {
  46. break
  47. }
  48. ast.BlockStmt.List = append(ast.BlockStmt.List, p.parseStmt(true))
  49. }
  50. } else {
  51. // catch shebang in first line
  52. var shebang []byte
  53. if r.Peek(0) == '#' && r.Peek(1) == '!' {
  54. r.Move(2)
  55. p.l.consumeSingleLineComment() // consume till end-of-line
  56. shebang = r.Shift()
  57. }
  58. // parse JS module
  59. p.next()
  60. ast.BlockStmt = p.parseModule()
  61. if 0 < len(shebang) {
  62. ast.BlockStmt.List = append([]IStmt{&Comment{shebang}}, ast.BlockStmt.List...)
  63. }
  64. }
  65. if p.err == nil {
  66. p.err = p.l.Err()
  67. } else {
  68. offset := p.l.r.Offset() - len(p.data)
  69. p.err = parse.NewError(buffer.NewReader(p.l.r.Bytes()), offset, p.err.Error())
  70. }
  71. if p.err == io.EOF {
  72. p.err = nil
  73. }
  74. return ast, p.err
  75. }
  76. ////////////////////////////////////////////////////////////////
  77. func (p *Parser) next() {
  78. p.prevLT = false
  79. p.tt, p.data = p.l.Next()
  80. for p.tt == WhitespaceToken || p.tt == LineTerminatorToken || (p.tt == CommentToken || p.tt == CommentLineTerminatorToken) && (p.exprLevel != 0 || len(p.data) < 3 || p.data[2] != '!') {
  81. if p.tt == LineTerminatorToken || p.tt == CommentLineTerminatorToken {
  82. p.prevLT = true
  83. }
  84. p.tt, p.data = p.l.Next()
  85. }
  86. }
  87. func (p *Parser) failMessage(msg string, args ...interface{}) {
  88. if p.err == nil {
  89. p.err = fmt.Errorf(msg, args...)
  90. p.tt = ErrorToken
  91. }
  92. }
  93. func (p *Parser) fail(in string, expected ...TokenType) {
  94. if p.err == nil {
  95. msg := "unexpected"
  96. if 0 < len(expected) {
  97. msg = "expected"
  98. for i, tt := range expected[:len(expected)-1] {
  99. if 0 < i {
  100. msg += ","
  101. }
  102. msg += " " + tt.String() + ""
  103. }
  104. if 2 < len(expected) {
  105. msg += ", or"
  106. } else if 1 < len(expected) {
  107. msg += " or"
  108. }
  109. msg += " " + expected[len(expected)-1].String() + " instead of"
  110. }
  111. if p.tt == ErrorToken {
  112. if p.l.Err() == io.EOF {
  113. msg += " EOF"
  114. } else if lexerErr, ok := p.l.Err().(*parse.Error); ok {
  115. msg = lexerErr.Message
  116. } else {
  117. // does not happen
  118. }
  119. } else {
  120. msg += " " + string(p.data) + ""
  121. }
  122. if in != "" {
  123. msg += " in " + in
  124. }
  125. p.err = errors.New(msg)
  126. p.tt = ErrorToken
  127. }
  128. }
  129. func (p *Parser) consume(in string, tt TokenType) bool {
  130. if p.tt != tt {
  131. p.fail(in, tt)
  132. return false
  133. }
  134. p.next()
  135. return true
  136. }
  137. func (p *Parser) enterScope(scope *Scope, isFunc bool) *Scope {
  138. // create a new scope object and add it to the parent
  139. parent := p.scope
  140. p.scope = scope
  141. *scope = Scope{
  142. Parent: parent,
  143. }
  144. if isFunc {
  145. scope.Func = scope
  146. } else if parent != nil {
  147. scope.Func = parent.Func
  148. }
  149. return parent
  150. }
  151. func (p *Parser) exitScope(parent *Scope) {
  152. p.scope.HoistUndeclared()
  153. p.scope = parent
  154. }
  155. func (p *Parser) parseModule() (module BlockStmt) {
  156. p.enterScope(&module.Scope, true)
  157. p.allowDirectivePrologue = true
  158. for {
  159. switch p.tt {
  160. case ErrorToken:
  161. return
  162. case ImportToken:
  163. p.next()
  164. if p.tt == OpenParenToken {
  165. // could be an import call expression
  166. left := &LiteralExpr{ImportToken, []byte("import")}
  167. p.exprLevel++
  168. suffix := p.parseExpressionSuffix(left, OpExpr, OpCall)
  169. p.exprLevel--
  170. module.List = append(module.List, &ExprStmt{suffix})
  171. if !p.prevLT && p.tt == SemicolonToken {
  172. p.next()
  173. }
  174. } else {
  175. importStmt := p.parseImportStmt()
  176. module.List = append(module.List, &importStmt)
  177. }
  178. case ExportToken:
  179. exportStmt := p.parseExportStmt()
  180. module.List = append(module.List, &exportStmt)
  181. default:
  182. module.List = append(module.List, p.parseStmt(true))
  183. }
  184. }
  185. }
  186. func (p *Parser) parseStmt(allowDeclaration bool) (stmt IStmt) {
  187. p.stmtLevel++
  188. if 1000 < p.stmtLevel {
  189. p.failMessage("too many nested statements")
  190. return nil
  191. }
  192. allowDirectivePrologue := p.allowDirectivePrologue
  193. p.allowDirectivePrologue = false
  194. switch tt := p.tt; tt {
  195. case OpenBraceToken:
  196. stmt = p.parseBlockStmt("block statement")
  197. case ConstToken, VarToken:
  198. if !allowDeclaration && tt == ConstToken {
  199. p.fail("statement")
  200. return
  201. }
  202. p.next()
  203. varDecl := p.parseVarDecl(tt, true)
  204. stmt = varDecl
  205. if !p.prevLT && p.tt != SemicolonToken && p.tt != CloseBraceToken && p.tt != ErrorToken {
  206. if tt == ConstToken {
  207. p.fail("const declaration")
  208. } else {
  209. p.fail("var statement")
  210. }
  211. return
  212. }
  213. case LetToken:
  214. let := p.data
  215. p.next()
  216. if allowDeclaration && (IsIdentifier(p.tt) || p.tt == YieldToken || p.tt == AwaitToken || p.tt == OpenBracketToken || p.tt == OpenBraceToken) {
  217. stmt = p.parseVarDecl(tt, false)
  218. if !p.prevLT && p.tt != SemicolonToken && p.tt != CloseBraceToken && p.tt != ErrorToken {
  219. p.fail("let declaration")
  220. return
  221. }
  222. } else {
  223. // expression
  224. stmt = &ExprStmt{p.parseIdentifierExpression(OpExpr, let)}
  225. if !p.prevLT && p.tt != SemicolonToken && p.tt != CloseBraceToken && p.tt != ErrorToken {
  226. p.fail("expression")
  227. return
  228. }
  229. }
  230. case IfToken:
  231. p.next()
  232. if !p.consume("if statement", OpenParenToken) {
  233. return
  234. }
  235. cond := p.parseExpression(OpExpr)
  236. if !p.consume("if statement", CloseParenToken) {
  237. return
  238. }
  239. body := p.parseStmt(false)
  240. var elseBody IStmt
  241. if p.tt == ElseToken {
  242. p.next()
  243. elseBody = p.parseStmt(false)
  244. }
  245. stmt = &IfStmt{cond, body, elseBody}
  246. case ContinueToken, BreakToken:
  247. tt := p.tt
  248. p.next()
  249. var label []byte
  250. if !p.prevLT && p.isIdentifierReference(p.tt) {
  251. label = p.data
  252. p.next()
  253. }
  254. stmt = &BranchStmt{tt, label}
  255. case WithToken:
  256. p.next()
  257. if !p.consume("with statement", OpenParenToken) {
  258. return
  259. }
  260. cond := p.parseExpression(OpExpr)
  261. if !p.consume("with statement", CloseParenToken) {
  262. return
  263. }
  264. p.scope.Func.HasWith = true
  265. stmt = &WithStmt{cond, p.parseStmt(false)}
  266. case DoToken:
  267. stmt = &DoWhileStmt{}
  268. p.next()
  269. body := p.parseStmt(false)
  270. if !p.consume("do-while statement", WhileToken) {
  271. return
  272. }
  273. if !p.consume("do-while statement", OpenParenToken) {
  274. return
  275. }
  276. stmt = &DoWhileStmt{p.parseExpression(OpExpr), body}
  277. if !p.consume("do-while statement", CloseParenToken) {
  278. return
  279. }
  280. case WhileToken:
  281. p.next()
  282. if !p.consume("while statement", OpenParenToken) {
  283. return
  284. }
  285. cond := p.parseExpression(OpExpr)
  286. if !p.consume("while statement", CloseParenToken) {
  287. return
  288. }
  289. body := p.parseStmt(false)
  290. if p.o.WhileToFor {
  291. varDecl := &VarDecl{TokenType: VarToken, Scope: p.scope, InFor: true}
  292. p.scope.Func.VarDecls = append(p.scope.Func.VarDecls, varDecl)
  293. block, ok := body.(*BlockStmt)
  294. if !ok {
  295. block = &BlockStmt{List: []IStmt{body}}
  296. }
  297. stmt = &ForStmt{varDecl, cond, nil, block}
  298. } else {
  299. stmt = &WhileStmt{cond, body}
  300. }
  301. case ForToken:
  302. p.next()
  303. await := p.await && p.tt == AwaitToken
  304. if await {
  305. p.next()
  306. }
  307. if !p.consume("for statement", OpenParenToken) {
  308. return
  309. }
  310. body := &BlockStmt{}
  311. parent := p.enterScope(&body.Scope, false)
  312. var init IExpr
  313. p.in = false
  314. if p.tt == VarToken || p.tt == LetToken || p.tt == ConstToken {
  315. tt := p.tt
  316. p.next()
  317. varDecl := p.parseVarDecl(tt, true)
  318. if p.err != nil {
  319. return
  320. } else if p.tt != SemicolonToken && (1 < len(varDecl.List) || varDecl.List[0].Default != nil) {
  321. p.fail("for statement")
  322. return
  323. } else if p.tt == SemicolonToken && varDecl.List[0].Default == nil {
  324. // all but the first item were already verified
  325. if _, ok := varDecl.List[0].Binding.(*Var); !ok {
  326. p.fail("for statement")
  327. return
  328. }
  329. }
  330. init = varDecl
  331. } else if await {
  332. init = p.parseExpression(OpLHS)
  333. } else if p.tt != SemicolonToken {
  334. init = p.parseExpression(OpExpr)
  335. }
  336. p.in = true
  337. isLHSExpr := isLHSExpr(init)
  338. if isLHSExpr && p.tt == InToken {
  339. if await {
  340. p.fail("for statement", OfToken)
  341. return
  342. }
  343. p.next()
  344. value := p.parseExpression(OpExpr)
  345. if !p.consume("for statement", CloseParenToken) {
  346. return
  347. }
  348. p.scope.MarkForStmt()
  349. if p.tt == OpenBraceToken {
  350. body.List = p.parseStmtList("")
  351. } else if p.tt != SemicolonToken {
  352. body.List = []IStmt{p.parseStmt(false)}
  353. } else {
  354. p.next()
  355. }
  356. if varDecl, ok := init.(*VarDecl); ok {
  357. varDecl.InForInOf = true
  358. }
  359. stmt = &ForInStmt{init, value, body}
  360. } else if isLHSExpr && p.tt == OfToken {
  361. p.next()
  362. value := p.parseExpression(OpAssign)
  363. if !p.consume("for statement", CloseParenToken) {
  364. return
  365. }
  366. p.scope.MarkForStmt()
  367. if p.tt == OpenBraceToken {
  368. body.List = p.parseStmtList("")
  369. } else if p.tt != SemicolonToken {
  370. body.List = []IStmt{p.parseStmt(false)}
  371. } else {
  372. p.next()
  373. }
  374. if varDecl, ok := init.(*VarDecl); ok {
  375. varDecl.InForInOf = true
  376. }
  377. stmt = &ForOfStmt{await, init, value, body}
  378. } else if p.tt == SemicolonToken {
  379. var cond, post IExpr
  380. if await {
  381. p.fail("for statement", OfToken)
  382. return
  383. }
  384. p.next()
  385. if p.tt != SemicolonToken {
  386. cond = p.parseExpression(OpExpr)
  387. }
  388. if !p.consume("for statement", SemicolonToken) {
  389. return
  390. }
  391. if p.tt != CloseParenToken {
  392. post = p.parseExpression(OpExpr)
  393. }
  394. if !p.consume("for statement", CloseParenToken) {
  395. return
  396. }
  397. p.scope.MarkForStmt()
  398. if p.tt == OpenBraceToken {
  399. body.List = p.parseStmtList("")
  400. } else if p.tt != SemicolonToken {
  401. body.List = []IStmt{p.parseStmt(false)}
  402. } else {
  403. p.next()
  404. }
  405. if init == nil {
  406. varDecl := &VarDecl{TokenType: VarToken, Scope: p.scope, InFor: true}
  407. p.scope.Func.VarDecls = append(p.scope.Func.VarDecls, varDecl)
  408. init = varDecl
  409. } else if varDecl, ok := init.(*VarDecl); ok {
  410. varDecl.InFor = true
  411. }
  412. stmt = &ForStmt{init, cond, post, body}
  413. } else if isLHSExpr {
  414. p.fail("for statement", InToken, OfToken, SemicolonToken)
  415. return
  416. } else {
  417. p.fail("for statement", SemicolonToken)
  418. return
  419. }
  420. p.exitScope(parent)
  421. case SwitchToken:
  422. p.next()
  423. if !p.consume("switch statement", OpenParenToken) {
  424. return
  425. }
  426. init := p.parseExpression(OpExpr)
  427. if !p.consume("switch statement", CloseParenToken) {
  428. return
  429. }
  430. // case block
  431. if !p.consume("switch statement", OpenBraceToken) {
  432. return
  433. }
  434. switchStmt := &SwitchStmt{Init: init}
  435. parent := p.enterScope(&switchStmt.Scope, false)
  436. for {
  437. if p.tt == ErrorToken {
  438. p.fail("switch statement")
  439. return
  440. } else if p.tt == CloseBraceToken {
  441. p.next()
  442. break
  443. }
  444. clause := p.tt
  445. var list IExpr
  446. if p.tt == CaseToken {
  447. p.next()
  448. list = p.parseExpression(OpExpr)
  449. } else if p.tt == DefaultToken {
  450. p.next()
  451. } else {
  452. p.fail("switch statement", CaseToken, DefaultToken)
  453. return
  454. }
  455. if !p.consume("switch statement", ColonToken) {
  456. return
  457. }
  458. var stmts []IStmt
  459. for p.tt != CaseToken && p.tt != DefaultToken && p.tt != CloseBraceToken && p.tt != ErrorToken {
  460. stmts = append(stmts, p.parseStmt(true))
  461. }
  462. switchStmt.List = append(switchStmt.List, CaseClause{clause, list, stmts})
  463. }
  464. p.exitScope(parent)
  465. stmt = switchStmt
  466. case FunctionToken:
  467. if !allowDeclaration {
  468. p.fail("statement")
  469. return
  470. }
  471. stmt = p.parseFuncDecl()
  472. case AsyncToken: // async function
  473. if !allowDeclaration {
  474. p.fail("statement")
  475. return
  476. }
  477. async := p.data
  478. p.next()
  479. if p.tt == FunctionToken && !p.prevLT {
  480. stmt = p.parseAsyncFuncDecl()
  481. } else {
  482. // expression
  483. stmt = &ExprStmt{p.parseAsyncExpression(OpExpr, async)}
  484. if !p.prevLT && p.tt != SemicolonToken && p.tt != CloseBraceToken && p.tt != ErrorToken {
  485. p.fail("expression")
  486. return
  487. }
  488. }
  489. case ClassToken:
  490. if !allowDeclaration {
  491. p.fail("statement")
  492. return
  493. }
  494. stmt = p.parseClassDecl()
  495. case ThrowToken:
  496. p.next()
  497. if p.prevLT {
  498. p.failMessage("unexpected newline in throw statement")
  499. return
  500. }
  501. stmt = &ThrowStmt{p.parseExpression(OpExpr)}
  502. case TryToken:
  503. p.next()
  504. body := p.parseBlockStmt("try statement")
  505. var binding IBinding
  506. var catch, finally *BlockStmt
  507. if p.tt == CatchToken {
  508. p.next()
  509. catch = &BlockStmt{}
  510. parent := p.enterScope(&catch.Scope, false)
  511. if p.tt == OpenParenToken {
  512. p.next()
  513. binding = p.parseBinding(CatchDecl) // local to block scope of catch
  514. if !p.consume("try-catch statement", CloseParenToken) {
  515. return
  516. }
  517. }
  518. catch.List = p.parseStmtList("try-catch statement")
  519. p.exitScope(parent)
  520. } else if p.tt != FinallyToken {
  521. p.fail("try statement", CatchToken, FinallyToken)
  522. return
  523. }
  524. if p.tt == FinallyToken {
  525. p.next()
  526. finally = p.parseBlockStmt("try-finally statement")
  527. }
  528. stmt = &TryStmt{body, binding, catch, finally}
  529. case DebuggerToken:
  530. stmt = &DebuggerStmt{}
  531. p.next()
  532. case SemicolonToken:
  533. stmt = &EmptyStmt{}
  534. p.next()
  535. case CommentToken, CommentLineTerminatorToken:
  536. // bang comment
  537. stmt = &Comment{p.data}
  538. p.next()
  539. case ErrorToken:
  540. stmt = &EmptyStmt{}
  541. return
  542. default:
  543. if p.retrn && p.tt == ReturnToken {
  544. p.next()
  545. var value IExpr
  546. if !p.prevLT && p.tt != SemicolonToken && p.tt != CloseBraceToken && p.tt != ErrorToken {
  547. value = p.parseExpression(OpExpr)
  548. }
  549. stmt = &ReturnStmt{value}
  550. } else if p.isIdentifierReference(p.tt) {
  551. // LabelledStatement, Expression
  552. label := p.data
  553. p.next()
  554. if p.tt == ColonToken {
  555. p.next()
  556. prevDeflt := p.deflt
  557. if p.tt == FunctionToken {
  558. p.deflt = false
  559. }
  560. stmt = &LabelledStmt{label, p.parseStmt(true)} // allows illegal async function, generator function, let, const, or class declarations
  561. p.deflt = prevDeflt
  562. } else {
  563. // expression
  564. stmt = &ExprStmt{p.parseIdentifierExpression(OpExpr, label)}
  565. if !p.prevLT && p.tt != SemicolonToken && p.tt != CloseBraceToken && p.tt != ErrorToken {
  566. p.fail("expression")
  567. return
  568. }
  569. }
  570. } else {
  571. // expression
  572. stmt = &ExprStmt{p.parseExpression(OpExpr)}
  573. if !p.prevLT && p.tt != SemicolonToken && p.tt != CloseBraceToken && p.tt != ErrorToken {
  574. p.fail("expression")
  575. return
  576. } else if lit, ok := stmt.(*ExprStmt).Value.(*LiteralExpr); ok && allowDirectivePrologue && lit.TokenType == StringToken && len(lit.Data) == 12 && bytes.Equal(lit.Data[1:11], []byte("use strict")) {
  577. stmt = &DirectivePrologueStmt{lit.Data}
  578. p.allowDirectivePrologue = true
  579. }
  580. }
  581. }
  582. if !p.prevLT && p.tt == SemicolonToken {
  583. p.next()
  584. }
  585. p.stmtLevel--
  586. return
  587. }
  588. func (p *Parser) parseStmtList(in string) (list []IStmt) {
  589. if !p.consume(in, OpenBraceToken) {
  590. return
  591. }
  592. for {
  593. if p.tt == ErrorToken {
  594. p.fail("")
  595. return
  596. } else if p.tt == CloseBraceToken {
  597. p.next()
  598. break
  599. }
  600. list = append(list, p.parseStmt(true))
  601. }
  602. return
  603. }
  604. func (p *Parser) parseBlockStmt(in string) (blockStmt *BlockStmt) {
  605. blockStmt = &BlockStmt{}
  606. parent := p.enterScope(&blockStmt.Scope, false)
  607. blockStmt.List = p.parseStmtList(in)
  608. p.exitScope(parent)
  609. return
  610. }
  611. func (p *Parser) parseImportStmt() (importStmt ImportStmt) {
  612. // assume we're passed import
  613. if p.tt == StringToken {
  614. importStmt.Module = p.data
  615. p.next()
  616. } else {
  617. expectClause := true
  618. if IsIdentifier(p.tt) || p.tt == YieldToken {
  619. importStmt.Default = p.data
  620. p.next()
  621. expectClause = p.tt == CommaToken
  622. if expectClause {
  623. p.next()
  624. }
  625. }
  626. if expectClause && p.tt == MulToken {
  627. star := p.data
  628. p.next()
  629. if !p.consume("import statement", AsToken) {
  630. return
  631. }
  632. if !IsIdentifier(p.tt) && p.tt != YieldToken {
  633. p.fail("import statement", IdentifierToken)
  634. return
  635. }
  636. importStmt.List = []Alias{Alias{star, p.data}}
  637. p.next()
  638. } else if expectClause && p.tt == OpenBraceToken {
  639. p.next()
  640. importStmt.List = []Alias{}
  641. for IsIdentifierName(p.tt) || p.tt == StringToken {
  642. tt := p.tt
  643. var name, binding []byte = nil, p.data
  644. p.next()
  645. if p.tt == AsToken {
  646. p.next()
  647. if !IsIdentifier(p.tt) && p.tt != YieldToken {
  648. p.fail("import statement", IdentifierToken)
  649. return
  650. }
  651. name = binding
  652. binding = p.data
  653. p.next()
  654. } else if !IsIdentifier(tt) && tt != YieldToken || tt == StringToken {
  655. p.fail("import statement", IdentifierToken, StringToken)
  656. return
  657. }
  658. importStmt.List = append(importStmt.List, Alias{name, binding})
  659. if p.tt == CommaToken {
  660. p.next()
  661. if p.tt == CloseBraceToken {
  662. importStmt.List = append(importStmt.List, Alias{})
  663. break
  664. }
  665. }
  666. }
  667. if !p.consume("import statement", CloseBraceToken) {
  668. return
  669. }
  670. } else if expectClause && importStmt.Default != nil {
  671. p.fail("import statement", MulToken, OpenBraceToken)
  672. return
  673. } else if importStmt.Default == nil {
  674. p.fail("import statement", StringToken, IdentifierToken, MulToken, OpenBraceToken)
  675. return
  676. }
  677. if !p.consume("import statement", FromToken) {
  678. return
  679. }
  680. if p.tt != StringToken {
  681. p.fail("import statement", StringToken)
  682. return
  683. }
  684. importStmt.Module = p.data
  685. p.next()
  686. }
  687. if p.tt == SemicolonToken {
  688. p.next()
  689. }
  690. return
  691. }
  692. func (p *Parser) parseExportStmt() (exportStmt ExportStmt) {
  693. // assume we're at export
  694. p.next()
  695. prevYield, prevAwait, prevDeflt := p.yield, p.await, p.deflt
  696. p.yield, p.await, p.deflt = false, true, true
  697. if p.tt == MulToken || p.tt == OpenBraceToken {
  698. if p.tt == MulToken {
  699. star := p.data
  700. p.next()
  701. if p.tt == AsToken {
  702. p.next()
  703. if !IsIdentifierName(p.tt) && p.tt != StringToken {
  704. p.fail("export statement", IdentifierToken, StringToken)
  705. return
  706. }
  707. exportStmt.List = []Alias{Alias{star, p.data}}
  708. p.next()
  709. } else {
  710. exportStmt.List = []Alias{Alias{nil, star}}
  711. }
  712. if p.tt != FromToken {
  713. p.fail("export statement", FromToken)
  714. return
  715. }
  716. } else {
  717. p.next()
  718. for IsIdentifierName(p.tt) || p.tt == StringToken {
  719. var name, binding []byte = nil, p.data
  720. p.next()
  721. if p.tt == AsToken {
  722. p.next()
  723. if !IsIdentifierName(p.tt) && p.tt != StringToken {
  724. p.fail("export statement", IdentifierToken, StringToken)
  725. return
  726. }
  727. name = binding
  728. binding = p.data
  729. p.next()
  730. }
  731. exportStmt.List = append(exportStmt.List, Alias{name, binding})
  732. if p.tt == CommaToken {
  733. p.next()
  734. if p.tt == CloseBraceToken {
  735. exportStmt.List = append(exportStmt.List, Alias{})
  736. break
  737. }
  738. }
  739. }
  740. if !p.consume("export statement", CloseBraceToken) {
  741. return
  742. }
  743. }
  744. if p.tt == FromToken {
  745. p.next()
  746. if p.tt != StringToken {
  747. p.fail("export statement", StringToken)
  748. return
  749. }
  750. exportStmt.Module = p.data
  751. p.next()
  752. }
  753. } else if p.tt == VarToken || p.tt == ConstToken || p.tt == LetToken {
  754. tt := p.tt
  755. p.next()
  756. exportStmt.Decl = p.parseVarDecl(tt, false)
  757. } else if p.tt == FunctionToken {
  758. exportStmt.Decl = p.parseFuncDecl()
  759. } else if p.tt == AsyncToken { // async function
  760. p.next()
  761. if p.tt != FunctionToken || p.prevLT {
  762. p.fail("export statement", FunctionToken)
  763. return
  764. }
  765. exportStmt.Decl = p.parseAsyncFuncDecl()
  766. } else if p.tt == ClassToken {
  767. exportStmt.Decl = p.parseClassDecl()
  768. } else if p.tt == DefaultToken {
  769. exportStmt.Default = true
  770. p.next()
  771. if p.tt == FunctionToken {
  772. exportStmt.Decl = p.parseFuncDecl()
  773. } else if p.tt == AsyncToken { // async function or async arrow function
  774. async := p.data
  775. p.next()
  776. if p.tt == FunctionToken && !p.prevLT {
  777. exportStmt.Decl = p.parseAsyncFuncDecl()
  778. } else {
  779. // expression
  780. exportStmt.Decl = p.parseAsyncExpression(OpExpr, async)
  781. }
  782. } else if p.tt == ClassToken {
  783. exportStmt.Decl = p.parseClassDecl()
  784. } else {
  785. exportStmt.Decl = p.parseExpression(OpAssign)
  786. }
  787. } else {
  788. p.fail("export statement", MulToken, OpenBraceToken, VarToken, LetToken, ConstToken, FunctionToken, AsyncToken, ClassToken, DefaultToken)
  789. return
  790. }
  791. if p.tt == SemicolonToken {
  792. p.next()
  793. }
  794. p.yield, p.await, p.deflt = prevYield, prevAwait, prevDeflt
  795. return
  796. }
  797. func (p *Parser) parseVarDecl(tt TokenType, canBeHoisted bool) (varDecl *VarDecl) {
  798. // assume we're past var, let or const
  799. varDecl = &VarDecl{
  800. TokenType: tt,
  801. Scope: p.scope,
  802. }
  803. declType := LexicalDecl
  804. if tt == VarToken {
  805. declType = VariableDecl
  806. if canBeHoisted {
  807. p.scope.Func.VarDecls = append(p.scope.Func.VarDecls, varDecl)
  808. }
  809. }
  810. for {
  811. // binding element, var declaration in for-in or for-of can never have a default
  812. var bindingElement BindingElement
  813. bindingElement.Binding = p.parseBinding(declType)
  814. if p.tt == EqToken {
  815. p.next()
  816. bindingElement.Default = p.parseExpression(OpAssign)
  817. } else if _, ok := bindingElement.Binding.(*Var); !ok && (p.in || 0 < len(varDecl.List)) {
  818. p.fail("var statement", EqToken)
  819. return
  820. } else if tt == ConstToken && (p.in || !p.in && p.tt != OfToken && p.tt != InToken) {
  821. p.fail("const statement", EqToken)
  822. }
  823. varDecl.List = append(varDecl.List, bindingElement)
  824. if p.tt == CommaToken {
  825. p.next()
  826. } else {
  827. break
  828. }
  829. }
  830. return
  831. }
  832. func (p *Parser) parseFuncParams(in string) (params Params) {
  833. // FormalParameters
  834. if !p.consume(in, OpenParenToken) {
  835. return
  836. }
  837. for p.tt != CloseParenToken && p.tt != ErrorToken {
  838. if p.tt == EllipsisToken {
  839. // binding rest element
  840. p.next()
  841. params.Rest = p.parseBinding(ArgumentDecl)
  842. p.consume(in, CloseParenToken)
  843. return
  844. }
  845. params.List = append(params.List, p.parseBindingElement(ArgumentDecl))
  846. if p.tt != CommaToken {
  847. break
  848. }
  849. p.next()
  850. }
  851. if p.tt != CloseParenToken {
  852. p.fail(in)
  853. return
  854. }
  855. p.next()
  856. // mark undeclared vars as arguments in `function f(a=b){var b}` where the b's are different vars
  857. p.scope.MarkFuncArgs()
  858. return
  859. }
  860. func (p *Parser) parseFuncDecl() (funcDecl *FuncDecl) {
  861. return p.parseFunc(false, false)
  862. }
  863. func (p *Parser) parseAsyncFuncDecl() (funcDecl *FuncDecl) {
  864. return p.parseFunc(true, false)
  865. }
  866. func (p *Parser) parseFuncExpr() (funcDecl *FuncDecl) {
  867. return p.parseFunc(false, true)
  868. }
  869. func (p *Parser) parseAsyncFuncExpr() (funcDecl *FuncDecl) {
  870. return p.parseFunc(true, true)
  871. }
  872. func (p *Parser) parseFunc(async, expr bool) (funcDecl *FuncDecl) {
  873. // assume we're at function
  874. p.next()
  875. funcDecl = &FuncDecl{}
  876. funcDecl.Async = async
  877. funcDecl.Generator = p.tt == MulToken
  878. if funcDecl.Generator {
  879. p.next()
  880. }
  881. var ok bool
  882. var name []byte
  883. if expr && (IsIdentifier(p.tt) || p.tt == YieldToken || p.tt == AwaitToken) || !expr && p.isIdentifierReference(p.tt) {
  884. name = p.data
  885. if !expr {
  886. funcDecl.Name, ok = p.scope.Declare(FunctionDecl, p.data)
  887. if !ok {
  888. p.failMessage("identifier %s has already been declared", string(p.data))
  889. return
  890. }
  891. }
  892. p.next()
  893. } else if !expr && !p.deflt {
  894. p.fail("function declaration", IdentifierToken)
  895. return
  896. } else if p.tt != OpenParenToken {
  897. p.fail("function declaration", IdentifierToken, OpenParenToken)
  898. return
  899. }
  900. parent := p.enterScope(&funcDecl.Body.Scope, true)
  901. prevAwait, prevYield, prevRetrn := p.await, p.yield, p.retrn
  902. p.await, p.yield, p.retrn = funcDecl.Async, funcDecl.Generator, true
  903. if expr && name != nil {
  904. funcDecl.Name, _ = p.scope.Declare(ExprDecl, name) // cannot fail
  905. }
  906. funcDecl.Params = p.parseFuncParams("function declaration")
  907. prevAllowDirectivePrologue, prevExprLevel := p.allowDirectivePrologue, p.exprLevel
  908. p.allowDirectivePrologue, p.exprLevel = true, 0
  909. funcDecl.Body.List = p.parseStmtList("function declaration")
  910. p.allowDirectivePrologue, p.exprLevel = prevAllowDirectivePrologue, prevExprLevel
  911. p.await, p.yield, p.retrn = prevAwait, prevYield, prevRetrn
  912. p.exitScope(parent)
  913. return
  914. }
  915. func (p *Parser) parseClassDecl() (classDecl *ClassDecl) {
  916. return p.parseAnyClass(false)
  917. }
  918. func (p *Parser) parseClassExpr() (classDecl *ClassDecl) {
  919. return p.parseAnyClass(true)
  920. }
  921. func (p *Parser) parseAnyClass(expr bool) (classDecl *ClassDecl) {
  922. // assume we're at class
  923. p.next()
  924. classDecl = &ClassDecl{}
  925. if IsIdentifier(p.tt) || p.tt == YieldToken || p.tt == AwaitToken {
  926. if !expr {
  927. var ok bool
  928. classDecl.Name, ok = p.scope.Declare(LexicalDecl, p.data)
  929. if !ok {
  930. p.failMessage("identifier %s has already been declared", string(p.data))
  931. return
  932. }
  933. } else {
  934. //classDecl.Name, ok = p.scope.Declare(ExprDecl, p.data) // classes do not register vars
  935. classDecl.Name = &Var{p.data, nil, 1, ExprDecl}
  936. }
  937. p.next()
  938. } else if !expr && !p.deflt {
  939. p.fail("class declaration", IdentifierToken)
  940. return
  941. }
  942. if p.tt == ExtendsToken {
  943. p.next()
  944. classDecl.Extends = p.parseExpression(OpLHS)
  945. }
  946. if !p.consume("class declaration", OpenBraceToken) {
  947. return
  948. }
  949. for {
  950. if p.tt == ErrorToken {
  951. p.fail("class declaration")
  952. return
  953. } else if p.tt == SemicolonToken {
  954. p.next()
  955. continue
  956. } else if p.tt == CloseBraceToken {
  957. p.next()
  958. break
  959. }
  960. classDecl.List = append(classDecl.List, p.parseClassElement())
  961. }
  962. return
  963. }
  964. func (p *Parser) parseClassElement() ClassElement {
  965. method := &MethodDecl{}
  966. var data []byte // either static, async, get, or set
  967. if p.tt == StaticToken {
  968. method.Static = true
  969. data = p.data
  970. p.next()
  971. if p.tt == OpenBraceToken {
  972. prevYield, prevAwait, prevRetrn := p.yield, p.await, p.retrn
  973. p.yield, p.await, p.retrn = false, true, false
  974. elem := ClassElement{StaticBlock: p.parseBlockStmt("class static block")}
  975. p.yield, p.await, p.retrn = prevYield, prevAwait, prevRetrn
  976. return elem
  977. }
  978. }
  979. if p.tt == MulToken {
  980. method.Generator = true
  981. p.next()
  982. } else if p.tt == AsyncToken {
  983. data = p.data
  984. p.next()
  985. if !p.prevLT {
  986. method.Async = true
  987. if p.tt == MulToken {
  988. method.Generator = true
  989. data = nil
  990. p.next()
  991. }
  992. }
  993. } else if p.tt == GetToken {
  994. method.Get = true
  995. data = p.data
  996. p.next()
  997. } else if p.tt == SetToken {
  998. method.Set = true
  999. data = p.data
  1000. p.next()
  1001. }
  1002. isField := false
  1003. if data != nil && p.tt == OpenParenToken {
  1004. // (static) method name is: static, async, get, or set
  1005. method.Name.Literal = LiteralExpr{IdentifierToken, data}
  1006. if method.Async || method.Get || method.Set {
  1007. method.Async = false
  1008. method.Get = false
  1009. method.Set = false
  1010. } else {
  1011. method.Static = false
  1012. }
  1013. } else if data != nil && (p.tt == EqToken || p.tt == SemicolonToken || p.tt == CloseBraceToken) {
  1014. // (static) field name is: static, async, get, or set
  1015. method.Name.Literal = LiteralExpr{IdentifierToken, data}
  1016. if !method.Async && !method.Get && !method.Set {
  1017. method.Static = false
  1018. }
  1019. isField = true
  1020. } else {
  1021. if p.tt == PrivateIdentifierToken {
  1022. method.Name.Literal = LiteralExpr{p.tt, p.data}
  1023. p.next()
  1024. } else {
  1025. method.Name = p.parsePropertyName("method or field definition")
  1026. }
  1027. if (data == nil || method.Static) && p.tt != OpenParenToken {
  1028. isField = true
  1029. }
  1030. }
  1031. if isField {
  1032. var init IExpr
  1033. if p.tt == EqToken {
  1034. p.next()
  1035. init = p.parseExpression(OpAssign)
  1036. }
  1037. return ClassElement{Field: Field{Static: method.Static, Name: method.Name, Init: init}}
  1038. }
  1039. parent := p.enterScope(&method.Body.Scope, true)
  1040. prevAwait, prevYield, prevRetrn := p.await, p.yield, p.retrn
  1041. p.await, p.yield, p.retrn = method.Async, method.Generator, true
  1042. method.Params = p.parseFuncParams("method definition")
  1043. prevAllowDirectivePrologue, prevExprLevel := p.allowDirectivePrologue, p.exprLevel
  1044. p.allowDirectivePrologue, p.exprLevel = true, 0
  1045. method.Body.List = p.parseStmtList("method function")
  1046. p.allowDirectivePrologue, p.exprLevel = prevAllowDirectivePrologue, prevExprLevel
  1047. p.await, p.yield, p.retrn = prevAwait, prevYield, prevRetrn
  1048. p.exitScope(parent)
  1049. return ClassElement{Method: method}
  1050. }
  1051. func (p *Parser) parsePropertyName(in string) (propertyName PropertyName) {
  1052. if IsIdentifierName(p.tt) {
  1053. propertyName.Literal = LiteralExpr{IdentifierToken, p.data}
  1054. p.next()
  1055. } else if p.tt == StringToken {
  1056. // reinterpret string as identifier or number if we can, except for empty strings
  1057. if isIdent := AsIdentifierName(p.data[1 : len(p.data)-1]); isIdent {
  1058. propertyName.Literal = LiteralExpr{IdentifierToken, p.data[1 : len(p.data)-1]}
  1059. } else if isNum := AsDecimalLiteral(p.data[1 : len(p.data)-1]); isNum {
  1060. propertyName.Literal = LiteralExpr{DecimalToken, p.data[1 : len(p.data)-1]}
  1061. } else {
  1062. propertyName.Literal = LiteralExpr{p.tt, p.data}
  1063. }
  1064. p.next()
  1065. } else if IsNumeric(p.tt) {
  1066. propertyName.Literal = LiteralExpr{p.tt, p.data}
  1067. p.next()
  1068. } else if p.tt == OpenBracketToken {
  1069. p.next()
  1070. propertyName.Computed = p.parseExpression(OpAssign)
  1071. if !p.consume(in, CloseBracketToken) {
  1072. return
  1073. }
  1074. } else {
  1075. p.fail(in, IdentifierToken, StringToken, NumericToken, OpenBracketToken)
  1076. return
  1077. }
  1078. return
  1079. }
  1080. func (p *Parser) parseBindingElement(decl DeclType) (bindingElement BindingElement) {
  1081. // BindingElement
  1082. bindingElement.Binding = p.parseBinding(decl)
  1083. if p.tt == EqToken {
  1084. p.next()
  1085. bindingElement.Default = p.parseExpression(OpAssign)
  1086. }
  1087. return
  1088. }
  1089. func (p *Parser) parseBinding(decl DeclType) (binding IBinding) {
  1090. // BindingIdentifier, BindingPattern
  1091. if p.isIdentifierReference(p.tt) {
  1092. var ok bool
  1093. binding, ok = p.scope.Declare(decl, p.data)
  1094. if !ok {
  1095. p.failMessage("identifier %s has already been declared", string(p.data))
  1096. return
  1097. }
  1098. p.next()
  1099. } else if p.tt == OpenBracketToken {
  1100. p.next()
  1101. array := BindingArray{}
  1102. if p.tt == CommaToken {
  1103. array.List = append(array.List, BindingElement{})
  1104. }
  1105. last := 0
  1106. for p.tt != CloseBracketToken {
  1107. // elision
  1108. for p.tt == CommaToken {
  1109. p.next()
  1110. if p.tt == CommaToken {
  1111. array.List = append(array.List, BindingElement{})
  1112. }
  1113. }
  1114. // binding rest element
  1115. if p.tt == EllipsisToken {
  1116. p.next()
  1117. array.Rest = p.parseBinding(decl)
  1118. if p.tt != CloseBracketToken {
  1119. p.fail("array binding pattern", CloseBracketToken)
  1120. return
  1121. }
  1122. break
  1123. } else if p.tt == CloseBracketToken {
  1124. array.List = array.List[:last]
  1125. break
  1126. }
  1127. array.List = append(array.List, p.parseBindingElement(decl))
  1128. last = len(array.List)
  1129. if p.tt != CommaToken && p.tt != CloseBracketToken {
  1130. p.fail("array binding pattern", CommaToken, CloseBracketToken)
  1131. return
  1132. }
  1133. }
  1134. p.next() // always CloseBracketToken
  1135. binding = &array
  1136. } else if p.tt == OpenBraceToken {
  1137. p.next()
  1138. object := BindingObject{}
  1139. for p.tt != CloseBraceToken {
  1140. // binding rest property
  1141. if p.tt == EllipsisToken {
  1142. p.next()
  1143. if !p.isIdentifierReference(p.tt) {
  1144. p.fail("object binding pattern", IdentifierToken)
  1145. return
  1146. }
  1147. var ok bool
  1148. object.Rest, ok = p.scope.Declare(decl, p.data)
  1149. if !ok {
  1150. p.failMessage("identifier %s has already been declared", string(p.data))
  1151. return
  1152. }
  1153. p.next()
  1154. if p.tt != CloseBraceToken {
  1155. p.fail("object binding pattern", CloseBraceToken)
  1156. return
  1157. }
  1158. break
  1159. }
  1160. item := BindingObjectItem{}
  1161. if p.isIdentifierReference(p.tt) {
  1162. name := p.data
  1163. item.Key = &PropertyName{LiteralExpr{IdentifierToken, p.data}, nil}
  1164. p.next()
  1165. if p.tt == ColonToken {
  1166. // property name + : + binding element
  1167. p.next()
  1168. item.Value = p.parseBindingElement(decl)
  1169. } else {
  1170. // single name binding
  1171. var ok bool
  1172. item.Key.Literal.Data = parse.Copy(item.Key.Literal.Data) // copy so that renaming doesn't rename the key
  1173. item.Value.Binding, ok = p.scope.Declare(decl, name)
  1174. if !ok {
  1175. p.failMessage("identifier %s has already been declared", string(name))
  1176. return
  1177. }
  1178. if p.tt == EqToken {
  1179. p.next()
  1180. item.Value.Default = p.parseExpression(OpAssign)
  1181. }
  1182. }
  1183. } else {
  1184. propertyName := p.parsePropertyName("object binding pattern")
  1185. item.Key = &propertyName
  1186. if !p.consume("object binding pattern", ColonToken) {
  1187. return
  1188. }
  1189. item.Value = p.parseBindingElement(decl)
  1190. }
  1191. object.List = append(object.List, item)
  1192. if p.tt == CommaToken {
  1193. p.next()
  1194. } else if p.tt != CloseBraceToken {
  1195. p.fail("object binding pattern", CommaToken, CloseBraceToken)
  1196. return
  1197. }
  1198. }
  1199. p.next() // always CloseBracketToken
  1200. binding = &object
  1201. } else {
  1202. p.fail("binding")
  1203. return
  1204. }
  1205. return
  1206. }
  1207. func (p *Parser) parseArrayLiteral() (array ArrayExpr) {
  1208. // assume we're on [
  1209. p.next()
  1210. prevComma := true
  1211. for {
  1212. if p.tt == ErrorToken {
  1213. p.fail("expression")
  1214. return
  1215. } else if p.tt == CloseBracketToken {
  1216. p.next()
  1217. break
  1218. } else if p.tt == CommaToken {
  1219. if prevComma {
  1220. array.List = append(array.List, Element{})
  1221. }
  1222. prevComma = true
  1223. p.next()
  1224. } else {
  1225. spread := p.tt == EllipsisToken
  1226. if spread {
  1227. p.next()
  1228. }
  1229. array.List = append(array.List, Element{p.parseAssignExprOrParam(), spread})
  1230. prevComma = false
  1231. if spread && p.tt != CloseBracketToken {
  1232. p.assumeArrowFunc = false
  1233. }
  1234. }
  1235. }
  1236. return
  1237. }
  1238. func (p *Parser) parseObjectLiteral() (object ObjectExpr) {
  1239. // assume we're on {
  1240. p.next()
  1241. for {
  1242. if p.tt == ErrorToken {
  1243. p.fail("object literal", CloseBraceToken)
  1244. return
  1245. } else if p.tt == CloseBraceToken {
  1246. p.next()
  1247. break
  1248. }
  1249. property := Property{}
  1250. if p.tt == EllipsisToken {
  1251. p.next()
  1252. property.Spread = true
  1253. property.Value = p.parseAssignExprOrParam()
  1254. if _, isIdent := property.Value.(*Var); !isIdent || p.tt != CloseBraceToken {
  1255. p.assumeArrowFunc = false
  1256. }
  1257. } else {
  1258. // try to parse as MethodDefinition, otherwise fall back to PropertyName:AssignExpr or IdentifierReference
  1259. var data []byte
  1260. method := MethodDecl{}
  1261. if p.tt == MulToken {
  1262. p.next()
  1263. method.Generator = true
  1264. } else if p.tt == AsyncToken {
  1265. data = p.data
  1266. p.next()
  1267. if !p.prevLT {
  1268. method.Async = true
  1269. if p.tt == MulToken {
  1270. p.next()
  1271. method.Generator = true
  1272. data = nil
  1273. }
  1274. } else {
  1275. method.Name.Literal = LiteralExpr{IdentifierToken, data}
  1276. data = nil
  1277. }
  1278. } else if p.tt == GetToken {
  1279. data = p.data
  1280. p.next()
  1281. method.Get = true
  1282. } else if p.tt == SetToken {
  1283. data = p.data
  1284. p.next()
  1285. method.Set = true
  1286. }
  1287. // PropertyName
  1288. if data != nil && !method.Generator && (p.tt == EqToken || p.tt == CommaToken || p.tt == CloseBraceToken || p.tt == ColonToken || p.tt == OpenParenToken) {
  1289. method.Name.Literal = LiteralExpr{IdentifierToken, data}
  1290. method.Async = false
  1291. method.Get = false
  1292. method.Set = false
  1293. } else if !method.Name.IsSet() { // did not parse async [LT]
  1294. method.Name = p.parsePropertyName("object literal")
  1295. if !method.Name.IsSet() {
  1296. return
  1297. }
  1298. }
  1299. if p.tt == OpenParenToken {
  1300. // MethodDefinition
  1301. parent := p.enterScope(&method.Body.Scope, true)
  1302. prevAwait, prevYield, prevRetrn := p.await, p.yield, p.retrn
  1303. p.await, p.yield, p.retrn = method.Async, method.Generator, true
  1304. method.Params = p.parseFuncParams("method definition")
  1305. method.Body.List = p.parseStmtList("method definition")
  1306. p.await, p.yield, p.retrn = prevAwait, prevYield, prevRetrn
  1307. p.exitScope(parent)
  1308. property.Value = &method
  1309. p.assumeArrowFunc = false
  1310. } else if p.tt == ColonToken {
  1311. // PropertyName : AssignmentExpression
  1312. p.next()
  1313. property.Name = &method.Name
  1314. property.Value = p.parseAssignExprOrParam()
  1315. } else if method.Name.IsComputed() || !p.isIdentifierReference(method.Name.Literal.TokenType) {
  1316. p.fail("object literal", ColonToken, OpenParenToken)
  1317. return
  1318. } else {
  1319. // IdentifierReference (= AssignmentExpression)?
  1320. name := method.Name.Literal.Data
  1321. method.Name.Literal.Data = parse.Copy(method.Name.Literal.Data) // copy so that renaming doesn't rename the key
  1322. property.Name = &method.Name // set key explicitly so after renaming the original is still known
  1323. if p.assumeArrowFunc {
  1324. var ok bool
  1325. property.Value, ok = p.scope.Declare(ArgumentDecl, name)
  1326. if !ok {
  1327. property.Value = p.scope.Use(name)
  1328. p.assumeArrowFunc = false
  1329. }
  1330. } else {
  1331. property.Value = p.scope.Use(name)
  1332. }
  1333. if p.tt == EqToken {
  1334. p.next()
  1335. prevAssumeArrowFunc := p.assumeArrowFunc
  1336. p.assumeArrowFunc = false
  1337. property.Init = p.parseExpression(OpAssign)
  1338. p.assumeArrowFunc = prevAssumeArrowFunc
  1339. }
  1340. }
  1341. }
  1342. object.List = append(object.List, property)
  1343. if p.tt == CommaToken {
  1344. p.next()
  1345. } else if p.tt != CloseBraceToken {
  1346. p.fail("object literal")
  1347. return
  1348. }
  1349. }
  1350. return
  1351. }
  1352. func (p *Parser) parseTemplateLiteral(precLeft OpPrec) (template TemplateExpr) {
  1353. // assume we're on 'Template' or 'TemplateStart'
  1354. template.Prec = OpMember
  1355. if precLeft < OpMember {
  1356. template.Prec = OpCall
  1357. }
  1358. for p.tt == TemplateStartToken || p.tt == TemplateMiddleToken {
  1359. tpl := p.data
  1360. p.next()
  1361. template.List = append(template.List, TemplatePart{tpl, p.parseExpression(OpExpr)})
  1362. }
  1363. if p.tt != TemplateToken && p.tt != TemplateEndToken {
  1364. p.fail("template literal", TemplateToken)
  1365. return
  1366. }
  1367. template.Tail = p.data
  1368. p.next() // TemplateEndToken
  1369. return
  1370. }
  1371. func (p *Parser) parseArguments() (args Args) {
  1372. // assume we're on (
  1373. p.next()
  1374. args.List = make([]Arg, 0, 4)
  1375. for p.tt != CloseParenToken && p.tt != ErrorToken {
  1376. rest := p.tt == EllipsisToken
  1377. if rest {
  1378. p.next()
  1379. }
  1380. args.List = append(args.List, Arg{
  1381. Value: p.parseExpression(OpAssign),
  1382. Rest: rest,
  1383. })
  1384. if p.tt != CloseParenToken {
  1385. if p.tt != CommaToken {
  1386. p.fail("arguments", CommaToken, CloseParenToken)
  1387. return
  1388. } else {
  1389. p.next() // CommaToken
  1390. }
  1391. }
  1392. }
  1393. p.consume("arguments", CloseParenToken)
  1394. return
  1395. }
  1396. func (p *Parser) parseAsyncArrowFunc() (arrowFunc *ArrowFunc) {
  1397. // expect we're at Identifier or Yield or (
  1398. arrowFunc = &ArrowFunc{}
  1399. parent := p.enterScope(&arrowFunc.Body.Scope, true)
  1400. prevAwait, prevYield := p.await, p.yield
  1401. p.await, p.yield = true, false
  1402. if IsIdentifier(p.tt) || !prevYield && p.tt == YieldToken {
  1403. ref, _ := p.scope.Declare(ArgumentDecl, p.data) // cannot fail
  1404. p.next()
  1405. arrowFunc.Params.List = []BindingElement{{Binding: ref}}
  1406. } else {
  1407. arrowFunc.Params = p.parseFuncParams("arrow function")
  1408. // CallExpression of 'async(params)' already handled
  1409. }
  1410. arrowFunc.Async = true
  1411. arrowFunc.Body.List = p.parseArrowFuncBody()
  1412. p.await, p.yield = prevAwait, prevYield
  1413. p.exitScope(parent)
  1414. return
  1415. }
  1416. func (p *Parser) parseIdentifierArrowFunc(v *Var) (arrowFunc *ArrowFunc) {
  1417. // expect we're at =>
  1418. arrowFunc = &ArrowFunc{}
  1419. parent := p.enterScope(&arrowFunc.Body.Scope, true)
  1420. prevAwait, prevYield := p.await, p.yield
  1421. p.await, p.yield = false, false
  1422. if 1 < v.Uses {
  1423. v.Uses--
  1424. v, _ = p.scope.Declare(ArgumentDecl, parse.Copy(v.Data)) // cannot fail
  1425. } else {
  1426. // if v.Uses==1 it must be undeclared and be the last added
  1427. p.scope.Parent.Undeclared = p.scope.Parent.Undeclared[:len(p.scope.Parent.Undeclared)-1]
  1428. v.Decl = ArgumentDecl
  1429. p.scope.Declared = append(p.scope.Declared, v)
  1430. }
  1431. arrowFunc.Params.List = []BindingElement{{v, nil}}
  1432. arrowFunc.Body.List = p.parseArrowFuncBody()
  1433. p.await, p.yield = prevAwait, prevYield
  1434. p.exitScope(parent)
  1435. return
  1436. }
  1437. func (p *Parser) parseArrowFuncBody() (list []IStmt) {
  1438. // expect we're at arrow
  1439. if p.tt != ArrowToken {
  1440. p.fail("arrow function", ArrowToken)
  1441. return
  1442. } else if p.prevLT {
  1443. p.fail("expression")
  1444. return
  1445. }
  1446. p.next()
  1447. // mark undeclared vars as arguments in `function f(a=b){var b}` where the b's are different vars
  1448. p.scope.MarkFuncArgs()
  1449. if p.tt == OpenBraceToken {
  1450. prevIn, prevRetrn := p.in, p.retrn
  1451. p.in, p.retrn = true, true
  1452. prevAllowDirectivePrologue, prevExprLevel := p.allowDirectivePrologue, p.exprLevel
  1453. p.allowDirectivePrologue, p.exprLevel = true, 0
  1454. list = p.parseStmtList("arrow function")
  1455. p.allowDirectivePrologue, p.exprLevel = prevAllowDirectivePrologue, prevExprLevel
  1456. p.in, p.retrn = prevIn, prevRetrn
  1457. } else {
  1458. list = []IStmt{&ReturnStmt{p.parseExpression(OpAssign)}}
  1459. }
  1460. return
  1461. }
  1462. func (p *Parser) parseIdentifierExpression(prec OpPrec, ident []byte) IExpr {
  1463. var left IExpr
  1464. left = p.scope.Use(ident)
  1465. return p.parseExpressionSuffix(left, prec, OpPrimary)
  1466. }
  1467. func (p *Parser) parseAsyncExpression(prec OpPrec, async []byte) IExpr {
  1468. // IdentifierReference, AsyncFunctionExpression, AsyncGeneratorExpression
  1469. // CoverCallExpressionAndAsyncArrowHead, AsyncArrowFunction
  1470. // assume we're at a token after async
  1471. var left IExpr
  1472. precLeft := OpPrimary
  1473. if !p.prevLT && p.tt == FunctionToken {
  1474. // primary expression
  1475. left = p.parseAsyncFuncExpr()
  1476. } else if !p.prevLT && prec <= OpAssign && (p.tt == OpenParenToken || IsIdentifier(p.tt) || p.tt == YieldToken || p.tt == AwaitToken) {
  1477. // async arrow function expression or call expression
  1478. if p.tt == AwaitToken || p.yield && p.tt == YieldToken {
  1479. p.fail("arrow function")
  1480. return nil
  1481. } else if p.tt == OpenParenToken {
  1482. return p.parseParenthesizedExpression(prec, async)
  1483. }
  1484. left = p.parseAsyncArrowFunc()
  1485. precLeft = OpAssign
  1486. } else {
  1487. left = p.scope.Use(async)
  1488. }
  1489. // can be async(args), async => ..., or e.g. async + ...
  1490. return p.parseExpressionSuffix(left, prec, precLeft)
  1491. }
  1492. // parseExpression parses an expression that has a precedence of prec or higher.
  1493. func (p *Parser) parseExpression(prec OpPrec) IExpr {
  1494. p.exprLevel++
  1495. if 1000 < p.exprLevel {
  1496. p.failMessage("too many nested expressions")
  1497. return nil
  1498. }
  1499. // reparse input if we have / or /= as the beginning of a new expression, this should be a regular expression!
  1500. if p.tt == DivToken || p.tt == DivEqToken {
  1501. p.tt, p.data = p.l.RegExp()
  1502. if p.tt == ErrorToken {
  1503. p.fail("regular expression")
  1504. return nil
  1505. }
  1506. }
  1507. var left IExpr
  1508. precLeft := OpPrimary
  1509. if IsIdentifier(p.tt) && p.tt != AsyncToken {
  1510. left = p.scope.Use(p.data)
  1511. p.next()
  1512. suffix := p.parseExpressionSuffix(left, prec, precLeft)
  1513. p.exprLevel--
  1514. return suffix
  1515. } else if IsNumeric(p.tt) {
  1516. left = &LiteralExpr{p.tt, p.data}
  1517. p.next()
  1518. suffix := p.parseExpressionSuffix(left, prec, precLeft)
  1519. p.exprLevel--
  1520. return suffix
  1521. }
  1522. switch tt := p.tt; tt {
  1523. case StringToken, ThisToken, NullToken, TrueToken, FalseToken, RegExpToken:
  1524. left = &LiteralExpr{p.tt, p.data}
  1525. p.next()
  1526. case OpenBracketToken:
  1527. prevIn := p.in
  1528. p.in = true
  1529. array := p.parseArrayLiteral()
  1530. p.in = prevIn
  1531. left = &array
  1532. case OpenBraceToken:
  1533. prevIn := p.in
  1534. p.in = true
  1535. object := p.parseObjectLiteral()
  1536. p.in = prevIn
  1537. left = &object
  1538. case OpenParenToken:
  1539. // parenthesized expression or arrow parameter list
  1540. if OpAssign < prec {
  1541. // must be a parenthesized expression
  1542. p.next()
  1543. prevIn := p.in
  1544. p.in = true
  1545. left = &GroupExpr{p.parseExpression(OpExpr)}
  1546. p.in = prevIn
  1547. if !p.consume("expression", CloseParenToken) {
  1548. return nil
  1549. }
  1550. break
  1551. }
  1552. suffix := p.parseParenthesizedExpression(prec, nil)
  1553. p.exprLevel--
  1554. return suffix
  1555. case NotToken, BitNotToken, TypeofToken, VoidToken, DeleteToken:
  1556. if OpUnary < prec {
  1557. p.fail("expression")
  1558. return nil
  1559. }
  1560. p.next()
  1561. left = &UnaryExpr{tt, p.parseExpression(OpUnary)}
  1562. precLeft = OpUnary
  1563. case AddToken:
  1564. if OpUnary < prec {
  1565. p.fail("expression")
  1566. return nil
  1567. }
  1568. p.next()
  1569. left = &UnaryExpr{PosToken, p.parseExpression(OpUnary)}
  1570. precLeft = OpUnary
  1571. case SubToken:
  1572. if OpUnary < prec {
  1573. p.fail("expression")
  1574. return nil
  1575. }
  1576. p.next()
  1577. left = &UnaryExpr{NegToken, p.parseExpression(OpUnary)}
  1578. precLeft = OpUnary
  1579. case IncrToken:
  1580. if OpUpdate < prec {
  1581. p.fail("expression")
  1582. return nil
  1583. }
  1584. p.next()
  1585. left = &UnaryExpr{PreIncrToken, p.parseExpression(OpUnary)}
  1586. precLeft = OpUnary
  1587. case DecrToken:
  1588. if OpUpdate < prec {
  1589. p.fail("expression")
  1590. return nil
  1591. }
  1592. p.next()
  1593. left = &UnaryExpr{PreDecrToken, p.parseExpression(OpUnary)}
  1594. precLeft = OpUnary
  1595. case AwaitToken:
  1596. // either accepted as IdentifierReference or as AwaitExpression
  1597. if p.await && prec <= OpUnary {
  1598. p.next()
  1599. left = &UnaryExpr{tt, p.parseExpression(OpUnary)}
  1600. precLeft = OpUnary
  1601. } else if p.await {
  1602. p.fail("expression")
  1603. return nil
  1604. } else {
  1605. left = p.scope.Use(p.data)
  1606. p.next()
  1607. }
  1608. case NewToken:
  1609. p.next()
  1610. if p.tt == DotToken {
  1611. p.next()
  1612. if !p.consume("new.target expression", TargetToken) {
  1613. return nil
  1614. }
  1615. left = &NewTargetExpr{}
  1616. precLeft = OpMember
  1617. } else {
  1618. newExpr := &NewExpr{p.parseExpression(OpNew), nil}
  1619. if p.tt == OpenParenToken {
  1620. args := p.parseArguments()
  1621. if len(args.List) != 0 {
  1622. newExpr.Args = &args
  1623. }
  1624. precLeft = OpMember
  1625. } else {
  1626. precLeft = OpNew
  1627. }
  1628. left = newExpr
  1629. }
  1630. case ImportToken:
  1631. // OpMember < prec does never happen
  1632. left = &LiteralExpr{p.tt, p.data}
  1633. p.next()
  1634. if p.tt == DotToken {
  1635. p.next()
  1636. if !p.consume("import.meta expression", MetaToken) {
  1637. return nil
  1638. }
  1639. left = &ImportMetaExpr{}
  1640. precLeft = OpMember
  1641. } else if p.tt != OpenParenToken {
  1642. p.fail("import expression", OpenParenToken)
  1643. return nil
  1644. } else if OpCall < prec {
  1645. p.fail("expression")
  1646. return nil
  1647. } else {
  1648. precLeft = OpCall
  1649. }
  1650. case SuperToken:
  1651. // OpMember < prec does never happen
  1652. left = &LiteralExpr{p.tt, p.data}
  1653. p.next()
  1654. if OpCall < prec && p.tt != DotToken && p.tt != OpenBracketToken {
  1655. p.fail("super expression", OpenBracketToken, DotToken)
  1656. return nil
  1657. } else if p.tt != DotToken && p.tt != OpenBracketToken && p.tt != OpenParenToken {
  1658. p.fail("super expression", OpenBracketToken, OpenParenToken, DotToken)
  1659. return nil
  1660. }
  1661. if OpCall < prec {
  1662. precLeft = OpMember
  1663. } else {
  1664. precLeft = OpCall
  1665. }
  1666. case YieldToken:
  1667. // either accepted as IdentifierReference or as YieldExpression
  1668. if p.yield && prec <= OpAssign {
  1669. // YieldExpression
  1670. p.next()
  1671. yieldExpr := YieldExpr{}
  1672. if !p.prevLT {
  1673. yieldExpr.Generator = p.tt == MulToken
  1674. if yieldExpr.Generator {
  1675. p.next()
  1676. yieldExpr.X = p.parseExpression(OpAssign)
  1677. } else if p.tt != CloseBraceToken && p.tt != CloseBracketToken && p.tt != CloseParenToken && p.tt != ColonToken && p.tt != CommaToken && p.tt != SemicolonToken {
  1678. yieldExpr.X = p.parseExpression(OpAssign)
  1679. }
  1680. }
  1681. left = &yieldExpr
  1682. precLeft = OpAssign
  1683. } else if p.yield {
  1684. p.fail("expression")
  1685. return nil
  1686. } else {
  1687. left = p.scope.Use(p.data)
  1688. p.next()
  1689. }
  1690. case AsyncToken:
  1691. async := p.data
  1692. p.next()
  1693. prevIn := p.in
  1694. p.in = true
  1695. left = p.parseAsyncExpression(prec, async)
  1696. p.in = prevIn
  1697. case ClassToken:
  1698. prevIn := p.in
  1699. p.in = true
  1700. left = p.parseClassExpr()
  1701. p.in = prevIn
  1702. case FunctionToken:
  1703. prevIn := p.in
  1704. p.in = true
  1705. left = p.parseFuncExpr()
  1706. p.in = prevIn
  1707. case TemplateToken, TemplateStartToken:
  1708. prevIn := p.in
  1709. p.in = true
  1710. template := p.parseTemplateLiteral(precLeft)
  1711. left = &template
  1712. p.in = prevIn
  1713. case PrivateIdentifierToken:
  1714. if OpCompare < prec || !p.in {
  1715. p.fail("expression")
  1716. return nil
  1717. }
  1718. left = &LiteralExpr{p.tt, p.data}
  1719. p.next()
  1720. if p.tt != InToken {
  1721. p.fail("relational expression", InToken)
  1722. return nil
  1723. }
  1724. default:
  1725. p.fail("expression")
  1726. return nil
  1727. }
  1728. suffix := p.parseExpressionSuffix(left, prec, precLeft)
  1729. p.exprLevel--
  1730. return suffix
  1731. }
  1732. func (p *Parser) parseExpressionSuffix(left IExpr, prec, precLeft OpPrec) IExpr {
  1733. for i := 0; ; i++ {
  1734. if 1000 < p.exprLevel+i {
  1735. p.failMessage("too many nested expressions")
  1736. return nil
  1737. }
  1738. switch tt := p.tt; tt {
  1739. case EqToken, MulEqToken, DivEqToken, ModEqToken, ExpEqToken, AddEqToken, SubEqToken, LtLtEqToken, GtGtEqToken, GtGtGtEqToken, BitAndEqToken, BitXorEqToken, BitOrEqToken, AndEqToken, OrEqToken, NullishEqToken:
  1740. if OpAssign < prec {
  1741. return left
  1742. } else if precLeft < OpLHS {
  1743. p.fail("expression")
  1744. return nil
  1745. }
  1746. p.next()
  1747. left = &BinaryExpr{tt, left, p.parseExpression(OpAssign)}
  1748. precLeft = OpAssign
  1749. case LtToken, LtEqToken, GtToken, GtEqToken, InToken, InstanceofToken:
  1750. if OpCompare < prec || !p.in && tt == InToken {
  1751. return left
  1752. } else if precLeft < OpCompare {
  1753. // can only fail after a yield or arrow function expression
  1754. p.fail("expression")
  1755. return nil
  1756. }
  1757. p.next()
  1758. left = &BinaryExpr{tt, left, p.parseExpression(OpShift)}
  1759. precLeft = OpCompare
  1760. case EqEqToken, NotEqToken, EqEqEqToken, NotEqEqToken:
  1761. if OpEquals < prec {
  1762. return left
  1763. } else if precLeft < OpEquals {
  1764. // can only fail after a yield or arrow function expression
  1765. p.fail("expression")
  1766. return nil
  1767. }
  1768. p.next()
  1769. left = &BinaryExpr{tt, left, p.parseExpression(OpCompare)}
  1770. precLeft = OpEquals
  1771. case AndToken:
  1772. if OpAnd < prec {
  1773. return left
  1774. } else if precLeft < OpAnd {
  1775. p.fail("expression")
  1776. return nil
  1777. }
  1778. p.next()
  1779. left = &BinaryExpr{tt, left, p.parseExpression(OpBitOr)}
  1780. precLeft = OpAnd
  1781. case OrToken:
  1782. if OpOr < prec {
  1783. return left
  1784. } else if precLeft < OpOr {
  1785. p.fail("expression")
  1786. return nil
  1787. }
  1788. p.next()
  1789. left = &BinaryExpr{tt, left, p.parseExpression(OpAnd)}
  1790. precLeft = OpOr
  1791. case NullishToken:
  1792. if OpCoalesce < prec {
  1793. return left
  1794. } else if precLeft < OpBitOr && precLeft != OpCoalesce {
  1795. p.fail("expression")
  1796. return nil
  1797. }
  1798. p.next()
  1799. left = &BinaryExpr{tt, left, p.parseExpression(OpBitOr)}
  1800. precLeft = OpCoalesce
  1801. case DotToken:
  1802. // OpMember < prec does never happen
  1803. if precLeft < OpCall {
  1804. p.fail("expression")
  1805. return nil
  1806. }
  1807. p.next()
  1808. if !IsIdentifierName(p.tt) && p.tt != PrivateIdentifierToken {
  1809. p.fail("dot expression", IdentifierToken)
  1810. return nil
  1811. }
  1812. exprPrec := OpMember
  1813. if precLeft < OpMember {
  1814. exprPrec = OpCall
  1815. }
  1816. if p.tt != PrivateIdentifierToken {
  1817. p.tt = IdentifierToken
  1818. }
  1819. left = &DotExpr{left, LiteralExpr{p.tt, p.data}, exprPrec, false}
  1820. p.next()
  1821. if precLeft < OpMember {
  1822. precLeft = OpCall
  1823. } else {
  1824. precLeft = OpMember
  1825. }
  1826. case OpenBracketToken:
  1827. // OpMember < prec does never happen
  1828. if precLeft < OpCall {
  1829. p.fail("expression")
  1830. return nil
  1831. }
  1832. p.next()
  1833. exprPrec := OpMember
  1834. if precLeft < OpMember {
  1835. exprPrec = OpCall
  1836. }
  1837. prevIn := p.in
  1838. p.in = true
  1839. left = &IndexExpr{left, p.parseExpression(OpExpr), exprPrec, false}
  1840. p.in = prevIn
  1841. if !p.consume("index expression", CloseBracketToken) {
  1842. return nil
  1843. }
  1844. if precLeft < OpMember {
  1845. precLeft = OpCall
  1846. } else {
  1847. precLeft = OpMember
  1848. }
  1849. case OpenParenToken:
  1850. if OpCall < prec {
  1851. return left
  1852. } else if precLeft < OpCall {
  1853. p.fail("expression")
  1854. return nil
  1855. }
  1856. prevIn := p.in
  1857. p.in = true
  1858. left = &CallExpr{left, p.parseArguments(), false}
  1859. precLeft = OpCall
  1860. p.in = prevIn
  1861. case TemplateToken, TemplateStartToken:
  1862. // OpMember < prec does never happen
  1863. if precLeft < OpCall {
  1864. p.fail("expression")
  1865. return nil
  1866. }
  1867. prevIn := p.in
  1868. p.in = true
  1869. template := p.parseTemplateLiteral(precLeft)
  1870. template.Tag = left
  1871. left = &template
  1872. if precLeft < OpMember {
  1873. precLeft = OpCall
  1874. } else {
  1875. precLeft = OpMember
  1876. }
  1877. p.in = prevIn
  1878. case OptChainToken:
  1879. if OpCall < prec {
  1880. return left
  1881. }
  1882. p.next()
  1883. if p.tt == OpenParenToken {
  1884. left = &CallExpr{left, p.parseArguments(), true}
  1885. } else if p.tt == OpenBracketToken {
  1886. p.next()
  1887. left = &IndexExpr{left, p.parseExpression(OpExpr), OpCall, true}
  1888. if !p.consume("optional chaining expression", CloseBracketToken) {
  1889. return nil
  1890. }
  1891. } else if p.tt == TemplateToken || p.tt == TemplateStartToken {
  1892. template := p.parseTemplateLiteral(precLeft)
  1893. template.Prec = OpCall
  1894. template.Tag = left
  1895. template.Optional = true
  1896. left = &template
  1897. } else if IsIdentifierName(p.tt) {
  1898. left = &DotExpr{left, LiteralExpr{IdentifierToken, p.data}, OpCall, true}
  1899. p.next()
  1900. } else if p.tt == PrivateIdentifierToken {
  1901. left = &DotExpr{left, LiteralExpr{p.tt, p.data}, OpCall, true}
  1902. p.next()
  1903. } else {
  1904. p.fail("optional chaining expression", IdentifierToken, OpenParenToken, OpenBracketToken, TemplateToken)
  1905. return nil
  1906. }
  1907. precLeft = OpCall
  1908. case IncrToken:
  1909. if p.prevLT || OpUpdate < prec {
  1910. return left
  1911. } else if precLeft < OpLHS {
  1912. p.fail("expression")
  1913. return nil
  1914. }
  1915. p.next()
  1916. left = &UnaryExpr{PostIncrToken, left}
  1917. precLeft = OpUpdate
  1918. case DecrToken:
  1919. if p.prevLT || OpUpdate < prec {
  1920. return left
  1921. } else if precLeft < OpLHS {
  1922. p.fail("expression")
  1923. return nil
  1924. }
  1925. p.next()
  1926. left = &UnaryExpr{PostDecrToken, left}
  1927. precLeft = OpUpdate
  1928. case ExpToken:
  1929. if OpExp < prec {
  1930. return left
  1931. } else if precLeft < OpUpdate {
  1932. p.fail("expression")
  1933. return nil
  1934. }
  1935. p.next()
  1936. left = &BinaryExpr{tt, left, p.parseExpression(OpExp)}
  1937. precLeft = OpExp
  1938. case MulToken, DivToken, ModToken:
  1939. if OpMul < prec {
  1940. return left
  1941. } else if precLeft < OpMul {
  1942. p.fail("expression")
  1943. return nil
  1944. }
  1945. p.next()
  1946. left = &BinaryExpr{tt, left, p.parseExpression(OpExp)}
  1947. precLeft = OpMul
  1948. case AddToken, SubToken:
  1949. if OpAdd < prec {
  1950. return left
  1951. } else if precLeft < OpAdd {
  1952. p.fail("expression")
  1953. return nil
  1954. }
  1955. p.next()
  1956. left = &BinaryExpr{tt, left, p.parseExpression(OpMul)}
  1957. precLeft = OpAdd
  1958. case LtLtToken, GtGtToken, GtGtGtToken:
  1959. if OpShift < prec {
  1960. return left
  1961. } else if precLeft < OpShift {
  1962. p.fail("expression")
  1963. return nil
  1964. }
  1965. p.next()
  1966. left = &BinaryExpr{tt, left, p.parseExpression(OpAdd)}
  1967. precLeft = OpShift
  1968. case BitAndToken:
  1969. if OpBitAnd < prec {
  1970. return left
  1971. } else if precLeft < OpBitAnd {
  1972. p.fail("expression")
  1973. return nil
  1974. }
  1975. p.next()
  1976. left = &BinaryExpr{tt, left, p.parseExpression(OpEquals)}
  1977. precLeft = OpBitAnd
  1978. case BitXorToken:
  1979. if OpBitXor < prec {
  1980. return left
  1981. } else if precLeft < OpBitXor {
  1982. p.fail("expression")
  1983. return nil
  1984. }
  1985. p.next()
  1986. left = &BinaryExpr{tt, left, p.parseExpression(OpBitAnd)}
  1987. precLeft = OpBitXor
  1988. case BitOrToken:
  1989. if OpBitOr < prec {
  1990. return left
  1991. } else if precLeft < OpBitOr {
  1992. p.fail("expression")
  1993. return nil
  1994. }
  1995. p.next()
  1996. left = &BinaryExpr{tt, left, p.parseExpression(OpBitXor)}
  1997. precLeft = OpBitOr
  1998. case QuestionToken:
  1999. if OpAssign < prec {
  2000. return left
  2001. } else if precLeft < OpCoalesce {
  2002. p.fail("expression")
  2003. return nil
  2004. }
  2005. p.next()
  2006. prevIn := p.in
  2007. p.in = true
  2008. ifExpr := p.parseExpression(OpAssign)
  2009. p.in = prevIn
  2010. if !p.consume("conditional expression", ColonToken) {
  2011. return nil
  2012. }
  2013. elseExpr := p.parseExpression(OpAssign)
  2014. left = &CondExpr{left, ifExpr, elseExpr}
  2015. precLeft = OpAssign
  2016. case CommaToken:
  2017. if OpExpr < prec {
  2018. return left
  2019. }
  2020. p.next()
  2021. if commaExpr, ok := left.(*CommaExpr); ok {
  2022. commaExpr.List = append(commaExpr.List, p.parseExpression(OpAssign))
  2023. i-- // adjust expression nesting limit
  2024. } else {
  2025. left = &CommaExpr{[]IExpr{left, p.parseExpression(OpAssign)}}
  2026. }
  2027. precLeft = OpExpr
  2028. case ArrowToken:
  2029. // handle identifier => ..., where identifier could also be yield or await
  2030. if OpAssign < prec {
  2031. return left
  2032. } else if precLeft < OpPrimary || p.prevLT {
  2033. p.fail("expression")
  2034. return nil
  2035. }
  2036. v, ok := left.(*Var)
  2037. if !ok {
  2038. p.fail("expression")
  2039. return nil
  2040. }
  2041. left = p.parseIdentifierArrowFunc(v)
  2042. precLeft = OpAssign
  2043. default:
  2044. return left
  2045. }
  2046. }
  2047. }
  2048. func (p *Parser) parseAssignExprOrParam() IExpr {
  2049. // this could be a BindingElement or an AssignmentExpression. Here we handle BindingIdentifier with a possible Initializer, BindingPattern will be handled by parseArrayLiteral or parseObjectLiteral
  2050. if p.assumeArrowFunc && p.isIdentifierReference(p.tt) {
  2051. tt := p.tt
  2052. data := p.data
  2053. p.next()
  2054. if p.tt == EqToken || p.tt == CommaToken || p.tt == CloseParenToken || p.tt == CloseBraceToken || p.tt == CloseBracketToken {
  2055. var ok bool
  2056. var left IExpr
  2057. left, ok = p.scope.Declare(ArgumentDecl, data)
  2058. if ok {
  2059. p.assumeArrowFunc = false
  2060. left = p.parseExpressionSuffix(left, OpAssign, OpPrimary)
  2061. p.assumeArrowFunc = true
  2062. return left
  2063. }
  2064. }
  2065. p.assumeArrowFunc = false
  2066. if tt == AsyncToken {
  2067. return p.parseAsyncExpression(OpAssign, data)
  2068. }
  2069. return p.parseIdentifierExpression(OpAssign, data)
  2070. } else if p.tt != OpenBracketToken && p.tt != OpenBraceToken {
  2071. p.assumeArrowFunc = false
  2072. }
  2073. return p.parseExpression(OpAssign)
  2074. }
  2075. func (p *Parser) parseParenthesizedExpression(prec OpPrec, async []byte) IExpr {
  2076. // parse ArrowFunc, AsyncArrowFunc, AsyncCallExpr, ParenthesizedExpr
  2077. var left IExpr
  2078. precLeft := OpPrimary
  2079. // expect to be at (
  2080. p.next()
  2081. isAsync := async != nil // prevLT is false before open parenthesis
  2082. arrowFunc := &ArrowFunc{}
  2083. parent := p.enterScope(&arrowFunc.Body.Scope, true)
  2084. prevAssumeArrowFunc, prevIn := p.assumeArrowFunc, p.in
  2085. p.assumeArrowFunc, p.in = true, true
  2086. // parse an Arguments expression but assume we might be parsing an (async) arrow function or ParenthesisedExpression. If this is really an arrow function, parsing as an Arguments expression cannot fail as AssignmentExpression, ArrayLiteral, and ObjectLiteral are supersets of SingleNameBinding, ArrayBindingPattern, and ObjectBindingPattern respectively. Any identifier that would be a BindingIdentifier in case of an arrow function, will be added as such to the scope. If finally this is not an arrow function, we will demote those variables as undeclared and merge them with the parent scope.
  2087. rests := 0
  2088. var args Args
  2089. for p.tt != CloseParenToken && p.tt != ErrorToken {
  2090. if 0 < len(args.List) && args.List[len(args.List)-1].Rest {
  2091. // only last parameter can have ellipsis
  2092. p.assumeArrowFunc = false
  2093. if !isAsync {
  2094. p.fail("arrow function", CloseParenToken)
  2095. }
  2096. }
  2097. rest := p.tt == EllipsisToken
  2098. if rest {
  2099. p.next()
  2100. rests++
  2101. }
  2102. args.List = append(args.List, Arg{p.parseAssignExprOrParam(), rest})
  2103. if p.tt != CommaToken {
  2104. break
  2105. }
  2106. p.next()
  2107. }
  2108. if p.tt != CloseParenToken {
  2109. p.fail("expression")
  2110. return nil
  2111. }
  2112. p.next()
  2113. isArrowFunc := !p.prevLT && p.tt == ArrowToken && p.assumeArrowFunc
  2114. hasLastRest := 0 < rests && p.assumeArrowFunc
  2115. p.assumeArrowFunc, p.in = prevAssumeArrowFunc, prevIn
  2116. if isArrowFunc {
  2117. prevAwait, prevYield := p.await, p.yield
  2118. p.await, p.yield = isAsync, false
  2119. // arrow function
  2120. arrowFunc.Async = isAsync
  2121. arrowFunc.Params = Params{List: make([]BindingElement, 0, len(args.List)-rests)}
  2122. for _, arg := range args.List {
  2123. if arg.Rest {
  2124. arrowFunc.Params.Rest = p.exprToBinding(arg.Value)
  2125. } else {
  2126. arrowFunc.Params.List = append(arrowFunc.Params.List, p.exprToBindingElement(arg.Value)) // can not fail when assumArrowFunc is set
  2127. }
  2128. }
  2129. arrowFunc.Body.List = p.parseArrowFuncBody()
  2130. p.await, p.yield = prevAwait, prevYield
  2131. p.exitScope(parent)
  2132. left = arrowFunc
  2133. precLeft = OpAssign
  2134. } else if !isAsync && (len(args.List) == 0 || hasLastRest) {
  2135. p.fail("arrow function", ArrowToken)
  2136. return nil
  2137. } else if isAsync && OpCall < prec || !isAsync && 0 < rests {
  2138. p.fail("expression")
  2139. return nil
  2140. } else {
  2141. // for any nested FuncExpr/ArrowFunc scope, Parent will point to the temporary scope created in case this was an arrow function instead of a parenthesized expression. This is not a problem as Parent is only used for defining new variables, and we already parsed all the nested scopes so that Parent (not Func) are not relevant anymore. Anyways, the Parent will just point to an empty scope, whose Parent/Func will point to valid scopes. This should not be a big deal.
  2142. // Here we move all declared ArgumentDecls (in case of an arrow function) to its parent scope as undeclared variables (identifiers used in a parenthesized expression).
  2143. p.exitScope(parent)
  2144. arrowFunc.Body.Scope.UndeclareScope()
  2145. if isAsync {
  2146. // call expression
  2147. left = p.scope.Use(async)
  2148. left = &CallExpr{left, args, false}
  2149. precLeft = OpCall
  2150. } else {
  2151. // parenthesized expression
  2152. if 1 < len(args.List) {
  2153. commaExpr := &CommaExpr{}
  2154. for _, arg := range args.List {
  2155. commaExpr.List = append(commaExpr.List, arg.Value)
  2156. }
  2157. left = &GroupExpr{commaExpr}
  2158. } else {
  2159. left = &GroupExpr{args.List[0].Value}
  2160. }
  2161. }
  2162. }
  2163. return p.parseExpressionSuffix(left, prec, precLeft)
  2164. }
  2165. // exprToBindingElement and exprToBinding convert a CoverParenthesizedExpressionAndArrowParameterList into FormalParameters.
  2166. // Any unbound variables of the parameters (Initializer, ComputedPropertyName) are kept in the parent scope
  2167. func (p *Parser) exprToBindingElement(expr IExpr) (bindingElement BindingElement) {
  2168. if assign, ok := expr.(*BinaryExpr); ok && assign.Op == EqToken {
  2169. bindingElement.Binding = p.exprToBinding(assign.X)
  2170. bindingElement.Default = assign.Y
  2171. } else {
  2172. bindingElement.Binding = p.exprToBinding(expr)
  2173. }
  2174. return
  2175. }
  2176. func (p *Parser) exprToBinding(expr IExpr) (binding IBinding) {
  2177. if expr == nil {
  2178. // no-op
  2179. } else if v, ok := expr.(*Var); ok {
  2180. binding = v
  2181. } else if array, ok := expr.(*ArrayExpr); ok {
  2182. bindingArray := BindingArray{}
  2183. for _, item := range array.List {
  2184. if item.Spread {
  2185. // can only BindingIdentifier or BindingPattern
  2186. bindingArray.Rest = p.exprToBinding(item.Value)
  2187. break
  2188. }
  2189. var bindingElement BindingElement
  2190. bindingElement = p.exprToBindingElement(item.Value)
  2191. bindingArray.List = append(bindingArray.List, bindingElement)
  2192. }
  2193. binding = &bindingArray
  2194. } else if object, ok := expr.(*ObjectExpr); ok {
  2195. bindingObject := BindingObject{}
  2196. for _, item := range object.List {
  2197. if item.Spread {
  2198. // can only be BindingIdentifier
  2199. bindingObject.Rest = item.Value.(*Var)
  2200. break
  2201. }
  2202. bindingElement := p.exprToBindingElement(item.Value)
  2203. if v, ok := item.Value.(*Var); item.Name == nil || (ok && item.Name.IsIdent(v.Data)) {
  2204. // IdentifierReference : Initializer
  2205. bindingElement.Default = item.Init
  2206. }
  2207. bindingObject.List = append(bindingObject.List, BindingObjectItem{Key: item.Name, Value: bindingElement})
  2208. }
  2209. binding = &bindingObject
  2210. } else {
  2211. p.failMessage("invalid parameters in arrow function")
  2212. }
  2213. return
  2214. }
  2215. func (p *Parser) isIdentifierReference(tt TokenType) bool {
  2216. return IsIdentifier(tt) || !p.yield && tt == YieldToken || !p.await && tt == AwaitToken
  2217. }