Пытаетесь найти строку во всем классе 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'.

person Sanjyot Agureddy    schedule 18.01.2016    source источник


Ответы (2)


Самый простой способ — напрямую использовать MethodCollector (см. MethodCollector>>methodsSelect:)

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

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

person Karsten    schedule 19.01.2016

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

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"'
person Peter Uhnak    schedule 18.01.2016