|
1 "{ Encoding: utf8 }" |
|
2 |
1 " |
3 " |
2 Copyright (c) 2007-2010 Jan Vrany, SWING Research Group, Czech Technical University in Prague |
4 Copyright (c) 2007-2010 Jan Vrany, SWING Research Group, Czech Technical University in Prague |
3 Copyright (c) 2009-2010 eXept Software AG |
5 Copyright (c) 2009-2010 eXept Software AG |
4 |
6 |
5 Permission is hereby granted, free of charge, to any person |
7 Permission is hereby granted, free of charge, to any person |
27 |
29 |
28 "{ NameSpace: Tools }" |
30 "{ NameSpace: Tools }" |
29 |
31 |
30 ApplicationModel subclass:#MethodRewriter |
32 ApplicationModel subclass:#MethodRewriter |
31 instanceVariableNames:'replaceTextView methods classes packages searchTextView |
33 instanceVariableNames:'replaceTextView methods classes packages searchTextView |
32 actionInProgresHolder infoHolder progressHolder |
34 actionInProgressHolder infoHolder progressHolder |
33 templateSearchPatternHolder templateReplacePatternHolder |
35 templateSearchPatternHolder templateReplacePatternHolder |
34 selectedTemplateIndex templates selectedTabIndex |
36 selectedTemplateIndex templates selectedTabIndex |
35 selectedClassesHolder selectedRuleIndex rules |
37 selectedClassesHolder selectedRuleIndex rules |
36 ruleReplacePatternHolder ruleSearchPatternHolder |
38 ruleReplacePatternHolder ruleSearchPatternHolder |
37 ruleSearchAndReplacePatternHolder ruleForRewriteOrNilForAdHoc |
39 ruleSearchAndReplacePatternHolder ruleForRewriteOrNilForAdHoc |
38 adHocFindAndReplaceVisibleHolder ruleNameHolder' |
40 adHocFindAndReplaceVisibleHolder ruleNameHolder |
|
41 isMethodPatternHolder classesInfoTextHolder |
|
42 cachedMethodsFromClasses' |
39 classVariableNames:'' |
43 classVariableNames:'' |
40 poolDictionaries:'' |
44 poolDictionaries:'' |
41 category:'Interface-MethodRewriter' |
45 category:'Interface-Tools' |
42 ! |
46 ! |
43 |
47 |
44 !MethodRewriter class methodsFor:'documentation'! |
48 !MethodRewriter class methodsFor:'documentation'! |
45 |
49 |
46 copyright |
50 copyright |
165 " |
169 " |
166 self templates |
170 self templates |
167 " |
171 " |
168 |
172 |
169 "Created: / 12-12-2007 / 11:03:32 / janfrog" |
173 "Created: / 12-12-2007 / 11:03:32 / janfrog" |
|
174 ! ! |
|
175 |
|
176 !MethodRewriter class methodsFor:'help specs'! |
|
177 |
|
178 flyByHelpSpec |
|
179 "This resource specification was automatically generated |
|
180 by the UIHelpTool of ST/X." |
|
181 |
|
182 "Do not manually edit this!! If it is corrupted, |
|
183 the UIHelpTool may not be able to read the specification." |
|
184 |
|
185 " |
|
186 UIHelpTool openOnClass:Tools::MethodRewriter |
|
187 " |
|
188 |
|
189 <resource: #help> |
|
190 |
|
191 ^ super helpSpec addPairsFrom:#( |
|
192 |
|
193 #isMethodPattern |
|
194 'The patterns are applied to the method''s whole source (including selector)\as opposed to the code''s syntax tree nodes.\(read the pattern help on this)' |
|
195 |
|
196 #doSearchAction |
|
197 'Searches for matching methods and opens a browser on those.' |
|
198 |
|
199 #doReplaceAction |
|
200 'Searches for matching methods, generates the new code and presents a list of changes.\This list allows for inspection and individual selection of changes to be applied' |
|
201 |
|
202 ) |
170 ! ! |
203 ! ! |
171 |
204 |
172 !MethodRewriter class methodsFor:'interface specs'! |
205 !MethodRewriter class methodsFor:'interface specs'! |
173 |
206 |
174 classesSpec |
207 classesSpec |
205 translateLabel: true |
238 translateLabel: true |
206 adjust: left |
239 adjust: left |
207 ) |
240 ) |
208 (SelectionInListModelViewSpec |
241 (SelectionInListModelViewSpec |
209 name: 'ClassesList' |
242 name: 'ClassesList' |
210 layout: (LayoutFrame 0 0 30 0 0 1 -30 1) |
243 layout: (LayoutFrame 0 0 30 0 0 1 -60 1) |
211 model: selectedClassesHolder |
244 model: selectedClassesHolder |
212 hasHorizontalScrollBar: true |
245 hasHorizontalScrollBar: true |
213 hasVerticalScrollBar: true |
246 hasVerticalScrollBar: true |
214 listModel: classes |
247 listModel: classes |
215 multipleSelectOk: true |
248 multipleSelectOk: true |
220 canDropSelector: canDropClasses: |
253 canDropSelector: canDropClasses: |
221 dropArgument: nil |
254 dropArgument: nil |
222 dropSelector: doDropClasses: |
255 dropSelector: doDropClasses: |
223 dragArgument: nil |
256 dragArgument: nil |
224 ) |
257 ) |
|
258 ) |
|
259 (LabelSpec |
|
260 name: 'ClassInfoLabel' |
|
261 layout: (LayoutFrame 0 0 -60 1 0 1 -30 1) |
|
262 translateLabel: true |
|
263 labelChannel: classesInfoTextHolder |
|
264 adjust: left |
225 ) |
265 ) |
226 (HorizontalPanelViewSpec |
266 (HorizontalPanelViewSpec |
227 name: 'HorizontalPanel1' |
267 name: 'HorizontalPanel1' |
228 layout: (LayoutFrame 0 0 -30 1 -16 1 0 1) |
268 layout: (LayoutFrame 0 0 -30 1 -16 1 0 1) |
229 horizontalLayout: center |
269 horizontalLayout: center |
417 bounds: (Rectangle 0 0 418 294) |
457 bounds: (Rectangle 0 0 418 294) |
418 ) |
458 ) |
419 component: |
459 component: |
420 (SpecCollection |
460 (SpecCollection |
421 collection: ( |
461 collection: ( |
|
462 (ViewSpec |
|
463 name: 'MethodPatternBox' |
|
464 layout: (LayoutFrame 0 0 0 0 0 1 30 0) |
|
465 component: |
|
466 (SpecCollection |
|
467 collection: ( |
|
468 (CheckBoxSpec |
|
469 label: 'Method Pattern' |
|
470 name: 'CheckBox1' |
|
471 layout: (LayoutFrame 0 0 8 0 136 0 30 0) |
|
472 activeHelpKey: isMethodPattern |
|
473 model: isMethodPatternHolder |
|
474 translateLabel: true |
|
475 ) |
|
476 ) |
|
477 |
|
478 ) |
|
479 ) |
422 (VariableVerticalPanelSpec |
480 (VariableVerticalPanelSpec |
423 name: 'FindAndReplacePanel' |
481 name: 'FindAndReplacePanel' |
424 layout: (LayoutFrame 0 0 0 0 0 1 -30 1) |
482 layout: (LayoutFrame 0 0 30 0 0 1 -30 1) |
425 visibilityChannel: adHocFindAndReplaceVisibleHolder |
483 visibilityChannel: adHocFindAndReplaceVisibleHolder |
426 showHandle: true |
484 showHandle: true |
427 snapMode: both |
485 snapMode: both |
428 component: |
486 component: |
429 (SpecCollection |
487 (SpecCollection |
521 (SpecCollection |
579 (SpecCollection |
522 collection: ( |
580 collection: ( |
523 (LabelSpec |
581 (LabelSpec |
524 label: 'Enjoy' |
582 label: 'Enjoy' |
525 name: 'Label1' |
583 name: 'Label1' |
526 layout: (LayoutFrame 5 0 -25 1 205 0 -5 1) |
584 layout: (LayoutFrame 5 0 -25 1 255 0 -5 1) |
527 visibilityChannel: actionInProgresHolder |
585 xxvisibilityChannel: actionInProgressHolder |
528 translateLabel: true |
586 translateLabel: true |
529 labelChannel: infoHolder |
587 labelChannel: infoHolder |
530 adjust: left |
588 adjust: left |
531 ) |
589 ) |
532 (ProgressIndicatorSpec |
590 (ProgressIndicatorSpec |
533 name: 'ProgressIndicator1' |
591 name: 'ProgressIndicator1' |
534 layout: (LayoutFrame 210 0 -25 1 -215 1 -5 1) |
592 layout: (LayoutFrame 260 0 -25 1 -215 1 -5 1) |
535 visibilityChannel: actionInProgresHolder |
593 xxvisibilityChannel: actionInProgressHolder |
536 model: progressHolder |
594 model: progressHolder |
537 ) |
595 ) |
538 (ActionButtonSpec |
596 (ActionButtonSpec |
539 label: 'Search' |
597 label: 'Search' |
540 name: 'Button2' |
598 name: 'Button2' |
541 layout: (LayoutFrame -210 1 -26 1 -110 1 -5 1) |
599 layout: (LayoutFrame -210 1 -26 1 -110 1 -5 1) |
|
600 activeHelpKey: doSearchAction |
542 translateLabel: true |
601 translateLabel: true |
543 model: doSearchAction |
602 model: doSearchAction |
544 ) |
603 ) |
545 (ActionButtonSpec |
604 (ActionButtonSpec |
546 label: 'Rewrite' |
605 label: 'Rewrite...' |
547 name: 'Button1' |
606 name: 'Button1' |
548 layout: (LayoutFrame -105 1 -25 1 -5 1 -5 1) |
607 layout: (LayoutFrame -105 1 -25 1 -5 1 -5 1) |
|
608 activeHelpKey: doRewriteAction |
549 translateLabel: true |
609 translateLabel: true |
550 model: doRewriteAction |
610 model: doRewriteAction |
551 ) |
611 ) |
552 ) |
612 ) |
553 |
613 |
823 "Modified: / 12-12-2007 / 11:21:27 / janfrog" |
883 "Modified: / 12-12-2007 / 11:21:27 / janfrog" |
824 ! ! |
884 ! ! |
825 |
885 |
826 !MethodRewriter methodsFor:'accessing'! |
886 !MethodRewriter methodsFor:'accessing'! |
827 |
887 |
828 actionInProgress: aBoolean |
|
829 |
|
830 ^self actionInProgresHolder value: aBoolean |
|
831 |
|
832 "Created: / 12-12-2007 / 10:06:16 / janfrog" |
|
833 ! |
|
834 |
|
835 classes |
888 classes |
836 ^ classes ifNil:[classes := List new] |
889 ^ classes ifNil:[classes := List new] |
837 |
890 |
838 "Created: / 20-07-2007 / 16:31:18 / janfrog" |
891 "Created: / 20-07-2007 / 16:31:18 / janfrog" |
839 ! |
892 ! |
840 |
893 |
841 classes: aCollection |
894 classes: aCollection |
842 classes := ((aCollection collect:[:cls|cls theNonMetaclass]) |
895 self classes contents:((aCollection collect:[:cls|cls theNonMetaclass]) |
843 sort:[:a :b | a className < b className]) asList |
896 sortBySelector:#name). |
|
897 self classesChanged |
|
898 |
844 |
899 |
845 "Created: / 20-07-2007 / 16:31:18 / janfrog" |
900 "Created: / 20-07-2007 / 16:31:18 / janfrog" |
846 "Modified: / 12-12-2007 / 09:47:01 / janfrog" |
901 "Modified: / 12-12-2007 / 09:47:01 / janfrog" |
847 ! |
902 ! |
848 |
903 |
986 changes := ChangeSet new name:'Rewrite Changes'. |
1041 changes := ChangeSet new name:'Rewrite Changes'. |
987 |
1042 |
988 methodsMatching isEmptyOrNil ifTrue:[^Dialog warn:'No methods matching']. |
1043 methodsMatching isEmptyOrNil ifTrue:[^Dialog warn:'No methods matching']. |
989 |
1044 |
990 self withMethods: methodsMatching do:[:mth| |
1045 self withMethods: methodsMatching do:[:mth| |
991 | newTree newSource change | |
1046 | rewriter newTree newSource change | |
992 |
1047 |
993 newTree := ParseTreeSourceRewriter new |
1048 rewriter := ParseTreeSourceRewriter new. |
994 replace: self searchPattern |
1049 (self isMethodPatternHolder value) ifTrue:[ |
995 with: self replacePattern; |
1050 rewriter replace: self searchPattern with: self replacePattern |
996 executeTree: mth parseTree; |
1051 ] ifFalse:[ |
997 tree. |
1052 rewriter replaceMethod: self searchPattern with: self replacePattern |
998 |
1053 ]. |
999 change := InteractiveAddMethodChange compile: newTree newSource in:mth mclass classified:mth category. |
1054 newTree := rewriter |
|
1055 executeTree: mth parseTree; |
|
1056 tree. |
|
1057 |
|
1058 change := InteractiveAddMethodChange compile: newTree newSource in:(mth mclass ? mth getMclass) classified:mth category. |
1000 |
1059 |
1001 "/ collect in order to have only one change in the undo-list (instead of many) |
1060 "/ collect in order to have only one change in the undo-list (instead of many) |
1002 changes add: change. |
1061 changes add: change. |
1003 |
1062 |
1004 "/ mth mclass |
1063 "/ mth mclass |
1103 "Created: / 12-12-2007 / 11:14:15 / janfrog" |
1164 "Created: / 12-12-2007 / 11:14:15 / janfrog" |
1104 ! ! |
1165 ! ! |
1105 |
1166 |
1106 !MethodRewriter methodsFor:'aspects'! |
1167 !MethodRewriter methodsFor:'aspects'! |
1107 |
1168 |
1108 actionInProgresHolder |
1169 actionInProgressHolder |
1109 actionInProgresHolder isNil ifTrue:[ |
1170 actionInProgressHolder isNil ifTrue:[ |
1110 actionInProgresHolder := true asValue. |
1171 actionInProgressHolder := false asValue. |
1111 ]. |
1172 ]. |
1112 ^ actionInProgresHolder. |
1173 ^ actionInProgressHolder. |
1113 |
1174 |
1114 "Created: / 12-12-2007 / 10:00:05 / janfrog" |
1175 "Created: / 12-12-2007 / 10:00:05 / janfrog" |
1115 ! |
1176 ! |
1116 |
1177 |
1117 adHocFindAndReplaceVisibleHolder |
1178 adHocFindAndReplaceVisibleHolder |
1119 adHocFindAndReplaceVisibleHolder := true asValue. |
1180 adHocFindAndReplaceVisibleHolder := true asValue. |
1120 ]. |
1181 ]. |
1121 ^ adHocFindAndReplaceVisibleHolder. |
1182 ^ adHocFindAndReplaceVisibleHolder. |
1122 ! |
1183 ! |
1123 |
1184 |
|
1185 classesInfoTextHolder |
|
1186 classesInfoTextHolder isNil ifTrue:[ |
|
1187 classesInfoTextHolder := '' asValue. |
|
1188 ]. |
|
1189 ^ classesInfoTextHolder. |
|
1190 ! |
|
1191 |
1124 howToUseRewriteToolURL |
1192 howToUseRewriteToolURL |
1125 ^ HTMLDocumentFrame documentFileFor:'help/Browser/RewriteToolHelp.html' |
1193 ^ HTMLDocumentFrame documentFileFor:'help/Browser/RewriteToolHelp.html' |
1126 ! |
1194 ! |
1127 |
1195 |
1128 infoHolder |
1196 infoHolder |
1133 |
1201 |
1134 "Created: / 12-12-2007 / 10:00:05 / janfrog" |
1202 "Created: / 12-12-2007 / 10:00:05 / janfrog" |
1135 "Modified: / 12-12-2007 / 11:40:17 / janfrog" |
1203 "Modified: / 12-12-2007 / 11:40:17 / janfrog" |
1136 ! |
1204 ! |
1137 |
1205 |
|
1206 isMethodPatternHolder |
|
1207 isMethodPatternHolder isNil ifTrue:[ |
|
1208 isMethodPatternHolder := false asValue |
|
1209 ]. |
|
1210 ^ isMethodPatternHolder. |
|
1211 ! |
|
1212 |
1138 progressHolder |
1213 progressHolder |
1139 progressHolder isNil ifTrue:[ |
1214 progressHolder isNil ifTrue:[ |
1140 progressHolder := 0 asValue |
1215 progressHolder := 0 asValue |
1141 ]. |
1216 ]. |
1142 ^ progressHolder. |
1217 ^ progressHolder. |
1264 ]. |
1339 ]. |
1265 ^ holder. |
1340 ^ holder. |
1266 ! ! |
1341 ! ! |
1267 |
1342 |
1268 !MethodRewriter methodsFor:'change & update'! |
1343 !MethodRewriter methodsFor:'change & update'! |
|
1344 |
|
1345 classesChanged |
|
1346 cachedMethodsFromClasses := nil. "/ flush |
|
1347 methods := nil. |
|
1348 |
|
1349 self classesInfoTextHolder |
|
1350 value:(((classes size == 1) ifTrue:['%1 class / %2 method(s)'] ifFalse:['%1 classes / %2 methods']) |
|
1351 bindWith:classes size |
|
1352 with:self methods size) |
|
1353 ! |
1269 |
1354 |
1270 selectedRuleIndexChanged |
1355 selectedRuleIndexChanged |
1271 |selectedRuleSpec| |
1356 |selectedRuleSpec| |
1272 |
1357 |
1273 selectedRuleSpec := self selectedRuleSpec. |
1358 selectedRuleSpec := self selectedRuleSpec. |
1317 ! |
1402 ! |
1318 |
1403 |
1319 doDropClasses: dropContext |
1404 doDropClasses: dropContext |
1320 "I accept classes, methods and packages" |
1405 "I accept classes, methods and packages" |
1321 |
1406 |
1322 | droppedProjects droppedClasses newClasses | |
1407 | droppedProjects droppedClasses newClasses classesAlready| |
1323 |
1408 |
1324 droppedProjects := dropContext dropObjects |
1409 droppedProjects := dropContext dropObjects |
1325 select:[:obj| obj isProjectObject] |
1410 select:[:obj| obj isProjectObject] |
1326 thenCollect:[:obj | obj theObject]. |
1411 thenCollect:[:obj | obj theObject]. |
1327 |
1412 |
1340 |
1425 |
1341 droppedProjects do:[:eachPackage | |
1426 droppedProjects do:[:eachPackage | |
1342 droppedClasses addAll:(Smalltalk allClassesInPackage:eachPackage) |
1427 droppedClasses addAll:(Smalltalk allClassesInPackage:eachPackage) |
1343 ]. |
1428 ]. |
1344 |
1429 |
1345 newClasses := droppedClasses reject:[:cls | self classes includes:cls]. |
1430 classesAlready := self classes asSet. |
|
1431 newClasses := droppedClasses reject:[:cls | classesAlready includes:cls]. |
|
1432 |
1346 self classes |
1433 self classes |
1347 addAll: newClasses; |
1434 addAll: newClasses; |
1348 changed:#content. |
1435 sortBySelector:#name. |
|
1436 self classesChanged |
1349 |
1437 |
1350 "Created: / 20-07-2007 / 16:58:16 / janfrog" |
1438 "Created: / 20-07-2007 / 16:58:16 / janfrog" |
1351 ! ! |
1439 ! ! |
1352 |
1440 |
1353 !MethodRewriter methodsFor:'hooks'! |
1441 !MethodRewriter methodsFor:'hooks'! |
1378 ]. |
1474 ]. |
1379 |
1475 |
1380 matchingMethods := Set new. |
1476 matchingMethods := Set new. |
1381 self |
1477 self |
1382 withMethodsDo:[:mthd| |
1478 withMethodsDo:[:mthd| |
1383 | tree | |
1479 | tree searcher | |
1384 tree := mthd parseTree. |
1480 tree := mthd parseTree. |
1385 tree |
1481 tree |
1386 ifNil:[ |
1482 ifNil:[ |
1387 Transcript showCR:'MethodRewriter: parse tree error in ',mthd whoString. |
1483 Transcript showCR:'MethodRewriter: parse tree error in ',mthd whoString. |
1388 self breakPoint: #jv |
1484 self breakPoint: #jv |
1389 ] |
1485 ] |
1390 ifNotNil:[ |
1486 ifNotNil:[ |
1391 (ParseTreeSearcher new) |
1487 searcher := ParseTreeSearcher new. |
1392 matches:pattern do:[:aNode :answer | matchingMethods add:mthd ]; |
1488 (self isMethodPatternHolder value) |
1393 executeTree: tree |
1489 ifTrue:[ |
|
1490 searcher matchesMethod:pattern do:[:aNode :answer | matchingMethods add:mthd ] |
|
1491 ] |
|
1492 ifFalse:[ |
|
1493 searcher matches:pattern do:[:aNode :answer | matchingMethods add:mthd ] |
|
1494 ]. |
|
1495 searcher executeTree: tree |
1394 ] |
1496 ] |
1395 ] |
1497 ] |
1396 finallyDo:[ |
1498 finallyDo:[ |
1397 block value: matchingMethods |
1499 block value: matchingMethods |
1398 ] |
1500 ] |
1446 ! |
1548 ! |
1447 |
1549 |
1448 methods |
1550 methods |
1449 methods notEmptyOrNil ifTrue:[^ methods]. |
1551 methods notEmptyOrNil ifTrue:[^ methods]. |
1450 |
1552 |
1451 ^self methodsFor: classes |
1553 ^self methodsForClasses |
1452 |
1554 |
1453 "Modified: / 21-07-2007 / 06:24:07 / janfrog" |
1555 "Modified: / 21-07-2007 / 06:24:07 / janfrog" |
1454 "Modified: / 05-07-2011 / 14:50:43 / cg" |
1556 "Modified: / 05-07-2011 / 14:50:43 / cg" |
1455 ! |
1557 ! |
1456 |
1558 |
1457 methods:aCollection |
1559 methods:aCollection |
|
1560 "to explicitly set the set of methods to be processed" |
|
1561 |
1458 methods := aCollection |
1562 methods := aCollection |
1459 |
1563 |
1460 "Created: / 05-07-2011 / 14:50:52 / cg" |
1564 "Created: / 05-07-2011 / 14:50:52 / cg" |
1461 ! |
1565 ! |
1462 |
1566 |
1463 methodsFor: aColletion |
1567 methodsForClasses |
1464 |
1568 cachedMethodsFromClasses isNil ifTrue:[ |
1465 ^classes |
1569 cachedMethodsFromClasses := |
1466 inject: Set new |
1570 (classes |
1467 into: |
1571 inject: OrderedCollection new |
1468 [:methods :cls| |
1572 into:[:methods :cls| |
1469 methods |
1573 methods |
1470 addAll: cls methodDictionary values; |
1574 addAll: cls methodDictionary values; |
1471 addAll: cls class methodDictionary values; |
1575 addAll: cls class methodDictionary values; |
1472 yourself] |
1576 yourself] |
1473 |
1577 ) asArray. |
1474 "Created: / 21-07-2007 / 06:25:42 / janfrog" |
1578 ]. |
|
1579 ^ cachedMethodsFromClasses |
1475 ! |
1580 ! |
1476 |
1581 |
1477 methodsMatchingPattern: searchPattern |
1582 methodsMatchingPattern: searchPattern |
1478 |methods matchingMethods| |
1583 |methods matchingMethods| |
1479 |
1584 |
1541 ! |
1646 ! |
1542 |
1647 |
1543 withMethods: methods do: methodBlock finallyDo: finallyBlock |
1648 withMethods: methods do: methodBlock finallyDo: finallyBlock |
1544 |
1649 |
1545 [ |
1650 [ |
|
1651 |numMethods| |
|
1652 |
|
1653 numMethods := methods size. |
|
1654 |
1546 self actionInProgress: true. |
1655 self actionInProgress: true. |
1547 methods asArray keysAndValuesDo: |
1656 self progress: 0. |
1548 [:idx :mth| |
1657 |
1549 self info: mth selector storeString. |
1658 self methods asArray keysAndValuesDo:[:idx :mth| |
|
1659 numMethods > 100 ifTrue:[ |
|
1660 self info: mth mclass name. |
|
1661 ] ifFalse:[ |
|
1662 self info: mth selector storeString. |
|
1663 ]. |
1550 methodBlock value: mth. |
1664 methodBlock value: mth. |
1551 self progress: ((100 / methods size) * idx) rounded]. |
1665 self progress: ((100 / methods size) * idx) rounded |
|
1666 ]. |
1552 finallyBlock value |
1667 finallyBlock value |
1553 ] ensure:[ |
1668 ] ensure:[ |
1554 "/self actionInProgress: false. |
1669 "/self actionInProgress: false. |
1555 self progress: 0. |
1670 self progress: 0. |
1556 self info: '' |
1671 self info: '' |
1578 "Modified: / 12-12-2007 / 10:45:20 / janfrog" |
1693 "Modified: / 12-12-2007 / 10:45:20 / janfrog" |
1579 ! ! |
1694 ! ! |
1580 |
1695 |
1581 !MethodRewriter class methodsFor:'documentation'! |
1696 !MethodRewriter class methodsFor:'documentation'! |
1582 |
1697 |
|
1698 version |
|
1699 ^ '$Header: /cvs/stx/stx/libtool/Tools__MethodRewriter.st,v 1.25 2015-05-11 15:25:48 cg Exp $' |
|
1700 ! |
|
1701 |
1583 version_CVS |
1702 version_CVS |
1584 ^ '$Header: /cvs/stx/stx/libtool/Tools__MethodRewriter.st,v 1.23 2015-02-24 18:13:14 cg Exp $' |
1703 ^ '$Header: /cvs/stx/stx/libtool/Tools__MethodRewriter.st,v 1.25 2015-05-11 15:25:48 cg Exp $' |
1585 ! |
1704 ! |
1586 |
1705 |
1587 version_SVN |
1706 version_SVN |
1588 ^ '$Id: Tools__MethodRewriter.st,v 1.23 2015-02-24 18:13:14 cg Exp $' |
1707 ^ '$Id: Tools__MethodRewriter.st,v 1.25 2015-05-11 15:25:48 cg Exp $' |
1589 ! ! |
1708 ! ! |
1590 |
1709 |