Long ago, there was a product named "Turbo Analyst" that was based on those ideas. The product is long dead by now but, it was useful (I used it.)
Today, I think only the compiler could have a chance to provide the information you seek and, even then, it would be difficult and not necessarily as useful as one may think at first. For instance, as MarkMLI mentioned, inheritance and polymorphism could create ambiguous/confusing situations, not to mention function/procedure overloading.
Interestingly, what you are referring to seems to work better at the assembly level than at the source level. For instance, IDA Pro cross references the "called from" and "called by" and that is quite useful at the assembly level. The important thing is that at that level most source-level ambiguities are no longer present. What's undecidable are the indirect register calls which can only be determined at run time (often a result of polymorphism.)