MethodFinder.st
author penk
Tue, 13 Nov 2001 11:08:31 +0100
changeset 1104 237db486634c
parent 1103 7582880480cf
child 1106 50a16e11b73a
permissions -rw-r--r--
copyLast: added to list
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
     1
"{ Package: 'stx:libbasic3' }"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
     2
40d9ddd1f510 initial checkin
james
parents:
diff changeset
     3
Object subclass:#MethodFinder
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
     4
        instanceVariableNames:'data answers selector argMap thisData mapStage mapList
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
     5
                expressions cachedClass cachedArgNum cachedSelectorLists'
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
     6
        classVariableNames:'AddAndRemove Approved Blocks Dangerous'
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
     7
        poolDictionaries:''
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
     8
        category:'MethodFinder'
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
     9
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    10
1100
0502179eabd1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1092
diff changeset
    11
!MethodFinder class methodsFor:'documentation'!
0502179eabd1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1092
diff changeset
    12
0502179eabd1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1092
diff changeset
    13
documentation
0502179eabd1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1092
diff changeset
    14
"
0502179eabd1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1092
diff changeset
    15
  [author:]
0502179eabd1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1092
diff changeset
    16
    ported from Squeak and GUI enhanced by James Hayes james@exept.de
0502179eabd1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1092
diff changeset
    17
"
0502179eabd1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1092
diff changeset
    18
! !
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    19
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    20
!MethodFinder class methodsFor:'accessing'!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    21
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    22
abortAllSignal
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    23
    "return the value of the static variable 'AbortAllSignal' (automatically generated)"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    24
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    25
    ^ AbortAllSignal
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    26
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    27
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    28
abortAllSignal:something
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    29
    "set the value of the static variable 'AbortAllSignal' (automatically generated)"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    30
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    31
    AbortAllSignal := something.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    32
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    33
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    34
addAndRemove
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    35
    "return the value of the static variable 'AddAndRemove' (automatically generated)"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    36
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    37
    ^ AddAndRemove
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    38
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    39
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    40
addAndRemove:something
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    41
    "set the value of the static variable 'AddAndRemove' (automatically generated)"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    42
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    43
    AddAndRemove := something.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    44
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    45
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    46
approved
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    47
    "return the value of the static variable 'Approved' (automatically generated)"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    48
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    49
    ^ Approved
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    50
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    51
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    52
approved:something
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    53
    "set the value of the static variable 'Approved' (automatically generated)"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    54
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    55
    Approved := something.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    56
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    57
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    58
blocks
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    59
    "return the value of the static variable 'Blocks' (automatically generated)"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    60
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    61
    ^ Blocks
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    62
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    63
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    64
blocks:something
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    65
    "set the value of the static variable 'Blocks' (automatically generated)"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    66
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    67
    Blocks := something.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    68
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    69
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    70
dangerous
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    71
    "return the value of the static variable 'Dangerous' (automatically generated)"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    72
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    73
    ^ Dangerous
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    74
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    75
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    76
dangerous:something
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    77
    "set the value of the static variable 'Dangerous' (automatically generated)"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    78
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    79
    Dangerous := something.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    80
