node.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  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. MetaProperty struct {
  145. Meta, Property *Identifier
  146. Idx file.Idx
  147. }
  148. )
  149. // _expressionNode
  150. func (*ArrayLiteral) _expressionNode() {}
  151. func (*AssignExpression) _expressionNode() {}
  152. func (*BadExpression) _expressionNode() {}
  153. func (*BinaryExpression) _expressionNode() {}
  154. func (*BooleanLiteral) _expressionNode() {}
  155. func (*BracketExpression) _expressionNode() {}
  156. func (*CallExpression) _expressionNode() {}
  157. func (*ConditionalExpression) _expressionNode() {}
  158. func (*DotExpression) _expressionNode() {}
  159. func (*FunctionLiteral) _expressionNode() {}
  160. func (*Identifier) _expressionNode() {}
  161. func (*NewExpression) _expressionNode() {}
  162. func (*NullLiteral) _expressionNode() {}
  163. func (*NumberLiteral) _expressionNode() {}
  164. func (*ObjectLiteral) _expressionNode() {}
  165. func (*RegExpLiteral) _expressionNode() {}
  166. func (*SequenceExpression) _expressionNode() {}
  167. func (*StringLiteral) _expressionNode() {}
  168. func (*ThisExpression) _expressionNode() {}
  169. func (*UnaryExpression) _expressionNode() {}
  170. func (*VariableExpression) _expressionNode() {}
  171. func (*MetaProperty) _expressionNode() {}
  172. // ========= //
  173. // Statement //
  174. // ========= //
  175. type (
  176. // All statement nodes implement the Statement interface.
  177. Statement interface {
  178. Node
  179. _statementNode()
  180. }
  181. BadStatement struct {
  182. From file.Idx
  183. To file.Idx
  184. }
  185. BlockStatement struct {
  186. LeftBrace file.Idx
  187. List []Statement
  188. RightBrace file.Idx
  189. }
  190. BranchStatement struct {
  191. Idx file.Idx
  192. Token token.Token
  193. Label *Identifier
  194. }
  195. CaseStatement struct {
  196. Case file.Idx
  197. Test Expression
  198. Consequent []Statement
  199. }
  200. CatchStatement struct {
  201. Catch file.Idx
  202. Parameter *Identifier
  203. Body Statement
  204. }
  205. DebuggerStatement struct {
  206. Debugger file.Idx
  207. }
  208. DoWhileStatement struct {
  209. Do file.Idx
  210. Test Expression
  211. Body Statement
  212. }
  213. EmptyStatement struct {
  214. Semicolon file.Idx
  215. }
  216. ExpressionStatement struct {
  217. Expression Expression
  218. }
  219. ForInStatement struct {
  220. For file.Idx
  221. Into Expression
  222. Source Expression
  223. Body Statement
  224. }
  225. ForOfStatement struct {
  226. For file.Idx
  227. Into Expression
  228. Source Expression
  229. Body Statement
  230. }
  231. ForStatement struct {
  232. For file.Idx
  233. Initializer Expression
  234. Update Expression
  235. Test Expression
  236. Body Statement
  237. }
  238. IfStatement struct {
  239. If file.Idx
  240. Test Expression
  241. Consequent Statement
  242. Alternate Statement
  243. }
  244. LabelledStatement struct {
  245. Label *Identifier
  246. Colon file.Idx
  247. Statement Statement
  248. }
  249. ReturnStatement struct {
  250. Return file.Idx
  251. Argument Expression
  252. }
  253. SwitchStatement struct {
  254. Switch file.Idx
  255. Discriminant Expression
  256. Default int
  257. Body []*CaseStatement
  258. }
  259. ThrowStatement struct {
  260. Throw file.Idx
  261. Argument Expression
  262. }
  263. TryStatement struct {
  264. Try file.Idx
  265. Body Statement
  266. Catch *CatchStatement
  267. Finally Statement
  268. }
  269. VariableStatement struct {
  270. Var file.Idx
  271. List []Expression
  272. }
  273. WhileStatement struct {
  274. While file.Idx
  275. Test Expression
  276. Body Statement
  277. }
  278. WithStatement struct {
  279. With file.Idx
  280. Object Expression
  281. Body Statement
  282. }
  283. )
  284. // _statementNode
  285. func (*BadStatement) _statementNode() {}
  286. func (*BlockStatement) _statementNode() {}
  287. func (*BranchStatement) _statementNode() {}
  288. func (*CaseStatement) _statementNode() {}
  289. func (*CatchStatement) _statementNode() {}
  290. func (*DebuggerStatement) _statementNode() {}
  291. func (*DoWhileStatement) _statementNode() {}
  292. func (*EmptyStatement) _statementNode() {}
  293. func (*ExpressionStatement) _statementNode() {}
  294. func (*ForInStatement) _statementNode() {}
  295. func (*ForOfStatement) _statementNode() {}
  296. func (*ForStatement) _statementNode() {}
  297. func (*IfStatement) _statementNode() {}
  298. func (*LabelledStatement) _statementNode() {}
  299. func (*ReturnStatement) _statementNode() {}
  300. func (*SwitchStatement) _statementNode() {}
  301. func (*ThrowStatement) _statementNode() {}
  302. func (*TryStatement) _statementNode() {}
  303. func (*VariableStatement) _statementNode() {}
  304. func (*WhileStatement) _statementNode() {}
  305. func (*WithStatement) _statementNode() {}
  306. // =========== //
  307. // Declaration //
  308. // =========== //
  309. type (
  310. // All declaration nodes implement the Declaration interface.
  311. Declaration interface {
  312. _declarationNode()
  313. }
  314. FunctionDeclaration struct {
  315. Function *FunctionLiteral
  316. }
  317. VariableDeclaration struct {
  318. Var file.Idx
  319. List []*VariableExpression
  320. }
  321. )
  322. // _declarationNode
  323. func (*FunctionDeclaration) _declarationNode() {}
  324. func (*VariableDeclaration) _declarationNode() {}
  325. // ==== //
  326. // Node //
  327. // ==== //
  328. type Program struct {
  329. Body []Statement
  330. DeclarationList []Declaration
  331. File *file.File
  332. SourceMap *sourcemap.Consumer
  333. }
  334. // ==== //
  335. // Idx0 //
  336. // ==== //
  337. func (self *ArrayLiteral) Idx0() file.Idx { return self.LeftBracket }
  338. func (self *AssignExpression) Idx0() file.Idx { return self.Left.Idx0() }
  339. func (self *BadExpression) Idx0() file.Idx { return self.From }
  340. func (self *BinaryExpression) Idx0() file.Idx { return self.Left.Idx0() }
  341. func (self *BooleanLiteral) Idx0() file.Idx { return self.Idx }
  342. func (self *BracketExpression) Idx0() file.Idx { return self.Left.Idx0() }
  343. func (self *CallExpression) Idx0() file.Idx { return self.Callee.Idx0() }
  344. func (self *ConditionalExpression) Idx0() file.Idx { return self.Test.Idx0() }
  345. func (self *DotExpression) Idx0() file.Idx { return self.Left.Idx0() }
  346. func (self *FunctionLiteral) Idx0() file.Idx { return self.Function }
  347. func (self *Identifier) Idx0() file.Idx { return self.Idx }
  348. func (self *NewExpression) Idx0() file.Idx { return self.New }
  349. func (self *NullLiteral) Idx0() file.Idx { return self.Idx }
  350. func (self *NumberLiteral) Idx0() file.Idx { return self.Idx }
  351. func (self *ObjectLiteral) Idx0() file.Idx { return self.LeftBrace }
  352. func (self *RegExpLiteral) Idx0() file.Idx { return self.Idx }
  353. func (self *SequenceExpression) Idx0() file.Idx { return self.Sequence[0].Idx0() }
  354. func (self *StringLiteral) Idx0() file.Idx { return self.Idx }
  355. func (self *ThisExpression) Idx0() file.Idx { return self.Idx }
  356. func (self *UnaryExpression) Idx0() file.Idx { return self.Idx }
  357. func (self *VariableExpression) Idx0() file.Idx { return self.Idx }
  358. func (self *MetaProperty) Idx0() file.Idx { return self.Idx }
  359. func (self *BadStatement) Idx0() file.Idx { return self.From }
  360. func (self *BlockStatement) Idx0() file.Idx { return self.LeftBrace }
  361. func (self *BranchStatement) Idx0() file.Idx { return self.Idx }
  362. func (self *CaseStatement) Idx0() file.Idx { return self.Case }
  363. func (self *CatchStatement) Idx0() file.Idx { return self.Catch }
  364. func (self *DebuggerStatement) Idx0() file.Idx { return self.Debugger }
  365. func (self *DoWhileStatement) Idx0() file.Idx { return self.Do }
  366. func (self *EmptyStatement) Idx0() file.Idx { return self.Semicolon }
  367. func (self *ExpressionStatement) Idx0() file.Idx { return self.Expression.Idx0() }
  368. func (self *ForInStatement) Idx0() file.Idx { return self.For }
  369. func (self *ForOfStatement) Idx0() file.Idx { return self.For }
  370. func (self *ForStatement) Idx0() file.Idx { return self.For }
  371. func (self *IfStatement) Idx0() file.Idx { return self.If }
  372. func (self *LabelledStatement) Idx0() file.Idx { return self.Label.Idx0() }
  373. func (self *Program) Idx0() file.Idx { return self.Body[0].Idx0() }
  374. func (self *ReturnStatement) Idx0() file.Idx { return self.Return }
  375. func (self *SwitchStatement) Idx0() file.Idx { return self.Switch }
  376. func (self *ThrowStatement) Idx0() file.Idx { return self.Throw }
  377. func (self *TryStatement) Idx0() file.Idx { return self.Try }
  378. func (self *VariableStatement) Idx0() file.Idx { return self.Var }
  379. func (self *WhileStatement) Idx0() file.Idx { return self.While }
  380. func (self *WithStatement) Idx0() file.Idx { return self.With }
  381. // ==== //
  382. // Idx1 //
  383. // ==== //
  384. func (self *ArrayLiteral) Idx1() file.Idx { return self.RightBracket }
  385. func (self *AssignExpression) Idx1() file.Idx { return self.Right.Idx1() }
  386. func (self *BadExpression) Idx1() file.Idx { return self.To }
  387. func (self *BinaryExpression) Idx1() file.Idx { return self.Right.Idx1() }
  388. func (self *BooleanLiteral) Idx1() file.Idx { return file.Idx(int(self.Idx) + len(self.Literal)) }
  389. func (self *BracketExpression) Idx1() file.Idx { return self.RightBracket + 1 }
  390. func (self *CallExpression) Idx1() file.Idx { return self.RightParenthesis + 1 }
  391. func (self *ConditionalExpression) Idx1() file.Idx { return self.Test.Idx1() }
  392. func (self *DotExpression) Idx1() file.Idx { return self.Identifier.Idx1() }
  393. func (self *FunctionLiteral) Idx1() file.Idx { return self.Body.Idx1() }
  394. func (self *Identifier) Idx1() file.Idx { return file.Idx(int(self.Idx) + len(self.Name)) }
  395. func (self *NewExpression) Idx1() file.Idx { return self.RightParenthesis + 1 }
  396. func (self *NullLiteral) Idx1() file.Idx { return file.Idx(int(self.Idx) + 4) } // "null"
  397. func (self *NumberLiteral) Idx1() file.Idx { return file.Idx(int(self.Idx) + len(self.Literal)) }
  398. func (self *ObjectLiteral) Idx1() file.Idx { return self.RightBrace }
  399. func (self *RegExpLiteral) Idx1() file.Idx { return file.Idx(int(self.Idx) + len(self.Literal)) }
  400. func (self *SequenceExpression) Idx1() file.Idx { return self.Sequence[0].Idx1() }
  401. func (self *StringLiteral) Idx1() file.Idx { return file.Idx(int(self.Idx) + len(self.Literal)) }
  402. func (self *ThisExpression) Idx1() file.Idx { return self.Idx }
  403. func (self *UnaryExpression) Idx1() file.Idx {
  404. if self.Postfix {
  405. return self.Operand.Idx1() + 2 // ++ --
  406. }
  407. return self.Operand.Idx1()
  408. }
  409. func (self *VariableExpression) Idx1() file.Idx {
  410. if self.Initializer == nil {
  411. return file.Idx(int(self.Idx) + len(self.Name) + 1)
  412. }
  413. return self.Initializer.Idx1()
  414. }
  415. func (self *MetaProperty) Idx1() file.Idx {
  416. return self.Property.Idx1()
  417. }
  418. func (self *BadStatement) Idx1() file.Idx { return self.To }
  419. func (self *BlockStatement) Idx1() file.Idx { return self.RightBrace + 1 }
  420. func (self *BranchStatement) Idx1() file.Idx { return self.Idx }
  421. func (self *CaseStatement) Idx1() file.Idx { return self.Consequent[len(self.Consequent)-1].Idx1() }
  422. func (self *CatchStatement) Idx1() file.Idx { return self.Body.Idx1() }
  423. func (self *DebuggerStatement) Idx1() file.Idx { return self.Debugger + 8 }
  424. func (self *DoWhileStatement) Idx1() file.Idx { return self.Test.Idx1() }
  425. func (self *EmptyStatement) Idx1() file.Idx { return self.Semicolon + 1 }
  426. func (self *ExpressionStatement) Idx1() file.Idx { return self.Expression.Idx1() }
  427. func (self *ForInStatement) Idx1() file.Idx { return self.Body.Idx1() }
  428. func (self *ForOfStatement) Idx1() file.Idx { return self.Body.Idx1() }
  429. func (self *ForStatement) Idx1() file.Idx { return self.Body.Idx1() }
  430. func (self *IfStatement) Idx1() file.Idx {
  431. if self.Alternate != nil {
  432. return self.Alternate.Idx1()
  433. }
  434. return self.Consequent.Idx1()
  435. }
  436. func (self *LabelledStatement) Idx1() file.Idx { return self.Colon + 1 }
  437. func (self *Program) Idx1() file.Idx { return self.Body[len(self.Body)-1].Idx1() }
  438. func (self *ReturnStatement) Idx1() file.Idx { return self.Return }
  439. func (self *SwitchStatement) Idx1() file.Idx { return self.Body[len(self.Body)-1].Idx1() }
  440. func (self *ThrowStatement) Idx1() file.Idx { return self.Throw }
  441. func (self *TryStatement) Idx1() file.Idx { return self.Try }
  442. func (self *VariableStatement) Idx1() file.Idx { return self.List[len(self.List)-1].Idx1() }
  443. func (self *WhileStatement) Idx1() file.Idx { return self.Body.Idx1() }
  444. func (self *WithStatement) Idx1() file.Idx { return self.Body.Idx1() }