Pharo和Squeak Smalltalk:在包中列出未实现的方法



如何列出包中所有未实现的方法?假设该方法应该在该包中实现,而不是在其他包中实现(例如在包外的超类或Object中)。

编辑:是的,我想知道"未实现的消息发送",但将分析限制在一个特定的给定包内,例如:

FooPackage未实现MessageSends。

我还没有完全测试过,所以你可能需要对它进行一些调整以适应你的需求,但从我对你的问题的理解来看,你可能想要这样的东西:

| 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(看看您可以使用什么,而不是更改它!)、CompiledMethodSystemOrganization

显然,这个例子使用了类别(我假设这就是你所说的包?)"Collections Arrayed",但你当然可以调整它,使其成为一个方法参数,比如:

MyUtilClass unimplementedMessageSendsFor: aCategorySymbol

最新更新