node.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. /*
  2. Package ast declares types representing a JavaScript AST.
  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. */
  7. package ast
  8. import (
  9. "github.com/dop251/goja/file"
  10. "github.com/dop251/goja/token"
  11. "github.com/go-sourcemap/sourcemap"
  12. )
  13. // All nodes implement the Node interface.
  14. type Node interface {
  15. Idx0() file.Idx // The index of the first character belonging to the node
  16. Idx1() file.Idx // The index of the first character immediately after the node
  17. }
  18. // ========== //
  19. // Expression //
  20. // ========== //
  21. type (
  22. // All expression nodes implement the Expression interface.
  23. Expression interface {
  24. Node
  25. _expressionNode()
  26. }
  27. ArrayLiteral struct {
  28. LeftBracket file.Idx
  29. RightBracket file.Idx
  30. Value []Expression
  31. }
  32. AssignExpression struct {
  33. Operator token.Token
  34. Left Expression
  35. Right Expression
  36. }
  37. BadExpression struct {
  38. From file.Idx
  39. To file.Idx
  40. }
  41. BinaryExpression struct {
  42. Operator token.Token
  43. Left Expression
  44. Right Expression
  45. Comparison bool
  46. }
  47. BooleanLiteral struct {
  48. Idx file.Idx
  49. Literal string
  50. Value bool
  51. }
  52. BracketExpression struct {
  53. Left Expression
  54. Member Expression
  55. LeftBracket file.Idx
  56. RightBracket file.Idx
  57. }
  58. CallExpression struct {
  59. Callee Expression
  60. LeftParenthesis file.Idx
  61. ArgumentList []Expression
  62. RightParenthesis file.Idx
  63. }
  64. ConditionalExpression struct {
  65. Test Expression
  66. Consequent Expression
  67. Alternate Expression
  68. }
  69. DotExpression struct {
  70. Left Expression
  71. Identifier Identifier
  72. }
  73. FunctionLiteral struct {
  74. Function file.Idx
  75. Name *Identifier
  76. ParameterList *ParameterList
  77. Body Statement
  78. Source string
  79. DeclarationList []Declaration
  80. }
  81. Identifier struct {
  82. Name string
  83. Idx file.Idx
  84. }
  85. NewExpression struct {
  86. New file.Idx
  87. Callee Expression
  88. LeftParenthesis file.Idx
  89. ArgumentList []Expression
  90. RightParenthesis file.Idx
  91. }
  92. NullLiteral struct {
  93. Idx file.Idx
  94. Literal string
  95. }
  96. NumberLiteral struct {
  97. Idx file.Idx
  98. Literal string
  99. Value interface{}
  100. }
  101. ObjectLiteral struct {
  102. LeftBrace file.Idx
  103. RightBrace file.Idx
  104. Value []Property
  105. }
  106. ParameterList struct {
  107. Opening file.Idx
  108. List []*Identifier
  109. Closing file.Idx
  110. }
  111. Property struct {
  112. Key string
  113. Kind string
  114. Value Expression
  115. }
  116. RegExpLiteral struct {
  117. Idx file.Idx
  118. Literal string
  119. Pattern string
  120. Flags string
  121. }
  122. SequenceExpression struct {
  123. Sequence []Expression
  124. }
  125. StringLiteral struct {
  126. Idx file.Idx
  127. Literal string
  128. Value string
  129. }
  130. ThisExpression struct {
  131. Idx file.Idx
  132. }
  133. UnaryExpression struct {
  134. Operator token.Token
  135. Idx file.Idx // If a prefix operation
  136. Operand Expression
  137. Postfix bool
  138. }
  139. VariableExpression struct {
  140. Name string
  141. Idx file.Idx
  142. Initializer Expression
  143. }
  144. )
  145. // _expressionNode
  146. func (*ArrayLiteral) _expressionNode() {}
  147. func (*AssignExpression) _expressionNode() {}
  148. func (*BadExpression) _expressionNode() {}
  149. func (*BinaryExpression) _expressionNode() {}
  150. func (*BooleanLiteral) _expressionNode() {}
  151. func (*BracketExpression) _expressionNode() {}
  152. func (*CallExpression) _expressionNode() {}
  153. func (*ConditionalExpression) _expressionNode() {}
  154. func (*DotExpression) _expressionNode() {}
  155. func (*FunctionLiteral) _expressionNode() {}
  156. func (*Identifier) _expressionNode() {}
  157. func (*NewExpression) _expressionNode() {}
  158. func (*NullLiteral) _expressionNode() {}
  159. func (*NumberLiteral) _expressionNode() {}
  160. func (*ObjectLiteral) _expressionNode() {}
  161. func (*RegExpLiteral) _expressionNode() {}
  162. func (*SequenceExpression) _expressionNode() {}
  163. func (*StringLiteral) _expressionNode() {}
  164. func (*ThisExpression) _expressionNode() {}
  165. func (*UnaryExpression) _expressionNode() {}
  166. func (*VariableExpression) _expressionNode() {}
  167. // ========= //
  168. // Statement //
  169. // ========= //
  170. type (
  171. // All statement nodes implement the Statement interface.
  172. Statement interface {
  173. Node
  174. _statementNode()
  175. }
  176. BadStatement struct {
  177. From file.Idx
  178. To file.Idx
  179. }
  180. BlockStatement struct {
  181. LeftBrace file.Idx
  182. List []Statement
  183. RightBrace file.Idx
  184. }
  185. BranchStatement struct {
  186. Idx file.Idx
  187. Token token.Token
  188. Label *Identifier
  189. }
  190. CaseStatement struct {
  191. Case file.Idx
  192. Test Expression
  193. Consequent []Statement
  194. }
  195. CatchStatement struct {
  196. Catch file.Idx
  197. Parameter *Identifier
  198. Body Statement
  199. }
  200. DebuggerStatement struct {
  201. Debugger file.Idx
  202. }
  203. DoWhileStatement struct {
  204. Do file.Idx
  205. Test Expression
  206. Body Statement
  207. }
  208. EmptyStatement struct {
  209. Semicolon file.Idx
  210. }
  211. ExpressionStatement struct {
  212. Expression Expression
  213. }
  214. ForInStatement struct {
  215. For file.Idx
  216. Into Expression
  217. Source Expression
  218. Body Statement
  219. }
  220. ForStatement struct {
  221. For file.Idx
  222. Initializer Expression
  223. Update Expression
  224. Test Expression
  225. Body Statement
  226. }
  227. IfStatement struct {
  228. If file.Idx
  229. Test Expression
  230. Consequent Statement
  231. Alternate Statement
  232. }
  233. LabelledStatement struct {
  234. Label *Identifier
  235. Colon file.Idx
  236. Statement Statement
  237. }
  238. ReturnStatement struct {
  239. Return file.Idx
  240. Argument Expression
  241. }
  242. SwitchStatement struct {
  243. Switch file.Idx
  244. Discriminant Expression
  245. Default int
  246. Body []*CaseStatement
  247. }
  248. ThrowStatement struct {
  249. Throw file.Idx
  250. Argument Expression
  251. }
  252. TryStatement struct {
  253. Try file.Idx
  254. Body Statement
  255. Catch *CatchStatement
  256. Finally Statement
  257. }
  258. VariableStatement struct {
  259. Var file.Idx
  260. List []Expression
  261. }
  262. WhileStatement struct {
  263. While file.Idx
  264. Test Expression
  265. Body Statement
  266. }
  267. WithStatement struct {
  268. With file.Idx
  269. Object Expression
  270. Body Statement
  271. }
  272. )
  273. // _statementNode
  274. func (*BadStatement) _statementNode() {}
  275. func (*BlockStatement) _statementNode() {}
  276. func (*BranchStatement) _statementNode() {}
  277. func (*CaseStatement) _statementNode() {}
  278. func (*CatchStatement) _statementNode() {}
  279. func (*DebuggerStatement) _statementNode() {}
  280. func (*DoWhileStatement) _statementNode() {}
  281. func (*EmptyStatement) _statementNode() {}
  282. func (*ExpressionStatement) _statementNode() {}
  283. func (*ForInStatement) _statementNode() {}
  284. func (*ForStatement) _statementNode() {}
  285. func (*IfStatement) _statementNode() {}
  286. func (*LabelledStatement) _statementNode() {}
  287. func (*ReturnStatement) _statementNode() {}
  288. func (*SwitchStatement) _statementNode() {}
  289. func (*ThrowStatement) _statementNode() {}
  290. func (*TryStatement) _statementNode() {}
  291. func (*VariableStatement) _statementNode() {}
  292. func (*WhileStatement) _statementNode() {}
  293. func (*WithStatement) _statementNode() {}
  294. // =========== //
  295. // Declaration //
  296. // =========== //
  297. type (
  298. // All declaration nodes implement the Declaration interface.
  299. Declaration interface {
  300. _declarationNode()
  301. }
  302. FunctionDeclaration struct {
  303. Function *FunctionLiteral
  304. }
  305. VariableDeclaration struct {
  306. Var file.Idx
  307. List []*VariableExpression
  308. }
  309. )
  310. // _declarationNode
  311. func (*FunctionDeclaration) _declarationNode() {}
  312. func (*VariableDeclaration) _declarationNode() {}
  313. // ==== //
  314. // Node //
  315. // ==== //
  316. type Program struct {
  317. Body []Statement
  318. DeclarationList []Declaration
  319. File *file.File
  320. SourceMap *sourcemap.Consumer
  321. }
  322. // ==== //
  323. // Idx0 //
  324. // ==== //
  325. func (self *ArrayLiteral) Idx0() file.Idx { return self.LeftBracket }
  326. func (self *AssignExpression) Idx0() file.Idx { return self.Left.Idx0() }
  327. func (self *BadExpression) Idx0() file.Idx { return self.From }
  328. func (self *BinaryExpression) Idx0() file.Idx { return self.Left.Idx0() }
  329. func (self *BooleanLiteral) Idx0() file.Idx { return self.Idx }
  330. func (self *BracketExpression) Idx0() file.Idx { return self.Left.Idx0() }
  331. func (self *CallExpression) Idx0() file.Idx { return self.Callee.Idx0() }
  332. func (self *ConditionalExpression) Idx0() file.Idx { return self.Test.Idx0() }
  333. func (self *DotExpression) Idx0() file.Idx { return self.Left.Idx0() }
  334. func (self *FunctionLiteral) Idx0() file.Idx { return self.Function }
  335. func (self *Identifier) Idx0() file.Idx { return self.Idx }
  336. func (self *NewExpression) Idx0() file.Idx { return self.New }
  337. func (self *NullLiteral) Idx0() file.Idx { return self.Idx }
  338. func (self *NumberLiteral) Idx0() file.Idx { return self.Idx }
  339. func (self *ObjectLiteral) Idx0() file.Idx { return self.LeftBrace }
  340. func (self *RegExpLiteral) Idx0() file.Idx { return self.Idx }
  341. func (self *SequenceExpression) Idx0() file.Idx { return self.Sequence[0].Idx0() }
  342. func (self *StringLiteral) Idx0() file.Idx { return self.Idx }
  343. func (self *ThisExpression) Idx0() file.Idx { return self.Idx }
  344. func (self *UnaryExpression) Idx0() file.Idx { return self.Idx }
  345. func (self *VariableExpression) Idx0() file.Idx { return self.Idx }
  346. func (self *BadStatement) Idx0() file.Idx { return self.From }
  347. func (self *BlockStatement) Idx0() file.Idx { return self.LeftBrace }
  348. func (self *BranchStatement) Idx0() file.Idx { return self.Idx }
  349. func (self *CaseStatement) Idx0() file.Idx { return self.Case }
  350. func (self *CatchStatement) Idx0() file.Idx { return self.Catch }
  351. func (self *DebuggerStatement) Idx0() file.Idx { return self.Debugger }
  352. func (self *DoWhileStatement) Idx0() file.Idx { return self.Do }
  353. func (self *EmptyStatement) Idx0() file.Idx { return self.Semicolon }
  354. func (self *ExpressionStatement) Idx0() file.Idx { return self.Expression.Idx0() }
  355. func (self *ForInStatement) Idx0() file.Idx { return self.For }
  356. func (self *ForStatement) Idx0() file.Idx { return self.For }
  357. func (self *IfStatement) Idx0() file.Idx { return self.If }
  358. func (self *LabelledStatement) Idx0() file.Idx { return self.Label.Idx0() }
  359. func (self *Program) Idx0() file.Idx { return self.Body[0].Idx0() }
  360. func (self *ReturnStatement) Idx0() file.Idx { return self.Return }
  361. func (self *SwitchStatement) Idx0() file.Idx { return self.Switch }
  362. func (self *ThrowStatement) Idx0() file.Idx { return self.Throw }
  363. func (self *TryStatement) Idx0() file.Idx { return self.Try }
  364. func (self *VariableStatement) Idx0() file.Idx { return self.Var }
  365. func (self *WhileStatement) Idx0() file.Idx { return self.While }
  366. func (self *WithStatement) Idx0() file.Idx { return self.With }
  367. // ==== //
  368. // Idx1 //
  369. // ==== //
  370. func (self *ArrayLiteral) Idx1() file.Idx { return self.RightBracket }
  371. func (self *AssignExpression) Idx1() file.Idx { return self.Right.Idx1() }
  372. func (self *BadExpression) Idx1() file.Idx { return self.To }
  373. func (self *BinaryExpression) Idx1() file.Idx { return self.Right.Idx1() }
  374. func (self *BooleanLiteral) Idx1() file.Idx { return file.Idx(int(self.Idx) + len(self.Literal)) }
  375. func (self *BracketExpression) Idx1() file.Idx { return self.RightBracket + 1 }
  376. func (self *CallExpression) Idx1() file.Idx { return self.RightParenthesis + 1 }
  377. func (self *ConditionalExpression) Idx1() file.Idx { return self.Test.Idx1() }
  378. func (self *DotExpression) Idx1() file.Idx { return self.Identifier.Idx1() }
  379. func (self *FunctionLiteral) Idx1() file.Idx { return self.Body.Idx1() }
  380. func (self *Identifier) Idx1() file.Idx { return file.Idx(int(self.Idx) + len(self.Name)) }
  381. func (self *NewExpression) Idx1() file.Idx { return self.RightParenthesis + 1 }
  382. func (self *NullLiteral) Idx1() file.Idx { return file.Idx(int(self.Idx) + 4) } // "null"
  383. func (self *NumberLiteral) Idx1() file.Idx { return file.Idx(int(self.Idx) + len(self.Literal)) }
  384. func (self *ObjectLiteral) Idx1() file.Idx { return self.RightBrace }
  385. func (self *RegExpLiteral) Idx1() file.Idx { return file.Idx(int(self.Idx) + len(self.Literal)) }
  386. func (self *SequenceExpression) Idx1() file.Idx { return self.Sequence[0].Idx1() }
  387. func (self *StringLiteral) Idx1() file.Idx { return file.Idx(int(self.Idx) + len(self.Literal)) }
  388. func (self *ThisExpression) Idx1() file.Idx { return self.Idx }
  389. func (self *UnaryExpression) Idx1() file.Idx {
  390. if self.Postfix {
  391. return self.Operand.Idx1() + 2 // ++ --
  392. }
  393. return self.Operand.Idx1()
  394. }
  395. func (self *VariableExpression) Idx1() file.Idx {
  396. if self.Initializer == nil {
  397. return file.Idx(int(self.Idx) + len(self.Name) + 1)
  398. }
  399. return self.Initializer.Idx1()
  400. }
  401. func (self *BadStatement) Idx1() file.Idx { return self.To }
  402. func (self *BlockStatement) Idx1() file.Idx { return self.RightBrace + 1 }
  403. func (self *BranchStatement) Idx1() file.Idx { return self.Idx }
  404. func (self *CaseStatement) Idx1() file.Idx { return self.Consequent[len(self.Consequent)-1].Idx1() }
  405. func (self *CatchStatement) Idx1() file.Idx { return self.Body.Idx1() }
  406. func (self *DebuggerStatement) Idx1() file.Idx { return self.Debugger + 8 }
  407. func (self *DoWhileStatement) Idx1() file.Idx { return self.Test.Idx1() }
  408. func (self *EmptyStatement) Idx1() file.Idx { return self.Semicolon + 1 }
  409. func (self *ExpressionStatement) Idx1() file.Idx { return self.Expression.Idx1() }
  410. func (self *ForInStatement) Idx1() file.Idx { return self.Body.Idx1() }
  411. func (self *ForStatement) Idx1() file.Idx { return self.Body.Idx1() }
  412. func (self *IfStatement) Idx1() file.Idx {
  413. if self.Alternate != nil {
  414. return self.Alternate.Idx1()
  415. }
  416. return self.Consequent.Idx1()
  417. }
  418. func (self *LabelledStatement) Idx1() file.Idx { return self.Colon + 1 }
  419. func (self *Program) Idx1() file.Idx { return self.Body[len(self.Body)-1].Idx1() }
  420. func (self *ReturnStatement) Idx1() file.Idx { return self.Return }
  421. func (self *SwitchStatement) Idx1() file.Idx { return self.Body[len(self.Body)-1].Idx1() }
  422. func (self *ThrowStatement) Idx1() file.Idx { return self.Throw }
  423. func (self *TryStatement) Idx1() file.Idx { return self.Try }
  424. func (self *VariableStatement) Idx1() file.Idx { return self.List[len(self.List)-1].Idx1() }
  425. func (self *WhileStatement) Idx1() file.Idx { return self.Body.Idx1() }
  426. func (self *WithStatement) Idx1() file.Idx { return self.Body.Idx1() }