110 |
110 |
111 "Do not manually edit this!! If it is corrupted, |
111 "Do not manually edit this!! If it is corrupted, |
112 the UIHelpTool may not be able to read the specification." |
112 the UIHelpTool may not be able to read the specification." |
113 |
113 |
114 " |
114 " |
115 UIHelpTool openOnClass:MethodFinderWindow |
115 UIHelpTool openOnClass:MethodFinderWindow |
116 " |
116 " |
117 |
117 |
118 <resource: #help> |
118 <resource: #help> |
119 |
119 |
120 ^ super helpSpec addPairsFrom:#( |
120 ^ super helpSpec addPairsFrom:#( |
|
121 |
|
122 #'*' |
|
123 'as in GLOB patterns (i.e. like filename patterns)' |
|
124 |
|
125 #answerValue |
|
126 'Enter result value here.\Can be a constant (like ''hello'')\or an expression, such as "Rectangle basicNew".' |
|
127 |
|
128 #arg1Value |
|
129 'Enter a value for the first argument here.\Can be a constant or an expression.' |
|
130 |
|
131 #arg2Value |
|
132 'Enter a value for the second argument here.\Can be a constant or an expression.' |
|
133 |
|
134 #arg3Value |
|
135 'Enter a value for the third argument here.\Can be a constant or an expression.' |
|
136 |
|
137 #argumentCount |
|
138 'Specify the number of arguments here.' |
|
139 |
|
140 #clearButton |
|
141 'Clear all sample value fields.' |
|
142 |
|
143 #implementorsFound |
|
144 'Shows a list of messages which deliver the result or match the selector pattern' |
121 |
145 |
122 #receiverValue |
146 #receiverValue |
123 'Enter a receiver value here.\Can be a constant (like ''hello'')\or an expression, such as "Rectangle basicNew".' |
147 'Enter a receiver value here.\Can be a constant (like ''hello'')\or an expression, such as "Rectangle basicNew".' |
124 |
148 |
125 #answerValue |
149 #selectorPattern |
126 'Enter result value here.\Can be a constant (like ''hello'')\or an expression, such as "Rectangle basicNew".' |
150 'Enter a pattern to search by message name' |
127 |
151 |
128 #arg1Value |
152 #selectorPatternSearch |
129 'Enter a value for the first argument here.\Can be a constant or an expression.' |
153 'Search by name.\You can use match characters' |
130 |
|
131 #arg2Value |
|
132 'Enter a value for the second argument here.\Can be a constant or an expression.' |
|
133 |
|
134 #arg3Value |
|
135 'Enter a value for the third argument here.\Can be a constant or an expression.' |
|
136 |
|
137 #argumentCount |
|
138 'Specify the number of arguments here.' |
|
139 |
|
140 #clearButton |
|
141 'Clear all sample value fields.' |
|
142 |
154 |
143 #startSearchButton |
155 #startSearchButton |
144 'Search for methods which answer the desired value,\given the concrete arguments' |
156 'Search for methods which answer the desired value,\given the concrete arguments' |
145 |
157 |
146 #selectorPatternSearch |
158 #startSearchPatternButton |
147 'Search by name.\You can use match characters '*' as in GLOB patterns (i.e. like filename patterns)' |
159 'Search for methods whose name matches the pattern' |
148 |
160 |
149 ) |
161 ) |
|
162 |
|
163 "Modified: / 08-06-2019 / 16:06:17 / Claus Gittinger" |
150 ! ! |
164 ! ! |
151 |
165 |
152 !MethodFinderWindow class methodsFor:'interface specs'! |
166 !MethodFinderWindow class methodsFor:'interface specs'! |
153 |
167 |
154 windowSpec |
168 windowSpec |
167 <resource: #canvas> |
181 <resource: #canvas> |
168 |
182 |
169 ^ |
183 ^ |
170 #(FullSpec |
184 #(FullSpec |
171 name: windowSpec |
185 name: windowSpec |
|
186 uuid: '5fb0c294-89f6-11e9-8df0-b8f6b1108e05' |
172 window: |
187 window: |
173 (WindowSpec |
188 (WindowSpec |
174 label: 'MethodFinder' |
189 label: 'MethodFinder' |
175 name: 'MethodFinder' |
190 name: 'MethodFinder' |
|
191 uuid: '5fb0c87a-89f6-11e9-8df0-b8f6b1108e05' |
176 bounds: (Rectangle 0 0 816 738) |
192 bounds: (Rectangle 0 0 816 738) |
177 menu: menu |
193 menu: menu |
178 icon: defaultIcon |
194 icon: defaultIcon |
179 ) |
195 ) |
180 component: |
196 component: |
181 (SpecCollection |
197 (SpecCollection |
182 collection: ( |
198 collection: ( |
183 (VariableHorizontalPanelSpec |
199 (VariableHorizontalPanelSpec |
184 name: 'VariableHorizontalPanel1' |
200 name: 'VariableHorizontalPanel1' |
185 layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0) |
201 layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0) |
|
202 uuid: '5fb0cd98-89f6-11e9-8df0-b8f6b1108e05' |
186 showHandle: true |
203 showHandle: true |
187 snapMode: both |
204 snapMode: both |
188 component: |
205 component: |
189 (SpecCollection |
206 (SpecCollection |
190 collection: ( |
207 collection: ( |
191 (VariableVerticalPanelSpec |
208 (VariableVerticalPanelSpec |
192 name: 'LeftBox' |
209 name: 'LeftBox' |
|
210 uuid: '5fb0d1a8-89f6-11e9-8df0-b8f6b1108e05' |
193 showHandle: true |
211 showHandle: true |
194 component: |
212 component: |
195 (SpecCollection |
213 (SpecCollection |
196 collection: ( |
214 collection: ( |
197 (ViewSpec |
215 (ViewSpec |
198 name: 'MethodFinderBox' |
216 name: 'MethodFinderBox' |
|
217 uuid: '5fb0d36a-89f6-11e9-8df0-b8f6b1108e05' |
199 component: |
218 component: |
200 (SpecCollection |
219 (SpecCollection |
201 collection: ( |
220 collection: ( |
202 (ViewSpec |
221 (ViewSpec |
203 name: 'ReceiverArgBox' |
222 name: 'ReceiverArgBox' |
204 layout: (LayoutFrame 0 0 0 0 0 1 -30 1) |
223 layout: (LayoutFrame 0 0 0 0 0 1 -30 1) |
|
224 uuid: '5fb0d4f0-89f6-11e9-8df0-b8f6b1108e05' |
205 component: |
225 component: |
206 (SpecCollection |
226 (SpecCollection |
207 collection: ( |
227 collection: ( |
208 (LabelSpec |
228 (LabelSpec |
209 label: 'Receiver' |
229 label: 'Receiver' |
210 name: 'ReceiverLabel' |
230 name: 'ReceiverLabel' |
211 layout: (LayoutFrame 0 0 0 0 0 0.34000000000000002 28 0) |
231 layout: (LayoutFrame 0 0 0 0 0 0.34000000000000002 28 0) |
|
232 uuid: '5fb0d6b2-89f6-11e9-8df0-b8f6b1108e05' |
212 translateLabel: true |
233 translateLabel: true |
213 ) |
234 ) |
214 (ComboListSpec |
235 (ComboListSpec |
215 name: 'allowedArgments' |
236 name: 'allowedArgments' |
216 layout: (LayoutFrame 0 0.34000000000000002 1 0 0 0.64000000000000135 28 0) |
237 layout: (LayoutFrame 0 0.34000000000000002 1 0 0 0.64000000000000135 28 0) |
217 activeHelpKey: argumentCount |
238 activeHelpKey: argumentCount |
|
239 uuid: '5fb0da9a-89f6-11e9-8df0-b8f6b1108e05' |
218 model: argCountHolder |
240 model: argCountHolder |
219 comboList: argCountList |
241 comboList: argCountList |
220 useIndex: true |
242 useIndex: true |
221 ) |
243 ) |
222 (LabelSpec |
244 (LabelSpec |
223 label: 'Answer' |
245 label: 'Answer' |
224 name: 'MessageAnswerLabel' |
246 name: 'MessageAnswerLabel' |
225 layout: (LayoutFrame 0 0.64000000000000135 0 0 0 1 28 0) |
247 layout: (LayoutFrame 0 0.64000000000000135 0 0 0 1 28 0) |
226 activeHelpKey: arg1Value |
248 activeHelpKey: arg1Value |
|
249 uuid: '5fb0dd60-89f6-11e9-8df0-b8f6b1108e05' |
227 translateLabel: true |
250 translateLabel: true |
228 ) |
251 ) |
229 (HorizontalPanelViewSpec |
252 (HorizontalPanelViewSpec |
230 name: 'HorizontalPanel1' |
253 name: 'HorizontalPanel1' |
231 layout: (LayoutFrame 0 0 30 0 0 1 0 1) |
254 layout: (LayoutFrame 0 0 30 0 0 1 0 1) |
|
255 uuid: '5fb0dee6-89f6-11e9-8df0-b8f6b1108e05' |
232 horizontalLayout: fit |
256 horizontalLayout: fit |
233 verticalLayout: fit |
257 verticalLayout: fit |
234 horizontalSpace: 3 |
258 horizontalSpace: 3 |
235 verticalSpace: 3 |
259 verticalSpace: 3 |
236 component: |
260 component: |
237 (SpecCollection |
261 (SpecCollection |
238 collection: ( |
262 collection: ( |
239 (WorkspaceSpec |
263 (WorkspaceSpec |
240 name: 'ReceiverEditor' |
264 name: 'ReceiverEditor' |
241 activeHelpKey: receiverValue |
265 activeHelpKey: receiverValue |
|
266 uuid: '5fb0e152-89f6-11e9-8df0-b8f6b1108e05' |
242 tabable: true |
267 tabable: true |
243 hasHorizontalScrollBar: true |
268 hasHorizontalScrollBar: true |
244 hasVerticalScrollBar: true |
269 hasVerticalScrollBar: true |
245 miniScrollerHorizontal: true |
270 miniScrollerHorizontal: true |
246 miniScrollerVertical: true |
271 miniScrollerVertical: true |
247 autoHideScrollBars: true |
272 autoHideScrollBars: true |
248 hasKeyboardFocusInitially: false |
273 hasKeyboardFocusInitially: false |
249 extent: (Point 85 142) |
274 extent: (Point 86 142) |
250 postBuildCallback: receiverWidgetCreated: |
275 postBuildCallback: receiverWidgetCreated: |
251 ) |
276 ) |
252 (VerticalPanelViewSpec |
277 (VerticalPanelViewSpec |
253 name: 'VerticalPanel1' |
278 name: 'VerticalPanel1' |
|
279 uuid: '5fb0e51c-89f6-11e9-8df0-b8f6b1108e05' |
254 horizontalLayout: fit |
280 horizontalLayout: fit |
255 verticalLayout: fit |
281 verticalLayout: fit |
256 horizontalSpace: 3 |
282 horizontalSpace: 3 |
257 verticalSpace: 3 |
283 verticalSpace: 3 |
258 component: |
284 component: |
259 (SpecCollection |
285 (SpecCollection |
260 collection: ( |
286 collection: ( |
261 (ViewSpec |
287 (ViewSpec |
262 name: 'Box1' |
288 name: 'Box1' |
|
289 uuid: '5fb0e6d4-89f6-11e9-8df0-b8f6b1108e05' |
263 visibilityChannel: arg1BoxVisible |
290 visibilityChannel: arg1BoxVisible |
264 component: |
291 component: |
265 (SpecCollection |
292 (SpecCollection |
266 collection: ( |
293 collection: ( |
267 (WorkspaceSpec |
294 (WorkspaceSpec |
268 name: 'Arg1Editor' |
295 name: 'Arg1Editor' |
269 layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0) |
296 layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0) |
270 activeHelpKey: arg1Value |
297 activeHelpKey: arg1Value |
|
298 uuid: '5fb0e7ce-89f6-11e9-8df0-b8f6b1108e05' |
271 tabable: true |
299 tabable: true |
272 hasHorizontalScrollBar: true |
300 hasHorizontalScrollBar: true |
273 hasVerticalScrollBar: true |
301 hasVerticalScrollBar: true |
274 miniScrollerHorizontal: true |
302 miniScrollerHorizontal: true |
275 miniScrollerVertical: true |
303 miniScrollerVertical: true |
326 postBuildCallback: argument3WidgetCreated: |
358 postBuildCallback: argument3WidgetCreated: |
327 ) |
359 ) |
328 ) |
360 ) |
329 |
361 |
330 ) |
362 ) |
331 extent: (Point 86 45) |
363 extent: (Point 87 45) |
332 ) |
364 ) |
333 ) |
365 ) |
334 |
366 |
335 ) |
367 ) |
336 extent: (Point 86 142) |
368 extent: (Point 87 142) |
337 ) |
369 ) |
338 (WorkspaceSpec |
370 (WorkspaceSpec |
339 name: 'AnswerEditor' |
371 name: 'AnswerEditor' |
340 activeHelpKey: answerValue |
372 activeHelpKey: answerValue |
|
373 uuid: '5fb0ef30-89f6-11e9-8df0-b8f6b1108e05' |
341 tabable: true |
374 tabable: true |
342 hasHorizontalScrollBar: true |
375 hasHorizontalScrollBar: true |
343 hasVerticalScrollBar: true |
376 hasVerticalScrollBar: true |
344 miniScrollerHorizontal: true |
377 miniScrollerHorizontal: true |
345 miniScrollerVertical: true |
378 miniScrollerVertical: true |
346 autoHideScrollBars: true |
379 autoHideScrollBars: true |
347 hasKeyboardFocusInitially: false |
380 hasKeyboardFocusInitially: false |
348 extent: (Point 86 142) |
381 extent: (Point 87 142) |
349 postBuildCallback: messageAnswerWidgetCreated: |
382 postBuildCallback: messageAnswerWidgetCreated: |
350 ) |
383 ) |
351 ) |
384 ) |
352 |
385 |
353 ) |
386 ) |
387 |
423 |
388 ) |
424 ) |
389 ) |
425 ) |
390 (ViewSpec |
426 (ViewSpec |
391 name: 'SelectorFinderBox' |
427 name: 'SelectorFinderBox' |
|
428 uuid: '5fb0f714-89f6-11e9-8df0-b8f6b1108e05' |
392 component: |
429 component: |
393 (SpecCollection |
430 (SpecCollection |
394 collection: ( |
431 collection: ( |
395 (ViewSpec |
432 (ViewSpec |
396 name: 'MatchActionBox' |
433 name: 'MatchActionBox' |
397 layout: (LayoutFrame 0 0 0 0 0 1 90 0) |
434 layout: (LayoutFrame 0 0 0 0 0 1 90 0) |
|
435 uuid: '5fb0f818-89f6-11e9-8df0-b8f6b1108e05' |
398 component: |
436 component: |
399 (SpecCollection |
437 (SpecCollection |
400 collection: ( |
438 collection: ( |
401 (LabelSpec |
439 (LabelSpec |
402 label: 'Selector Pattern:' |
440 label: 'Selector Pattern:' |
403 name: 'Label1' |
441 name: 'Label1' |
404 layout: (LayoutFrame 0 0 0 0 0 0.5 25 0) |
442 layout: (LayoutFrame 0 0 0 0 0 0.5 25 0) |
|
443 uuid: '5fb0f908-89f6-11e9-8df0-b8f6b1108e05' |
405 translateLabel: true |
444 translateLabel: true |
406 adjust: left |
445 adjust: left |
407 ) |
446 ) |
408 (InputFieldSpec |
447 (InputFieldSpec |
409 name: 'EntryField1' |
448 name: 'EntryField1' |
410 layout: (LayoutFrame 2 0 -54 1 -2 1 -29 1) |
449 layout: (LayoutFrame 2 0 -54 1 -2 1 -29 1) |
|
450 activeHelpKey: selectorPattern |
|
451 uuid: '5fb0fa70-89f6-11e9-8df0-b8f6b1108e05' |
411 model: selectorPatternHolder |
452 model: selectorPatternHolder |
412 immediateAccept: true |
453 immediateAccept: true |
413 acceptOnReturn: true |
454 acceptOnReturn: true |
414 acceptOnTab: true |
455 acceptOnTab: true |
415 acceptOnPointerLeave: true |
456 acceptOnPointerLeave: true |
416 ) |
457 ) |
417 (ActionButtonSpec |
458 (ActionButtonSpec |
418 label: 'Search' |
459 label: 'Search' |
419 name: 'Button4' |
460 name: 'Button4' |
420 layout: (LayoutFrame 5 0.5 -25 1 -5 1 0 1) |
461 layout: (LayoutFrame 5 0.5 -25 1 -5 1 0 1) |
|
462 activeHelpKey: startSearchPatternButton |
|
463 uuid: '5fb0fea8-89f6-11e9-8df0-b8f6b1108e05' |
421 translateLabel: true |
464 translateLabel: true |
422 tabable: true |
465 tabable: true |
423 model: searchPatternMatchesInBackground |
466 model: searchPatternMatchesInBackground |
424 ) |
467 ) |
425 ) |
468 ) |
1089 "the following then replaces data1 and data2 created by the method finder to the appropriate arguments" |
1137 "the following then replaces data1 and data2 created by the method finder to the appropriate arguments" |
1090 resultArray |
1138 resultArray |
1091 keysAndValuesDo:[:key :value | |
1139 keysAndValuesDo:[:key :value | |
1092 |newValue| |
1140 |newValue| |
1093 |
1141 |
1094 newValue := value copyReplaceString:'data1' withString:(tempReceiver key). |
1142 newValue := value copyReplaceString:'data1' |
|
1143 withString:(tempReceiver value storeString). "/ was: "tempReceiver key" |
1095 (tempArguments size) >= 1 ifTrue:[ |
1144 (tempArguments size) >= 1 ifTrue:[ |
1096 newValue := newValue replString:'data2' |
1145 newValue := newValue copyReplaceString:'data2' |
1097 withString:(tempArguments keyAt:1) |
1146 withString:(tempArguments valueAt:1) storeString "/ was "keyAt:1" |
1098 ]. |
1147 ]. |
1099 (tempArguments size) > 1 ifTrue:[ |
1148 (tempArguments size) > 1 ifTrue:[ |
1100 newValue := newValue copyReplaceString:'data3' |
1149 newValue := newValue copyReplaceString:'data3' |
1101 withString:(tempArguments keyAt:2). |
1150 withString:(tempArguments valueAt:2) storeString. "/ was "keyAt:2" |
1102 ]. |
1151 ]. |
1103 (tempArguments size) > 2 ifTrue:[ |
1152 (tempArguments size) > 2 ifTrue:[ |
1104 newValue := newValue copyReplaceString:'data4' |
1153 newValue := newValue copyReplaceString:'data4' |
1105 withString:(tempArguments keyAt:3). |
1154 withString:(tempArguments valueAt:3) storeString. "/ was: keyAt:3 |
1106 ]. |
1155 ]. |
1107 (tempArguments size) > 3 ifTrue:[ |
1156 (tempArguments size) > 3 ifTrue:[ |
1108 self halt:'unimplemented'. |
1157 self halt:'unimplemented'. |
1109 ]. |
1158 ]. |
1110 " newValue:= value copyReplaceString: 'data3' withString:(self messageAnswer key). " |
1159 " newValue:= value copyReplaceString: 'data3' withString:(self messageAnswer key). " |
1210 aNumber := anInteger ? 1. |
1260 aNumber := anInteger ? 1. |
1211 methods := SystemBrowser |
1261 methods := SystemBrowser |
1212 findImplementorsOf:(resultSelectors at:aNumber) |
1262 findImplementorsOf:(resultSelectors at:aNumber) |
1213 in:Smalltalk allClasses |
1263 in:Smalltalk allClasses |
1214 ignoreCase:false. |
1264 ignoreCase:false. |
1215 classList := methods asOrderedCollection |
1265 methods := methods asOrderedCollection. |
1216 collect:[:m | m mclass name , ' ' , m selector ]. |
1266 classList := methods collect:[:m | m mclass name , ' ' , m selector ]. |
1217 classList := (self markMatchingClasses:(resultSelectors at:aNumber) |
1267 classList := self markMatchingClasses:(resultSelectors at:aNumber) |
1218 classesWithSelector:classList). |
1268 classesWithSelector:classList. |
|
1269 "/ now classList contains a list of <className> <selector>, |
|
1270 "/ where the one which is responsible for the selected result is marked (bold) |
1219 self classOfResultHolder value:classList. |
1271 self classOfResultHolder value:classList. |
1220 classList size ~~ 0 ifTrue:[ |
1272 |
1221 self selectedClassOfResultHolder value:(classList first). |
1273 "/ initially select the bold one |
|
1274 classList notEmptyOrNil ifTrue:[ |
|
1275 |receiversMethodEntryInClass| |
|
1276 |
|
1277 receiversMethodEntryInClass := classList detect:#isText ifNone:nil. |
|
1278 receiversMethodEntryInClass notNil ifTrue:[ |
|
1279 self selectedClassOfResultHolder value:receiversMethodEntryInClass. |
|
1280 ] ifFalse:[ |
|
1281 self selectedClassOfResultHolder value:(classList first). |
|
1282 ]. |
1222 self selectedClassOfResultHolderChanged. |
1283 self selectedClassOfResultHolderChanged. |
1223 ] ifFalse:[ |
1284 ] ifFalse:[ |
1224 self selectedClassOfResultHolder value:nil. |
1285 self selectedClassOfResultHolder value:nil. |
1225 ]. |
1286 ]. |
1226 |
1287 |
1227 "Modified (comment): / 24-06-2012 / 18:41:45 / cg" |
1288 "Modified (comment): / 24-06-2012 / 18:41:45 / cg" |
1228 "Modified: / 03-03-2019 / 23:13:43 / Claus Gittinger" |
1289 "Modified: / 08-06-2019 / 15:39:49 / Claus Gittinger" |
1229 ! |
1290 ! |
1230 |
1291 |
1231 updateListAfterPatternSearch:resultList |
1292 updateListAfterPatternSearch:resultList |
1232 |searchPattern idx| |
1293 |searchPattern idx| |
1233 |
1294 |
1456 " Matches the class of the receiver with all the elements in anOrderedCollection |
1517 " Matches the class of the receiver with all the elements in anOrderedCollection |
1457 (which are classes with selectors). If a match is found it is marked with an asterisk. |
1518 (which are classes with selectors). If a match is found it is marked with an asterisk. |
1458 The classes are then sorted so the asterisk appears first. Return the |
1519 The classes are then sorted so the asterisk appears first. Return the |
1459 markedClassList." |
1520 markedClassList." |
1460 |
1521 |
1461 |marker recClass unmarkedClassList markedClassList| |
1522 |marker recClass unmarkedClassList markedClassList toMark| |
1462 |
1523 |
1463 marker := self class markerForImplementingClass. |
1524 marker := self class markerForImplementingClass. |
1464 recClass := receiver value class. |
1525 recClass := receiver value class. |
|
1526 |
|
1527 toMark := OrderedCollection new. |
|
1528 |
1465 unmarkedClassList := anOrderedCollection copy. |
1529 unmarkedClassList := anOrderedCollection copy. |
1466 unmarkedClassList do:[:classAndMethod | |
1530 unmarkedClassList do:[:classAndMethod | |
1467 |className class sel| |
1531 |className class sel| |
1468 |
1532 |
1469 className := classAndMethod copyButLast:aSelector size. |
1533 className := (classAndMethod copyButLast:aSelector size) withoutSeparators. |
1470 class := Smalltalk classNamed:className. "/ Compiler evaluate:className. |
1534 class := Smalltalk classNamed:className. "/ Compiler evaluate:className. |
1471 |
1535 |
1472 "/ (recClass == class) |
1536 "/ (recClass == class) |
1473 |
1537 |
1474 (recClass whichClassImplements:aSelector) == class ifTrue:[ |
1538 (recClass whichClassImplements:aSelector) == class ifTrue:[ |
1475 "/ unmarkedClassList add: marker, classAndMethod. |
1539 toMark add:classAndMethod. |
1476 unmarkedClassList add:classAndMethod allBold. |
|
1477 unmarkedClassList remove:classAndMethod. |
|
1478 ]. |
1540 ]. |
1479 ]. |
1541 ]. |
|
1542 unmarkedClassList removeAll:toMark. |
|
1543 unmarkedClassList addAll:(toMark collect:#allBold). |
|
1544 |
1480 unmarkedClassList |
1545 unmarkedClassList |
1481 sort:[:a :b | |
1546 sort:[:a :b | |
1482 |rawA rawB| |
1547 |rawA rawB| |
1483 |
1548 |
1484 rawA := a string withoutPrefix:marker. |
1549 rawA := a string withoutPrefix:marker. |