Fix import visibility bugs 313 and 314.

This commit is contained in:
Christian Kamm
2008-10-01 19:16:10 +02:00
parent cd99e773f0
commit 271012bcfc
4 changed files with 23 additions and 9 deletions

View File

@@ -646,6 +646,11 @@ Dsymbol *ScopeDsymbol::search(Loc loc, Identifier *ident, int flags)
// Look in symbols declared in this module
Dsymbol *s = symtab ? symtab->lookup(ident) : NULL;
// hide private nonlocal symbols
if (flags & 1 && s && s->prot() == PROTprivate)
s = NULL;
if (s)
{
//printf("\ts = '%s.%s'\n",toChars(),s->toChars());

View File

@@ -33,6 +33,7 @@ Import::Import(Loc loc, Array *packages, Identifier *id, Identifier *aliasId,
this->id = id;
this->aliasId = aliasId;
this->isstatic = isstatic;
protection = PROTundefined;
pkg = NULL;
mod = NULL;
@@ -60,6 +61,10 @@ const char *Import::kind()
return isstatic ? (char *)"static import" : (char *)"import";
}
enum PROT Import::prot()
{
return protection;
}
Dsymbol *Import::syntaxCopy(Dsymbol *s)
{
@@ -131,14 +136,15 @@ void Import::semantic(Scope *sc)
}
#endif
/* Default to private importing
*/
protection = sc->protection;
if (!sc->explicitProtection)
protection = PROTprivate;
if (!isstatic && !aliasId && !names.dim)
{
/* Default to private importing
*/
enum PROT prot = sc->protection;
if (!sc->explicitProtection)
prot = PROTprivate;
sc->scopesym->importScope(mod, prot);
sc->scopesym->importScope(mod, protection);
}
// Modules need a list of each imported module
@@ -149,13 +155,14 @@ void Import::semantic(Scope *sc)
sc = sc->push(mod);
for (size_t i = 0; i < aliasdecls.dim; i++)
{ Dsymbol *s = (Dsymbol *)aliasdecls.data[i];
{ AliasDeclaration *ad = (AliasDeclaration *)aliasdecls.data[i];
//printf("\tImport alias semantic('%s')\n", s->toChars());
if (!mod->search(loc, (Identifier *)names.data[i], 0))
error("%s not found", ((Identifier *)names.data[i])->toChars());
s->semantic(sc);
ad->semantic(sc);
ad->protection = protection;
}
sc = sc->pop();
}

View File

@@ -34,6 +34,7 @@ struct Import : Dsymbol
Identifier *id; // module Identifier
Identifier *aliasId;
int isstatic; // !=0 if static import
enum PROT protection;
// Pairs of alias=name to bind into current namespace
Array names;
@@ -49,6 +50,7 @@ struct Import : Dsymbol
void addAlias(Identifier *name, Identifier *alias);
const char *kind();
enum PROT prot();
Dsymbol *syntaxCopy(Dsymbol *s); // copy only syntax trees
void load(Scope *sc);
void semantic(Scope *sc);

View File

@@ -64,7 +64,7 @@ void Module::genobjfile(int multiobj)
Logger::println("Generating module: %s\n", (md ? md->toChars() : toChars()));
LOG_SCOPE;
printf("codegen: %s\n", srcfile->toChars());
// printf("codegen: %s\n", srcfile->toChars());
// start by deleting the old object file
deleteObjFile();