parse.go 60 KB

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