2016-01-18 1 views
2

Я пытаюсь создать небольшую функцию для поиска строки во всем приложении.Пытается найти строку во всем классе в 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'. 

ответ

0

Для поиска всего исходного кода, вы можете сделать следующее

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 будет выбраны все классы в system
  • 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"' 
2

Самый простой способ заключается в использовании MethodCollector непосредственно (см MethodCollector >> methodsSelect :)

| mc pattern | 
pattern := '*',searchString,'*'. 
mc := MethodCollector new. 
mc browseSelect: (mc methodsSelect: [:m | pattern match: m getSource]). 

MethodCollector уже позаботился об итерации с помощью методов, не нужно делать это самостоятельно. МетодCollector также определяет средства объединения запросов, поэтому вы также можете ограничить запрос методами в определенном пакете.

Смежные вопросы