Как искать строку внутри класса в Squeak smalltalk?Как насчет внутри пакета? - PullRequest
6 голосов
/ 25 декабря 2011

Я искал и искал.

Я пошел на IRC

Надеюсь, вопрос не глупый.Если бы это было так, правильная строка для поиска в Google все равно будет высоко ценится

Ответы [ 2 ]

2 голосов
/ 25 декабря 2011

Отвечать на такие вопросы с помощью механизма рефакторинга довольно просто. Следующий код находит все вхождения / в системе:

allCodeWithSlash := RBBrowserEnvironment new matches: '/'

Оттуда вы можете расширить область поиска, например, внутрь класса:

allCodeWithSlashInClass := allCodeWithSlash forClasses: (Array with: DosFileDirectory)

или внутри упаковки:

allCodeWithSlashInPackage := allCodeWithSlash forPackageNames: (Array with: 'Files')

Если у вас загружен пользовательский интерфейс, вы можете открыть браузер для любого из следующих результатов поиска:

allCodeWithSlashInPackage open

Если вы используете OmniBrowser, вы также можете создавать и перемещаться по этим областям без ввода какого-либо кода через меню Refactoring scope .

1 голос
/ 25 декабря 2011

Вот пример, который показывает вам все методы в DosFileDirectory, содержащие строку '\'.

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'.

Чтобы найти весь пакет, оберните поисковую часть в:

package := PackageOrganizer default packageNamed: packageName ifAbsent: [ self error: 'package doesn't exist' ].
package classesAndMetaClasses do: [ :class | ... ]
...