Smalltalk makes it a little harder than some languages because a method has no real idea who will be receiving the messages it sends. People have done work on implementing types (Strongtalk) to, among other things, limit the search space. But you're right that a lot of moving parts means that eventually you have to have a lot of open context to view it statically.

Another way is to trace things in the debugger, and then you get the dynamic picture.