forked from pharo-project/pharo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
SycMessageDescription.class.st
116 lines (91 loc) · 3.18 KB
/
SycMessageDescription.class.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
"
I represent message description which includes selector and argument names.
In addition I keep reference to so named contextUser. It is an object which uses given message, which was used to retrieve message instance.
The #contextUser is either a method or RBMessageNode.
To create my instance use following expressions:
SycMessageDescription ofMethod: Magnitude >> #between:and:.
SycMessageDescription ofMessageNode: (SycRenameMessageCommand >> #createRefactoring) ast sendNodes first.
I implement suitable method for commands to request new signature:
aMessage requestNewSignature
It returnes new message instance.
Also I provide a method to compute argument permutations comparing to another message:
aMessage1 computeArgumentPermutationsFor: aMessage2
It is required for rename method refactoring.
Internal Representation and Key Implementation Points.
Instance Variables
argumentNames: <Array of<String>>
contextUser: <Object>
selector: <Symbol>
"
Class {
#name : #SycMessageDescription,
#superclass : #Object,
#instVars : [
'selector',
'argumentNames',
'contextUser'
],
#category : #'SystemCommands-MessageCommands'
}
{ #category : #'instance creation' }
SycMessageDescription class >> fromContextOf: messageUserObject [
^self new
contextUser: messageUserObject
]
{ #category : #'instance creation' }
SycMessageDescription class >> ofMessageNode: astMessageNode [
^(self fromContextOf: astMessageNode)
selector: astMessageNode selector;
argumentNames: (astMessageNode arguments collect: [:each | each formattedCode])
]
{ #category : #'instance creation' }
SycMessageDescription class >> ofMethod: aMethod [
^(self fromContextOf: aMethod)
selector: aMethod selector;
argumentNames: aMethod argumentNames
]
{ #category : #accessing }
SycMessageDescription >> argumentNames [
^ argumentNames
]
{ #category : #accessing }
SycMessageDescription >> argumentNames: anObject [
argumentNames := anObject
]
{ #category : #operations }
SycMessageDescription >> computeArgumentPermutationsFor: modifiedMessageDescription [
^modifiedMessageDescription argumentNames
collect: [ :each | argumentNames indexOf: each ]
]
{ #category : #accessing }
SycMessageDescription >> contextUser [
^ contextUser
]
{ #category : #accessing }
SycMessageDescription >> contextUser: anObject [
contextUser := anObject
]
{ #category : #testing }
SycMessageDescription >> describesSelector: someSelector withArguments: someArgumentNames [
^selector = someSelector & (argumentNames = someArgumentNames)
]
{ #category : #operations }
SycMessageDescription >> requestNewSignature [
| methodName dialog |
methodName := RBMethodName selector: selector arguments: argumentNames copy.
dialog := SycMethodNameEditor openOn: methodName.
dialog cancelled ifTrue: [ CmdCommandAborted signal ].
selector = methodName selector & (argumentNames = methodName arguments)
ifTrue: [ CmdCommandAborted signal].
^(SycMessageDescription fromContextOf: contextUser)
selector: methodName selector;
argumentNames: methodName arguments
]
{ #category : #accessing }
SycMessageDescription >> selector [
^ selector
]
{ #category : #accessing }
SycMessageDescription >> selector: anObject [
selector := anObject
]