Пытаетесь найти строку во всем классе в Smalltalk VisualWorks?
Я пытаюсь создать небольшую функцию для поиска строки во всем приложении.
Я получил этот код, но он не сильно поможет
aString := '\\'.
class := DosFileDirectory.
methodsContainingString := class methodDictionary values select: [:method |
method hasLiteralSuchThat: [:lit |
(lit isString and: [lit isSymbol not]) and:
[lit = aString]]].
messageList := methodsContainingString collect: [ :e | MethodReference new setStandardClass: class methodSymbol: e selector ].
SystemNavigation new
browseMessageList: messageList
name: 'methods containing string'.
2 ответа
Самый простой способ - использовать метод MethodCollector напрямую (см. MethodCollector>>methodSelect:)
| mc pattern |
pattern := '*',searchString,'*'.
mc := MethodCollector new.
mc browseSelect: (mc methodsSelect: [:m | pattern match: m getSource]).
MethodCollector уже позаботится об итерации по методам, нет необходимости делать это самостоятельно. MethodCollector также определяет средства объединения запросов, поэтому вы также можете ограничить запрос методами из определенного пакета.
Чтобы найти весь исходный код, вы можете сделать следующее
searchAll := [ :searchedString |
(Object withAllSubclasses collect: [ :cls |
cls methodDictionary values select: [ :method |
(method getSource findString: searchedString startingAt: 1) > 0
]
]) inject: #() into: [ :arr :each | arr, each ]
]
Object withAllSubclasses
выберет все классы в системеmethod getSource findString:startingAt:
сопоставление будет выполнено само (вы можете заменить его регулярным выражением и т. д.)#inject:into:
сгладит массив (иначе это массив массивов)
Чтобы сделать поиск, оцените блок:
matchedMethods := searchAll value: 'Answer a Paragraph' "(returns a collection of methods containing the string)"
Наконец, вы можете проверить коллекцию или открыть ее в браузере:
MethodCollector new
openListBrowserOn: (matchedMethods collect: [ :each | each definition ])
label: 'methods containing "Answer a Paragraph"'