D-Programming-Language/dmd — pull request #3407 by 9rnsr (2014-03-29 02:18:51+00:00)
Title: More conservative fix for issue 313 & 314

[Issue 313](https://d.puremagic.com/issues/show_bug.cgi?id=313) - [module] Fully qualified names bypass private imports
[Issue 314](https://d.puremagic.com/issues/show_bug.cgi?id=314) - [module] Static, renamed, and selective imports are always public

Unlike #2256, this PR will keep existing name lookup rule and import behaviors that is unrelated to the issues.

Two main points:

1. Most of import declarations will insert their fully qualified names in local symbol table.

Currently, it is stored only in one place - `Module::modules`. After this change, in addition to that, each `ScopeDsymbol::symtab` will have the "local package tree" which represents the scope local imports.

For example:

```d
class C {
import core.stdc.stdio;
import core.stdc.stdlib : malloc;
import core.stdc.stdlib : free;
void func() {
import core.stdc.string;
}
}
```

`symtab` of class `C` and `C.func` will have following package object trees:

```
// in C
Package('core') <----------+
+ Package('stdc') <-------|--+
+ Import('stdio') | |
+ Import('stdlib') | |
names = ["malloc"] | |
+---- overnext | |
| | |
+-> Import('stdlib') | |
names = ["free"] | |
| |
// in C.func() | |
Package('core') aliassym --+ |
+ Package('stdc') aliassym -+
+ Import('string')
```

In there, `Import` object will be the leaf of the tree.

It's done by `Import::addPackage`.

2. A part of local package tree will be merged into other tree.

This example case of public import should work.

```d
module a;
public import std.stdio;
```
```d
module b;
import a;
import std.algorithm;
std.stdio.writeln(); // point
```

In module b, 'std.stdio' should be visible. To realize it, import declarations will pull the fully qualified name of public imports in the imported module. Finally, module b will have the package tree:

```
Package('std')
+ Package('algorithm')
+ Package('stdio') <--- Pulled from module a, by `import a;`
```

Same work is necessary on class inheritance. Public/protected imports in base class scope should be pulled in the derived class scope.