node.go 15 KB

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