! !
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    81
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    82
!MethodFinder class methodsFor:'as yet unclassified'!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    83
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    84
methodFor: dataAndAnswers
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
    85
        "Return a Squeak expression that computes these answers.  (This method is called by the comment in the bottom pane of a MethodFinder.  Do not delete this method.)"
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    86
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
    87
        | resultOC selFinder resultString |
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    88
   
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
    89
        resultOC _ (self new) load: dataAndAnswers; findMessage.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
    90
        resultString _ String streamContents: [:strm |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
    91
                resultOC do: [:exp | strm nextPut: $(; nextPutAll: exp; nextPut: $); space]].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
    92
        Smalltalk isMorphic ifTrue: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
    93
                selFinder _ (Display bestGuessOfCurrentWorld 
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
    94
                                submorphThat: [:mm | mm class == SystemWindow and: 
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
    95
                                                                        [mm model isKindOf: SelectorBrowser]] 
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
    96
                                ifNone: [^ resultString]) model.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
    97
                selFinder searchResult: resultOC].
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
    98
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
    99
        ^ resultString
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   100
! !
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   101
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   102
!MethodFinder methodsFor:'access'!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   103
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   104
answers
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   105
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   106
        ^ answers
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   107
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   108
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   109
data
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   110
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   111
        ^ data
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   112
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   113
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   114
expressions
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   115
        ^ expressions
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   116
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   117
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   118
selectors
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   119
        "Note the inst var does not have an S on the end"
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   120
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   121
        ^ selector
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   122
! !
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   123
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   124
!MethodFinder methodsFor:'arg maps'!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   125
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   126
argMap
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   127
        ^ argMap 
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   128
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   129
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   130
makeAllMaps 
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   131
        "Make a giant list of all permutations of the args.  To find the function, we will try these permutations of the input data.  receiver, args."
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   132
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   133
        | ii |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   134
        mapList _ Array new: argMap size factorial.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   135
        ii _ 1.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   136
        argMap permutationsDo: [:perm |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   137
                mapList at: ii put: perm copy.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   138
                ii _ ii + 1].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   139
        mapStage _ 1.   "about to be bumped"
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   140
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   141
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   142
mapData 
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   143
        "Force the data through the map (permutation) to create the data to test."
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   144
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   145
        thisData _ data collect: [:realData |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   146
                                        argMap collect: [:ind | realData at: ind]].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   147
                
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   148
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   149
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   150
permuteArgs 
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   151
        "Run through ALL the permutations.  First one was as presented."
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   152
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   153
        data first size <= 1 ifTrue: [^ false]. "no other way"
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   154
        mapList ifNil: [self makeAllMaps].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   155
        mapStage _ mapStage + 1.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   156
        mapStage > mapList size ifTrue: [^ false].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   157
        argMap _ mapList at: mapStage.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   158
        self mapData.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   159
        ^ true
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   160
        
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   161
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   162
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   163
thisData
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   164
        ^ thisData 
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   165
! !
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   166
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   167
!MethodFinder methodsFor:'find a constant'!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   168
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   169
allNumbers
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   170
        "Return true if all answers and all data are numbers."
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   171
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   172
        answers do: [:aa | aa isNumber ifFalse: [^ false]].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   173
        thisData do: [:vec |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   174
                        vec do: [:nn | nn isNumber ifFalse: [^ false]]].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   175
        ^ true
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   176
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   177
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   178
const
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   179
        | const |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   180
        "See if (^ constant) is the answer"
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   181
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   182
        "quick test"
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   183
        ((const _ answers at: 1) closeTo: (answers at: 2)) ifFalse: [^ false].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   184
        3 to: answers size do: [:ii | (const closeTo: (answers at: ii)) ifFalse: [^ false]].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   185
        expressions add: '^ ', const printString.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   186
        selector add: #yourself.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   187
        ^ true
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   188
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   189
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   190
constDiv
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   191
        | const subTest got |
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   192
        "See if (data1 // C) is the answer"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   193
        self halt.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   194
        ^ false.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   195
        const _ ((thisData at: 1) at: 1) // (answers at: 1).  "May not be right!!"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   196
        got _ (subTest _ MethodFinder new copy: self addArg: const) 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   197
                                searchForOne isEmpty not.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   198
        got ifFalse: [^ false]. 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   199
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   200
        "replace data2 with const in expressions"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   201
        subTest expressions do: [:exp |
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   202
                expressions add: (exp copyReplaceAll: 'data2' with: const printString)].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   203
        selector addAll: subTest selectors.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   204
        ^ true
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   205
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   206
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   207
constLessThan
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   208
        | const subTest got minConst maxConst tt |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   209
        "See if (data1 <= C) or (data1 >= C) is the answer"
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   210
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   211
        "quick test"
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   212
        ((answers at: 1) class superclass == Boolean) ifFalse: [^ false].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   213
        2 to: answers size do: [:ii | 
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   214
                ((answers at: ii) class superclass == Boolean) ifFalse: [^ false]].
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   215
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   216
        minConst _ Float infinity.  maxConst _ minConst negated.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   217
        answers withIndexDo: [:aa :ii |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   218
                aa ifTrue: [tt _ (thisData at: ii) at: 1.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   219
                        minConst _ minConst min: tt.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   220
                        maxConst _ maxConst max: tt]].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   221
        const _ (thisData at: 1) at: 1.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   222
        got _ (subTest _ MethodFinder new copy: self addArg: minConst) 
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   223
                                searchForOne isEmpty not.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   224
        got ifFalse: ["try other extreme for <= >= "
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   225
                got _ (subTest _ MethodFinder new copy: self addArg: maxConst) 
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   226
                                searchForOne isEmpty not]. 
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   227
        got ifFalse: [^ false]. 
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   228
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   229
        "replace data2 with const in expressions"
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   230
        subTest expressions do: [:exp |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   231
                expressions add: (exp copyReplaceAll: 'data2' with: const printString)].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   232
        selector addAll: subTest selectors.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   233
        ^ true
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   234
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   235
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   236
constLinear
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   237
        | const subTest got denom num slope offset |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   238
        "See if (data1 * C1) + C2 is the answer.  In the form  #(C2 C1) polynomialEval: data1 "
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   239
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   240
        denom _ ((thisData at: 2) at: 1) - ((thisData at: 1) at: 1).
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   241
        denom = 0 ifTrue: [^ false].   "will divide by it"
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   242
        num _ (answers at: 2) - (answers at: 1).
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   243
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   244
    slope := (num asFloat / denom) reduce.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   245
    offset := ((answers at: 2) - (((thisData at: 2) at: 1) * slope)) reduce.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   246
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   247
        const _ Array with: offset with: slope.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   248
        got _ (subTest _ MethodFinder new copy: self addArg: const) 
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   249
                                searchForOne isEmpty not.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   250
        got ifFalse: [^ false]. 
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   251
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   252
        "replace data2 with const in expressions"
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   253
        subTest expressions do: [:exp |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   254
                expressions add: (exp copyReplaceAll: 'data2' with: const printString)].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   255
        selector addAll: subTest selectors.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   256
        ^ true
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   257
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   258
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   259
constMod
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   260
        | subTest low |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   261
        "See if mod, (data1 \\ C) is the answer"
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   262
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   263
        low _ answers max.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   264
        low+1 to: low+20 do: [:const |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   265
                subTest _ MethodFinder new copy: self addArg: const.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   266
                (subTest testPerfect: #\\) ifTrue: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   267
                        expressions add: 'data1 \\ ', const printString.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   268
                        selector add: #\\.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   269
                        ^ true]].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   270
        ^ false
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   271
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   272
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   273
constMult
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   274
        | const subTest got |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   275
        "See if (data1 * C) is the answer"
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   276
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   277
        ((thisData at: 1) at: 1) = 0 ifTrue: [^ false].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   278
        const _ ((answers at: 1) asFloat / ((thisData at: 1) at: 1)) reduce.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   279
        got _ (subTest _ MethodFinder new copy: self addArg: const) 
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   280
                                searchForOne isEmpty not.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   281
        got ifFalse: [^ false]. 
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   282
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   283
        "replace data2 with const in expressions"
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   284
        subTest expressions do: [:exp |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   285
                expressions add: (exp copyReplaceAll: 'data2' with: const printString)].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   286
        selector addAll: subTest selectors.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   287
        ^ true
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   288
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   289
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   290
constPlus
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   291
        | const subTest got |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   292
        "See if (data1 + C) is the answer"
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   293
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   294
        const _ (answers at: 1) - ((thisData at: 1) at: 1).
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   295
        got _ (subTest _ MethodFinder new copy: self addArg: const) 
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   296
                                searchForOne isEmpty not.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   297
        got ifFalse: [^ false]. 
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   298
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   299
        "replace data2 with const in expressions"
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   300
        subTest expressions do: [:exp |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   301
                expressions add: (exp copyReplaceAll: 'data2' with: const printString)].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   302
        selector addAll: subTest selectors.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   303
        ^ true
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   304
! !
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   305
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   306
!MethodFinder methodsFor:'initialize'!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   307
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   308
cleanInputs: dataAndAnswerString
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   309
        "Find an remove common mistakes.  Complain when ill formed."
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   310
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   311
| fixed ddd rs places |
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   312
ddd _ dataAndAnswerString.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   313
fixed _ false.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   314
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   315
rs _ ReadStream on: ddd, ' '.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   316
places _ OrderedCollection new.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   317
[rs upToAll: '#true'.  rs atEnd] whileFalse: [places addFirst: rs position-4]. 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   318
places do: [:pos | ddd _ ddd copyReplaceFrom: pos to: pos with: ''.
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   319
        fixed _ true].  "remove #"
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   320
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   321
rs _ ReadStream on: ddd.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   322
places _ OrderedCollection new.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   323
[rs upToAll: '#false'.  rs atEnd] whileFalse: [places addFirst: rs position-5]. 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   324
places do: [:pos | ddd _ ddd copyReplaceFrom: pos to: pos with: ''.
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   325
        fixed _ true].  "remove #"
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   326
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   327
fixed ifTrue: [self inform: '#(true false) are Symbols, not Booleans.  
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   328
Next time use { true. false }.'].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   329
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   330
fixed _ false.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   331
rs _ ReadStream on: ddd.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   332
places _ OrderedCollection new.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   333
[rs upToAll: '#nil'.  rs atEnd] whileFalse: [places addFirst: rs position-3]. 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   334
places do: [:pos | ddd _ ddd copyReplaceFrom: pos to: pos with: ''.
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   335
        fixed _ true].  "remove #"
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   336
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   337
fixed ifTrue: [self inform: '#nil is a Symbol, not the authentic UndefinedObject.  
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   338
Next time use nil instead of #nil'].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   339
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   340
^ ddd
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   341
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   342
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   343
initialize
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   344
        "The methods we are allowed to use.  (MethodFinder new initialize) "
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   345
        Approved _ Set new.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   346
        AddAndRemove _ Set new.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   347
        Blocks _ Set new.                       
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   348
        "These modify an argument: longPrintOn: printOn: storeOn: sentTo: storeOn:base: printOn:base: absPrintExactlyOn:base: absPrintOn:base: absPrintOn:base:digitCount: writeOn: writeScanOn: possibleVariablesFor:continuedFrom:"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   349
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   350
"Object"  
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   351
        #("in class, instance creation" categoryForUniclasses chooseUniqueClassName initialInstance isSystemDefined newFrom: officialClass readCarefullyFrom:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   352
"accessing" at: basicAt: basicSize bindWithTemp: in: size yourself 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   353
"testing" basicType ifNil: #'ifNil:ifNotNil:' ifNotNil: #'ifNotNil:ifNil:' isColor isFloat isFraction isInMemory isInteger isMorph isNil isNumber isPoint isPseudoContext isText isTransparent isWebBrowser knownName notNil pointsTo: wantsSteps 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   354
"comparing" = == closeTo: hash hashMappedBy: identityHash identityHashMappedBy: identityHashPrintString ~= ~~ 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   355
"copying" clone copy shallowCopy 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   356
"dependents access" canDiscardEdits dependents hasUnacceptedEdits 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   357
"updating" changed changed: okToChange update: windowIsClosing 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   358
"printing" fullPrintString isLiteral longPrintString printString storeString stringForReadout stringRepresentation 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   359
"class membership" class isKindOf: #'isKindOf:orOf:' isMemberOf: respondsTo: xxxClass 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   360
"error handling" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   361
"user interface" defaultBackgroundColor defaultLabelForInspector fullScreenSize initialExtent modelWakeUp mouseUpBalk: newTileMorphRepresentative windowActiveOnFirstClick windowReqNewLabel: 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   362
"system primitives"  instVarAt: instVarNamed: 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   363
"private" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   364
"associating" -> 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   365
"converting" as: asOrderedCollection asString 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   366
"casing" caseOf: #'caseOf:otherwise:' 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   367
"binding" bindingOf: 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   368
"macpal" contentsChanged #'ifKindOf:thenDo:' instanceVariableValues  
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   369
"flagging" flag: 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   370
"translation support" "objects from disk" "finalization" ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   371
        #(#'at:add:' #'at:modify:' #'at:put:' #'basicAt:put:' "NOT instVar:at:"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   372
"message handling" perform: #'perform:orSendTo:' #'perform:with:' #'perform:with:with:' #'perform:with:with:with:' #'perform:withArguments:' #'perform:withArguments:inSuperclass:'
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   373
) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   374
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   375
"Boolean, True, False, UndefinedObject"  
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   376
        #("logical operations" & eqv: not xor: |
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   377
"controlling" and: ifFalse: #'ifFalse:ifTrue:' ifTrue: #'ifTrue:ifFalse:' or:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   378
"copying" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   379
"testing" isEmptyOrNil) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   380
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   381
"Behavior" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   382
        #("initialize-release"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   383
