2
0

Compiler-AST.st 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. Smalltalk current createPackage: 'Compiler-AST' properties: #{}!
  2. Object subclass: #Node
  3. instanceVariableNames: 'nodes shouldBeInlined shouldBeAliased'
  4. package: 'Compiler-AST'!
  5. !Node commentStamp!
  6. I am the abstract root class of the abstract syntax tree.!
  7. !Node methodsFor: 'accessing'!
  8. addNode: aNode
  9. self nodes add: aNode
  10. !
  11. nodes
  12. ^nodes ifNil: [nodes := Array new]
  13. !
  14. shouldBeAliased
  15. ^ shouldBeAliased ifNil: [ false ]
  16. !
  17. shouldBeAliased: aBoolean
  18. shouldBeAliased := aBoolean
  19. !
  20. shouldBeInlined
  21. ^ shouldBeInlined ifNil: [ false ]
  22. !
  23. shouldBeInlined: aBoolean
  24. shouldBeInlined := aBoolean
  25. ! !
  26. !Node methodsFor: 'building'!
  27. nodes: aCollection
  28. nodes := aCollection
  29. ! !
  30. !Node methodsFor: 'testing'!
  31. isAssignmentNode
  32. ^ false
  33. !
  34. isBlockNode
  35. ^false
  36. !
  37. isBlockSequenceNode
  38. ^false
  39. !
  40. isImmutable
  41. ^false
  42. !
  43. isReturnNode
  44. ^false
  45. !
  46. isSendNode
  47. ^false
  48. !
  49. isValueNode
  50. ^false
  51. ! !
  52. !Node methodsFor: 'visiting'!
  53. accept: aVisitor
  54. ^ aVisitor visitNode: self
  55. ! !
  56. Node subclass: #AssignmentNode
  57. instanceVariableNames: 'left right'
  58. package: 'Compiler-AST'!
  59. !AssignmentNode methodsFor: 'accessing'!
  60. left
  61. ^left
  62. !
  63. left: aNode
  64. left := aNode
  65. !
  66. nodes
  67. ^ Array with: self left with: self right
  68. !
  69. right
  70. ^right
  71. !
  72. right: aNode
  73. right := aNode
  74. ! !
  75. !AssignmentNode methodsFor: 'testing'!
  76. isAssignmentNode
  77. ^ true
  78. ! !
  79. !AssignmentNode methodsFor: 'visiting'!
  80. accept: aVisitor
  81. ^ aVisitor visitAssignmentNode: self
  82. ! !
  83. Node subclass: #BlockNode
  84. instanceVariableNames: 'parameters scope'
  85. package: 'Compiler-AST'!
  86. !BlockNode methodsFor: 'accessing'!
  87. parameters
  88. ^parameters ifNil: [parameters := Array new]
  89. !
  90. parameters: aCollection
  91. parameters := aCollection
  92. !
  93. scope
  94. ^ scope
  95. !
  96. scope: aLexicalScope
  97. scope := aLexicalScope
  98. ! !
  99. !BlockNode methodsFor: 'testing'!
  100. isBlockNode
  101. ^true
  102. ! !
  103. !BlockNode methodsFor: 'visiting'!
  104. accept: aVisitor
  105. ^ aVisitor visitBlockNode: self
  106. ! !
  107. Node subclass: #CascadeNode
  108. instanceVariableNames: 'receiver'
  109. package: 'Compiler-AST'!
  110. !CascadeNode methodsFor: 'accessing'!
  111. receiver
  112. ^receiver
  113. !
  114. receiver: aNode
  115. receiver := aNode
  116. ! !
  117. !CascadeNode methodsFor: 'visiting'!
  118. accept: aVisitor
  119. ^ aVisitor visitCascadeNode: self
  120. ! !
  121. Node subclass: #DynamicArrayNode
  122. instanceVariableNames: ''
  123. package: 'Compiler-AST'!
  124. !DynamicArrayNode methodsFor: 'visiting'!
  125. accept: aVisitor
  126. ^ aVisitor visitDynamicArrayNode: self
  127. ! !
  128. Node subclass: #DynamicDictionaryNode
  129. instanceVariableNames: ''
  130. package: 'Compiler-AST'!
  131. !DynamicDictionaryNode methodsFor: 'visiting'!
  132. accept: aVisitor
  133. ^ aVisitor visitDynamicDictionaryNode: self
  134. ! !
  135. Node subclass: #JSStatementNode
  136. instanceVariableNames: 'source'
  137. package: 'Compiler-AST'!
  138. !JSStatementNode methodsFor: 'accessing'!
  139. source
  140. ^source ifNil: ['']
  141. !
  142. source: aString
  143. source := aString
  144. ! !
  145. !JSStatementNode methodsFor: 'visiting'!
  146. accept: aVisitor
  147. ^ aVisitor visitJSStatementNode: self
  148. ! !
  149. Node subclass: #MethodNode
  150. instanceVariableNames: 'selector arguments source scope classReferences messageSends'
  151. package: 'Compiler-AST'!
  152. !MethodNode methodsFor: 'accessing'!
  153. arguments
  154. ^arguments ifNil: [#()]
  155. !
  156. arguments: aCollection
  157. arguments := aCollection
  158. !
  159. classReferences
  160. ^ classReferences
  161. !
  162. classReferences: aCollection
  163. classReferences := aCollection
  164. !
  165. messageSends
  166. ^ messageSends
  167. !
  168. messageSends: aCollection
  169. messageSends := aCollection
  170. !
  171. scope
  172. ^ scope
  173. !
  174. scope: aMethodScope
  175. scope := aMethodScope
  176. !
  177. selector
  178. ^selector
  179. !
  180. selector: aString
  181. selector := aString
  182. !
  183. source
  184. ^source
  185. !
  186. source: aString
  187. source := aString
  188. ! !
  189. !MethodNode methodsFor: 'visiting'!
  190. accept: aVisitor
  191. ^ aVisitor visitMethodNode: self
  192. ! !
  193. Node subclass: #ReturnNode
  194. instanceVariableNames: 'scope'
  195. package: 'Compiler-AST'!
  196. !ReturnNode methodsFor: 'accessing'!
  197. scope
  198. ^ scope
  199. !
  200. scope: aLexicalScope
  201. scope := aLexicalScope
  202. ! !
  203. !ReturnNode methodsFor: 'testing'!
  204. isReturnNode
  205. ^ true
  206. !
  207. nonLocalReturn
  208. ^ self scope isMethodScope not
  209. ! !
  210. !ReturnNode methodsFor: 'visiting'!
  211. accept: aVisitor
  212. ^ aVisitor visitReturnNode: self
  213. ! !
  214. Node subclass: #SendNode
  215. instanceVariableNames: 'selector arguments receiver superSend index'
  216. package: 'Compiler-AST'!
  217. !SendNode methodsFor: 'accessing'!
  218. arguments
  219. ^arguments ifNil: [arguments := #()]
  220. !
  221. arguments: aCollection
  222. arguments := aCollection
  223. !
  224. cascadeNodeWithMessages: aCollection
  225. | first |
  226. first := SendNode new
  227. selector: self selector;
  228. arguments: self arguments;
  229. yourself.
  230. ^CascadeNode new
  231. receiver: self receiver;
  232. nodes: (Array with: first), aCollection;
  233. yourself
  234. !
  235. index
  236. ^ index
  237. !
  238. index: anInteger
  239. index := anInteger
  240. !
  241. nodes
  242. ^ (Array withAll: self arguments)
  243. add: self receiver;
  244. yourself
  245. !
  246. receiver
  247. ^receiver
  248. !
  249. receiver: aNode
  250. receiver := aNode
  251. !
  252. selector
  253. ^selector
  254. !
  255. selector: aString
  256. selector := aString
  257. !
  258. superSend
  259. ^ superSend ifNil: [ false ]
  260. !
  261. superSend: aBoolean
  262. superSend := aBoolean
  263. !
  264. valueForReceiver: anObject
  265. ^SendNode new
  266. receiver: (self receiver
  267. ifNil: [anObject]
  268. ifNotNil: [self receiver valueForReceiver: anObject]);
  269. selector: self selector;
  270. arguments: self arguments;
  271. yourself
  272. ! !
  273. !SendNode methodsFor: 'testing'!
  274. isSendNode
  275. ^ true
  276. ! !
  277. !SendNode methodsFor: 'visiting'!
  278. accept: aVisitor
  279. ^ aVisitor visitSendNode: self
  280. ! !
  281. Node subclass: #SequenceNode
  282. instanceVariableNames: 'temps scope'
  283. package: 'Compiler-AST'!
  284. !SequenceNode methodsFor: 'accessing'!
  285. scope
  286. ^ scope
  287. !
  288. scope: aLexicalScope
  289. scope := aLexicalScope
  290. !
  291. temps
  292. ^temps ifNil: [#()]
  293. !
  294. temps: aCollection
  295. temps := aCollection
  296. ! !
  297. !SequenceNode methodsFor: 'testing'!
  298. asBlockSequenceNode
  299. ^BlockSequenceNode new
  300. nodes: self nodes;
  301. temps: self temps;
  302. yourself
  303. ! !
  304. !SequenceNode methodsFor: 'visiting'!
  305. accept: aVisitor
  306. ^ aVisitor visitSequenceNode: self
  307. ! !
  308. SequenceNode subclass: #BlockSequenceNode
  309. instanceVariableNames: ''
  310. package: 'Compiler-AST'!
  311. !BlockSequenceNode methodsFor: 'testing'!
  312. isBlockSequenceNode
  313. ^true
  314. ! !
  315. !BlockSequenceNode methodsFor: 'visiting'!
  316. accept: aVisitor
  317. ^ aVisitor visitBlockSequenceNode: self
  318. ! !
  319. Node subclass: #ValueNode
  320. instanceVariableNames: 'value'
  321. package: 'Compiler-AST'!
  322. !ValueNode methodsFor: 'accessing'!
  323. value
  324. ^value
  325. !
  326. value: anObject
  327. value := anObject
  328. ! !
  329. !ValueNode methodsFor: 'testing'!
  330. isImmutable
  331. ^true
  332. !
  333. isValueNode
  334. ^true
  335. ! !
  336. !ValueNode methodsFor: 'visiting'!
  337. accept: aVisitor
  338. ^ aVisitor visitValueNode: self
  339. ! !
  340. ValueNode subclass: #VariableNode
  341. instanceVariableNames: 'assigned binding'
  342. package: 'Compiler-AST'!
  343. !VariableNode methodsFor: 'accessing'!
  344. alias
  345. ^ self binding alias
  346. !
  347. assigned
  348. ^assigned ifNil: [false]
  349. !
  350. assigned: aBoolean
  351. assigned := aBoolean
  352. !
  353. beAssigned
  354. self binding validateAssignment.
  355. assigned := true
  356. !
  357. binding
  358. ^ binding
  359. !
  360. binding: aScopeVar
  361. binding := aScopeVar
  362. ! !
  363. !VariableNode methodsFor: 'testing'!
  364. isImmutable
  365. ^false
  366. ! !
  367. !VariableNode methodsFor: 'visiting'!
  368. accept: aVisitor
  369. ^ aVisitor visitVariableNode: self
  370. ! !
  371. VariableNode subclass: #ClassReferenceNode
  372. instanceVariableNames: ''
  373. package: 'Compiler-AST'!
  374. !ClassReferenceNode methodsFor: 'visiting'!
  375. accept: aVisitor
  376. ^ aVisitor visitClassReferenceNode: self
  377. ! !