mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
My recent refactoring of top-level lookup replaced the old shadowing done as part of top-level lookup with two separate rules: - If all paths from the current source file to a module 'B' go through a module 'A', then declarations in 'A' shadow declarations in 'B'. - If a declaration in module 'A' was found via a scoped import and a declaration with the same name in module 'B' was found via an unscoped import, prefer the declaration from module 'A'. However this caused a source break when you have a scenario like the following: - A source file imports 'A', 'B', and 'B.Foo'. - 'A' re-exports 'B'. - Both 'A' and 'B' define a type named 'Foo'. The problem is that the scoped import 'B.Foo' can actually find both 'A.Foo' and 'B.Foo', since 'B' re-exports 'A'. Furthermore, since the source file explicitly imports 'A', 'B' does not shadow 'A' in the import graph. As a result neither shadowing rule would eliminate the ambiguity. The new rule combines the scoped import check and the shadowing check by considering all access paths to 'A' that are not shadowed by 'B'. Using this rule, 'A.Foo' is only seen via the access path 'A', whereas 'B.Foo' is seen under both 'B' and 'B.Foo'. Since 'B.Foo' is seen via a scoped import and 'A.Foo' is only seen via an unscoped import, we can conclude that 'B.Foo' shadows 'A.Foo'. Fixes <rdar://problem/55205050>.
5.5 KiB
5.5 KiB