"accessing" compilerClass decompilerClass evaluatorClass format methodDict parserClass sourceCodeTemplate subclassDefinerClass
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   384
"testing" instSize instSpec isBits isBytes isFixed isPointers isVariable isWeak isWords
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   385
"copying"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   386
"printing" defaultNameStemForInstances printHierarchy
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   387
"creating class hierarchy"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   388
"creating method dictionary"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   389
"instance creation" basicNew basicNew: new new:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   390
"accessing class hierarchy" allSubclasses #'allSubclassesWithLevelDo:startingLevel:' allSuperclasses subclasses superclass withAllSubclasses withAllSuperclasses
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   391
"accessing method dictionary" allSelectors changeRecordsAt: compiledMethodAt: #'compiledMethodAt:ifAbsent:' firstCommentAt: lookupSelector: selectors selectorsDo: selectorsWithArgs: "slow but useful ->" sourceCodeAt: sourceCodeAt:ifAbsent: sourceMethodAt: sourceMethodAt:ifAbsent:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   392
"accessing instances and variables" allClassVarNames allInstVarNames allSharedPools classVarNames instVarNames instanceCount sharedPools someInstance subclassInstVarNames
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   393
"testing class hierarchy" inheritsFrom: kindOfSubclass
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   394
"testing method dictionary" canUnderstand: classThatUnderstands: hasMethods includesSelector: #'scopeHas:ifTrue:' whichClassIncludesSelector: whichSelectorsAccess: whichSelectorsReferTo: #'whichSelectorsReferTo:special:byte:' whichSelectorsStoreInto:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   395
"enumerating"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   396
"user interface"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   397
"private" indexIfCompact) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   398
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   399
"ClassDescription"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   400
        #("initialize-release" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   401
"accessing" classVersion isMeta name theNonMetaClass
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   402
"copying" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   403
"printing" classVariablesString instanceVariablesString sharedPoolsString
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   404
"instance variables" checkForInstVarsOK: 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   405
"method dictionary" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   406
"organization" category organization whichCategoryIncludesSelector:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   407
"compiling" acceptsLoggingOfCompilation wantsChangeSetLogging
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   408
"fileIn/Out" definition
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   409
"private" ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   410
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   411
"Class"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   412
        #("initialize-release" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   413
"accessing" classPool
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   414
"testing"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   415
"copying" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   416
"class name" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   417
"instance variables" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   418
"class variables" classVarAt: classVariableAssociationAt:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   419
"pool variables" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   420
"compiling" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   421
"subclass creation" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   422
"fileIn/Out" ) do: [:sel | Approved add: sel]. 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   423
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   424
"Metaclass"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   425
        #("initialize-release" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   426
"accessing" isSystemDefined soleInstance
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   427
"copying" "instance creation" "instance variables"  "pool variables" "class hierarchy"  "compiling"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   428
"fileIn/Out"  nonTrivial ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   429
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   430
"Context, BlockContext"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   431
        #(receiver client method receiver tempAt: 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   432
"debugger access" mclass pc selector sender shortStack sourceCode tempNames tempsAndValues
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   433
"controlling"  "printing" "system simulation" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   434
"initialize-release" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   435
"accessing" hasMethodReturn home numArgs
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   436
"evaluating" value #'value:ifError:' #'value:value:' #'value:value:value:' #'value:value:value:value:' #'valueWithArguments:'
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   437
"controlling"  "scheduling"  "instruction decoding"  "printing" "private"  "system simulation" ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   438
        #(value: "<- Association has it as a store" ) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   439
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   440
"Message"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   441
        #("inclass, instance creation" selector: #'selector:argument:' #'selector:arguments:'
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   442
"accessing" argument argument: arguments sends:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   443
"printing" "sending" ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   444
        #("private" #'setSelector:arguments:') do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   445
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   446
"Magnitude"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   447
        #("comparing" < <= > >= #'between:and:'
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   448
"testing" max: min: min:max: ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   449
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   450
"Date, Time"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   451
        #("in class, instance creation" fromDays: fromSeconds: fromString: #'newDay:month:year:' #'newDay:year:' today
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   452
        "in class, general inquiries" dateAndTimeNow dayOfWeek: #'daysInMonth:forYear:' daysInYear: #'firstWeekdayOfMonth:year:' indexOfMonth: leapYear: nameOfDay: nameOfMonth:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   453
"accessing" day leap monthIndex monthName weekday year
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   454
"arithmetic" addDays: subtractDate: subtractDays:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   455
"comparing"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   456
"inquiries" dayOfMonth daysInMonth daysInYear daysLeftInYear firstDayOfMonth previous:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   457
"converting" asSeconds
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   458
"printing" mmddyy mmddyyyy printFormat: printOn:format:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   459
"private" firstDayOfMonthIndex: weekdayIndex 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   460
        "in class, instance creation" fromSeconds: now 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   461
        "in class, general inquiries" dateAndTimeFromSeconds: dateAndTimeNow millisecondClockValue millisecondsToRun: totalSeconds
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   462
"accessing" hours minutes seconds
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   463
"arithmetic" addTime: subtractTime:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   464
"comparing"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   465
"printing" intervalString print24 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   466
"converting") do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   467
        #("private" hours: #'hours:minutes:seconds:' #'day:year:' 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   468
                 ) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   469
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   470
"Number"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   471
        #("in class" #'readFrom:base:' 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   472
"arithmetic" * + - / // \\ abs negated quo: reciprocal rem:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   473
"mathematical functions" arcCos arcSin arcTan arcTan: cos exp floorLog: ln log log: raisedTo: raisedToInteger: sin sqrt squared tan
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   474
"truncation and round off" ceiling #'detentBy:atMultiplesOf:snap:' floor roundTo: roundUpTo: rounded truncateTo: truncated
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   475
"comparing"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   476
"testing" even isDivisibleBy: isInf isInfinite isNaN isZero negative odd positive sign strictlyPositive
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   477
"converting" @ asInteger asNumber asPoint asSmallAngleDegrees degreesToRadians radiansToDegrees
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   478
"intervals" to: #'to:by:' 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   479
"printing" printStringBase: storeStringBase: ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   480
        Smalltalk isSmalltalkX ifTrue:[
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   481
            #("in class" #'readFrom:base:' 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   482
    "arithmetic"  
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   483
    "mathematical functions" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   484
    "truncation and round off" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   485
    "comparing"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   486
    "testing" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   487
    "converting" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   488
    "intervals" downTo: #'downTo:by:' 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   489
    "printing" radixPrintStringRadix: printStringRadix: storeStringRadix: ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   490
        ].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   491
"Integer"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   492
        #("in class" primesUpTo:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   493
"testing" isPowerOfTwo
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   494
"arithmetic" alignedTo:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   495
"comparing"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   496
"truncation and round off" atRandom normalize
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   497
"enumerating" timesRepeat:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   498
"mathematical functions" degreeCos degreeSin factorial gcd: lcm: take:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   499
"bit manipulation" << >> allMask: anyMask: bitAnd: bitClear: bitInvert bitInvert32 bitOr: bitShift: bitXor: lowBit noMask:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   500
"converting" asCharacter asColorOfDepth: asFloat asFraction asHexDigit
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   501
"printing" asStringWithCommas hex hex8 radix:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   502
"system primitives" lastDigit #'replaceFrom:to:with:startingAt:'
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   503
"private" "benchmarks" ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   504
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   505
"SmallInteger, LargeNegativeInteger, LargePositiveInteger"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   506
        #("arithmetic" "bit manipulation" highBit "testing" "comparing" "copying" "converting" "printing" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   507
"system primitives" digitAt: digitLength 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   508
"private" #'fromString:radix:' ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   509
        #((#'digitAt:put:') ) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   510
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   511
"Float"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   512
        #("arithmetic"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   513
"mathematical functions" reciprocalFloorLog: reciprocalLogBase2 timesTwoPower:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   514
"comparing" "testing"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   515
"truncation and round off" exponent fractionPart integerPart significand significandAsInteger
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   516
"converting" asApproximateFraction asIEEE32BitWord asTrueFraction
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   517
"copying") do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   518
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   519
"Fraction, Random"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   520
        #(denominator numerator reduced next nextValue) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   521
        #(#'setNumerator:denominator:') do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   522
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   523
"Collection"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   524
        #("accessing" anyOne
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   525
"testing" includes: includesAllOf: includesAnyOf: includesSubstringAnywhere: isEmpty isSequenceable occurrencesOf:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   526
"enumerating" collect: #'collect:thenSelect:' count: detect: #'detect:ifNone:' detectMax: detectMin: detectSum: #'inject:into:' reject: select: #'select:thenCollect:'
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   527
"converting" asBag asCharacterSet asSet asSortedArray asSortedCollection asSortedCollection:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   528
"printing"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   529
"private" maxSize
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   530
"arithmetic"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   531
"math functions" average max median min range sum) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   532
        #("adding" add: addAll: addIfNotPresent:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   533
