statement.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044
  1. package parser
  2. import (
  3. "encoding/base64"
  4. "fmt"
  5. "os"
  6. "strings"
  7. "github.com/dop251/goja/ast"
  8. "github.com/dop251/goja/file"
  9. "github.com/dop251/goja/token"
  10. "github.com/go-sourcemap/sourcemap"
  11. )
  12. func (self *_parser) parseBlockStatement() *ast.BlockStatement {
  13. node := &ast.BlockStatement{}
  14. node.LeftBrace = self.expect(token.LEFT_BRACE)
  15. node.List = self.parseStatementList()
  16. node.RightBrace = self.expect(token.RIGHT_BRACE)
  17. return node
  18. }
  19. func (self *_parser) parseEmptyStatement() ast.Statement {
  20. idx := self.expect(token.SEMICOLON)
  21. return &ast.EmptyStatement{Semicolon: idx}
  22. }
  23. func (self *_parser) parseStatementList() (list []ast.Statement) {
  24. for self.token != token.RIGHT_BRACE && self.token != token.EOF {
  25. self.scope.allowLet = true
  26. list = append(list, self.parseStatement())
  27. }
  28. return
  29. }
  30. func (self *_parser) parseStatement() ast.Statement {
  31. if self.token == token.EOF {
  32. self.errorUnexpectedToken(self.token)
  33. return &ast.BadStatement{From: self.idx, To: self.idx + 1}
  34. }
  35. switch self.token {
  36. case token.SEMICOLON:
  37. return self.parseEmptyStatement()
  38. case token.LEFT_BRACE:
  39. return self.parseBlockStatement()
  40. case token.IF:
  41. return self.parseIfStatement()
  42. case token.DO:
  43. return self.parseDoWhileStatement()
  44. case token.WHILE:
  45. return self.parseWhileStatement()
  46. case token.FOR:
  47. return self.parseForOrForInStatement()
  48. case token.BREAK:
  49. return self.parseBreakStatement()
  50. case token.CONTINUE:
  51. return self.parseContinueStatement()
  52. case token.DEBUGGER:
  53. return self.parseDebuggerStatement()
  54. case token.WITH:
  55. return self.parseWithStatement()
  56. case token.VAR:
  57. return self.parseVariableStatement()
  58. case token.LET:
  59. tok := self.peek()
  60. if tok == token.LEFT_BRACKET || self.scope.allowLet && (token.IsId(tok) || tok == token.LEFT_BRACE) {
  61. return self.parseLexicalDeclaration(self.token)
  62. }
  63. self.insertSemicolon = true
  64. case token.CONST:
  65. return self.parseLexicalDeclaration(self.token)
  66. case token.ASYNC:
  67. if f := self.parseMaybeAsyncFunction(true); f != nil {
  68. return &ast.FunctionDeclaration{
  69. Function: f,
  70. }
  71. }
  72. case token.FUNCTION:
  73. return &ast.FunctionDeclaration{
  74. Function: self.parseFunction(true, false, self.idx),
  75. }
  76. case token.CLASS:
  77. return &ast.ClassDeclaration{
  78. Class: self.parseClass(true),
  79. }
  80. case token.SWITCH:
  81. return self.parseSwitchStatement()
  82. case token.RETURN:
  83. return self.parseReturnStatement()
  84. case token.THROW:
  85. return self.parseThrowStatement()
  86. case token.TRY:
  87. return self.parseTryStatement()
  88. }
  89. expression := self.parseExpression()
  90. if identifier, isIdentifier := expression.(*ast.Identifier); isIdentifier && self.token == token.COLON {
  91. // LabelledStatement
  92. colon := self.idx
  93. self.next() // :
  94. label := identifier.Name
  95. for _, value := range self.scope.labels {
  96. if label == value {
  97. self.error(identifier.Idx0(), "Label '%s' already exists", label)
  98. }
  99. }
  100. self.scope.labels = append(self.scope.labels, label) // Push the label
  101. self.scope.allowLet = false
  102. statement := self.parseStatement()
  103. self.scope.labels = self.scope.labels[:len(self.scope.labels)-1] // Pop the label
  104. return &ast.LabelledStatement{
  105. Label: identifier,
  106. Colon: colon,
  107. Statement: statement,
  108. }
  109. }
  110. self.optionalSemicolon()
  111. return &ast.ExpressionStatement{
  112. Expression: expression,
  113. }
  114. }
  115. func (self *_parser) parseTryStatement() ast.Statement {
  116. node := &ast.TryStatement{
  117. Try: self.expect(token.TRY),
  118. Body: self.parseBlockStatement(),
  119. }
  120. if self.token == token.CATCH {
  121. catch := self.idx
  122. self.next()
  123. var parameter ast.BindingTarget
  124. if self.token == token.LEFT_PARENTHESIS {
  125. self.next()
  126. parameter = self.parseBindingTarget()
  127. self.expect(token.RIGHT_PARENTHESIS)
  128. }
  129. node.Catch = &ast.CatchStatement{
  130. Catch: catch,
  131. Parameter: parameter,
  132. Body: self.parseBlockStatement(),
  133. }
  134. }
  135. if self.token == token.FINALLY {
  136. self.next()
  137. node.Finally = self.parseBlockStatement()
  138. }
  139. if node.Catch == nil && node.Finally == nil {
  140. self.error(node.Try, "Missing catch or finally after try")
  141. return &ast.BadStatement{From: node.Try, To: node.Body.Idx1()}
  142. }
  143. return node
  144. }
  145. func (self *_parser) parseFunctionParameterList() *ast.ParameterList {
  146. opening := self.expect(token.LEFT_PARENTHESIS)
  147. var list []*ast.Binding
  148. var rest ast.Expression
  149. for self.token != token.RIGHT_PARENTHESIS && self.token != token.EOF {
  150. if self.token == token.ELLIPSIS {
  151. self.next()
  152. rest = self.reinterpretAsDestructBindingTarget(self.parseAssignmentExpression())
  153. break
  154. }
  155. item := self.parseVariableDeclaration(&list)
  156. if _, ok := item.Initializer.(*ast.AwaitExpression); ok {
  157. self.error(item.Idx0(), "Illegal await-expression in formal parameters of async function")
  158. }
  159. if self.token != token.RIGHT_PARENTHESIS {
  160. self.expect(token.COMMA)
  161. }
  162. }
  163. closing := self.expect(token.RIGHT_PARENTHESIS)
  164. return &ast.ParameterList{
  165. Opening: opening,
  166. List: list,
  167. Rest: rest,
  168. Closing: closing,
  169. }
  170. }
  171. func (self *_parser) parseMaybeAsyncFunction(declaration bool) *ast.FunctionLiteral {
  172. if self.peek() == token.FUNCTION {
  173. idx := self.idx
  174. self.next()
  175. return self.parseFunction(declaration, true, idx)
  176. }
  177. return nil
  178. }
  179. func (self *_parser) parseFunction(declaration, async bool, start file.Idx) *ast.FunctionLiteral {
  180. node := &ast.FunctionLiteral{
  181. Function: start,
  182. Async: async,
  183. }
  184. self.expect(token.FUNCTION)
  185. if !declaration {
  186. if async != self.scope.allowAwait {
  187. self.scope.allowAwait = async
  188. defer func() {
  189. self.scope.allowAwait = !async
  190. }()
  191. }
  192. }
  193. self.tokenToBindingId()
  194. var name *ast.Identifier
  195. if self.token == token.IDENTIFIER {
  196. name = self.parseIdentifier()
  197. } else if declaration {
  198. // Use expect error handling
  199. self.expect(token.IDENTIFIER)
  200. }
  201. node.Name = name
  202. if declaration {
  203. if async != self.scope.allowAwait {
  204. self.scope.allowAwait = async
  205. defer func() {
  206. self.scope.allowAwait = !async
  207. }()
  208. }
  209. }
  210. node.ParameterList = self.parseFunctionParameterList()
  211. node.Body, node.DeclarationList = self.parseFunctionBlock(async, async)
  212. node.Source = self.slice(node.Idx0(), node.Idx1())
  213. return node
  214. }
  215. func (self *_parser) parseFunctionBlock(async, allowAwait bool) (body *ast.BlockStatement, declarationList []*ast.VariableDeclaration) {
  216. self.openScope()
  217. self.scope.inFunction = true
  218. self.scope.inAsync = async
  219. self.scope.allowAwait = allowAwait
  220. defer self.closeScope()
  221. body = self.parseBlockStatement()
  222. declarationList = self.scope.declarationList
  223. return
  224. }
  225. func (self *_parser) parseArrowFunctionBody(async bool) (ast.ConciseBody, []*ast.VariableDeclaration) {
  226. if self.token == token.LEFT_BRACE {
  227. return self.parseFunctionBlock(async, async)
  228. }
  229. if async != self.scope.inAsync || async != self.scope.allowAwait {
  230. inAsync := self.scope.inAsync
  231. allowAwait := self.scope.allowAwait
  232. self.scope.inAsync = async
  233. self.scope.allowAwait = async
  234. defer func() {
  235. self.scope.inAsync = inAsync
  236. self.scope.allowAwait = allowAwait
  237. }()
  238. }
  239. return &ast.ExpressionBody{
  240. Expression: self.parseAssignmentExpression(),
  241. }, nil
  242. }
  243. func (self *_parser) parseClass(declaration bool) *ast.ClassLiteral {
  244. if !self.scope.allowLet && self.token == token.CLASS {
  245. self.errorUnexpectedToken(token.CLASS)
  246. }
  247. node := &ast.ClassLiteral{
  248. Class: self.expect(token.CLASS),
  249. }
  250. self.tokenToBindingId()
  251. var name *ast.Identifier
  252. if self.token == token.IDENTIFIER {
  253. name = self.parseIdentifier()
  254. } else if declaration {
  255. // Use expect error handling
  256. self.expect(token.IDENTIFIER)
  257. }
  258. node.Name = name
  259. if self.token != token.LEFT_BRACE {
  260. self.expect(token.EXTENDS)
  261. node.SuperClass = self.parseLeftHandSideExpressionAllowCall()
  262. }
  263. self.expect(token.LEFT_BRACE)
  264. for self.token != token.RIGHT_BRACE && self.token != token.EOF {
  265. if self.token == token.SEMICOLON {
  266. self.next()
  267. continue
  268. }
  269. start := self.idx
  270. static := false
  271. if self.token == token.STATIC {
  272. switch self.peek() {
  273. case token.ASSIGN, token.SEMICOLON, token.RIGHT_BRACE, token.LEFT_PARENTHESIS:
  274. // treat as identifier
  275. default:
  276. self.next()
  277. if self.token == token.LEFT_BRACE {
  278. b := &ast.ClassStaticBlock{
  279. Static: start,
  280. }
  281. b.Block, b.DeclarationList = self.parseFunctionBlock(false, true)
  282. b.Source = self.slice(b.Block.LeftBrace, b.Block.Idx1())
  283. node.Body = append(node.Body, b)
  284. continue
  285. }
  286. static = true
  287. }
  288. }
  289. var kind ast.PropertyKind
  290. var async bool
  291. methodBodyStart := self.idx
  292. if self.literal == "get" || self.literal == "set" {
  293. if tok := self.peek(); tok != token.SEMICOLON && tok != token.LEFT_PARENTHESIS {
  294. if self.literal == "get" {
  295. kind = ast.PropertyKindGet
  296. } else {
  297. kind = ast.PropertyKindSet
  298. }
  299. self.next()
  300. }
  301. } else if self.token == token.ASYNC {
  302. if tok := self.peek(); tok != token.SEMICOLON && tok != token.LEFT_PARENTHESIS {
  303. async = true
  304. kind = ast.PropertyKindMethod
  305. self.next()
  306. }
  307. }
  308. _, keyName, value, tkn := self.parseObjectPropertyKey()
  309. if value == nil {
  310. continue
  311. }
  312. computed := tkn == token.ILLEGAL
  313. _, private := value.(*ast.PrivateIdentifier)
  314. if static && !private && keyName == "prototype" {
  315. self.error(value.Idx0(), "Classes may not have a static property named 'prototype'")
  316. }
  317. if kind == "" && self.token == token.LEFT_PARENTHESIS {
  318. kind = ast.PropertyKindMethod
  319. }
  320. if kind != "" {
  321. // method
  322. if keyName == "constructor" && !computed {
  323. if !static {
  324. if kind != ast.PropertyKindMethod {
  325. self.error(value.Idx0(), "Class constructor may not be an accessor")
  326. } else if async {
  327. self.error(value.Idx0(), "Class constructor may not be an async method")
  328. }
  329. } else if private {
  330. self.error(value.Idx0(), "Class constructor may not be a private method")
  331. }
  332. }
  333. md := &ast.MethodDefinition{
  334. Idx: start,
  335. Key: value,
  336. Kind: kind,
  337. Body: self.parseMethodDefinition(methodBodyStart, kind, async),
  338. Static: static,
  339. Computed: computed,
  340. }
  341. node.Body = append(node.Body, md)
  342. } else {
  343. // field
  344. isCtor := !computed && keyName == "constructor"
  345. if !isCtor {
  346. if name, ok := value.(*ast.PrivateIdentifier); ok {
  347. isCtor = name.Name == "constructor"
  348. }
  349. }
  350. if isCtor {
  351. self.error(value.Idx0(), "Classes may not have a field named 'constructor'")
  352. }
  353. var initializer ast.Expression
  354. if self.token == token.ASSIGN {
  355. self.next()
  356. initializer = self.parseExpression()
  357. }
  358. if !self.implicitSemicolon && self.token != token.SEMICOLON && self.token != token.RIGHT_BRACE {
  359. self.errorUnexpectedToken(self.token)
  360. break
  361. }
  362. node.Body = append(node.Body, &ast.FieldDefinition{
  363. Idx: start,
  364. Key: value,
  365. Initializer: initializer,
  366. Static: static,
  367. Computed: computed,
  368. })
  369. }
  370. }
  371. node.RightBrace = self.expect(token.RIGHT_BRACE)
  372. node.Source = self.slice(node.Class, node.RightBrace+1)
  373. return node
  374. }
  375. func (self *_parser) parseDebuggerStatement() ast.Statement {
  376. idx := self.expect(token.DEBUGGER)
  377. node := &ast.DebuggerStatement{
  378. Debugger: idx,
  379. }
  380. self.semicolon()
  381. return node
  382. }
  383. func (self *_parser) parseReturnStatement() ast.Statement {
  384. idx := self.expect(token.RETURN)
  385. if !self.scope.inFunction {
  386. self.error(idx, "Illegal return statement")
  387. self.nextStatement()
  388. return &ast.BadStatement{From: idx, To: self.idx}
  389. }
  390. node := &ast.ReturnStatement{
  391. Return: idx,
  392. }
  393. if !self.implicitSemicolon && self.token != token.SEMICOLON && self.token != token.RIGHT_BRACE && self.token != token.EOF {
  394. node.Argument = self.parseExpression()
  395. }
  396. self.semicolon()
  397. return node
  398. }
  399. func (self *_parser) parseThrowStatement() ast.Statement {
  400. idx := self.expect(token.THROW)
  401. if self.implicitSemicolon {
  402. if self.chr == -1 { // Hackish
  403. self.error(idx, "Unexpected end of input")
  404. } else {
  405. self.error(idx, "Illegal newline after throw")
  406. }
  407. self.nextStatement()
  408. return &ast.BadStatement{From: idx, To: self.idx}
  409. }
  410. node := &ast.ThrowStatement{
  411. Throw: idx,
  412. Argument: self.parseExpression(),
  413. }
  414. self.semicolon()
  415. return node
  416. }
  417. func (self *_parser) parseSwitchStatement() ast.Statement {
  418. self.expect(token.SWITCH)
  419. self.expect(token.LEFT_PARENTHESIS)
  420. node := &ast.SwitchStatement{
  421. Discriminant: self.parseExpression(),
  422. Default: -1,
  423. }
  424. self.expect(token.RIGHT_PARENTHESIS)
  425. self.expect(token.LEFT_BRACE)
  426. inSwitch := self.scope.inSwitch
  427. self.scope.inSwitch = true
  428. defer func() {
  429. self.scope.inSwitch = inSwitch
  430. }()
  431. for index := 0; self.token != token.EOF; index++ {
  432. if self.token == token.RIGHT_BRACE {
  433. self.next()
  434. break
  435. }
  436. clause := self.parseCaseStatement()
  437. if clause.Test == nil {
  438. if node.Default != -1 {
  439. self.error(clause.Case, "Already saw a default in switch")
  440. }
  441. node.Default = index
  442. }
  443. node.Body = append(node.Body, clause)
  444. }
  445. return node
  446. }
  447. func (self *_parser) parseWithStatement() ast.Statement {
  448. self.expect(token.WITH)
  449. self.expect(token.LEFT_PARENTHESIS)
  450. node := &ast.WithStatement{
  451. Object: self.parseExpression(),
  452. }
  453. self.expect(token.RIGHT_PARENTHESIS)
  454. self.scope.allowLet = false
  455. node.Body = self.parseStatement()
  456. return node
  457. }
  458. func (self *_parser) parseCaseStatement() *ast.CaseStatement {
  459. node := &ast.CaseStatement{
  460. Case: self.idx,
  461. }
  462. if self.token == token.DEFAULT {
  463. self.next()
  464. } else {
  465. self.expect(token.CASE)
  466. node.Test = self.parseExpression()
  467. }
  468. self.expect(token.COLON)
  469. for {
  470. if self.token == token.EOF ||
  471. self.token == token.RIGHT_BRACE ||
  472. self.token == token.CASE ||
  473. self.token == token.DEFAULT {
  474. break
  475. }
  476. self.scope.allowLet = true
  477. node.Consequent = append(node.Consequent, self.parseStatement())
  478. }
  479. return node
  480. }
  481. func (self *_parser) parseIterationStatement() ast.Statement {
  482. inIteration := self.scope.inIteration
  483. self.scope.inIteration = true
  484. defer func() {
  485. self.scope.inIteration = inIteration
  486. }()
  487. self.scope.allowLet = false
  488. return self.parseStatement()
  489. }
  490. func (self *_parser) parseForIn(idx file.Idx, into ast.ForInto) *ast.ForInStatement {
  491. // Already have consumed "<into> in"
  492. source := self.parseExpression()
  493. self.expect(token.RIGHT_PARENTHESIS)
  494. return &ast.ForInStatement{
  495. For: idx,
  496. Into: into,
  497. Source: source,
  498. Body: self.parseIterationStatement(),
  499. }
  500. }
  501. func (self *_parser) parseForOf(idx file.Idx, into ast.ForInto) *ast.ForOfStatement {
  502. // Already have consumed "<into> of"
  503. source := self.parseAssignmentExpression()
  504. self.expect(token.RIGHT_PARENTHESIS)
  505. return &ast.ForOfStatement{
  506. For: idx,
  507. Into: into,
  508. Source: source,
  509. Body: self.parseIterationStatement(),
  510. }
  511. }
  512. func (self *_parser) parseFor(idx file.Idx, initializer ast.ForLoopInitializer) *ast.ForStatement {
  513. // Already have consumed "<initializer> ;"
  514. var test, update ast.Expression
  515. if self.token != token.SEMICOLON {
  516. test = self.parseExpression()
  517. }
  518. self.expect(token.SEMICOLON)
  519. if self.token != token.RIGHT_PARENTHESIS {
  520. update = self.parseExpression()
  521. }
  522. self.expect(token.RIGHT_PARENTHESIS)
  523. return &ast.ForStatement{
  524. For: idx,
  525. Initializer: initializer,
  526. Test: test,
  527. Update: update,
  528. Body: self.parseIterationStatement(),
  529. }
  530. }
  531. func (self *_parser) parseForOrForInStatement() ast.Statement {
  532. idx := self.expect(token.FOR)
  533. self.expect(token.LEFT_PARENTHESIS)
  534. var initializer ast.ForLoopInitializer
  535. forIn := false
  536. forOf := false
  537. var into ast.ForInto
  538. if self.token != token.SEMICOLON {
  539. allowIn := self.scope.allowIn
  540. self.scope.allowIn = false
  541. tok := self.token
  542. if tok == token.LET {
  543. switch self.peek() {
  544. case token.IDENTIFIER, token.LEFT_BRACKET, token.LEFT_BRACE:
  545. default:
  546. tok = token.IDENTIFIER
  547. }
  548. }
  549. if tok == token.VAR || tok == token.LET || tok == token.CONST {
  550. idx := self.idx
  551. self.next()
  552. var list []*ast.Binding
  553. if tok == token.VAR {
  554. list = self.parseVarDeclarationList(idx)
  555. } else {
  556. list = self.parseVariableDeclarationList()
  557. }
  558. if len(list) == 1 {
  559. if self.token == token.IN {
  560. self.next() // in
  561. forIn = true
  562. } else if self.token == token.IDENTIFIER && self.literal == "of" {
  563. self.next()
  564. forOf = true
  565. }
  566. }
  567. if forIn || forOf {
  568. if list[0].Initializer != nil {
  569. self.error(list[0].Initializer.Idx0(), "for-in loop variable declaration may not have an initializer")
  570. }
  571. if tok == token.VAR {
  572. into = &ast.ForIntoVar{
  573. Binding: list[0],
  574. }
  575. } else {
  576. into = &ast.ForDeclaration{
  577. Idx: idx,
  578. IsConst: tok == token.CONST,
  579. Target: list[0].Target,
  580. }
  581. }
  582. } else {
  583. self.ensurePatternInit(list)
  584. if tok == token.VAR {
  585. initializer = &ast.ForLoopInitializerVarDeclList{
  586. List: list,
  587. }
  588. } else {
  589. initializer = &ast.ForLoopInitializerLexicalDecl{
  590. LexicalDeclaration: ast.LexicalDeclaration{
  591. Idx: idx,
  592. Token: tok,
  593. List: list,
  594. },
  595. }
  596. }
  597. }
  598. } else {
  599. expr := self.parseExpression()
  600. if self.token == token.IN {
  601. self.next()
  602. forIn = true
  603. } else if self.token == token.IDENTIFIER && self.literal == "of" {
  604. self.next()
  605. forOf = true
  606. }
  607. if forIn || forOf {
  608. switch e := expr.(type) {
  609. case *ast.Identifier, *ast.DotExpression, *ast.PrivateDotExpression, *ast.BracketExpression, *ast.Binding:
  610. // These are all acceptable
  611. case *ast.ObjectLiteral:
  612. expr = self.reinterpretAsObjectAssignmentPattern(e)
  613. case *ast.ArrayLiteral:
  614. expr = self.reinterpretAsArrayAssignmentPattern(e)
  615. default:
  616. self.error(idx, "Invalid left-hand side in for-in or for-of")
  617. self.nextStatement()
  618. return &ast.BadStatement{From: idx, To: self.idx}
  619. }
  620. into = &ast.ForIntoExpression{
  621. Expression: expr,
  622. }
  623. } else {
  624. initializer = &ast.ForLoopInitializerExpression{
  625. Expression: expr,
  626. }
  627. }
  628. }
  629. self.scope.allowIn = allowIn
  630. }
  631. if forIn {
  632. return self.parseForIn(idx, into)
  633. }
  634. if forOf {
  635. return self.parseForOf(idx, into)
  636. }
  637. self.expect(token.SEMICOLON)
  638. return self.parseFor(idx, initializer)
  639. }
  640. func (self *_parser) ensurePatternInit(list []*ast.Binding) {
  641. for _, item := range list {
  642. if _, ok := item.Target.(ast.Pattern); ok {
  643. if item.Initializer == nil {
  644. self.error(item.Idx1(), "Missing initializer in destructuring declaration")
  645. break
  646. }
  647. }
  648. }
  649. }
  650. func (self *_parser) parseVariableStatement() *ast.VariableStatement {
  651. idx := self.expect(token.VAR)
  652. list := self.parseVarDeclarationList(idx)
  653. self.ensurePatternInit(list)
  654. self.semicolon()
  655. return &ast.VariableStatement{
  656. Var: idx,
  657. List: list,
  658. }
  659. }
  660. func (self *_parser) parseLexicalDeclaration(tok token.Token) *ast.LexicalDeclaration {
  661. idx := self.expect(tok)
  662. if !self.scope.allowLet {
  663. self.error(idx, "Lexical declaration cannot appear in a single-statement context")
  664. }
  665. list := self.parseVariableDeclarationList()
  666. self.ensurePatternInit(list)
  667. self.semicolon()
  668. return &ast.LexicalDeclaration{
  669. Idx: idx,
  670. Token: tok,
  671. List: list,
  672. }
  673. }
  674. func (self *_parser) parseDoWhileStatement() ast.Statement {
  675. inIteration := self.scope.inIteration
  676. self.scope.inIteration = true
  677. defer func() {
  678. self.scope.inIteration = inIteration
  679. }()
  680. self.expect(token.DO)
  681. node := &ast.DoWhileStatement{}
  682. if self.token == token.LEFT_BRACE {
  683. node.Body = self.parseBlockStatement()
  684. } else {
  685. self.scope.allowLet = false
  686. node.Body = self.parseStatement()
  687. }
  688. self.expect(token.WHILE)
  689. self.expect(token.LEFT_PARENTHESIS)
  690. node.Test = self.parseExpression()
  691. self.expect(token.RIGHT_PARENTHESIS)
  692. if self.token == token.SEMICOLON {
  693. self.next()
  694. }
  695. return node
  696. }
  697. func (self *_parser) parseWhileStatement() ast.Statement {
  698. self.expect(token.WHILE)
  699. self.expect(token.LEFT_PARENTHESIS)
  700. node := &ast.WhileStatement{
  701. Test: self.parseExpression(),
  702. }
  703. self.expect(token.RIGHT_PARENTHESIS)
  704. node.Body = self.parseIterationStatement()
  705. return node
  706. }
  707. func (self *_parser) parseIfStatement() ast.Statement {
  708. self.expect(token.IF)
  709. self.expect(token.LEFT_PARENTHESIS)
  710. node := &ast.IfStatement{
  711. Test: self.parseExpression(),
  712. }
  713. self.expect(token.RIGHT_PARENTHESIS)
  714. if self.token == token.LEFT_BRACE {
  715. node.Consequent = self.parseBlockStatement()
  716. } else {
  717. self.scope.allowLet = false
  718. node.Consequent = self.parseStatement()
  719. }
  720. if self.token == token.ELSE {
  721. self.next()
  722. self.scope.allowLet = false
  723. node.Alternate = self.parseStatement()
  724. }
  725. return node
  726. }
  727. func (self *_parser) parseSourceElements() (body []ast.Statement) {
  728. for self.token != token.EOF {
  729. self.scope.allowLet = true
  730. body = append(body, self.parseStatement())
  731. }
  732. return body
  733. }
  734. func (self *_parser) parseProgram() *ast.Program {
  735. prg := &ast.Program{
  736. Body: self.parseSourceElements(),
  737. DeclarationList: self.scope.declarationList,
  738. File: self.file,
  739. }
  740. self.file.SetSourceMap(self.parseSourceMap())
  741. return prg
  742. }
  743. func extractSourceMapLine(str string) string {
  744. for {
  745. p := strings.LastIndexByte(str, '\n')
  746. line := str[p+1:]
  747. if line != "" && line != "})" {
  748. if strings.HasPrefix(line, "//# sourceMappingURL=") {
  749. return line
  750. }
  751. break
  752. }
  753. if p >= 0 {
  754. str = str[:p]
  755. } else {
  756. break
  757. }
  758. }
  759. return ""
  760. }
  761. func (self *_parser) parseSourceMap() *sourcemap.Consumer {
  762. if self.opts.disableSourceMaps {
  763. return nil
  764. }
  765. if smLine := extractSourceMapLine(self.str); smLine != "" {
  766. urlIndex := strings.Index(smLine, "=")
  767. urlStr := smLine[urlIndex+1:]
  768. var data []byte
  769. var err error
  770. if strings.HasPrefix(urlStr, "data:application/json") {
  771. b64Index := strings.Index(urlStr, ",")
  772. b64 := urlStr[b64Index+1:]
  773. data, err = base64.StdEncoding.DecodeString(b64)
  774. } else {
  775. if sourceURL := file.ResolveSourcemapURL(self.file.Name(), urlStr); sourceURL != nil {
  776. if self.opts.sourceMapLoader != nil {
  777. data, err = self.opts.sourceMapLoader(sourceURL.String())
  778. } else {
  779. if sourceURL.Scheme == "" || sourceURL.Scheme == "file" {
  780. data, err = os.ReadFile(sourceURL.Path)
  781. } else {
  782. err = fmt.Errorf("unsupported source map URL scheme: %s", sourceURL.Scheme)
  783. }
  784. }
  785. }
  786. }
  787. if err != nil {
  788. self.error(file.Idx(0), "Could not load source map: %v", err)
  789. return nil
  790. }
  791. if data == nil {
  792. return nil
  793. }
  794. if sm, err := sourcemap.Parse(self.file.Name(), data); err == nil {
  795. return sm
  796. } else {
  797. self.error(file.Idx(0), "Could not parse source map: %v", err)
  798. }
  799. }
  800. return nil
  801. }
  802. func (self *_parser) parseBreakStatement() ast.Statement {
  803. idx := self.expect(token.BREAK)
  804. semicolon := self.implicitSemicolon
  805. if self.token == token.SEMICOLON {
  806. semicolon = true
  807. self.next()
  808. }
  809. if semicolon || self.token == token.RIGHT_BRACE {
  810. self.implicitSemicolon = false
  811. if !self.scope.inIteration && !self.scope.inSwitch {
  812. goto illegal
  813. }
  814. return &ast.BranchStatement{
  815. Idx: idx,
  816. Token: token.BREAK,
  817. }
  818. }
  819. self.tokenToBindingId()
  820. if self.token == token.IDENTIFIER {
  821. identifier := self.parseIdentifier()
  822. if !self.scope.hasLabel(identifier.Name) {
  823. self.error(idx, "Undefined label '%s'", identifier.Name)
  824. return &ast.BadStatement{From: idx, To: identifier.Idx1()}
  825. }
  826. self.semicolon()
  827. return &ast.BranchStatement{
  828. Idx: idx,
  829. Token: token.BREAK,
  830. Label: identifier,
  831. }
  832. }
  833. self.expect(token.IDENTIFIER)
  834. illegal:
  835. self.error(idx, "Illegal break statement")
  836. self.nextStatement()
  837. return &ast.BadStatement{From: idx, To: self.idx}
  838. }
  839. func (self *_parser) parseContinueStatement() ast.Statement {
  840. idx := self.expect(token.CONTINUE)
  841. semicolon := self.implicitSemicolon
  842. if self.token == token.SEMICOLON {
  843. semicolon = true
  844. self.next()
  845. }
  846. if semicolon || self.token == token.RIGHT_BRACE {
  847. self.implicitSemicolon = false
  848. if !self.scope.inIteration {
  849. goto illegal
  850. }
  851. return &ast.BranchStatement{
  852. Idx: idx,
  853. Token: token.CONTINUE,
  854. }
  855. }
  856. self.tokenToBindingId()
  857. if self.token == token.IDENTIFIER {
  858. identifier := self.parseIdentifier()
  859. if !self.scope.hasLabel(identifier.Name) {
  860. self.error(idx, "Undefined label '%s'", identifier.Name)
  861. return &ast.BadStatement{From: idx, To: identifier.Idx1()}
  862. }
  863. if !self.scope.inIteration {
  864. goto illegal
  865. }
  866. self.semicolon()
  867. return &ast.BranchStatement{
  868. Idx: idx,
  869. Token: token.CONTINUE,
  870. Label: identifier,
  871. }
  872. }
  873. self.expect(token.IDENTIFIER)
  874. illegal:
  875. self.error(idx, "Illegal continue statement")
  876. self.nextStatement()
  877. return &ast.BadStatement{From: idx, To: self.idx}
  878. }
  879. // Find the next statement after an error (recover)
  880. func (self *_parser) nextStatement() {
  881. for {
  882. switch self.token {
  883. case token.BREAK, token.CONTINUE,
  884. token.FOR, token.IF, token.RETURN, token.SWITCH,
  885. token.VAR, token.DO, token.TRY, token.WITH,
  886. token.WHILE, token.THROW, token.CATCH, token.FINALLY:
  887. // Return only if parser made some progress since last
  888. // sync or if it has not reached 10 next calls without
  889. // progress. Otherwise consume at least one token to
  890. // avoid an endless parser loop
  891. if self.idx == self.recover.idx && self.recover.count < 10 {
  892. self.recover.count++
  893. return
  894. }
  895. if self.idx > self.recover.idx {
  896. self.recover.idx = self.idx
  897. self.recover.count = 0
  898. return
  899. }
  900. // Reaching here indicates a parser bug, likely an
  901. // incorrect token list in this function, but it only
  902. // leads to skipping of possibly correct code if a
  903. // previous error is present, and thus is preferred
  904. // over a non-terminating parse.
  905. case token.EOF:
  906. return
  907. }
  908. self.next()
  909. }
  910. }