expression.go 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590
  1. package parser
  2. import (
  3. "strings"
  4. "github.com/dop251/goja/ast"
  5. "github.com/dop251/goja/file"
  6. "github.com/dop251/goja/token"
  7. "github.com/dop251/goja/unistring"
  8. )
  9. func (self *_parser) parseIdentifier() *ast.Identifier {
  10. literal := self.parsedLiteral
  11. idx := self.idx
  12. self.next()
  13. return &ast.Identifier{
  14. Name: literal,
  15. Idx: idx,
  16. }
  17. }
  18. func (self *_parser) parsePrimaryExpression() ast.Expression {
  19. literal, parsedLiteral := self.literal, self.parsedLiteral
  20. idx := self.idx
  21. switch self.token {
  22. case token.IDENTIFIER:
  23. self.next()
  24. return &ast.Identifier{
  25. Name: parsedLiteral,
  26. Idx: idx,
  27. }
  28. case token.NULL:
  29. self.next()
  30. return &ast.NullLiteral{
  31. Idx: idx,
  32. Literal: literal,
  33. }
  34. case token.BOOLEAN:
  35. self.next()
  36. value := false
  37. switch parsedLiteral {
  38. case "true":
  39. value = true
  40. case "false":
  41. value = false
  42. default:
  43. self.error(idx, "Illegal boolean literal")
  44. }
  45. return &ast.BooleanLiteral{
  46. Idx: idx,
  47. Literal: literal,
  48. Value: value,
  49. }
  50. case token.STRING:
  51. self.next()
  52. return &ast.StringLiteral{
  53. Idx: idx,
  54. Literal: literal,
  55. Value: parsedLiteral,
  56. }
  57. case token.NUMBER:
  58. self.next()
  59. value, err := parseNumberLiteral(literal)
  60. if err != nil {
  61. self.error(idx, err.Error())
  62. value = 0
  63. }
  64. return &ast.NumberLiteral{
  65. Idx: idx,
  66. Literal: literal,
  67. Value: value,
  68. }
  69. case token.SLASH, token.QUOTIENT_ASSIGN:
  70. return self.parseRegExpLiteral()
  71. case token.LEFT_BRACE:
  72. return self.parseObjectLiteral()
  73. case token.LEFT_BRACKET:
  74. return self.parseArrayLiteral()
  75. case token.LEFT_PARENTHESIS:
  76. return self.parseParenthesisedExpression()
  77. case token.BACKTICK:
  78. return self.parseTemplateLiteral(false)
  79. case token.THIS:
  80. self.next()
  81. return &ast.ThisExpression{
  82. Idx: idx,
  83. }
  84. case token.SUPER:
  85. return self.parseSuperProperty()
  86. case token.ASYNC:
  87. if f := self.parseMaybeAsyncFunction(false); f != nil {
  88. return f
  89. }
  90. case token.FUNCTION:
  91. return self.parseFunction(false, false, idx)
  92. case token.CLASS:
  93. return self.parseClass(false)
  94. }
  95. if self.isBindingId(self.token) {
  96. self.next()
  97. return &ast.Identifier{
  98. Name: parsedLiteral,
  99. Idx: idx,
  100. }
  101. }
  102. self.errorUnexpectedToken(self.token)
  103. self.nextStatement()
  104. return &ast.BadExpression{From: idx, To: self.idx}
  105. }
  106. func (self *_parser) parseSuperProperty() ast.Expression {
  107. idx := self.idx
  108. self.next()
  109. switch self.token {
  110. case token.PERIOD:
  111. self.next()
  112. if !token.IsId(self.token) {
  113. self.expect(token.IDENTIFIER)
  114. self.nextStatement()
  115. return &ast.BadExpression{From: idx, To: self.idx}
  116. }
  117. idIdx := self.idx
  118. parsedLiteral := self.parsedLiteral
  119. self.next()
  120. return &ast.DotExpression{
  121. Left: &ast.SuperExpression{
  122. Idx: idx,
  123. },
  124. Identifier: ast.Identifier{
  125. Name: parsedLiteral,
  126. Idx: idIdx,
  127. },
  128. }
  129. case token.LEFT_BRACKET:
  130. return self.parseBracketMember(&ast.SuperExpression{
  131. Idx: idx,
  132. })
  133. case token.LEFT_PARENTHESIS:
  134. return self.parseCallExpression(&ast.SuperExpression{
  135. Idx: idx,
  136. })
  137. default:
  138. self.error(idx, "'super' keyword unexpected here")
  139. self.nextStatement()
  140. return &ast.BadExpression{From: idx, To: self.idx}
  141. }
  142. }
  143. func (self *_parser) reinterpretSequenceAsArrowFuncParams(list []ast.Expression) *ast.ParameterList {
  144. firstRestIdx := -1
  145. params := make([]*ast.Binding, 0, len(list))
  146. for i, item := range list {
  147. if _, ok := item.(*ast.SpreadElement); ok {
  148. if firstRestIdx == -1 {
  149. firstRestIdx = i
  150. continue
  151. }
  152. }
  153. if firstRestIdx != -1 {
  154. self.error(list[firstRestIdx].Idx0(), "Rest parameter must be last formal parameter")
  155. return &ast.ParameterList{}
  156. }
  157. params = append(params, self.reinterpretAsBinding(item))
  158. }
  159. var rest ast.Expression
  160. if firstRestIdx != -1 {
  161. rest = self.reinterpretAsBindingRestElement(list[firstRestIdx])
  162. }
  163. return &ast.ParameterList{
  164. List: params,
  165. Rest: rest,
  166. }
  167. }
  168. func (self *_parser) parseParenthesisedExpression() ast.Expression {
  169. opening := self.idx
  170. self.expect(token.LEFT_PARENTHESIS)
  171. var list []ast.Expression
  172. if self.token != token.RIGHT_PARENTHESIS {
  173. for {
  174. if self.token == token.ELLIPSIS {
  175. start := self.idx
  176. self.errorUnexpectedToken(token.ELLIPSIS)
  177. self.next()
  178. expr := self.parseAssignmentExpression()
  179. list = append(list, &ast.BadExpression{
  180. From: start,
  181. To: expr.Idx1(),
  182. })
  183. } else {
  184. list = append(list, self.parseAssignmentExpression())
  185. }
  186. if self.token != token.COMMA {
  187. break
  188. }
  189. self.next()
  190. if self.token == token.RIGHT_PARENTHESIS {
  191. self.errorUnexpectedToken(token.RIGHT_PARENTHESIS)
  192. break
  193. }
  194. }
  195. }
  196. self.expect(token.RIGHT_PARENTHESIS)
  197. if len(list) == 1 && len(self.errors) == 0 {
  198. return list[0]
  199. }
  200. if len(list) == 0 {
  201. self.errorUnexpectedToken(token.RIGHT_PARENTHESIS)
  202. return &ast.BadExpression{
  203. From: opening,
  204. To: self.idx,
  205. }
  206. }
  207. return &ast.SequenceExpression{
  208. Sequence: list,
  209. }
  210. }
  211. func (self *_parser) parseRegExpLiteral() *ast.RegExpLiteral {
  212. offset := self.chrOffset - 1 // Opening slash already gotten
  213. if self.token == token.QUOTIENT_ASSIGN {
  214. offset -= 1 // =
  215. }
  216. idx := self.idxOf(offset)
  217. pattern, _, err := self.scanString(offset, false)
  218. endOffset := self.chrOffset
  219. if err == "" {
  220. pattern = pattern[1 : len(pattern)-1]
  221. }
  222. flags := ""
  223. if !isLineTerminator(self.chr) && !isLineWhiteSpace(self.chr) {
  224. self.next()
  225. if self.token == token.IDENTIFIER { // gim
  226. flags = self.literal
  227. self.next()
  228. endOffset = self.chrOffset - 1
  229. }
  230. } else {
  231. self.next()
  232. }
  233. literal := self.str[offset:endOffset]
  234. return &ast.RegExpLiteral{
  235. Idx: idx,
  236. Literal: literal,
  237. Pattern: pattern,
  238. Flags: flags,
  239. }
  240. }
  241. func (self *_parser) isBindingId(tok token.Token) bool {
  242. if tok == token.IDENTIFIER {
  243. return true
  244. }
  245. if tok == token.AWAIT {
  246. return !self.scope.allowAwait
  247. }
  248. if token.IsUnreservedWord(tok) {
  249. return true
  250. }
  251. return false
  252. }
  253. func (self *_parser) tokenToBindingId() {
  254. if self.isBindingId(self.token) {
  255. self.token = token.IDENTIFIER
  256. }
  257. }
  258. func (self *_parser) parseBindingTarget() (target ast.BindingTarget) {
  259. self.tokenToBindingId()
  260. switch self.token {
  261. case token.IDENTIFIER:
  262. target = &ast.Identifier{
  263. Name: self.parsedLiteral,
  264. Idx: self.idx,
  265. }
  266. self.next()
  267. case token.LEFT_BRACKET:
  268. target = self.parseArrayBindingPattern()
  269. case token.LEFT_BRACE:
  270. target = self.parseObjectBindingPattern()
  271. default:
  272. idx := self.expect(token.IDENTIFIER)
  273. self.nextStatement()
  274. target = &ast.BadExpression{From: idx, To: self.idx}
  275. }
  276. return
  277. }
  278. func (self *_parser) parseVariableDeclaration(declarationList *[]*ast.Binding) *ast.Binding {
  279. node := &ast.Binding{
  280. Target: self.parseBindingTarget(),
  281. }
  282. if declarationList != nil {
  283. *declarationList = append(*declarationList, node)
  284. }
  285. if self.token == token.ASSIGN {
  286. self.next()
  287. node.Initializer = self.parseAssignmentExpression()
  288. }
  289. return node
  290. }
  291. func (self *_parser) parseVariableDeclarationList() (declarationList []*ast.Binding) {
  292. for {
  293. self.parseVariableDeclaration(&declarationList)
  294. if self.token != token.COMMA {
  295. break
  296. }
  297. self.next()
  298. }
  299. return
  300. }
  301. func (self *_parser) parseVarDeclarationList(var_ file.Idx) []*ast.Binding {
  302. declarationList := self.parseVariableDeclarationList()
  303. self.scope.declare(&ast.VariableDeclaration{
  304. Var: var_,
  305. List: declarationList,
  306. })
  307. return declarationList
  308. }
  309. func (self *_parser) parseObjectPropertyKey() (string, unistring.String, ast.Expression, token.Token) {
  310. if self.token == token.LEFT_BRACKET {
  311. self.next()
  312. expr := self.parseAssignmentExpression()
  313. self.expect(token.RIGHT_BRACKET)
  314. return "", "", expr, token.ILLEGAL
  315. }
  316. idx, tkn, literal, parsedLiteral := self.idx, self.token, self.literal, self.parsedLiteral
  317. var value ast.Expression
  318. self.next()
  319. switch tkn {
  320. case token.IDENTIFIER, token.STRING, token.KEYWORD, token.ESCAPED_RESERVED_WORD:
  321. value = &ast.StringLiteral{
  322. Idx: idx,
  323. Literal: literal,
  324. Value: parsedLiteral,
  325. }
  326. case token.NUMBER:
  327. num, err := parseNumberLiteral(literal)
  328. if err != nil {
  329. self.error(idx, err.Error())
  330. } else {
  331. value = &ast.NumberLiteral{
  332. Idx: idx,
  333. Literal: literal,
  334. Value: num,
  335. }
  336. }
  337. case token.PRIVATE_IDENTIFIER:
  338. value = &ast.PrivateIdentifier{
  339. Identifier: ast.Identifier{
  340. Idx: idx,
  341. Name: parsedLiteral,
  342. },
  343. }
  344. default:
  345. // null, false, class, etc.
  346. if token.IsId(tkn) {
  347. value = &ast.StringLiteral{
  348. Idx: idx,
  349. Literal: literal,
  350. Value: unistring.String(literal),
  351. }
  352. } else {
  353. self.errorUnexpectedToken(tkn)
  354. }
  355. }
  356. return literal, parsedLiteral, value, tkn
  357. }
  358. func (self *_parser) parseObjectProperty() ast.Property {
  359. if self.token == token.ELLIPSIS {
  360. self.next()
  361. return &ast.SpreadElement{
  362. Expression: self.parseAssignmentExpression(),
  363. }
  364. }
  365. keyStartIdx := self.idx
  366. literal, parsedLiteral, value, tkn := self.parseObjectPropertyKey()
  367. if value == nil {
  368. return nil
  369. }
  370. if token.IsId(tkn) || tkn == token.STRING || tkn == token.NUMBER || tkn == token.ILLEGAL {
  371. switch {
  372. case self.token == token.LEFT_PARENTHESIS:
  373. return &ast.PropertyKeyed{
  374. Key: value,
  375. Kind: ast.PropertyKindMethod,
  376. Value: self.parseMethodDefinition(keyStartIdx, ast.PropertyKindMethod, false),
  377. Computed: tkn == token.ILLEGAL,
  378. }
  379. case self.token == token.COMMA || self.token == token.RIGHT_BRACE || self.token == token.ASSIGN: // shorthand property
  380. if self.isBindingId(tkn) {
  381. var initializer ast.Expression
  382. if self.token == token.ASSIGN {
  383. // allow the initializer syntax here in case the object literal
  384. // needs to be reinterpreted as an assignment pattern, enforce later if it doesn't.
  385. self.next()
  386. initializer = self.parseAssignmentExpression()
  387. }
  388. return &ast.PropertyShort{
  389. Name: ast.Identifier{
  390. Name: parsedLiteral,
  391. Idx: value.Idx0(),
  392. },
  393. Initializer: initializer,
  394. }
  395. } else {
  396. self.errorUnexpectedToken(self.token)
  397. }
  398. case (literal == "get" || literal == "set" || tkn == token.ASYNC) && self.token != token.COLON:
  399. _, _, keyValue, tkn1 := self.parseObjectPropertyKey()
  400. if keyValue == nil {
  401. return nil
  402. }
  403. var kind ast.PropertyKind
  404. var async bool
  405. if tkn == token.ASYNC {
  406. async = true
  407. kind = ast.PropertyKindMethod
  408. } else if literal == "get" {
  409. kind = ast.PropertyKindGet
  410. } else {
  411. kind = ast.PropertyKindSet
  412. }
  413. return &ast.PropertyKeyed{
  414. Key: keyValue,
  415. Kind: kind,
  416. Value: self.parseMethodDefinition(keyStartIdx, kind, async),
  417. Computed: tkn1 == token.ILLEGAL,
  418. }
  419. }
  420. }
  421. self.expect(token.COLON)
  422. return &ast.PropertyKeyed{
  423. Key: value,
  424. Kind: ast.PropertyKindValue,
  425. Value: self.parseAssignmentExpression(),
  426. Computed: tkn == token.ILLEGAL,
  427. }
  428. }
  429. func (self *_parser) parseMethodDefinition(keyStartIdx file.Idx, kind ast.PropertyKind, async bool) *ast.FunctionLiteral {
  430. idx1 := self.idx
  431. if async != self.scope.allowAwait {
  432. self.scope.allowAwait = async
  433. defer func() {
  434. self.scope.allowAwait = !async
  435. }()
  436. }
  437. parameterList := self.parseFunctionParameterList()
  438. switch kind {
  439. case ast.PropertyKindGet:
  440. if len(parameterList.List) > 0 || parameterList.Rest != nil {
  441. self.error(idx1, "Getter must not have any formal parameters.")
  442. }
  443. case ast.PropertyKindSet:
  444. if len(parameterList.List) != 1 || parameterList.Rest != nil {
  445. self.error(idx1, "Setter must have exactly one formal parameter.")
  446. }
  447. }
  448. node := &ast.FunctionLiteral{
  449. Function: keyStartIdx,
  450. ParameterList: parameterList,
  451. Async: async,
  452. }
  453. node.Body, node.DeclarationList = self.parseFunctionBlock(async, async)
  454. node.Source = self.slice(keyStartIdx, node.Body.Idx1())
  455. return node
  456. }
  457. func (self *_parser) parseObjectLiteral() *ast.ObjectLiteral {
  458. var value []ast.Property
  459. idx0 := self.expect(token.LEFT_BRACE)
  460. for self.token != token.RIGHT_BRACE && self.token != token.EOF {
  461. property := self.parseObjectProperty()
  462. if property != nil {
  463. value = append(value, property)
  464. }
  465. if self.token != token.RIGHT_BRACE {
  466. self.expect(token.COMMA)
  467. } else {
  468. break
  469. }
  470. }
  471. idx1 := self.expect(token.RIGHT_BRACE)
  472. return &ast.ObjectLiteral{
  473. LeftBrace: idx0,
  474. RightBrace: idx1,
  475. Value: value,
  476. }
  477. }
  478. func (self *_parser) parseArrayLiteral() *ast.ArrayLiteral {
  479. idx0 := self.expect(token.LEFT_BRACKET)
  480. var value []ast.Expression
  481. for self.token != token.RIGHT_BRACKET && self.token != token.EOF {
  482. if self.token == token.COMMA {
  483. self.next()
  484. value = append(value, nil)
  485. continue
  486. }
  487. if self.token == token.ELLIPSIS {
  488. self.next()
  489. value = append(value, &ast.SpreadElement{
  490. Expression: self.parseAssignmentExpression(),
  491. })
  492. } else {
  493. value = append(value, self.parseAssignmentExpression())
  494. }
  495. if self.token != token.RIGHT_BRACKET {
  496. self.expect(token.COMMA)
  497. }
  498. }
  499. idx1 := self.expect(token.RIGHT_BRACKET)
  500. return &ast.ArrayLiteral{
  501. LeftBracket: idx0,
  502. RightBracket: idx1,
  503. Value: value,
  504. }
  505. }
  506. func (self *_parser) parseTemplateLiteral(tagged bool) *ast.TemplateLiteral {
  507. res := &ast.TemplateLiteral{
  508. OpenQuote: self.idx,
  509. }
  510. for {
  511. start := self.offset
  512. literal, parsed, finished, parseErr, err := self.parseTemplateCharacters()
  513. if err != "" {
  514. self.error(self.offset, err)
  515. }
  516. res.Elements = append(res.Elements, &ast.TemplateElement{
  517. Idx: self.idxOf(start),
  518. Literal: literal,
  519. Parsed: parsed,
  520. Valid: parseErr == "",
  521. })
  522. if !tagged && parseErr != "" {
  523. self.error(self.offset, parseErr)
  524. }
  525. end := self.chrOffset - 1
  526. self.next()
  527. if finished {
  528. res.CloseQuote = self.idxOf(end)
  529. break
  530. }
  531. expr := self.parseExpression()
  532. res.Expressions = append(res.Expressions, expr)
  533. if self.token != token.RIGHT_BRACE {
  534. self.errorUnexpectedToken(self.token)
  535. }
  536. }
  537. return res
  538. }
  539. func (self *_parser) parseTaggedTemplateLiteral(tag ast.Expression) *ast.TemplateLiteral {
  540. l := self.parseTemplateLiteral(true)
  541. l.Tag = tag
  542. return l
  543. }
  544. func (self *_parser) parseArgumentList() (argumentList []ast.Expression, idx0, idx1 file.Idx) {
  545. idx0 = self.expect(token.LEFT_PARENTHESIS)
  546. for self.token != token.RIGHT_PARENTHESIS {
  547. var item ast.Expression
  548. if self.token == token.ELLIPSIS {
  549. self.next()
  550. item = &ast.SpreadElement{
  551. Expression: self.parseAssignmentExpression(),
  552. }
  553. } else {
  554. item = self.parseAssignmentExpression()
  555. }
  556. argumentList = append(argumentList, item)
  557. if self.token != token.COMMA {
  558. break
  559. }
  560. self.next()
  561. }
  562. idx1 = self.expect(token.RIGHT_PARENTHESIS)
  563. return
  564. }
  565. func (self *_parser) parseCallExpression(left ast.Expression) ast.Expression {
  566. argumentList, idx0, idx1 := self.parseArgumentList()
  567. return &ast.CallExpression{
  568. Callee: left,
  569. LeftParenthesis: idx0,
  570. ArgumentList: argumentList,
  571. RightParenthesis: idx1,
  572. }
  573. }
  574. func (self *_parser) parseDotMember(left ast.Expression) ast.Expression {
  575. period := self.idx
  576. self.next()
  577. literal := self.parsedLiteral
  578. idx := self.idx
  579. if self.token == token.PRIVATE_IDENTIFIER {
  580. self.next()
  581. return &ast.PrivateDotExpression{
  582. Left: left,
  583. Identifier: ast.PrivateIdentifier{
  584. Identifier: ast.Identifier{
  585. Idx: idx,
  586. Name: literal,
  587. },
  588. },
  589. }
  590. }
  591. if !token.IsId(self.token) {
  592. self.expect(token.IDENTIFIER)
  593. self.nextStatement()
  594. return &ast.BadExpression{From: period, To: self.idx}
  595. }
  596. self.next()
  597. return &ast.DotExpression{
  598. Left: left,
  599. Identifier: ast.Identifier{
  600. Idx: idx,
  601. Name: literal,
  602. },
  603. }
  604. }
  605. func (self *_parser) parseBracketMember(left ast.Expression) ast.Expression {
  606. idx0 := self.expect(token.LEFT_BRACKET)
  607. member := self.parseExpression()
  608. idx1 := self.expect(token.RIGHT_BRACKET)
  609. return &ast.BracketExpression{
  610. LeftBracket: idx0,
  611. Left: left,
  612. Member: member,
  613. RightBracket: idx1,
  614. }
  615. }
  616. func (self *_parser) parseNewExpression() ast.Expression {
  617. idx := self.expect(token.NEW)
  618. if self.token == token.PERIOD {
  619. self.next()
  620. if self.literal == "target" {
  621. return &ast.MetaProperty{
  622. Meta: &ast.Identifier{
  623. Name: unistring.String(token.NEW.String()),
  624. Idx: idx,
  625. },
  626. Property: self.parseIdentifier(),
  627. }
  628. }
  629. self.errorUnexpectedToken(token.IDENTIFIER)
  630. }
  631. callee := self.parseLeftHandSideExpression()
  632. if bad, ok := callee.(*ast.BadExpression); ok {
  633. bad.From = idx
  634. return bad
  635. }
  636. node := &ast.NewExpression{
  637. New: idx,
  638. Callee: callee,
  639. }
  640. if self.token == token.LEFT_PARENTHESIS {
  641. argumentList, idx0, idx1 := self.parseArgumentList()
  642. node.ArgumentList = argumentList
  643. node.LeftParenthesis = idx0
  644. node.RightParenthesis = idx1
  645. }
  646. return node
  647. }
  648. func (self *_parser) parseLeftHandSideExpression() ast.Expression {
  649. var left ast.Expression
  650. if self.token == token.NEW {
  651. left = self.parseNewExpression()
  652. } else {
  653. left = self.parsePrimaryExpression()
  654. }
  655. L:
  656. for {
  657. switch self.token {
  658. case token.PERIOD:
  659. left = self.parseDotMember(left)
  660. case token.LEFT_BRACKET:
  661. left = self.parseBracketMember(left)
  662. case token.BACKTICK:
  663. left = self.parseTaggedTemplateLiteral(left)
  664. default:
  665. break L
  666. }
  667. }
  668. return left
  669. }
  670. func (self *_parser) parseLeftHandSideExpressionAllowCall() ast.Expression {
  671. allowIn := self.scope.allowIn
  672. self.scope.allowIn = true
  673. defer func() {
  674. self.scope.allowIn = allowIn
  675. }()
  676. var left ast.Expression
  677. start := self.idx
  678. if self.token == token.NEW {
  679. left = self.parseNewExpression()
  680. } else {
  681. left = self.parsePrimaryExpression()
  682. }
  683. optionalChain := false
  684. L:
  685. for {
  686. switch self.token {
  687. case token.PERIOD:
  688. left = self.parseDotMember(left)
  689. case token.LEFT_BRACKET:
  690. left = self.parseBracketMember(left)
  691. case token.LEFT_PARENTHESIS:
  692. left = self.parseCallExpression(left)
  693. case token.BACKTICK:
  694. if optionalChain {
  695. self.error(self.idx, "Invalid template literal on optional chain")
  696. self.nextStatement()
  697. return &ast.BadExpression{From: start, To: self.idx}
  698. }
  699. left = self.parseTaggedTemplateLiteral(left)
  700. case token.QUESTION_DOT:
  701. optionalChain = true
  702. left = &ast.Optional{Expression: left}
  703. switch self.peek() {
  704. case token.LEFT_BRACKET, token.LEFT_PARENTHESIS, token.BACKTICK:
  705. self.next()
  706. default:
  707. left = self.parseDotMember(left)
  708. }
  709. default:
  710. break L
  711. }
  712. }
  713. if optionalChain {
  714. left = &ast.OptionalChain{Expression: left}
  715. }
  716. return left
  717. }
  718. func (self *_parser) parsePostfixExpression() ast.Expression {
  719. operand := self.parseLeftHandSideExpressionAllowCall()
  720. switch self.token {
  721. case token.INCREMENT, token.DECREMENT:
  722. // Make sure there is no line terminator here
  723. if self.implicitSemicolon {
  724. break
  725. }
  726. tkn := self.token
  727. idx := self.idx
  728. self.next()
  729. switch operand.(type) {
  730. case *ast.Identifier, *ast.DotExpression, *ast.PrivateDotExpression, *ast.BracketExpression:
  731. default:
  732. self.error(idx, "Invalid left-hand side in assignment")
  733. self.nextStatement()
  734. return &ast.BadExpression{From: idx, To: self.idx}
  735. }
  736. return &ast.UnaryExpression{
  737. Operator: tkn,
  738. Idx: idx,
  739. Operand: operand,
  740. Postfix: true,
  741. }
  742. }
  743. return operand
  744. }
  745. func (self *_parser) parseUnaryExpression() ast.Expression {
  746. switch self.token {
  747. case token.PLUS, token.MINUS, token.NOT, token.BITWISE_NOT:
  748. fallthrough
  749. case token.DELETE, token.VOID, token.TYPEOF:
  750. tkn := self.token
  751. idx := self.idx
  752. self.next()
  753. return &ast.UnaryExpression{
  754. Operator: tkn,
  755. Idx: idx,
  756. Operand: self.parseUnaryExpression(),
  757. }
  758. case token.INCREMENT, token.DECREMENT:
  759. tkn := self.token
  760. idx := self.idx
  761. self.next()
  762. operand := self.parseUnaryExpression()
  763. switch operand.(type) {
  764. case *ast.Identifier, *ast.DotExpression, *ast.PrivateDotExpression, *ast.BracketExpression:
  765. default:
  766. self.error(idx, "Invalid left-hand side in assignment")
  767. self.nextStatement()
  768. return &ast.BadExpression{From: idx, To: self.idx}
  769. }
  770. return &ast.UnaryExpression{
  771. Operator: tkn,
  772. Idx: idx,
  773. Operand: operand,
  774. }
  775. case token.AWAIT:
  776. if self.scope.allowAwait {
  777. idx := self.idx
  778. self.next()
  779. if !self.scope.inAsync {
  780. self.errorUnexpectedToken(token.AWAIT)
  781. return &ast.BadExpression{
  782. From: idx,
  783. To: self.idx,
  784. }
  785. }
  786. return &ast.AwaitExpression{
  787. Await: idx,
  788. Argument: self.parseUnaryExpression(),
  789. }
  790. }
  791. }
  792. return self.parsePostfixExpression()
  793. }
  794. func isUpdateExpression(expr ast.Expression) bool {
  795. if ux, ok := expr.(*ast.UnaryExpression); ok {
  796. return ux.Operator == token.INCREMENT || ux.Operator == token.DECREMENT
  797. }
  798. return true
  799. }
  800. func (self *_parser) parseExponentiationExpression() ast.Expression {
  801. left := self.parseUnaryExpression()
  802. for self.token == token.EXPONENT && isUpdateExpression(left) {
  803. self.next()
  804. left = &ast.BinaryExpression{
  805. Operator: token.EXPONENT,
  806. Left: left,
  807. Right: self.parseExponentiationExpression(),
  808. }
  809. }
  810. return left
  811. }
  812. func (self *_parser) parseMultiplicativeExpression() ast.Expression {
  813. left := self.parseExponentiationExpression()
  814. for self.token == token.MULTIPLY || self.token == token.SLASH ||
  815. self.token == token.REMAINDER {
  816. tkn := self.token
  817. self.next()
  818. left = &ast.BinaryExpression{
  819. Operator: tkn,
  820. Left: left,
  821. Right: self.parseExponentiationExpression(),
  822. }
  823. }
  824. return left
  825. }
  826. func (self *_parser) parseAdditiveExpression() ast.Expression {
  827. left := self.parseMultiplicativeExpression()
  828. for self.token == token.PLUS || self.token == token.MINUS {
  829. tkn := self.token
  830. self.next()
  831. left = &ast.BinaryExpression{
  832. Operator: tkn,
  833. Left: left,
  834. Right: self.parseMultiplicativeExpression(),
  835. }
  836. }
  837. return left
  838. }
  839. func (self *_parser) parseShiftExpression() ast.Expression {
  840. left := self.parseAdditiveExpression()
  841. for self.token == token.SHIFT_LEFT || self.token == token.SHIFT_RIGHT ||
  842. self.token == token.UNSIGNED_SHIFT_RIGHT {
  843. tkn := self.token
  844. self.next()
  845. left = &ast.BinaryExpression{
  846. Operator: tkn,
  847. Left: left,
  848. Right: self.parseAdditiveExpression(),
  849. }
  850. }
  851. return left
  852. }
  853. func (self *_parser) parseRelationalExpression() ast.Expression {
  854. if self.scope.allowIn && self.token == token.PRIVATE_IDENTIFIER {
  855. left := &ast.PrivateIdentifier{
  856. Identifier: ast.Identifier{
  857. Idx: self.idx,
  858. Name: self.parsedLiteral,
  859. },
  860. }
  861. self.next()
  862. if self.token == token.IN {
  863. self.next()
  864. return &ast.BinaryExpression{
  865. Operator: self.token,
  866. Left: left,
  867. Right: self.parseShiftExpression(),
  868. }
  869. }
  870. return left
  871. }
  872. left := self.parseShiftExpression()
  873. allowIn := self.scope.allowIn
  874. self.scope.allowIn = true
  875. defer func() {
  876. self.scope.allowIn = allowIn
  877. }()
  878. switch self.token {
  879. case token.LESS, token.LESS_OR_EQUAL, token.GREATER, token.GREATER_OR_EQUAL:
  880. tkn := self.token
  881. self.next()
  882. return &ast.BinaryExpression{
  883. Operator: tkn,
  884. Left: left,
  885. Right: self.parseRelationalExpression(),
  886. Comparison: true,
  887. }
  888. case token.INSTANCEOF:
  889. tkn := self.token
  890. self.next()
  891. return &ast.BinaryExpression{
  892. Operator: tkn,
  893. Left: left,
  894. Right: self.parseRelationalExpression(),
  895. }
  896. case token.IN:
  897. if !allowIn {
  898. return left
  899. }
  900. tkn := self.token
  901. self.next()
  902. return &ast.BinaryExpression{
  903. Operator: tkn,
  904. Left: left,
  905. Right: self.parseRelationalExpression(),
  906. }
  907. }
  908. return left
  909. }
  910. func (self *_parser) parseEqualityExpression() ast.Expression {
  911. left := self.parseRelationalExpression()
  912. for self.token == token.EQUAL || self.token == token.NOT_EQUAL ||
  913. self.token == token.STRICT_EQUAL || self.token == token.STRICT_NOT_EQUAL {
  914. tkn := self.token
  915. self.next()
  916. left = &ast.BinaryExpression{
  917. Operator: tkn,
  918. Left: left,
  919. Right: self.parseRelationalExpression(),
  920. Comparison: true,
  921. }
  922. }
  923. return left
  924. }
  925. func (self *_parser) parseBitwiseAndExpression() ast.Expression {
  926. left := self.parseEqualityExpression()
  927. for self.token == token.AND {
  928. tkn := self.token
  929. self.next()
  930. left = &ast.BinaryExpression{
  931. Operator: tkn,
  932. Left: left,
  933. Right: self.parseEqualityExpression(),
  934. }
  935. }
  936. return left
  937. }
  938. func (self *_parser) parseBitwiseExclusiveOrExpression() ast.Expression {
  939. left := self.parseBitwiseAndExpression()
  940. for self.token == token.EXCLUSIVE_OR {
  941. tkn := self.token
  942. self.next()
  943. left = &ast.BinaryExpression{
  944. Operator: tkn,
  945. Left: left,
  946. Right: self.parseBitwiseAndExpression(),
  947. }
  948. }
  949. return left
  950. }
  951. func (self *_parser) parseBitwiseOrExpression() ast.Expression {
  952. left := self.parseBitwiseExclusiveOrExpression()
  953. for self.token == token.OR {
  954. tkn := self.token
  955. self.next()
  956. left = &ast.BinaryExpression{
  957. Operator: tkn,
  958. Left: left,
  959. Right: self.parseBitwiseExclusiveOrExpression(),
  960. }
  961. }
  962. return left
  963. }
  964. func (self *_parser) parseLogicalAndExpression() ast.Expression {
  965. left := self.parseBitwiseOrExpression()
  966. for self.token == token.LOGICAL_AND {
  967. tkn := self.token
  968. self.next()
  969. left = &ast.BinaryExpression{
  970. Operator: tkn,
  971. Left: left,
  972. Right: self.parseBitwiseOrExpression(),
  973. }
  974. }
  975. return left
  976. }
  977. func isLogicalAndExpr(expr ast.Expression) bool {
  978. if bexp, ok := expr.(*ast.BinaryExpression); ok && bexp.Operator == token.LOGICAL_AND {
  979. return true
  980. }
  981. return false
  982. }
  983. func (self *_parser) parseLogicalOrExpression() ast.Expression {
  984. var idx file.Idx
  985. parenthesis := self.token == token.LEFT_PARENTHESIS
  986. left := self.parseLogicalAndExpression()
  987. if self.token == token.LOGICAL_OR || !parenthesis && isLogicalAndExpr(left) {
  988. for {
  989. switch self.token {
  990. case token.LOGICAL_OR:
  991. self.next()
  992. left = &ast.BinaryExpression{
  993. Operator: token.LOGICAL_OR,
  994. Left: left,
  995. Right: self.parseLogicalAndExpression(),
  996. }
  997. case token.COALESCE:
  998. idx = self.idx
  999. goto mixed
  1000. default:
  1001. return left
  1002. }
  1003. }
  1004. } else {
  1005. for {
  1006. switch self.token {
  1007. case token.COALESCE:
  1008. idx = self.idx
  1009. self.next()
  1010. parenthesis := self.token == token.LEFT_PARENTHESIS
  1011. right := self.parseLogicalAndExpression()
  1012. if !parenthesis && isLogicalAndExpr(right) {
  1013. goto mixed
  1014. }
  1015. left = &ast.BinaryExpression{
  1016. Operator: token.COALESCE,
  1017. Left: left,
  1018. Right: right,
  1019. }
  1020. case token.LOGICAL_OR:
  1021. idx = self.idx
  1022. goto mixed
  1023. default:
  1024. return left
  1025. }
  1026. }
  1027. }
  1028. mixed:
  1029. self.error(idx, "Logical expressions and coalesce expressions cannot be mixed. Wrap either by parentheses")
  1030. return left
  1031. }
  1032. func (self *_parser) parseConditionalExpression() ast.Expression {
  1033. left := self.parseLogicalOrExpression()
  1034. if self.token == token.QUESTION_MARK {
  1035. self.next()
  1036. consequent := self.parseAssignmentExpression()
  1037. self.expect(token.COLON)
  1038. return &ast.ConditionalExpression{
  1039. Test: left,
  1040. Consequent: consequent,
  1041. Alternate: self.parseAssignmentExpression(),
  1042. }
  1043. }
  1044. return left
  1045. }
  1046. func (self *_parser) parseArrowFunction(start file.Idx, paramList *ast.ParameterList, async bool) ast.Expression {
  1047. self.expect(token.ARROW)
  1048. node := &ast.ArrowFunctionLiteral{
  1049. Start: start,
  1050. ParameterList: paramList,
  1051. Async: async,
  1052. }
  1053. node.Body, node.DeclarationList = self.parseArrowFunctionBody(async)
  1054. node.Source = self.slice(start, node.Body.Idx1())
  1055. return node
  1056. }
  1057. func (self *_parser) parseSingleArgArrowFunction(start file.Idx, async bool) ast.Expression {
  1058. if async != self.scope.allowAwait {
  1059. self.scope.allowAwait = async
  1060. defer func() {
  1061. self.scope.allowAwait = !async
  1062. }()
  1063. }
  1064. self.tokenToBindingId()
  1065. if self.token != token.IDENTIFIER {
  1066. self.errorUnexpectedToken(self.token)
  1067. self.next()
  1068. return &ast.BadExpression{
  1069. From: start,
  1070. To: self.idx,
  1071. }
  1072. }
  1073. id := self.parseIdentifier()
  1074. paramList := &ast.ParameterList{
  1075. Opening: id.Idx,
  1076. Closing: id.Idx1(),
  1077. List: []*ast.Binding{{
  1078. Target: id,
  1079. }},
  1080. }
  1081. return self.parseArrowFunction(start, paramList, async)
  1082. }
  1083. func (self *_parser) parseAssignmentExpression() ast.Expression {
  1084. start := self.idx
  1085. parenthesis := false
  1086. async := false
  1087. var state parserState
  1088. switch self.token {
  1089. case token.LEFT_PARENTHESIS:
  1090. self.mark(&state)
  1091. parenthesis = true
  1092. case token.ASYNC:
  1093. tok := self.peek()
  1094. if self.isBindingId(tok) {
  1095. // async x => ...
  1096. self.next()
  1097. return self.parseSingleArgArrowFunction(start, true)
  1098. } else if tok == token.LEFT_PARENTHESIS {
  1099. self.mark(&state)
  1100. async = true
  1101. }
  1102. default:
  1103. self.tokenToBindingId()
  1104. }
  1105. left := self.parseConditionalExpression()
  1106. var operator token.Token
  1107. switch self.token {
  1108. case token.ASSIGN:
  1109. operator = self.token
  1110. case token.ADD_ASSIGN:
  1111. operator = token.PLUS
  1112. case token.SUBTRACT_ASSIGN:
  1113. operator = token.MINUS
  1114. case token.MULTIPLY_ASSIGN:
  1115. operator = token.MULTIPLY
  1116. case token.EXPONENT_ASSIGN:
  1117. operator = token.EXPONENT
  1118. case token.QUOTIENT_ASSIGN:
  1119. operator = token.SLASH
  1120. case token.REMAINDER_ASSIGN:
  1121. operator = token.REMAINDER
  1122. case token.AND_ASSIGN:
  1123. operator = token.AND
  1124. case token.OR_ASSIGN:
  1125. operator = token.OR
  1126. case token.EXCLUSIVE_OR_ASSIGN:
  1127. operator = token.EXCLUSIVE_OR
  1128. case token.SHIFT_LEFT_ASSIGN:
  1129. operator = token.SHIFT_LEFT
  1130. case token.SHIFT_RIGHT_ASSIGN:
  1131. operator = token.SHIFT_RIGHT
  1132. case token.UNSIGNED_SHIFT_RIGHT_ASSIGN:
  1133. operator = token.UNSIGNED_SHIFT_RIGHT
  1134. case token.ARROW:
  1135. var paramList *ast.ParameterList
  1136. if id, ok := left.(*ast.Identifier); ok {
  1137. paramList = &ast.ParameterList{
  1138. Opening: id.Idx,
  1139. Closing: id.Idx1() - 1,
  1140. List: []*ast.Binding{{
  1141. Target: id,
  1142. }},
  1143. }
  1144. } else if parenthesis {
  1145. if seq, ok := left.(*ast.SequenceExpression); ok && len(self.errors) == 0 {
  1146. paramList = self.reinterpretSequenceAsArrowFuncParams(seq.Sequence)
  1147. } else {
  1148. self.restore(&state)
  1149. paramList = self.parseFunctionParameterList()
  1150. }
  1151. } else if async {
  1152. // async (x, y) => ...
  1153. if !self.scope.allowAwait {
  1154. self.scope.allowAwait = true
  1155. defer func() {
  1156. self.scope.allowAwait = false
  1157. }()
  1158. }
  1159. if _, ok := left.(*ast.CallExpression); ok {
  1160. self.restore(&state)
  1161. self.next() // skip "async"
  1162. paramList = self.parseFunctionParameterList()
  1163. }
  1164. }
  1165. if paramList == nil {
  1166. self.error(left.Idx0(), "Malformed arrow function parameter list")
  1167. return &ast.BadExpression{From: left.Idx0(), To: left.Idx1()}
  1168. }
  1169. return self.parseArrowFunction(start, paramList, async)
  1170. }
  1171. if operator != 0 {
  1172. idx := self.idx
  1173. self.next()
  1174. ok := false
  1175. switch l := left.(type) {
  1176. case *ast.Identifier, *ast.DotExpression, *ast.PrivateDotExpression, *ast.BracketExpression:
  1177. ok = true
  1178. case *ast.ArrayLiteral:
  1179. if !parenthesis && operator == token.ASSIGN {
  1180. left = self.reinterpretAsArrayAssignmentPattern(l)
  1181. ok = true
  1182. }
  1183. case *ast.ObjectLiteral:
  1184. if !parenthesis && operator == token.ASSIGN {
  1185. left = self.reinterpretAsObjectAssignmentPattern(l)
  1186. ok = true
  1187. }
  1188. }
  1189. if ok {
  1190. return &ast.AssignExpression{
  1191. Left: left,
  1192. Operator: operator,
  1193. Right: self.parseAssignmentExpression(),
  1194. }
  1195. }
  1196. self.error(left.Idx0(), "Invalid left-hand side in assignment")
  1197. self.nextStatement()
  1198. return &ast.BadExpression{From: idx, To: self.idx}
  1199. }
  1200. return left
  1201. }
  1202. func (self *_parser) parseExpression() ast.Expression {
  1203. left := self.parseAssignmentExpression()
  1204. if self.token == token.COMMA {
  1205. sequence := []ast.Expression{left}
  1206. for {
  1207. if self.token != token.COMMA {
  1208. break
  1209. }
  1210. self.next()
  1211. sequence = append(sequence, self.parseAssignmentExpression())
  1212. }
  1213. return &ast.SequenceExpression{
  1214. Sequence: sequence,
  1215. }
  1216. }
  1217. return left
  1218. }
  1219. func (self *_parser) checkComma(from, to file.Idx) {
  1220. if pos := strings.IndexByte(self.str[int(from)-self.base:int(to)-self.base], ','); pos >= 0 {
  1221. self.error(from+file.Idx(pos), "Comma is not allowed here")
  1222. }
  1223. }
  1224. func (self *_parser) reinterpretAsArrayAssignmentPattern(left *ast.ArrayLiteral) ast.Expression {
  1225. value := left.Value
  1226. var rest ast.Expression
  1227. for i, item := range value {
  1228. if spread, ok := item.(*ast.SpreadElement); ok {
  1229. if i != len(value)-1 {
  1230. self.error(item.Idx0(), "Rest element must be last element")
  1231. return &ast.BadExpression{From: left.Idx0(), To: left.Idx1()}
  1232. }
  1233. self.checkComma(spread.Expression.Idx1(), left.RightBracket)
  1234. rest = self.reinterpretAsDestructAssignTarget(spread.Expression)
  1235. value = value[:len(value)-1]
  1236. } else {
  1237. value[i] = self.reinterpretAsAssignmentElement(item)
  1238. }
  1239. }
  1240. return &ast.ArrayPattern{
  1241. LeftBracket: left.LeftBracket,
  1242. RightBracket: left.RightBracket,
  1243. Elements: value,
  1244. Rest: rest,
  1245. }
  1246. }
  1247. func (self *_parser) reinterpretArrayAssignPatternAsBinding(pattern *ast.ArrayPattern) *ast.ArrayPattern {
  1248. for i, item := range pattern.Elements {
  1249. pattern.Elements[i] = self.reinterpretAsDestructBindingTarget(item)
  1250. }
  1251. if pattern.Rest != nil {
  1252. pattern.Rest = self.reinterpretAsDestructBindingTarget(pattern.Rest)
  1253. }
  1254. return pattern
  1255. }
  1256. func (self *_parser) reinterpretAsArrayBindingPattern(left *ast.ArrayLiteral) ast.BindingTarget {
  1257. value := left.Value
  1258. var rest ast.Expression
  1259. for i, item := range value {
  1260. if spread, ok := item.(*ast.SpreadElement); ok {
  1261. if i != len(value)-1 {
  1262. self.error(item.Idx0(), "Rest element must be last element")
  1263. return &ast.BadExpression{From: left.Idx0(), To: left.Idx1()}
  1264. }
  1265. self.checkComma(spread.Expression.Idx1(), left.RightBracket)
  1266. rest = self.reinterpretAsDestructBindingTarget(spread.Expression)
  1267. value = value[:len(value)-1]
  1268. } else {
  1269. value[i] = self.reinterpretAsBindingElement(item)
  1270. }
  1271. }
  1272. return &ast.ArrayPattern{
  1273. LeftBracket: left.LeftBracket,
  1274. RightBracket: left.RightBracket,
  1275. Elements: value,
  1276. Rest: rest,
  1277. }
  1278. }
  1279. func (self *_parser) parseArrayBindingPattern() ast.BindingTarget {
  1280. return self.reinterpretAsArrayBindingPattern(self.parseArrayLiteral())
  1281. }
  1282. func (self *_parser) parseObjectBindingPattern() ast.BindingTarget {
  1283. return self.reinterpretAsObjectBindingPattern(self.parseObjectLiteral())
  1284. }
  1285. func (self *_parser) reinterpretArrayObjectPatternAsBinding(pattern *ast.ObjectPattern) *ast.ObjectPattern {
  1286. for _, prop := range pattern.Properties {
  1287. if keyed, ok := prop.(*ast.PropertyKeyed); ok {
  1288. keyed.Value = self.reinterpretAsBindingElement(keyed.Value)
  1289. }
  1290. }
  1291. if pattern.Rest != nil {
  1292. pattern.Rest = self.reinterpretAsBindingRestElement(pattern.Rest)
  1293. }
  1294. return pattern
  1295. }
  1296. func (self *_parser) reinterpretAsObjectBindingPattern(expr *ast.ObjectLiteral) ast.BindingTarget {
  1297. var rest ast.Expression
  1298. value := expr.Value
  1299. for i, prop := range value {
  1300. ok := false
  1301. switch prop := prop.(type) {
  1302. case *ast.PropertyKeyed:
  1303. if prop.Kind == ast.PropertyKindValue {
  1304. prop.Value = self.reinterpretAsBindingElement(prop.Value)
  1305. ok = true
  1306. }
  1307. case *ast.PropertyShort:
  1308. ok = true
  1309. case *ast.SpreadElement:
  1310. if i != len(expr.Value)-1 {
  1311. self.error(prop.Idx0(), "Rest element must be last element")
  1312. return &ast.BadExpression{From: expr.Idx0(), To: expr.Idx1()}
  1313. }
  1314. // TODO make sure there is no trailing comma
  1315. rest = self.reinterpretAsBindingRestElement(prop.Expression)
  1316. value = value[:i]
  1317. ok = true
  1318. }
  1319. if !ok {
  1320. self.error(prop.Idx0(), "Invalid destructuring binding target")
  1321. return &ast.BadExpression{From: expr.Idx0(), To: expr.Idx1()}
  1322. }
  1323. }
  1324. return &ast.ObjectPattern{
  1325. LeftBrace: expr.LeftBrace,
  1326. RightBrace: expr.RightBrace,
  1327. Properties: value,
  1328. Rest: rest,
  1329. }
  1330. }
  1331. func (self *_parser) reinterpretAsObjectAssignmentPattern(l *ast.ObjectLiteral) ast.Expression {
  1332. var rest ast.Expression
  1333. value := l.Value
  1334. for i, prop := range value {
  1335. ok := false
  1336. switch prop := prop.(type) {
  1337. case *ast.PropertyKeyed:
  1338. if prop.Kind == ast.PropertyKindValue {
  1339. prop.Value = self.reinterpretAsAssignmentElement(prop.Value)
  1340. ok = true
  1341. }
  1342. case *ast.PropertyShort:
  1343. ok = true
  1344. case *ast.SpreadElement:
  1345. if i != len(l.Value)-1 {
  1346. self.error(prop.Idx0(), "Rest element must be last element")
  1347. return &ast.BadExpression{From: l.Idx0(), To: l.Idx1()}
  1348. }
  1349. // TODO make sure there is no trailing comma
  1350. rest = prop.Expression
  1351. value = value[:i]
  1352. ok = true
  1353. }
  1354. if !ok {
  1355. self.error(prop.Idx0(), "Invalid destructuring assignment target")
  1356. return &ast.BadExpression{From: l.Idx0(), To: l.Idx1()}
  1357. }
  1358. }
  1359. return &ast.ObjectPattern{
  1360. LeftBrace: l.LeftBrace,
  1361. RightBrace: l.RightBrace,
  1362. Properties: value,
  1363. Rest: rest,
  1364. }
  1365. }
  1366. func (self *_parser) reinterpretAsAssignmentElement(expr ast.Expression) ast.Expression {
  1367. switch expr := expr.(type) {
  1368. case *ast.AssignExpression:
  1369. if expr.Operator == token.ASSIGN {
  1370. expr.Left = self.reinterpretAsDestructAssignTarget(expr.Left)
  1371. return expr
  1372. } else {
  1373. self.error(expr.Idx0(), "Invalid destructuring assignment target")
  1374. return &ast.BadExpression{From: expr.Idx0(), To: expr.Idx1()}
  1375. }
  1376. default:
  1377. return self.reinterpretAsDestructAssignTarget(expr)
  1378. }
  1379. }
  1380. func (self *_parser) reinterpretAsBindingElement(expr ast.Expression) ast.Expression {
  1381. switch expr := expr.(type) {
  1382. case *ast.AssignExpression:
  1383. if expr.Operator == token.ASSIGN {
  1384. expr.Left = self.reinterpretAsDestructBindingTarget(expr.Left)
  1385. return expr
  1386. } else {
  1387. self.error(expr.Idx0(), "Invalid destructuring assignment target")
  1388. return &ast.BadExpression{From: expr.Idx0(), To: expr.Idx1()}
  1389. }
  1390. default:
  1391. return self.reinterpretAsDestructBindingTarget(expr)
  1392. }
  1393. }
  1394. func (self *_parser) reinterpretAsBinding(expr ast.Expression) *ast.Binding {
  1395. switch expr := expr.(type) {
  1396. case *ast.AssignExpression:
  1397. if expr.Operator == token.ASSIGN {
  1398. return &ast.Binding{
  1399. Target: self.reinterpretAsDestructBindingTarget(expr.Left),
  1400. Initializer: expr.Right,
  1401. }
  1402. } else {
  1403. self.error(expr.Idx0(), "Invalid destructuring assignment target")
  1404. return &ast.Binding{
  1405. Target: &ast.BadExpression{From: expr.Idx0(), To: expr.Idx1()},
  1406. }
  1407. }
  1408. default:
  1409. return &ast.Binding{
  1410. Target: self.reinterpretAsDestructBindingTarget(expr),
  1411. }
  1412. }
  1413. }
  1414. func (self *_parser) reinterpretAsDestructAssignTarget(item ast.Expression) ast.Expression {
  1415. switch item := item.(type) {
  1416. case nil:
  1417. return nil
  1418. case *ast.ArrayLiteral:
  1419. return self.reinterpretAsArrayAssignmentPattern(item)
  1420. case *ast.ObjectLiteral:
  1421. return self.reinterpretAsObjectAssignmentPattern(item)
  1422. case ast.Pattern, *ast.Identifier, *ast.DotExpression, *ast.PrivateDotExpression, *ast.BracketExpression:
  1423. return item
  1424. }
  1425. self.error(item.Idx0(), "Invalid destructuring assignment target")
  1426. return &ast.BadExpression{From: item.Idx0(), To: item.Idx1()}
  1427. }
  1428. func (self *_parser) reinterpretAsDestructBindingTarget(item ast.Expression) ast.BindingTarget {
  1429. switch item := item.(type) {
  1430. case nil:
  1431. return nil
  1432. case *ast.ArrayPattern:
  1433. return self.reinterpretArrayAssignPatternAsBinding(item)
  1434. case *ast.ObjectPattern:
  1435. return self.reinterpretArrayObjectPatternAsBinding(item)
  1436. case *ast.ArrayLiteral:
  1437. return self.reinterpretAsArrayBindingPattern(item)
  1438. case *ast.ObjectLiteral:
  1439. return self.reinterpretAsObjectBindingPattern(item)
  1440. case *ast.Identifier:
  1441. if !self.scope.allowAwait || item.Name != "await" {
  1442. return item
  1443. }
  1444. }
  1445. self.error(item.Idx0(), "Invalid destructuring binding target")
  1446. return &ast.BadExpression{From: item.Idx0(), To: item.Idx1()}
  1447. }
  1448. func (self *_parser) reinterpretAsBindingRestElement(expr ast.Expression) ast.Expression {
  1449. if _, ok := expr.(*ast.Identifier); ok {
  1450. return expr
  1451. }
  1452. self.error(expr.Idx0(), "Invalid binding rest")
  1453. return &ast.BadExpression{From: expr.Idx0(), To: expr.Idx1()}
  1454. }