"removing" remove: #'remove:ifAbsent:' removeAll: removeAllFoundIn: removeAllSuchThat: #'remove:ifAbsent:') do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   534
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   535
"SequenceableCollection"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   536
        #("comparing" hasEqualElements:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   537
"accessing" allButFirst allButLast at:ifAbsent: atAll: atPin: atRandom: atWrap: fifth first fourth identityIndexOf: #'identityIndexOf:ifAbsent:' indexOf: #'indexOf:ifAbsent:' #'indexOf:startingAt:ifAbsent:' #'indexOfSubCollection:startingAt:' #'indexOfSubCollection:startingAt:ifAbsent:' last second sixth third
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   538
"removing"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   539
"copying" , copyAfterLast: #'copyAt:put:' #'copyFrom:to:' #'copyReplaceAll:with:' #'copyReplaceFrom:to:with:' copyUpTo: copyUpToLast: copyWith: copyWithout: copyWithoutAll: #'forceTo:paddingWith:' shuffled sortBy:
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   540
            copyWithoutLast: copyLast:  copyFrom: copyTo:
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   541
"enumerating" collectWithIndex: findFirst: findLast: pairsCollect: #'with:collect:' withIndexCollect: polynomialEval:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   542
"converting" asArray asDictionary asFloatArray asIntegerArray asStringWithCr asWordArray reversed
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   543
"private" #'copyReplaceAll:with:asTokens:' ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   544
        #( swap:with:) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   545
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   546
"ArrayedCollection, Bag"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   547
        #("private" defaultElement 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   548
"sorting" isSorted
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   549
"accessing" cumulativeCounts sortedCounts sortedElements "testing" "adding" #'add:withOccurrences:' "removing" "enumerating" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   550
        ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   551
        #( #'mergeSortFrom:to:by:' sort sort: add: #'add:withOccurrences:'
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   552
"private" setDictionary ) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   553
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   554
"Other messages that modify the receiver"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   555
        #(#'atAll:put:' #'atAll:putAll:' atAllPut: #'atWrap:put:' #'replaceAll:with:' #'replaceFrom:to:with:'  removeFirst removeLast) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   556
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   557
        self initialize2.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   558
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   559
"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   560
MethodFinder new initialize.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   561
MethodFinder new organizationFiltered: Set
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   562
"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   563
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   564
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   565
initialize2
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   566
        "The methods we are allowed to use.  (MethodFinder new initialize) "
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   567
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   568
"Set"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   569
        #("in class" sizeFor:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   570
"testing" "adding" "removing" "enumerating"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   571
"private" array findElementOrNil: 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   572
"accessing" someElement) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   573
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   574
"Dictionary, IdentityDictionary, IdentitySet"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   575
        #("accessing" associationAt: #'associationAt:ifAbsent:' #'at:ifPresent:' keyAtIdentityValue: #'keyAtIdentityValue:ifAbsent:' keyAtValue: #'keyAtValue:ifAbsent:' keys
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   576
"testing" includesKey: ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   577
        #(removeKey: #'removeKey:ifAbsent:'
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   578
) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   579
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   580
"LinkedList, Interval, MappedCollection"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   581
        #("in class"  #'from:to:' #'from:to:by:'
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   582
"accessing" contents) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   583
        #(
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   584
"adding" addFirst: addLast:) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   585
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   586
"OrderedCollection, SortedCollection"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   587
        #("accessing" after: before:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   588
"copying" copyEmpty
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   589
"adding"  growSize
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   590
"removing" "enumerating" "private" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   591
"accessing" sortBlock) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   592
        #("adding" #'add:after:' #'add:afterIndex:' #'add:before:' addAllFirst: addAllLast: addFirst: addLast:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   593
"removing" removeAt: removeFirst removeLast
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   594
"accessing" sortBlock:) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   595
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   596
"Character"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   597
        #("in class, instance creation" allCharacters digitValue: new separators
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   598
        "accessing untypeable characters" backspace cr enter lf linefeed nbsp newPage space tab
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   599
        "constants" alphabet characterTable
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   600
"accessing" asciiValue digitValue
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   601
"comparing"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   602
"testing" isAlphaNumeric isDigit isLetter isLowercase isSafeForHTTP isSeparator isSpecial isUppercase isVowel tokenish
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   603
"copying"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   604
"converting" asIRCLowercase asLowercase asUppercase
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   605
        ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   606
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   607
"String"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   608
        #("in class, instance creation" crlf fromPacked:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   609
        "primitives" #'findFirstInString:inSet:startingAt:' #'indexOfAscii:inString:startingAt:'      "internet" valueOfHtmlEntity:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   610
"accessing" byteAt: endsWithDigit #'findAnySubStr:startingAt:' findBetweenSubStrs: #'findDelimiters:startingAt:' #'findString:startingAt:' #'findString:startingAt:caseSensitive:' findTokens: #'findTokens:includes:' #'findTokens:keep:' includesSubString: #'includesSubstring:caseSensitive:' #'indexOf:startingAt:' indexOfAnyOf: #'indexOfAnyOf:ifAbsent:' #'indexOfAnyOf:startingAt:' #'indexOfAnyOf:startingAt:ifAbsent:' lineCorrespondingToIndex: lineCount lineNumber: #'skipAnySubStr:startingAt:' #'skipDelimiters:startingAt:' startsWithDigit
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   611
"comparing" alike: beginsWith: caseSensitiveLessOrEqual: charactersExactlyMatching: compare: crc16 endsWith: endsWithAnyOf: sameAs: #'startingAt:match:startingAt:'
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   612
"copying" #'copyReplaceTokens:with:' #'padded:to:with:'
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   613
"converting" asByteArray asDate asDisplayText asFileName asHtml asLegalSelector asPacked asParagraph asText asTime asUnHtml asUrl asUrlRelativeTo: #capitalized compressWithTable: contractTo: correctAgainst: encodeForHTTP initialIntegerOrNil keywords quoted sansPeriodSuffix splitInteger stemAndNumericSuffix substrings surroundedBySingleQuotes truncateWithElipsisTo: withBlanksTrimmed withFirstCharacterDownshifted withNoLineLongerThan: withSeparatorsCompacted withoutLeadingDigits withoutTrailingBlanks
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   614
"displaying" "printing"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   615
"system primitives" #'compare:with:collated:' 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   616
"Celeste" withCRs
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   617
"internet" decodeMimeHeader decodeQuotedPrintable replaceHtmlCharRefs unescapePercents withInternetLineEndings withSqueakLineEndings withoutQuoting
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   618
"testing" isAllSeparators lastSpacePosition
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   619
"paragraph support" indentationIfBlank:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   620
"arithmetic" ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   621
        #(#'byteAt:put:' translateToLowercase match:) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   622
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   623
"Symbol"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   624
        #("in class, private" hasInterned:ifTrue:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   625
        "access" morePossibleSelectorsFor: possibleSelectorsFor: selectorsContaining: #'thatStarts:skipping:'
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   626
"accessing" "comparing" "copying" "converting" "printing" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   627
"testing" isInfix isKeyword isPvtSelector isUnary) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   628
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   629
"Array"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   630
        #("comparing" "converting" evalStrings 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   631
"printing" "private" hasLiteralSuchThat:) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   632
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   633
"Array2D"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   634
        #("access" #'at:at:' atCol: #'atCol:put:' atRow: extent #'extent:fromArray:' height width #'width:height:type:') do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   635
        #(#'at:at:add:' #'at:at:put:' #'atRow:put:' ) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   636
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   637
"ByteArray"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   638
        #("accessing" doubleWordAt: wordAt: 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   639
