1
0

Helios-References.st 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. Smalltalk createPackage: 'Helios-References'!
  2. Object subclass: #HLMethodReference
  3. instanceVariableNames: 'selector methodClass'
  4. package: 'Helios-References'!
  5. !HLMethodReference methodsFor: 'accessing'!
  6. method
  7. ^ self methodClass methodAt: self selector
  8. !
  9. methodClass
  10. ^ methodClass
  11. !
  12. methodClass: aClass
  13. methodClass := aClass
  14. !
  15. selector
  16. ^ selector
  17. !
  18. selector: aString
  19. selector := aString
  20. !
  21. source
  22. ^ self method source
  23. ! !
  24. !HLMethodReference methodsFor: 'initialization'!
  25. initializeFromMethod: aCompiledMethod
  26. self
  27. selector: aCompiledMethod selector;
  28. methodClass: aCompiledMethod methodClass
  29. ! !
  30. !HLMethodReference class methodsFor: 'instance creation'!
  31. on: aCompiledMethod
  32. ^ self new
  33. initializeFromMethod: aCompiledMethod;
  34. yourself
  35. ! !
  36. HLWidget subclass: #HLReferences
  37. instanceVariableNames: 'model sendersListWidget implementorsListWidget classReferencesListWidget regexpListWidget sourceCodeWidget'
  38. package: 'Helios-References'!
  39. !HLReferences methodsFor: 'accessing'!
  40. classReferencesListWidget
  41. ^ classReferencesListWidget ifNil: [
  42. classReferencesListWidget := HLClassReferencesListWidget on: self model.
  43. classReferencesListWidget next: self regexpListWidget ]
  44. !
  45. implementorsListWidget
  46. ^ implementorsListWidget ifNil: [
  47. implementorsListWidget := HLImplementorsListWidget on: self model.
  48. implementorsListWidget next: self classReferencesListWidget ]
  49. !
  50. model
  51. ^ model ifNil: [
  52. model := (HLReferencesModel new
  53. environment: self manager environment;
  54. yourself) ]
  55. !
  56. model: aModel
  57. model := aModel
  58. !
  59. regexpListWidget
  60. ^ regexpListWidget ifNil: [
  61. regexpListWidget := HLRegexpListWidget on: self model.
  62. regexpListWidget next: self sourceCodeWidget ]
  63. !
  64. sendersListWidget
  65. ^ sendersListWidget ifNil: [
  66. sendersListWidget := HLSendersListWidget on: self model.
  67. sendersListWidget next: self implementorsListWidget ]
  68. !
  69. sourceCodeWidget
  70. ^ sourceCodeWidget ifNil: [
  71. sourceCodeWidget := HLBrowserCodeWidget new
  72. browserModel: self model;
  73. yourself ]
  74. ! !
  75. !HLReferences methodsFor: 'actions'!
  76. registerBindingsOn: aBindingGroup
  77. HLToolCommand
  78. registerConcreteClassesOn: aBindingGroup
  79. for: self model
  80. !
  81. search: aString
  82. self model search: aString.
  83. self setTabLabel: aString
  84. ! !
  85. !HLReferences methodsFor: 'rendering'!
  86. renderContentOn: html
  87. html with: (HLContainer with: (HLHorizontalSplitter
  88. with: (HLVerticalSplitter
  89. with: (HLVerticalSplitter
  90. with: self sendersListWidget
  91. with: self implementorsListWidget)
  92. with: (HLVerticalSplitter
  93. with: self classReferencesListWidget
  94. with: self regexpListWidget))
  95. with: self sourceCodeWidget)).
  96. self sendersListWidget focus
  97. ! !
  98. !HLReferences class methodsFor: 'accessing'!
  99. tabClass
  100. ^ 'references'
  101. !
  102. tabLabel
  103. ^ 'References'
  104. !
  105. tabPriority
  106. ^ 100
  107. ! !
  108. !HLReferences class methodsFor: 'testing'!
  109. canBeOpenAsTab
  110. ^ false
  111. ! !
  112. HLToolListWidget subclass: #HLReferencesListWidget
  113. instanceVariableNames: ''
  114. package: 'Helios-References'!
  115. !HLReferencesListWidget methodsFor: 'accessing'!
  116. commandCategory
  117. ^ 'Methods'
  118. !
  119. label
  120. ^ 'List'
  121. ! !
  122. !HLReferencesListWidget methodsFor: 'actions'!
  123. activateListItem: anItem
  124. self model withChangesDo: [ super activateListItem: anItem ]
  125. !
  126. observeModel
  127. self model announcer
  128. on: HLSearchReferences
  129. do: [ :ann | self onSearchReferences: ann searchString ];
  130. on: HLMethodSelected
  131. do: [ :ann | self onMethodSelected: ann item ]
  132. !
  133. selectItem: aMethod
  134. super selectItem: aMethod.
  135. self model selectedMethod: aMethod
  136. ! !
  137. !HLReferencesListWidget methodsFor: 'reactions'!
  138. onMethodSelected: aMethod
  139. aMethod ifNil: [ ^ self ].
  140. self items detect: [ :each | each = aMethod selector ] ifNone: [ ^ self ].
  141. self
  142. selectedItem: aMethod selector;
  143. activateItem: aMethod selector
  144. !
  145. onSearchReferences: aString
  146. self subclassResponsibility
  147. ! !
  148. !HLReferencesListWidget methodsFor: 'rendering'!
  149. renderItemLabel: aMethod on: html
  150. html with: aMethod methodClass name, ' >> #', aMethod selector
  151. ! !
  152. !HLReferencesListWidget class methodsFor: 'instance creation'!
  153. on: aModel
  154. ^ self new
  155. model: aModel;
  156. yourself
  157. ! !
  158. HLReferencesListWidget subclass: #HLClassReferencesListWidget
  159. instanceVariableNames: ''
  160. package: 'Helios-References'!
  161. !HLClassReferencesListWidget methodsFor: 'accessing'!
  162. label
  163. ^ 'Class references'
  164. ! !
  165. !HLClassReferencesListWidget methodsFor: 'reactions'!
  166. onItemDoubleClicked: anEvent on: anObject
  167. "The item that this widget has rendered for anObject has been double clicked."
  168. HLBrowser openAsTab openMethod: anObject
  169. !
  170. onSearchReferences: aString
  171. self selectItem: nil.
  172. self items: (self model classReferencesOf: aString).
  173. self refresh
  174. ! !
  175. HLReferencesListWidget subclass: #HLImplementorsListWidget
  176. instanceVariableNames: ''
  177. package: 'Helios-References'!
  178. !HLImplementorsListWidget methodsFor: 'accessing'!
  179. label
  180. ^ 'Implementors'
  181. ! !
  182. !HLImplementorsListWidget methodsFor: 'reactions'!
  183. onSearchReferences: aString
  184. self selectItem: nil.
  185. self items: (self model implementorsOf: aString).
  186. self refresh
  187. ! !
  188. HLReferencesListWidget subclass: #HLRegexpListWidget
  189. instanceVariableNames: ''
  190. package: 'Helios-References'!
  191. !HLRegexpListWidget methodsFor: 'accessing'!
  192. label
  193. ^ 'Source search'
  194. ! !
  195. !HLRegexpListWidget methodsFor: 'reactions'!
  196. onSearchReferences: aString
  197. self selectItem: nil.
  198. self items: (self model regexpReferencesOf: aString).
  199. self refresh
  200. ! !
  201. HLReferencesListWidget subclass: #HLSendersListWidget
  202. instanceVariableNames: ''
  203. package: 'Helios-References'!
  204. !HLSendersListWidget methodsFor: 'accessing'!
  205. label
  206. ^ 'Senders'
  207. ! !
  208. !HLSendersListWidget methodsFor: 'reactions'!
  209. onSearchReferences: aString
  210. self selectItem: nil.
  211. self items: (self model sendersOf: aString).
  212. self refresh
  213. ! !
  214. HLToolModel subclass: #HLReferencesModel
  215. instanceVariableNames: 'methodsCache classesAndMetaclassesCache'
  216. package: 'Helios-References'!
  217. !HLReferencesModel methodsFor: 'accessing'!
  218. allMethods
  219. ^ self methodsCache
  220. !
  221. classReferencesOf: aString
  222. "Answer all methods referencing the class named aString"
  223. ^self allMethods select: [ :each |
  224. (each referencedClasses includes: aString) ].
  225. !
  226. classesAndMetaclasses
  227. ^ self classesAndMetaclassesCache
  228. !
  229. implementorsOf: aString
  230. ^ (self allMethods select: [ :each |
  231. each selector = aString ])
  232. collect: [ :each | self methodReferenceOn: each ]
  233. !
  234. methodReferenceOn: aCompiledMethod
  235. ^ HLMethodReference on: aCompiledMethod
  236. !
  237. regexpReferencesOf: aString
  238. ^ (self allMethods select: [ :each |
  239. each source match: aString ])
  240. collect: [ :each | self methodReferenceOn: each ]
  241. !
  242. sendersOf: aString
  243. ^ (self allMethods select: [ :each |
  244. each messageSends includes: aString ])
  245. collect: [ :each | self methodReferenceOn: each ]
  246. ! !
  247. !HLReferencesModel methodsFor: 'actions'!
  248. openClassNamed: aString
  249. | browser |
  250. self withChangesDo: [
  251. browser := HLBrowser openAsTab.
  252. browser openClassNamed: aString ]
  253. !
  254. openMethod
  255. | browser |
  256. self selectedMethod ifNil: [ ^ self ].
  257. self withChangesDo: [
  258. browser := HLBrowser openAsTab.
  259. browser openMethod: self selectedMethod ]
  260. !
  261. search: aString
  262. self updateCaches.
  263. self announcer announce: (HLSearchReferences new
  264. searchString: aString;
  265. yourself)
  266. ! !
  267. !HLReferencesModel methodsFor: 'cache'!
  268. classesAndMetaclassesCache
  269. classesAndMetaclassesCache ifNil: [ self updateClassesAndMetaclassesCache ].
  270. ^ classesAndMetaclassesCache
  271. !
  272. methodsCache
  273. methodsCache ifNil: [ self updateMethodsCache ].
  274. ^ methodsCache
  275. !
  276. updateCaches
  277. self
  278. updateClassesAndMetaclassesCache;
  279. updateMethodsCache
  280. !
  281. updateClassesAndMetaclassesCache
  282. classesAndMetaclassesCache := OrderedCollection new.
  283. self environment classes do: [ :each |
  284. classesAndMetaclassesCache
  285. add: each;
  286. add: each class ]
  287. !
  288. updateMethodsCache
  289. methodsCache := OrderedCollection new.
  290. self classesAndMetaclasses
  291. do: [ :each | methodsCache addAll: each methods ]
  292. ! !
  293. !HLReferencesModel methodsFor: 'testing'!
  294. isReferencesModel
  295. ^ true
  296. ! !