Список методов, если в их реализации хотя бы два раза встречается слово assert в Smalltalk
Я хотел получить список методов класса, если в их реализации есть хотя бы два вхождения слова assert в Smalltalk.
Кто-нибудь может мне с этим помочь? Заранее спасибо!
1 ответ
Я не уверен в деталях gnu-Smalltalk, но в Pharo вы можете сделать что-то вроде этого:
YourClass methods select: [ :method |
method sourceCode matchesRegex: '.*assert.*assert.*'. ]
Здесь я использую тривиальное регулярное выражение, чтобы проверить, могу ли я сопоставить два слова "assert" в исходном коде.
Однако с помощью Smalltalk легко выполнять более точный поиск. Изображение, вы хотите увидеть, отправляет ли метод хотя бы два
assert:
Сообщения. Найти такие методы можно так:
YourClass methods select: [ :method |
| numAsserts |
numAsserts := method ast allChildren count: [ :node |
node isMessage and: [ node selector = #assert: ] ].
numAsserts >= 2
]
В приведенном выше примере для каждого метода мы просто подсчитываем количество узлов AST, которые отправляют сообщения, и получаем
assert:
селектор. Затем мы проверяем, больше или равно 2 этих узлов.