"platform independent access" #'longAt:bigEndian:' #'shortAt:bigEndian:' #'unsignedLongAt:bigEndian:' #'unsignedShortAt:bigEndian:' 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   640
"converting") do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   641
        #(#'doubleWordAt:put:' #'wordAt:put:' #'longAt:put:bigEndian:' #'shortAt:put:bigEndian:' #'unsignedLongAt:put:bigEndian:' #'unsignedShortAt:put:bigEndian:'
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   642
        ) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   643
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   644
"FloatArray"            "Dont know what happens when prims not here"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   645
        false ifTrue: [#("accessing" "arithmetic" *= += -= /=
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   646
"comparing"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   647
"primitives-plugin" primAddArray: primAddScalar: primDivArray: primDivScalar: primMulArray: primMulScalar: primSubArray: primSubScalar:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   648
"primitives-translated" #'primAddArray:withArray:from:to:' #'primMulArray:withArray:from:to:' #'primSubArray:withArray:from:to:'
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   649
"converting" "private" "user interface") do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   650
        ].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   651
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   652
"IntegerArray, WordArray"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   653
"RunArray"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   654
        #("in class, instance creation" #'runs:values:' scanFrom:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   655
"accessing" runLengthAt: 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   656
"adding" "copying"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   657
"private" runs values) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   658
        #(coalesce #'addLast:times:' #'repeatLast:ifEmpty:' repeatLastIfEmpty:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   659
                ) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   660
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   661
"Stream  -- many operations change its state"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   662
        #("testing" atEnd) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   663
        #("accessing" next: nextMatchAll: nextMatchFor: upToEnd
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   664
#'next:put:' nextPut: nextPutAll: "printing" print: printHtml:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   665
        ) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   666
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   667
"PositionableStream"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   668
        #("accessing" contentsOfEntireFile originalContents peek peekFor: "testing"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   669
"positioning" position ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   670
        #(nextDelimited: nextLine upTo: position: reset resetContents setToEnd skip: skipTo: upToAll: ) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   671
        "Because it is so difficult to test the result of an operation on a Stream (you have to supply another Stream in the same state), we don't support Streams beyond the basics.  We want to find the messages that convert Streams to other things."
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   672
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   673
"ReadWriteStream"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   674
        #("file status" closed) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   675
        #("accessing" next: on: ) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   676
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   677
"WriteStream"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   678
        #("in class, instance creation" on:from:to: with: with:from:to:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   679
                ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   680
        #("positioning" resetToStart
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   681
"character writing" crtab crtab:) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   682
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   683
"LookupKey, Association, Link"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   684
        #("accessing" key nextLink) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   685
        #(key: #'key:value:' nextLink:) do: [:sel | AddAndRemove add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   686
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   687
"Point"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   688
        #("in class, instance creation" #'r:degrees:' #'x:y:'
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   689
"accessing" x y "comparing" "arithmetic" "truncation and round off"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   690
"polar coordinates" degrees r theta
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   691
"point functions" bearingToPoint: crossProduct: dist: dotProduct: eightNeighbors #'flipBy:centerAt:' fourNeighbors grid: #'nearestPointAlongLineFrom:to:' #'nearestPointOnLineFrom:to:' normal normalized octantOf: #'onLineFrom:to:' #'onLineFrom:to:within:' quadrantOf: #'rotateBy:centerAt:' transposed unitVector
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   692
"converting" asFloatPoint asIntegerPoint corner: extent: rect:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   693
"transforming" adhereTo: #'rotateBy:about:' scaleBy: #'scaleFrom:to:' translateBy: "copying"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   694
"interpolating" #'interpolateTo:at:') do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   695
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   696
"Rectangle"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   697
        #("in class, instance creation" #'center:extent:' encompassing: #'left:right:top:bottom:' 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   698
        merging: #'origin:corner:' #'origin:extent:' 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   699
"accessing" area bottom bottomCenter bottomLeft bottomRight boundingBox center corner corners innerCorners left leftCenter origin right rightCenter top topCenter topLeft topRight
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   700
"comparing"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   701
"rectangle functions" #'adjustTo:along:' amountToTranslateWithin: areasOutside: #'bordersOn:along:' encompass: expandBy: extendBy: #'forPoint:closestSideDistLen:' insetBy: #'insetOriginBy:cornerBy:' intersect: merge: pointNearestTo: quickMerge: #'rectanglesAt:height:' sideNearestTo: translatedToBeWithin: withBottom: withHeight: withLeft: withRight: #'withSide:setTo:' withTop: withWidth:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   702
"testing" containsPoint: containsRect: hasPositiveExtent intersects: isTall isWide
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   703
"truncation and round off"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   704
"transforming" #'align:with:' centeredBeneath: newRectFrom: squishedWithin: "copying"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   705
        ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   706
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   707
"Color"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   708
        #("in class, instance creation" colorFrom: #'colorFromPixelValue:depth:' fromRgbTriplet: gray: #'h:s:v:' #'r:g:b:' #'r:g:b:alpha:' #'r:g:b:range:'
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   709
        "named colors" black blue brown cyan darkGray gray green lightBlue lightBrown lightCyan lightGray lightGreen lightMagenta lightOrange lightRed lightYellow magenta orange red transparent veryDarkGray veryLightGray veryVeryDarkGray veryVeryLightGray white yellow
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   710
        "other" colorNames indexedColors pixelScreenForDepth: quickHighLight:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   711
"access" alpha blue brightness green hue luminance red saturation
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   712
"equality"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   713
"queries" isBitmapFill isBlack isGray isSolidFill isTranslucent isTranslucentColor
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   714
"transformations" alpha: dansDarker darker lighter #'mixed:with:' muchLighter slightlyDarker slightlyLighter veryMuchLighter #'alphaMixed:with:'
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   715
"groups of shades" darkShades: lightShades: #'mix:shades:' wheel:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   716
"printing" shortPrintString
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   717
"other" colorForInsets rgbTriplet
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   718
"conversions" asB3DColor asColor balancedPatternForDepth: bitPatternForDepth: closestPixelValue1 closestPixelValue2 closestPixelValue4 closestPixelValue8 dominantColor halfTonePattern1 halfTonePattern2 indexInMap: pixelValueForDepth: #'pixelWordFor:filledWith:' pixelWordForDepth: scaledPixelValue32
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   719
"private" privateAlpha privateBlue privateGreen privateRGB privateRed "copying"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   720
        ) do: [:sel | Approved add: sel].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   721
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   722
"       For each selector that requires a block argument, add (selector argNum) 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   723
                to the set Blocks."
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   724
"ourClasses _ #(Object Boolean True False UndefinedObject Behavior ClassDescription Class Metaclass MethodContext BlockContext Message Magnitude Date Time Number Integer SmallInteger LargeNegativeInteger LargePositiveInteger Float Fraction Random Collection SequenceableCollection ArrayedCollection Bag Set Dictionary IdentityDictionary IdentitySet LinkedList Interval MappedCollection OrderedCollection SortedCollection Character String Symbol Array Array2D ByteArray FloatArray IntegerArray WordArray RunArray Stream PositionableStream ReadWriteStream WriteStream LookupKey Association Link Point Rectangle Color).
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   725
ourClasses do: [:clsName | cls _ Smalltalk at: clsName.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   726
        (cls selectors) do: [:aSel |
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   727
                ((Approved includes: aSel) or: [AddAndRemove includes: aSel]) ifTrue: [
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   728
                        (cls formalParametersAt: aSel) withIndexDo: [:tName :ind |
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   729
                                (tName endsWith: 'Block') ifTrue: [
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   730
                                        Blocks add: (Array with: aSel with: ind)]]]]].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   731
