1
0

Compiler-AST.st 7.4 KB

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