Список методов, если в их реализации хотя бы два раза встречается слово 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 этих узлов.

Другие вопросы по тегам