"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   732
#((timesRepeat: 1 ) (indexOf:ifAbsent: 2 ) (pairsCollect: 1 ) (#'mergeSortFrom:to:by:' 3 ) (#'ifNotNil:ifNil:' 1 ) (#'ifNotNil:ifNil:' 2 ) (ifNil: 1 ) (#'at:ifAbsent:' 2 ) (#'ifNil:ifNotNil:' 1 ) (#'ifNil:ifNotNil:' 2 ) (ifNotNil: 1 ) (#'at:modify:' 2 ) (#'identityIndexOf:ifAbsent:' 2 ) (sort: 1 ) (sortBlock: 1 ) (detectMax: 1 ) (repeatLastIfEmpty: 1 ) (#'allSubclassesWithLevelDo:startingLevel:' 1 ) (#'keyAtValue:ifAbsent:' 2 ) (in: 1 ) (ifTrue: 1 ) (or: 1 ) (select: 1 ) (inject:into: 2 ) (#'ifKindOf:thenDo:' 2 ) (#'forPoint:closestSideDistLen:' 2 ) (#'value:ifError:' 2 ) (selectorsDo: 1 ) (removeAllSuchThat: 1 ) (#'keyAtIdentityValue:ifAbsent:' 2 ) (detectMin: 1 ) (#'detect:ifNone:' 1 ) (#'ifTrue:ifFalse:' 1 ) (#'ifTrue:ifFalse:' 2 ) (#'detect:ifNone:' 2 ) (hasLiteralSuchThat: 1 ) (#'indexOfAnyOf:ifAbsent:' 2 ) (reject: 1 ) (newRectFrom: 1 ) (#'removeKey:ifAbsent:' 2 ) (#'at:ifPresent:' 2 ) (#'associationAt:ifAbsent:' 2 ) (withIndexCollect: 1 ) (#'repeatLast:ifEmpty:' 2 ) (findLast: 1 ) (#'indexOf:startingAt:ifAbsent:' 3 ) (#'remove:ifAbsent:' 2 ) (#'ifFalse:ifTrue:' 1 ) (#'ifFalse:ifTrue:' 2 ) (#'caseOf:otherwise:' 2 ) (count: 1 ) (collect: 1 ) (sortBy: 1 ) (and: 1 ) (asSortedCollection: 1 ) (#'with:collect:' 2 ) (#'sourceCodeAt:ifAbsent:' 2 ) (detect: 1 ) (#'scopeHas:ifTrue:' 2 ) (collectWithIndex: 1 ) (#'compiledMethodAt:ifAbsent:' 2 ) (bindWithTemp: 1 ) (detectSum: 1 ) (#'indexOfSubCollection:startingAt:ifAbsent:' 3 ) (findFirst: 1 ) (#'sourceMethodAt:ifAbsent:' 2 ) (#'collect:thenSelect:' 1 ) (#'collect:thenSelect:' 2 ) (#'select:thenCollect:' 1 ) (#'select:thenCollect:' 2 ) (ifFalse: 1 ) (#'indexOfAnyOf:startingAt:ifAbsent:' 3 ) (#'indentationIfBlank:' 1 ) ) do: [:anArray |
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   733
        Blocks add: anArray].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   734
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   735
self initialize3.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   736
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   737
"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   738
MethodFinder new initialize.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   739
MethodFinder new organizationFiltered: TranslucentColor class 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   740
"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   741
"Do not forget class messages for each of these classes"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   742
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   743
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   744
initialize3
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   745
        "more selectors to consider"
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   746
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   747
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   748
load: dataWithAnswers
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   749
        "Find a function that takes the data and gives the answers.  Odd list entries are data for it, even ones are the answers.  nil input means data and answers were supplied already."
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   750
"  (MethodFinder new) load: #( (4 3) 7  (-10 5) -5  (-3 11) 8);
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   751
                findMessage  "
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   752
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   753
dataWithAnswers ifNotNil: [
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   754
        data _ Array new: dataWithAnswers size // 2.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   755
        1 to: data size do: [:ii | data at: ii put: (dataWithAnswers at: ii*2-1)].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   756
        answers _ Array new: data size.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   757
        1 to: answers size do: [:ii | answers at: ii put: (dataWithAnswers at: ii*2)]].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   758
data do: [:list | 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   759
        (list isKindOf: SequenceableCollection) ifFalse: [
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   760
                ^ self warn: 'first and third items are not Arrays'].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   761
        ].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   762
argMap _ (1 to: data first size) asArray.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   763
data do: [:list | list size = argMap size ifFalse: [
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   764
                self warn: 'data arrays must all be the same size']].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   765
