node.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964
  1. // Package ast declares types representing a JavaScript AST.
  2. //
  3. // # Warning
  4. // The parser and AST interfaces are still works-in-progress (particularly where
  5. // node types are concerned) and may change in the future.
  6. package ast
  7. import (
  8. "github.com/robertkrimen/otto/file"
  9. "github.com/robertkrimen/otto/token"
  10. )
  11. // Node is implemented by types that represent a node.
  12. type Node interface {
  13. Idx0() file.Idx // The index of the first character belonging to the node
  14. Idx1() file.Idx // The index of the first character immediately after the node
  15. }
  16. // Expression is implemented by types that represent an Expression.
  17. type Expression interface {
  18. Node
  19. expression()
  20. }
  21. // ArrayLiteral represents an array literal.
  22. type ArrayLiteral struct {
  23. Value []Expression
  24. LeftBracket file.Idx
  25. RightBracket file.Idx
  26. }
  27. // Idx0 implements Node.
  28. func (al *ArrayLiteral) Idx0() file.Idx {
  29. return al.LeftBracket
  30. }
  31. // Idx1 implements Node.
  32. func (al *ArrayLiteral) Idx1() file.Idx {
  33. return al.RightBracket + 1
  34. }
  35. // expression implements Expression.
  36. func (*ArrayLiteral) expression() {}
  37. // AssignExpression represents an assignment expression.
  38. type AssignExpression struct {
  39. Left Expression
  40. Right Expression
  41. Operator token.Token
  42. }
  43. // Idx0 implements Node.
  44. func (ae *AssignExpression) Idx0() file.Idx {
  45. return ae.Left.Idx0()
  46. }
  47. // Idx1 implements Node.
  48. func (ae *AssignExpression) Idx1() file.Idx {
  49. return ae.Right.Idx1()
  50. }
  51. // expression implements Expression.
  52. func (*AssignExpression) expression() {}
  53. // BadExpression represents a bad expression.
  54. type BadExpression struct {
  55. From file.Idx
  56. To file.Idx
  57. }
  58. // Idx0 implements Node.
  59. func (be *BadExpression) Idx0() file.Idx {
  60. return be.From
  61. }
  62. // Idx1 implements Node.
  63. func (be *BadExpression) Idx1() file.Idx {
  64. return be.To
  65. }
  66. // expression implements Expression.
  67. func (*BadExpression) expression() {}
  68. // BinaryExpression represents a binary expression.
  69. type BinaryExpression struct {
  70. Left Expression
  71. Right Expression
  72. Operator token.Token
  73. Comparison bool
  74. }
  75. // Idx0 implements Node.
  76. func (be *BinaryExpression) Idx0() file.Idx {
  77. return be.Left.Idx0()
  78. }
  79. // Idx1 implements Node.
  80. func (be *BinaryExpression) Idx1() file.Idx {
  81. return be.Right.Idx1()
  82. }
  83. // expression implements Expression.
  84. func (*BinaryExpression) expression() {}
  85. // BooleanLiteral represents a boolean expression.
  86. type BooleanLiteral struct {
  87. Literal string
  88. Idx file.Idx
  89. Value bool
  90. }
  91. // Idx0 implements Node.
  92. func (bl *BooleanLiteral) Idx0() file.Idx {
  93. return bl.Idx
  94. }
  95. // Idx1 implements Node.
  96. func (bl *BooleanLiteral) Idx1() file.Idx {
  97. return file.Idx(int(bl.Idx) + len(bl.Literal))
  98. }
  99. // expression implements Expression.
  100. func (*BooleanLiteral) expression() {}
  101. // BracketExpression represents a bracketed expression.
  102. type BracketExpression struct {
  103. Left Expression
  104. Member Expression
  105. LeftBracket file.Idx
  106. RightBracket file.Idx
  107. }
  108. // Idx0 implements Node.
  109. func (be *BracketExpression) Idx0() file.Idx {
  110. return be.Left.Idx0()
  111. }
  112. // Idx1 implements Node.
  113. func (be *BracketExpression) Idx1() file.Idx {
  114. return be.RightBracket + 1
  115. }
  116. // expression implements Expression.
  117. func (*BracketExpression) expression() {}
  118. // CallExpression represents a call expression.
  119. type CallExpression struct {
  120. Callee Expression
  121. ArgumentList []Expression
  122. LeftParenthesis file.Idx
  123. RightParenthesis file.Idx
  124. }
  125. // Idx0 implements Node.
  126. func (ce *CallExpression) Idx0() file.Idx {
  127. return ce.Callee.Idx0()
  128. }
  129. // Idx1 implements Node.
  130. func (ce *CallExpression) Idx1() file.Idx {
  131. return ce.RightParenthesis + 1
  132. }
  133. // expression implements Expression.
  134. func (*CallExpression) expression() {}
  135. // ConditionalExpression represents a conditional expression.
  136. type ConditionalExpression struct {
  137. Test Expression
  138. Consequent Expression
  139. Alternate Expression
  140. }
  141. // Idx0 implements Node.
  142. func (ce *ConditionalExpression) Idx0() file.Idx {
  143. return ce.Test.Idx0()
  144. }
  145. // Idx1 implements Node.
  146. func (ce *ConditionalExpression) Idx1() file.Idx {
  147. return ce.Alternate.Idx1()
  148. }
  149. // expression implements Expression.
  150. func (*ConditionalExpression) expression() {}
  151. // DotExpression represents a dot expression.
  152. type DotExpression struct {
  153. Left Expression
  154. Identifier *Identifier
  155. }
  156. // Idx0 implements Node.
  157. func (de *DotExpression) Idx0() file.Idx {
  158. return de.Left.Idx0()
  159. }
  160. // Idx1 implements Node.
  161. func (de *DotExpression) Idx1() file.Idx {
  162. return de.Identifier.Idx1()
  163. }
  164. // expression implements Expression.
  165. func (*DotExpression) expression() {}
  166. // EmptyExpression represents an empty expression.
  167. type EmptyExpression struct {
  168. Begin file.Idx
  169. End file.Idx
  170. }
  171. // Idx0 implements Node.
  172. func (ee *EmptyExpression) Idx0() file.Idx {
  173. return ee.Begin
  174. }
  175. // Idx1 implements Node.
  176. func (ee *EmptyExpression) Idx1() file.Idx {
  177. return ee.End
  178. }
  179. // expression implements Expression.
  180. func (*EmptyExpression) expression() {}
  181. // FunctionLiteral represents a function literal.
  182. type FunctionLiteral struct {
  183. Body Statement
  184. Name *Identifier
  185. ParameterList *ParameterList
  186. Source string
  187. DeclarationList []Declaration
  188. Function file.Idx
  189. }
  190. // Idx0 implements Node.
  191. func (fl *FunctionLiteral) Idx0() file.Idx {
  192. return fl.Function
  193. }
  194. // Idx1 implements Node.
  195. func (fl *FunctionLiteral) Idx1() file.Idx {
  196. return fl.Body.Idx1()
  197. }
  198. // expression implements Expression.
  199. func (*FunctionLiteral) expression() {}
  200. // Identifier represents an identifier.
  201. type Identifier struct {
  202. Name string
  203. Idx file.Idx
  204. }
  205. // Idx0 implements Node.
  206. func (i *Identifier) Idx0() file.Idx {
  207. return i.Idx
  208. }
  209. // Idx1 implements Node.
  210. func (i *Identifier) Idx1() file.Idx {
  211. return file.Idx(int(i.Idx) + len(i.Name))
  212. }
  213. // expression implements Expression.
  214. func (*Identifier) expression() {}
  215. // NewExpression represents a new expression.
  216. type NewExpression struct {
  217. Callee Expression
  218. ArgumentList []Expression
  219. New file.Idx
  220. LeftParenthesis file.Idx
  221. RightParenthesis file.Idx
  222. }
  223. // Idx0 implements Node.
  224. func (ne *NewExpression) Idx0() file.Idx {
  225. return ne.New
  226. }
  227. // Idx1 implements Node.
  228. func (ne *NewExpression) Idx1() file.Idx {
  229. if ne.RightParenthesis > 0 {
  230. return ne.RightParenthesis + 1
  231. }
  232. return ne.Callee.Idx1()
  233. }
  234. // expression implements Expression.
  235. func (*NewExpression) expression() {}
  236. // NullLiteral represents a null literal.
  237. type NullLiteral struct {
  238. Literal string
  239. Idx file.Idx
  240. }
  241. // Idx0 implements Node.
  242. func (nl *NullLiteral) Idx0() file.Idx {
  243. return nl.Idx
  244. }
  245. // Idx1 implements Node.
  246. func (nl *NullLiteral) Idx1() file.Idx {
  247. return file.Idx(int(nl.Idx) + 4)
  248. }
  249. // expression implements Expression.
  250. func (*NullLiteral) expression() {}
  251. // NumberLiteral represents a number literal.
  252. type NumberLiteral struct {
  253. Value interface{}
  254. Literal string
  255. Idx file.Idx
  256. }
  257. // Idx0 implements Node.
  258. func (nl *NumberLiteral) Idx0() file.Idx {
  259. return nl.Idx
  260. }
  261. // Idx1 implements Node.
  262. func (nl *NumberLiteral) Idx1() file.Idx {
  263. return file.Idx(int(nl.Idx) + len(nl.Literal))
  264. }
  265. // expression implements Expression.
  266. func (*NumberLiteral) expression() {}
  267. // ObjectLiteral represents an object literal.
  268. type ObjectLiteral struct {
  269. Value []Property
  270. LeftBrace file.Idx
  271. RightBrace file.Idx
  272. }
  273. // Idx0 implements Node.
  274. func (ol *ObjectLiteral) Idx0() file.Idx {
  275. return ol.LeftBrace
  276. }
  277. // Idx1 implements Node.
  278. func (ol *ObjectLiteral) Idx1() file.Idx {
  279. return ol.RightBrace + 1
  280. }
  281. // expression implements Expression.
  282. func (*ObjectLiteral) expression() {}
  283. // ParameterList represents a parameter list.
  284. type ParameterList struct {
  285. List []*Identifier
  286. Opening file.Idx
  287. Closing file.Idx
  288. }
  289. // Property represents a property.
  290. type Property struct {
  291. Value Expression
  292. Key string
  293. Kind string
  294. }
  295. // RegExpLiteral represents a regular expression literal.
  296. type RegExpLiteral struct {
  297. Literal string
  298. Pattern string
  299. Flags string
  300. Value string
  301. Idx file.Idx
  302. }
  303. // Idx0 implements Node.
  304. func (rl *RegExpLiteral) Idx0() file.Idx {
  305. return rl.Idx
  306. }
  307. // Idx1 implements Node.
  308. func (rl *RegExpLiteral) Idx1() file.Idx {
  309. return file.Idx(int(rl.Idx) + len(rl.Literal))
  310. }
  311. // expression implements Expression.
  312. func (*RegExpLiteral) expression() {}
  313. // SequenceExpression represents a sequence literal.
  314. type SequenceExpression struct {
  315. Sequence []Expression
  316. }
  317. // Idx0 implements Node.
  318. func (se *SequenceExpression) Idx0() file.Idx {
  319. return se.Sequence[0].Idx0()
  320. }
  321. // Idx1 implements Node.
  322. func (se *SequenceExpression) Idx1() file.Idx {
  323. return se.Sequence[len(se.Sequence)-1].Idx1()
  324. }
  325. // expression implements Expression.
  326. func (*SequenceExpression) expression() {}
  327. // StringLiteral represents a string literal.
  328. type StringLiteral struct {
  329. Literal string
  330. Value string
  331. Idx file.Idx
  332. }
  333. // Idx0 implements Node.
  334. func (sl *StringLiteral) Idx0() file.Idx {
  335. return sl.Idx
  336. }
  337. // Idx1 implements Node.
  338. func (sl *StringLiteral) Idx1() file.Idx {
  339. return file.Idx(int(sl.Idx) + len(sl.Literal))
  340. }
  341. // expression implements Expression.
  342. func (*StringLiteral) expression() {}
  343. // ThisExpression represents a this expression.
  344. type ThisExpression struct {
  345. Idx file.Idx
  346. }
  347. // Idx0 implements Node.
  348. func (te *ThisExpression) Idx0() file.Idx {
  349. return te.Idx
  350. }
  351. // Idx1 implements Node.
  352. func (te *ThisExpression) Idx1() file.Idx {
  353. return te.Idx + 4
  354. }
  355. // expression implements Expression.
  356. func (*ThisExpression) expression() {}
  357. // UnaryExpression represents a unary expression.
  358. type UnaryExpression struct {
  359. Operand Expression
  360. Operator token.Token
  361. Idx file.Idx
  362. Postfix bool
  363. }
  364. // Idx0 implements Node.
  365. func (ue *UnaryExpression) Idx0() file.Idx {
  366. if ue.Postfix {
  367. return ue.Operand.Idx0()
  368. }
  369. return ue.Idx
  370. }
  371. // Idx1 implements Node.
  372. func (ue *UnaryExpression) Idx1() file.Idx {
  373. if ue.Postfix {
  374. return ue.Operand.Idx1() + 2 // ++ --
  375. }
  376. return ue.Operand.Idx1()
  377. }
  378. // expression implements Expression.
  379. func (*UnaryExpression) expression() {}
  380. // VariableExpression represents a variable expression.
  381. type VariableExpression struct {
  382. Initializer Expression
  383. Name string
  384. Idx file.Idx
  385. }
  386. // Idx0 implements Node.
  387. func (ve *VariableExpression) Idx0() file.Idx {
  388. return ve.Idx
  389. }
  390. // Idx1 implements Node.
  391. func (ve *VariableExpression) Idx1() file.Idx {
  392. if ve.Initializer == nil {
  393. return file.Idx(int(ve.Idx) + len(ve.Name))
  394. }
  395. return ve.Initializer.Idx1()
  396. }
  397. // expression implements Expression.
  398. func (*VariableExpression) expression() {}
  399. // Statement is implemented by types which represent a statement.
  400. type Statement interface {
  401. Node
  402. statement()
  403. }
  404. // BadStatement represents a bad statement.
  405. type BadStatement struct {
  406. From file.Idx
  407. To file.Idx
  408. }
  409. // Idx0 implements Node.
  410. func (bs *BadStatement) Idx0() file.Idx {
  411. return bs.From
  412. }
  413. // Idx1 implements Node.
  414. func (bs *BadStatement) Idx1() file.Idx {
  415. return bs.To
  416. }
  417. // expression implements Statement.
  418. func (*BadStatement) statement() {}
  419. // BlockStatement represents a block statement.
  420. type BlockStatement struct {
  421. List []Statement
  422. LeftBrace file.Idx
  423. RightBrace file.Idx
  424. }
  425. // Idx0 implements Node.
  426. func (bs *BlockStatement) Idx0() file.Idx {
  427. return bs.LeftBrace
  428. }
  429. // Idx1 implements Node.
  430. func (bs *BlockStatement) Idx1() file.Idx {
  431. return bs.RightBrace + 1
  432. }
  433. // expression implements Statement.
  434. func (*BlockStatement) statement() {}
  435. // BranchStatement represents a branch statement.
  436. type BranchStatement struct {
  437. Label *Identifier
  438. Idx file.Idx
  439. Token token.Token
  440. }
  441. // Idx0 implements Node.
  442. func (bs *BranchStatement) Idx0() file.Idx {
  443. return bs.Idx
  444. }
  445. // Idx1 implements Node.
  446. func (bs *BranchStatement) Idx1() file.Idx {
  447. if bs.Label == nil {
  448. return file.Idx(int(bs.Idx) + len(bs.Token.String()))
  449. }
  450. return bs.Label.Idx1()
  451. }
  452. // expression implements Statement.
  453. func (*BranchStatement) statement() {}
  454. // CaseStatement represents a case statement.
  455. type CaseStatement struct {
  456. Test Expression
  457. Consequent []Statement
  458. Case file.Idx
  459. }
  460. // Idx0 implements Node.
  461. func (cs *CaseStatement) Idx0() file.Idx {
  462. return cs.Case
  463. }
  464. // Idx1 implements Node.
  465. func (cs *CaseStatement) Idx1() file.Idx {
  466. return cs.Consequent[len(cs.Consequent)-1].Idx1()
  467. }
  468. // expression implements Statement.
  469. func (*CaseStatement) statement() {}
  470. // CatchStatement represents a catch statement.
  471. type CatchStatement struct {
  472. Body Statement
  473. Parameter *Identifier
  474. Catch file.Idx
  475. }
  476. // Idx0 implements Node.
  477. func (cs *CatchStatement) Idx0() file.Idx {
  478. return cs.Catch
  479. }
  480. // Idx1 implements Node.
  481. func (cs *CatchStatement) Idx1() file.Idx {
  482. return cs.Body.Idx1()
  483. }
  484. // expression implements Statement.
  485. func (*CatchStatement) statement() {}
  486. // DebuggerStatement represents a debugger statement.
  487. type DebuggerStatement struct {
  488. Debugger file.Idx
  489. }
  490. // Idx0 implements Node.
  491. func (ds *DebuggerStatement) Idx0() file.Idx {
  492. return ds.Debugger
  493. }
  494. // Idx1 implements Node.
  495. func (ds *DebuggerStatement) Idx1() file.Idx {
  496. return ds.Debugger + 8
  497. }
  498. // expression implements Statement.
  499. func (*DebuggerStatement) statement() {}
  500. // DoWhileStatement represents a do while statement.
  501. type DoWhileStatement struct {
  502. Test Expression
  503. Body Statement
  504. Do file.Idx
  505. RightParenthesis file.Idx
  506. }
  507. // Idx0 implements Node.
  508. func (dws *DoWhileStatement) Idx0() file.Idx {
  509. return dws.Do
  510. }
  511. // Idx1 implements Node.
  512. func (dws *DoWhileStatement) Idx1() file.Idx {
  513. return dws.RightParenthesis + 1
  514. }
  515. // expression implements Statement.
  516. func (*DoWhileStatement) statement() {}
  517. // EmptyStatement represents a empty statement.
  518. type EmptyStatement struct {
  519. Semicolon file.Idx
  520. }
  521. // Idx0 implements Node.
  522. func (es *EmptyStatement) Idx0() file.Idx {
  523. return es.Semicolon
  524. }
  525. // Idx1 implements Node.
  526. func (es *EmptyStatement) Idx1() file.Idx {
  527. return es.Semicolon + 1
  528. }
  529. // expression implements Statement.
  530. func (*EmptyStatement) statement() {}
  531. // ExpressionStatement represents a expression statement.
  532. type ExpressionStatement struct {
  533. Expression Expression
  534. }
  535. // Idx0 implements Node.
  536. func (es *ExpressionStatement) Idx0() file.Idx {
  537. return es.Expression.Idx0()
  538. }
  539. // Idx1 implements Node.
  540. func (es *ExpressionStatement) Idx1() file.Idx {
  541. return es.Expression.Idx1()
  542. }
  543. // expression implements Statement.
  544. func (*ExpressionStatement) statement() {}
  545. // ForInStatement represents a for in statement.
  546. type ForInStatement struct {
  547. Into Expression
  548. Source Expression
  549. Body Statement
  550. For file.Idx
  551. }
  552. // Idx0 implements Node.
  553. func (fis *ForInStatement) Idx0() file.Idx {
  554. return fis.For
  555. }
  556. // Idx1 implements Node.
  557. func (fis *ForInStatement) Idx1() file.Idx {
  558. return fis.Body.Idx1()
  559. }
  560. // expression implements Statement.
  561. func (*ForInStatement) statement() {}
  562. // ForStatement represents a for statement.
  563. type ForStatement struct {
  564. Initializer Expression
  565. Update Expression
  566. Test Expression
  567. Body Statement
  568. For file.Idx
  569. }
  570. // Idx0 implements Node.
  571. func (fs *ForStatement) Idx0() file.Idx {
  572. return fs.For
  573. }
  574. // Idx1 implements Node.
  575. func (fs *ForStatement) Idx1() file.Idx {
  576. return fs.Body.Idx1()
  577. }
  578. // expression implements Statement.
  579. func (*ForStatement) statement() {}
  580. // FunctionStatement represents a function statement.
  581. type FunctionStatement struct {
  582. Function *FunctionLiteral
  583. }
  584. // Idx0 implements Node.
  585. func (fs *FunctionStatement) Idx0() file.Idx {
  586. return fs.Function.Idx0()
  587. }
  588. // Idx1 implements Node.
  589. func (fs *FunctionStatement) Idx1() file.Idx {
  590. return fs.Function.Idx1()
  591. }
  592. // expression implements Statement.
  593. func (*FunctionStatement) statement() {}
  594. // IfStatement represents a if statement.
  595. type IfStatement struct {
  596. Test Expression
  597. Consequent Statement
  598. Alternate Statement
  599. If file.Idx
  600. }
  601. // Idx0 implements Node.
  602. func (is *IfStatement) Idx0() file.Idx {
  603. return is.If
  604. }
  605. // Idx1 implements Node.
  606. func (is *IfStatement) Idx1() file.Idx {
  607. if is.Alternate != nil {
  608. return is.Alternate.Idx1()
  609. }
  610. return is.Consequent.Idx1()
  611. }
  612. // expression implements Statement.
  613. func (*IfStatement) statement() {}
  614. // LabelledStatement represents a labelled statement.
  615. type LabelledStatement struct {
  616. Statement Statement
  617. Label *Identifier
  618. Colon file.Idx
  619. }
  620. // Idx0 implements Node.
  621. func (ls *LabelledStatement) Idx0() file.Idx {
  622. return ls.Label.Idx0()
  623. }
  624. // Idx1 implements Node.
  625. func (ls *LabelledStatement) Idx1() file.Idx {
  626. return ls.Statement.Idx1()
  627. }
  628. // expression implements Statement.
  629. func (*LabelledStatement) statement() {}
  630. // ReturnStatement represents a return statement.
  631. type ReturnStatement struct {
  632. Argument Expression
  633. Return file.Idx
  634. }
  635. // Idx0 implements Node.
  636. func (rs *ReturnStatement) Idx0() file.Idx {
  637. return rs.Return
  638. }
  639. // Idx1 implements Node.
  640. func (rs *ReturnStatement) Idx1() file.Idx {
  641. if rs.Argument != nil {
  642. return rs.Argument.Idx1()
  643. }
  644. return rs.Return + 6
  645. }
  646. // expression implements Statement.
  647. func (*ReturnStatement) statement() {}
  648. // SwitchStatement represents a switch statement.
  649. type SwitchStatement struct {
  650. Discriminant Expression
  651. Body []*CaseStatement
  652. Switch file.Idx
  653. Default int
  654. RightBrace file.Idx
  655. }
  656. // Idx0 implements Node.
  657. func (ss *SwitchStatement) Idx0() file.Idx {
  658. return ss.Switch
  659. }
  660. // Idx1 implements Node.
  661. func (ss *SwitchStatement) Idx1() file.Idx {
  662. return ss.RightBrace + 1
  663. }
  664. // expression implements Statement.
  665. func (*SwitchStatement) statement() {}
  666. // ThrowStatement represents a throw statement.
  667. type ThrowStatement struct {
  668. Argument Expression
  669. Throw file.Idx
  670. }
  671. // Idx0 implements Node.
  672. func (ts *ThrowStatement) Idx0() file.Idx {
  673. return ts.Throw
  674. }
  675. // Idx1 implements Node.
  676. func (ts *ThrowStatement) Idx1() file.Idx {
  677. return ts.Argument.Idx1()
  678. }
  679. // expression implements Statement.
  680. func (*ThrowStatement) statement() {}
  681. // TryStatement represents a try statement.
  682. type TryStatement struct {
  683. Body Statement
  684. Finally Statement
  685. Catch *CatchStatement
  686. Try file.Idx
  687. }
  688. // Idx0 implements Node.
  689. func (ts *TryStatement) Idx0() file.Idx {
  690. return ts.Try
  691. }
  692. // Idx1 implements Node.
  693. func (ts *TryStatement) Idx1() file.Idx {
  694. if ts.Finally != nil {
  695. return ts.Finally.Idx1()
  696. }
  697. return ts.Catch.Idx1()
  698. }
  699. // expression implements Statement.
  700. func (*TryStatement) statement() {}
  701. // VariableStatement represents a variable statement.
  702. type VariableStatement struct {
  703. List []Expression
  704. Var file.Idx
  705. }
  706. // Idx0 implements Node.
  707. func (vs *VariableStatement) Idx0() file.Idx {
  708. return vs.Var
  709. }
  710. // Idx1 implements Node.
  711. func (vs *VariableStatement) Idx1() file.Idx {
  712. return vs.List[len(vs.List)-1].Idx1()
  713. }
  714. // expression implements Statement.
  715. func (*VariableStatement) statement() {}
  716. // WhileStatement represents a while statement.
  717. type WhileStatement struct {
  718. Test Expression
  719. Body Statement
  720. While file.Idx
  721. }
  722. // Idx0 implements Node.
  723. func (ws *WhileStatement) Idx0() file.Idx {
  724. return ws.While
  725. }
  726. // Idx1 implements Node.
  727. func (ws *WhileStatement) Idx1() file.Idx {
  728. return ws.Body.Idx1()
  729. }
  730. // expression implements Statement.
  731. func (*WhileStatement) statement() {}
  732. // WithStatement represents a with statement.
  733. type WithStatement struct {
  734. Object Expression
  735. Body Statement
  736. With file.Idx
  737. }
  738. // Idx0 implements Node.
  739. func (ws *WithStatement) Idx0() file.Idx {
  740. return ws.With
  741. }
  742. // Idx1 implements Node.
  743. func (ws *WithStatement) Idx1() file.Idx {
  744. return ws.Body.Idx1()
  745. }
  746. // expression implements Statement.
  747. func (*WithStatement) statement() {}
  748. // Declaration is implemented by type which represent declarations.
  749. type Declaration interface {
  750. declaration()
  751. }
  752. // FunctionDeclaration represents a function declaration.
  753. type FunctionDeclaration struct {
  754. Function *FunctionLiteral
  755. }
  756. func (*FunctionDeclaration) declaration() {}
  757. // VariableDeclaration represents a variable declaration.
  758. type VariableDeclaration struct {
  759. List []*VariableExpression
  760. Var file.Idx
  761. }
  762. // declaration implements Declaration.
  763. func (*VariableDeclaration) declaration() {}
  764. // Program represents a full program.
  765. type Program struct {
  766. File *file.File
  767. Comments CommentMap
  768. Body []Statement
  769. DeclarationList []Declaration
  770. }
  771. // Idx0 implements Node.
  772. func (p *Program) Idx0() file.Idx {
  773. return p.Body[0].Idx0()
  774. }
  775. // Idx1 implements Node.
  776. func (p *Program) Idx1() file.Idx {
  777. return p.Body[len(p.Body)-1].Idx1()
  778. }