1. Given a M.( * ) without warning the * may be the one of M or the one in scope. Ambiguous, can't be resolved locally.
2. Given a M.( id ) without warning, if [id] is in scope I *know* this [id] is being used. If it's not I know M.id is being used. No ambiguity, can be resolved locally.
If you allow each identifier in a module to sport an @shadow annotation you lose 2. which I find a very valuable property. Without it, given that identifiers are much more widespread than operators, we get a much more ambiguous language.
It is a very valid point. However, I would argue that 1. and 2. are
transformed to