Pharo и Squeak Smalltalk: перечисление невыполненных методов в пакете? - PullRequest
1 голос
/ 05 января 2012

Как мне перечислить все нереализованные методы в пакете?Учитывая, что метод должен быть реализован в этом пакете, а не в другом (например, в суперклассе вне пакета или в Object).

Редактировать: Да, я хотел бы знать "отправленные сообщения,реализовано "но ограничить анализ одним конкретным данным пакетом, например:

FooPackage unimplementedMessageSends.

1 Ответ

1 голос
/ 16 января 2012

Я не полностью протестировал это, поэтому вам, возможно, придется немного его настроить в соответствии с вашими требованиями, но, насколько я понимаю, ваш вопрос может привести к чему-то вроде этого:

| allMethodsSent allMethodsImplemented |
allMethodsSent := IdentitySet new.
allMethodsImplemented := IdentitySet new.
(SystemOrganization listAtCategoryNamed: #'Collections-Arrayed')
    do: [:eachClassName |
        (Smalltalk at: eachClassName) methodDictionary valuesDo: [:eachMethod |
            allMethodsSent addAll: eachMethod messages.
            ].
        allMethodsImplemented addAll: (Smalltalk at: eachClassName) selectors
        ].
^allMethodsSent
    removeAllFoundIn: allMethodsImplemented;
    yourself

Надеюсь, что это поможет вам начать, по крайней мере, если вам нужно настроить его, взгляните на классы Behavior (чтобы увидеть, что вы можете использовать, а не изменить его!), CompiledMethod и SystemOrganization.

Очевидно, что в этом примере используется категория (я предполагаю, что вы подразумеваете под пакетом?) «Коллекции с массивами», но вы, конечно, могли бы адаптировать ее, чтобы сделать это параметром метода, что-то вроде:

MyUtilClass unimplementedMessageSendsFor: aCategorySymbol
...