node.go 15 KB

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