/
ClyBrowserMorph.extension.st
176 lines (129 loc) · 6.21 KB
/
ClyBrowserMorph.extension.st
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
Extension { #name : #ClyBrowserMorph }
{ #category : #'*Calypso-SystemTools-Core' }
ClyBrowserMorph >> allowSilentlyRemoveMethods: methods whichHaveSenders: senders [
| singleSender sendersCount |
sendersCount := senders size.
sendersCount = 0 ifTrue: [ ^true].
methods size = 1 & (sendersCount = 1) ifFalse: [^false].
singleSender := senders itemAt: 1.
^singleSender == methods first
]
{ #category : #'*Calypso-SystemTools-Core' }
ClyBrowserMorph >> confirmEmptySystemQuery: aQuery [
| showResult result |
result := aQuery execute.
result isEmpty ifTrue: [ ^true ].
showResult := UIManager default confirm: 'There are '
, result size asString, ' ', aQuery description, '. Show them?'.
showResult ifTrue: [self spawnQueryBrowserOn: aQuery].
^false
]
{ #category : #'*Calypso-SystemTools-Core' }
ClyBrowserMorph >> confirmEmptySystemQuery: aQuery excluding: classes [
| showResult result |
result := aQuery execute.
(result isEmpty or: [ ((result items collect: [:each | each origin]) difference: classes ) isEmpty]) ifTrue: [ ^true ].
showResult := UIManager default confirm: 'There are '
, result size asString, ' ', aQuery description, '. Show them?'.
showResult ifTrue: [self spawnQueryBrowserOn: aQuery].
^false
]
{ #category : #'*Calypso-SystemTools-Core' }
ClyBrowserMorph >> confirmUnusedClasses: classes [
| refQuery noUsers answer subclasses users |
refQuery := ClyClassReferencesQuery toAny: classes from: self systemScope.
"we need to exclude both the class and instance side of the class"
noUsers := self confirmEmptySystemQuery: refQuery excluding: (classes flatCollect: [ :each | { each . each classSide } ]).
subclasses := (classes flatCollect: [:each | each subclasses]) copyWithoutAll: classes.
subclasses ifNotEmpty: [
noUsers := false.
answer := UIManager default confirm: 'There are subclasses. Show them?'.
answer ifTrue: [ self spawnQueryBrowserOn: (ClyConstantQuery returning: subclasses) ] ].
users := (classes flatCollect: [:each | each users]) copyWithoutAll: classes.
users ifNotEmpty: [
noUsers := false.
answer := UIManager default confirm: 'There are users of trait. Show them?'.
answer ifTrue: [ self spawnQueryBrowserOn: (ClyConstantQuery returning: users) ]].
^noUsers
]
{ #category : #'*Calypso-SystemTools-Core' }
ClyBrowserMorph >> confirmUnusedClassesExceptInheritance: classes [
| refQuery noUsers answer users |
refQuery := ClyClassReferencesQuery toAny: classes from: self systemScope.
"we need to exclude both the class and instance side of the class"
noUsers := self confirmEmptySystemQuery: refQuery excluding: (classes flatCollect: [ :each | { each . each classSide } ]).
users := (classes flatCollect: [:each | each users]) copyWithoutAll: classes.
users ifNotEmpty: [
noUsers := false.
answer := UIManager default confirm: 'There are users of trait. Show them?'.
answer ifTrue: [ self spawnQueryBrowserOn: (ClyConstantQuery returning: users) ]].
^noUsers
]
{ #category : #'*Calypso-SystemTools-Core' }
ClyBrowserMorph >> confirmUnusedVariables: variables [
| refQuery |
refQuery := ClyVariableReferencesQuery ofAny: variables from: self systemScope.
^self confirmEmptySystemQuery: refQuery
]
{ #category : #'*Calypso-SystemTools-Core' }
ClyBrowserMorph >> confirmUnusedVariablesInDefiningClass: variables [
| refQuery classScope |
classScope := ClyBothMetaLevelClassScope ofAll: (variables collect: [:each | each definingClass]) in: navigationEnvironment.
refQuery := ClyVariableReferencesQuery ofAny: variables from: classScope.
^self confirmEmptySystemQuery: refQuery
]
{ #category : #'*Calypso-SystemTools-Core' }
ClyBrowserMorph >> decorateMethodEditor: aMethodEditor [
]
{ #category : #'*Calypso-SystemTools-Core' }
ClyBrowserMorph >> hasReferencesToClasses: classes [
| query references |
query := (ClyClassReferencesQuery toAny: classes from: self systemScope).
references := query execute.
^(references notEmpty and: [
((references items collect: [:each | each origin])
difference: (classes flatCollect: [ :each | { each . each classSide } ])) notEmpty])
]
{ #category : #'*Calypso-SystemTools-Core' }
ClyBrowserMorph >> isMethodSelected: aMethod [
^self methodSelection includesActualObject: aMethod
]
{ #category : #'*Calypso-SystemTools-Core' }
ClyBrowserMorph >> requestRemoveClassStrategyFor: classes [
| hasReferences hasSubclasses hasUsers result strategies |
hasReferences := self hasReferencesToClasses: classes.
hasSubclasses := ((classes flatCollect: [ :each | each subclasses ])
copyWithoutAll: classes) notEmpty.
hasUsers := ((classes flatCollect: [ :each | each users ])
copyWithoutAll: classes) notEmpty.
hasReferences | hasSubclasses | hasUsers ifFalse: [
^ SycSilentlyRemoveClassStrategy new ].
strategies := SycRemoveClassStrategy
createAllForBrowser: self
references: hasReferences
subclasses: hasSubclasses
users: hasUsers.
result := UIManager default
chooseFrom:
(strategies collect: [ :each | each userRequestString ])
values: strategies
title: 'Class has references, subclasses, or users'.
^ result ifNil: [ SycNotRemoveClassStrategy new ]
]
{ #category : #'*Calypso-SystemTools-Core' }
ClyBrowserMorph >> requestRemoveMethodStrategyFor: methods [
| selectors result strategies caption senders senderCount plural |
selectors := (methods collect: [ :each | each selector ] as: IdentitySet) asArray.
senders := (ClyMessageSendersQuery ofAny: selectors from: self systemScope) execute.
(self allowSilentlyRemoveMethods: methods whichHaveSenders: senders)
ifTrue: [ ^SycSilentlyRemoveMethodStrategy new ].
strategies := SycRemoveMethodStrategy createAllForBrowser: self.
senderCount := senders size.
plural := '' asPluralBasedOn: senderCount.
caption := selectors size > 1
ifTrue: [ 'There are {1} sender{2}' format: {senderCount. plural}]
ifFalse: ['The message #{1} has {2} sender{3}' format: {selectors anyOne. senderCount. plural}].
result := UIManager default
chooseFrom: (strategies collect: [:each | each userRequestString]) values: strategies title: caption.
^result ifNil: [ SycNotRemoveMethodStrategy new ]
]