argMap size > 4 ifTrue: [self warn: 'No more than a receiver and 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   766
three arguments allowed'].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   767
        "Really only test receiver and three args." 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   768
thisData _ data copy.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   769
mapStage _ mapList _ nil.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   770
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   771
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   772
noteDangerous
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   773
        "Remember the methods with really bad side effects."
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   774
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   775
        Dangerous _ Set new.
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   776
"Object accessing, testing, copying, dependent access, macpal, flagging"
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   777
        #(addInstanceVarNamed:withValue: haltIfNil copyAddedStateFrom: veryDeepCopy veryDeepCopyWith: veryDeepFixupWith: veryDeepInner: addDependent: evaluate:wheneverChangeIn: codeStrippedOut: playSoundNamed: isThisEverCalled isThisEverCalled: logEntry logExecution logExit)
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   778
                do: [:sel | Dangerous add: sel].
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   779
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   780
"Object error handling"
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   781
        #(cannotInterpret: caseError confirm: confirm:orCancel: doesNotUnderstand: error: halt halt: notify: notify:at: primitiveFailed shouldNotImplement subclassResponsibility tryToDefineVariableAccess:)
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   782
                do: [:sel | Dangerous add: sel].
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   783
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   784
"Object user interface"
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   785
        #(basicInspect beep inform: inspect inspectWithLabel: notYetImplemented inspectElement )
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   786
                do: [:sel | Dangerous add: sel].
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   787
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   788
"Object system primitives"
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   789
        #(become: becomeForward: instVarAt:put: instVarNamed:put: nextInstance nextObject rootStubInImageSegment: someObject tryPrimitive:withArgs:)
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   790
                do: [:sel | Dangerous add: sel].
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   791
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   792
"Object private"
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   793
        #(errorImproperStore errorNonIntegerIndex errorNotIndexable errorSubscriptBounds: mustBeBoolean primitiveError: species storeAt:inTempFrame:)
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   794
                do: [:sel | Dangerous add: sel].
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   795
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   796
"Object, translation support"
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   797
        #(cCode: cCode:inSmalltalk: cCoerce:to: export: inline: returnTypeC: sharedCodeNamed:inCase: var:declareC:)
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   798
                do: [:sel | Dangerous add: sel].
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   799
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   800
"Object, objects from disk, finalization.  And UndefinedObject"
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   801
        #(comeFullyUpOnReload: objectForDataStream: readDataFrom:size: rehash saveOnFile storeDataOn: actAsExecutor executor finalize retryWithGC:until:   suspend)
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   802
                do: [:sel | Dangerous add: sel].
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   803
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   804
"No Restrictions:   Boolean, False, True, "
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   805
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   806
"Morph"
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   807
        #(fullCopy copyRecordingIn:)
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   808
                do: [:sel | Dangerous add: sel].
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   809
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   810
"Behavior"
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   811
        #(obsolete confirmRemovalOf: copyOfMethodDictionary literalScannedAs:notifying: storeLiteral:on: addSubclass: removeSubclass: superclass: 
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   812
"creating method dictionary" addSelector:withMethod: compile: compile:notifying: compileAll compileAllFrom: compress decompile: defaultSelectorForMethod: methodDictionary: recompile:from: recompileChanges removeSelector: compressedSourceCodeAt: selectorAtMethod:setClass: allInstances allSubInstances inspectAllInstances inspectSubInstances thoroughWhichSelectorsReferTo:special:byte: "enumerating" allInstancesDo: allSubInstancesDo: allSubclassesDo: allSuperclassesDo: selectSubclasses: selectSuperclasses: subclassesDo: withAllSubclassesDo:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   813
"user interface" allCallsOn: browse browseAllAccessesTo: browseAllCallsOn: browseAllStoresInto: "too slow->" crossReference removeUninstantiatedSubclassesSilently "too slow->" unreferencedInstanceVariables
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   814
"private" becomeCompact becomeUncompact flushCache format:variable:words:pointers: format:variable:words:pointers:weak: printSubclassesOn:level: removeSelectorSimply:)
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   815
                do: [:sel | Dangerous add: sel].
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   816
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   817
"Others "
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   818
        #("no tangible result" do: associationsDo:  
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   819
"private" adaptToCollection:andSend: adaptToNumber:andSend: adaptToPoint:andSend: adaptToString:andSend: instVarAt:put: asDigitsToPower:do: combinations:atATimeDo: doWithIndex: pairsDo: permutationsDo: reverseDo: reverseWith:do: with:do: withIndexDo: asDigitsAt:in:do: combinationsAt:in:after:do: errorOutOfBounds permutationsStartingAt:do: fromUser)
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   820
                do: [:sel | Dangerous add: sel].
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   821
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   822
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   823
        #(    fileOutPrototype addSpareFields makeFileOutFile )
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   824
                do: [:sel | Dangerous add: sel].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   825
        #(recompile:from: recompileAllFrom: recompileChanges asPrototypeWithFields: asPrototype addInstanceVarNamed:withValue: addInstanceVariable addClassVarName: removeClassVarName: findOrAddClassVarName: tryToDefineVariableAccess: instanceVariableNames: )
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   826
                do: [:sel | Dangerous add: sel].
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   827
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   828
 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   829
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   830
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   831
organizationFiltered: aClass
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   832
        "Return the organization of the class with all selectors defined in superclasses removed.  (except those in Object)"
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   833
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   834
        | org str |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   835
        org _ aClass organization deepCopy.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   836
        Dangerous do: [:sel |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   837
                        org removeElement: sel].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   838
        Approved do: [:sel |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   839
                        org removeElement: sel].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   840
        AddAndRemove do: [:sel |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   841
                        org removeElement: sel].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   842
        str _ org printString copyWithout: $(.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   843
        str _ '(', (str copyWithout: $) ).
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   844
        str _ str replaceAll: $' with: $".
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   845
        ^ str
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   846
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   847
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   848
test2: anArray
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   849
        "look for bad association"
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   850
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   851
        anArray do: [:sub |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   852
                sub class == Association ifTrue: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   853
                        (#('true' '$a' '2' 'false') includes: sub value printString) ifFalse: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   854
                                self error: 'bad assn'].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   855
                        (#('3' '5.6' 'x' '''abcd''') includes: sub key printString) ifFalse: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   856
                                self error: 'bad assn'].
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   857
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   858
        "                       sub value class == Association ifTrue: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   859
                                        self error: 'bad assn'].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   860
                                (sub value isKindOf: Class) ifTrue: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   861
                                        self error: 'class in assn'].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   862
                                sub value class == Symbol ifTrue: [sub value asciiValue = 204 '$Ì' ifTrue: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   863
                                        self error: 'Write into char']].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   864
                                sub value == $Ì ifTrue: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   865
                                        self error: 'Write into char']
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   866
        "].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   867
                sub class == Array ifTrue: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   868
                        sub do: [:element | 
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   869
                                element class == String ifTrue: [element first asciiValue < 32 ifTrue: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   870
                                                self error: 'store into string in data']].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   871
                                element class == Association ifTrue: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   872
                                        element value class == Association ifTrue: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   873
                                                self error: 'bad assn']]]].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   874
                sub class == Date ifTrue: [sub year isInteger ifFalse: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   875
                                self error: 'stored into input date!!!!']].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   876
                sub class == Dictionary ifTrue: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   877
                                sub size > 0 ifTrue: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   878
                                        self error: 'store into dictionary']].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   879
                sub class == OrderedCollection ifTrue: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   880
                                sub size > 4 ifTrue: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   881
                                        self error: 'store into OC']].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   882
                ].
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   883
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   884
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   885
test3
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   886
        "find the modification of the caracter table"
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   887
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   888
        (#x at: 1) asciiValue = 120 ifFalse: [self error: 'Character table mod'].
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   889
! !
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   890
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   891
!MethodFinder methodsFor:'search'!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   892
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   893
exceptions
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   894
        "Handle some very slippery selectors.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   895
        asSymbol -- want to be able to produce it, but do not want to make every string submitted into a Symbol!!" 
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   896
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   897
        | aSel |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   898
        answers first class == Symbol ifFalse: [^ self].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   899
        thisData first first class == String ifFalse: [^ self].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   900
        aSel _ #asSymbol.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   901
        (self testPerfect: aSel) ifTrue: [
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   902
                selector add: aSel.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   903
                expressions add: (String streamContents: [:strm | 
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   904
                        strm nextPutAll: 'data', argMap first printString.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   905
                        aSel keywords doWithIndex: [:key :ind |
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   906
                                strm nextPutAll: ' ',key.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   907
                                (key last == $:) | (key first isLetter not)
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   908
                                        ifTrue: [strm nextPutAll: ' data', 
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   909
                                                (argMap at: ind+1) printString]]])].
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   910
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   911
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   912
findMessage
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   913
        "Control the search."
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   914
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   915
        data do: [:alist |
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   916
                (alist isKindOf: SequenceableCollection) ifFalse: [
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   917
                        ^ OrderedCollection with: 'first and third items are not Arrays']].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   918
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   919
        Approved ifNil: [self initialize].      "Sets of allowed selectors"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   920
        expressions _ OrderedCollection new.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   921
        self search: true.      "multi"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   922
        expressions isEmpty ifTrue: [^ OrderedCollection with: 'no single method does that function'].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   923
        expressions class = String ifTrue: [^ OrderedCollection with: expressions].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   924
        ^ expressions
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   925
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   926
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   927
insertConstants
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   928
        "see if one of several known expressions will do it. C is the constant we discover here."
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   929
        "C  data1+C  data1*C  data1//C  (data1*C1 + C2) (data1 = C) (data1 ~= C) (data1 <= C) (data1 >= C) 
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   930
 (data1 mod C)"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   931
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   932
        thisData size >= 2 ifFalse: [^ self].   "need 2 examples"
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   933
        (thisData at: 1) size = 1 ifFalse: [^ self].    "only one arg, data1"
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   934
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   935
        self const ifTrue: [^ self].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   936
        self constEquiv ifTrue: [^ self].       " ==  ~= "
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   937
        self constLessThan ifTrue: [^ self].    " <=  and  >= "
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   938
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   939
        self allNumbers ifFalse: [^ self].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   940
        self constMod ifTrue: [^ self].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   941
        self constPlus ifTrue: [^ self].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   942
        self constMult ifTrue: [^ self].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   943
        self constDiv ifTrue: [^ self].
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   944
        self constLinear ifTrue: [^ self].
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   945
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   946
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   947
search: multi
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   948
        "if Multi is true, collect all selectors that work."
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   949
        | old |
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   950
        selector:=OrderedCollection new.       "list of them"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   951
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   952
      "  old _ Preferences autoAccessors.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   953
        Preferences disableGently: #autoAccessors. "
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   954
        Smalltalk isSmalltalkX ifTrue:[old:=false].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   955
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   956
        self simpleSearch.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   957
        multi not & (selector isEmpty not) ifTrue:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   958
                ["old ifTrue: [Preferences enableGently: #autoAccessors]."
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   959
                ^ selector]. 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   960
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   961
        [self permuteArgs] whileTrue:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   962
                [self simpleSearch.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   963
               multi not & (selector isEmpty not) ifTrue:
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   964
                        ["old ifTrue: [Preferences enableGently: #autoAccessors]."
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   965
                        ^ selector]].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   966
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   967
        self insertConstants.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   968
      "  old ifTrue: [Preferences enableGently: #autoAccessors]. "
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   969
"/ (selector isEmpty not) ifTrue: [^ selector]].   " expression is the answer, not a selector"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   970
        ^ #()
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   971
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   972
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   973
searchForOne
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   974
        "Look for and return just one answer"
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   975
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   976
        expressions _ OrderedCollection new.
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   977
        self search: false.     "non-multi"
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   978
        ^ expressions
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
   979
                        
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   980
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   981
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   982
simpleSearch
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   983
        "Run through first arg's class' selectors, looking for one that works."
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   984
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   985
| class supers listOfLists |
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   986
self exceptions.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   987
class:=thisData first first class.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   988
"Cache the selectors for the receiver class"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   989
(class == cachedClass and: [cachedArgNum = ((argMap size) - 1)]) 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   990
        ifTrue: [listOfLists:=cachedSelectorLists]
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   991
        ifFalse: [supers:=class withAllSuperclasses.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   992
                listOfLists:=OrderedCollection new.
1092
b6e046dfe01e checkin from browser
james
parents: 1089
diff changeset
   993
                supers do: [:cls |    
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   994
                        listOfLists add: (cls selectorsWithArgs: (argMap size) - 1)].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   995
                cachedClass:=class.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   996
                cachedArgNum:=(argMap size) - 1.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   997
                cachedSelectorLists:=listOfLists].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   998
"/ self halt.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
   999
listOfLists do: [:selectorList |
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1000
        selectorList do: [:aSel |
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1001
                (selector includes: aSel) ifFalse: [
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1002
                        ((Approved includes: aSel) or: [AddAndRemove includes: aSel]) ifTrue: [
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1003
                                (self testPerfect: aSel) ifTrue: [
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1004
                                        selector add: aSel.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1005
                                        expressions add: (String streamContents: [:strm | 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1006
                                                strm nextPutAll: 'data', argMap first printString.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1007
                                                aSel keywords doWithIndex: [:key :ind |
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1008
                                                        strm nextPutAll: ' ',key.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1009
                                                        (key last == $:) | (key first isLetter not)
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1010
                                                                ifTrue: [strm nextPutAll: ' data', 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1011
                                                                        (argMap at: ind+1) printString]]])
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1012
                                        ]]]]].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1013
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1014
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1015
testPerfect: aSelector
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1016
        "Try this selector!! Return true if it answers every example perfectly.  Take the args in the order they are.  Do not permute them.  Survive errors.  later cache arg lists."
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1017
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1018
| sz argList val rec activeSel perform argIsBlock expectedAnswer|
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1019
        "Transcript cr; show: aSelector.                debug"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1020
perform:=aSelector beginsWith: 'perform:'.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1021
sz:=argMap size.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1022
1 to: thisData size do: [:ii | "each example set of args"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1023
        argList:=(thisData at: ii) copyFrom: 2 to: sz.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1024
        perform
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1025
                ifFalse: [activeSel:=aSelector]
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1026
                ifTrue: [activeSel:=argList first.     "what will be performed"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1027
                        ((Approved includes: activeSel) or: [AddAndRemove includes: activeSel])
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1028
                                ifFalse: [^ false].     "not approved"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1029
                        aSelector == #perform:withArguments: 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1030
                                ifTrue: [activeSel numArgs = (argList at: 2) basicSize "avoid error" 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1031
                                                        ifFalse: [^ false]]
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1032
                                ifFalse: [activeSel numArgs = (aSelector numArgs - 1) 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1033
                                                        ifFalse: [^ false]]].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1034
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1035
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1036
        1 to: sz do: [:num |   
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1037
                (Blocks includes: (Array with: activeSel with: num)) ifTrue: [
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1038
                        Smalltalk isSmalltalkX ifTrue:[
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1039
                            argIsBlock := (argList at: num) isBlock
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1040
                        ] ifFalse:[
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1041
                            argIsBlock := (argList at: num) class == BlockContext    
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1042
                        ].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1043
                        argIsBlock ifFalse: [^ false]]].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1044
     "   (activeSel = #capitalized) ifTrue:[self halt.].  "  "  used to test  "
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1045
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1046
        rec:=(AddAndRemove includes: activeSel) 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1047
                        ifTrue: [(thisData at: ii) first class == Symbol ifTrue: [^ false].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1048
                                                "vulnerable to modification"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1049
                                (thisData at: ii) first copyTwoLevel]   "protect from damage"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1050
                        ifFalse: [[(thisData at: ii) first]ifError:[self halt.]] .
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1051
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1052
        expectedAnswer := (answers at: ii).
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1053
        val:= [ rec copy perform: aSelector withArguments: argList] 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1054
                ifError: [:aSignal|  
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1055
Transcript showCR:aSignal description.
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1056
                                                        "self test3."
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1057
                                                        "self test2: (thisData at: ii)."
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1058
                                                        ^ false].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1059
        "self test3."
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1060
        "self test2: (thisData at: ii)."
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1061
        (expectedAnswer isKindOf: Number) 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1062
        ifFalse:[
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1063
                (expectedAnswer = val) ifFalse: [^ false]]
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1064
        ifTrue:[
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1065
                (expectedAnswer closeTo: val) ifFalse: [^ false]].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1066
        ].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1067
        ^ true
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1068
!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1069
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1070
verify
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1071
        "Test a bunch of examples"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1072
        "       MethodFinder new verify    "
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1073
Approved ifNil: [self initialize].      "Sets of allowed selectors"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1074
"/(MethodFinder new load: #( (0) 0  (30) 0.5  (45) 0.707106  (90) 1)
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1075
"/        ) searchForOne asArray = #('data1 degreeSin') ifFalse: [self error: 'should have found it'].  "Squeak test"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1076
"/(MethodFinder new load:   { { true. [3]. [4]}. 3.  { false. [0]. [6]}. 6}
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1077
"/        ) searchForOne asArray = #('data1 ifTrue: data2 ifFalse: data3') ifFalse: [
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1078
"/                self error: 'should have found it'].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1079
(MethodFinder2 new load: #(#(1) true #(2) false #(5) true #(10) false)
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1080
        ) searchForOne asArray = #('data1 odd') ifFalse: [self error: 'should have found it'].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1081
                "will correct the date type of #true, and complain"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1082
Smalltalk isSmalltalkX ifTrue:[        
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1083
(MethodFinder2 new load: #((4 2) '2r100'   (255 16) '16rFF'    (14 8) '8r16')
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1084
        ) searchForOne asArray = 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1085
                #('data1 radixPrintStringRadix: data2' )
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1086
                          ifFalse: [self error: 'should have found it'].        
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1087
] ifFalse:[
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1088
(MethodFinder2 new load: #((4 2) '2r100'   (255 16) '16rFF'    (14 8) '8r16')
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1089
        ) searchForOne asArray = 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1090
                #('data1 radix: data2' 'data1 printStringBase: data2' 'data1 storeStringBase: data2')                             
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1091
                          ifFalse: [self error: 'should have found it'].        
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1092
].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1093
"/(MethodFinder2 new load: #(#(3@4) 4 #(1@5) 5)
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1094
"/        ) searchForOne asArray = #('data1 y') ifFalse: [self error: 'should have found it'].    
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1095
Smalltalk isSmalltalkX ifTrue:[
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1096
(MethodFinder2 new load: #(('abcd') $a  ('TedK') $T)
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1097
        ) searchForOne asArray = #('data1 first' 'data1 removeFirst'  'data1 anyOne')   
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1098
                 ifFalse: [self error: 'should have found it']. 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1099
] ifFalse:[
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1100
(MethodFinder2 new load: #(('abcd') $a  ('TedK') $T)
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1101
        ) searchForOne asArray = #('data1 asCharacter' 'data1 first' 'data1 anyOne')
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1102
                 ifFalse: [self error: 'should have found it']. 
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1103
].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1104
(((MethodFinder2 new load: #(('abcd' 1) $a  ('Ted ' 3) $d )
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1105
        ) searchForOne asArray) includesAll: #('data1 at: data2' 'data1 atPin: data2' 'data1 atWrap: data2'))
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1106
                ifFalse: [self error: 'should have found it'].  
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1107
(MethodFinder2 new load: #(((12 4 8)) 24  ((1 3 6)) 10 )
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1108
        ) searchForOne asArray=  #('data1 sum') ifFalse: [self error: 'should have found it'].  
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1109
                "note extra () needed for an Array object as an argument"
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1110
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1111
(MethodFinder2 new load: #((14 3) 11  (-10 5) -15  (4 -3) 7)
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1112
        ) searchForOne asArray = #('data1 - data2') ifFalse: [self error: 'should have found it'].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1113
((MethodFinder2 new load: #((4) 4  (-10) 10 (-3) 3 (2) 2 (-6) 6 (612) 612)
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1114
        ) searchForOne asArray includesAll: #('data1 abs')) ifFalse: [self error: 'should have found it'].
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1115
(MethodFinder2 new load: #(#(4 3) true #(-7 3) false #(5 1) true #(5 5) false)
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1116
        ) searchForOne asArray = #('data1 > data2') ifFalse: [self error: 'should have found it'].      
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1117
(MethodFinder2 new load: #((5) 0.2   (2) 0.5)
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1118
        ) searchForOne asArray = #('data1 reciprocal') ifFalse: [self error: 'should have found it'].   
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1119
(MethodFinder2 new load: #((12 4 8) 2  (1 3 6) 2  (5 2 16) 8)
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1120
        ) searchForOne asArray = #()     " '(data3 / data2) ' want to be able to leave out args"  
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1121
                ifFalse: [self error: 'should have found it'].  
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1122
(MethodFinder2 new load: #((0.0) 0.0  (1.5) 0.997495  (0.75) 0.681639)
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1123
        ) searchForOne asArray = #('data1 sin') ifFalse: [self error: 'should have found it'].  
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1124
(MethodFinder2 new load: #((7 5) 2   (4 5) 4   (-9 4) 3)
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1125
        ) searchForOne asArray = #('data1 \\ data2') ifFalse: [self error: 'should have found it'].     
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1126
! !
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1127
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1128
!MethodFinder class methodsFor:'documentation'!
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1129
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1130
version
1104
237db486634c copyLast: added to list
penk
parents: 1103
diff changeset
  1131
    ^ '$Header: /cvs/stx/stx/libbasic3/MethodFinder.st,v 1.5 2001-11-13 10:08:31 penk Exp $'
1089
40d9ddd1f510 initial checkin
james
parents:
diff changeset
  1132
! !