Mercurial > projects > ldc
diff dmd/dsymbol.c @ 336:aaade6ded589 trunk
[svn r357] Merged DMD 1.033
author | lindquist |
---|---|
date | Sat, 12 Jul 2008 19:38:31 +0200 |
parents | 5acec6b2eef8 |
children | f1d37dc5d354 |
line wrap: on
line diff
--- a/dmd/dsymbol.c Sat Jul 12 17:04:36 2008 +0200 +++ b/dmd/dsymbol.c Sat Jul 12 19:38:31 2008 +0200 @@ -1,6 +1,6 @@ // Compiler implementation of the D programming language -// Copyright (c) 1999-2007 by Digital Mars +// Copyright (c) 1999-2008 by Digital Mars // All Rights Reserved // written by Walter Bright // http://www.digitalmars.com @@ -201,7 +201,7 @@ return loc.toChars(); } -char *Dsymbol::kind() +const char *Dsymbol::kind() { return "symbol"; } @@ -244,6 +244,16 @@ return s; } +TemplateInstance *Dsymbol::inTemplateInstance() +{ + for (Dsymbol *parent = this->parent; parent; parent = parent->parent) + { + TemplateInstance *ti = parent->isTemplateInstance(); + if (ti) + return ti; + } + return NULL; +} int Dsymbol::isAnonymous() { @@ -270,6 +280,16 @@ // Most Dsymbols have no further semantic analysis needed } +/********************************************* + * Search for ident as member of s. + * Input: + * flags: 1 don't find private members + * 2 don't give error messages + * 4 return NULL if ambiguous + * Returns: + * NULL if not found + */ + Dsymbol *Dsymbol::search(Loc loc, Identifier *ident, int flags) { //printf("Dsymbol::search(this=%p,%s, ident='%s')\n", this, toChars(), ident->toChars()); @@ -389,7 +409,9 @@ AggregateDeclaration *Dsymbol::isMember() // is this a member of an AggregateDeclaration? { + //printf("Dsymbol::isMember() %s\n", toChars()); Dsymbol *parent = toParent(); + //printf("parent is %s %s\n", parent->kind(), parent->toChars()); return parent ? parent->isAggregateDeclaration() : NULL; } @@ -502,6 +524,10 @@ { if (sc->scopesym && sc->scopesym->isDeprecated()) return; + + // If inside a StorageClassDeclaration that is deprecated + if (sc->stc & STCdeprecated) + return; } error(loc, "is deprecated"); @@ -617,12 +643,11 @@ } Dsymbol *ScopeDsymbol::search(Loc loc, Identifier *ident, int flags) -{ Dsymbol *s; - int i; +{ + //printf("%s->ScopeDsymbol::search(ident='%s', flags=x%x)\n", toChars(), ident->toChars(), flags); - //printf("%s->ScopeDsymbol::search(ident='%s', flags=x%x)\n", toChars(), ident->toChars(), flags); // Look in symbols declared in this module - s = symtab ? symtab->lookup(ident) : NULL; + Dsymbol *s = symtab ? symtab->lookup(ident) : NULL; if (s) { //printf("\ts = '%s.%s'\n",toChars(),s->toChars()); @@ -630,7 +655,7 @@ else if (imports) { // Look in imported modules - for (i = 0; i < imports->dim; i++) + for (int i = 0; i < imports->dim; i++) { ScopeDsymbol *ss = (ScopeDsymbol *)imports->data[i]; Dsymbol *s2; @@ -639,6 +664,8 @@ continue; //printf("\tscanning import '%s', prots = %d, isModule = %p, isImport = %p\n", ss->toChars(), prots[i], ss->isModule(), ss->isImport()); + /* Don't find private members if ss is a module + */ s2 = ss->search(loc, ident, ss->isModule() ? 1 : 0); if (!s) s = s2; @@ -646,6 +673,10 @@ { if (s->toAlias() == s2->toAlias()) { + /* After following aliases, we found the same symbol, + * so it's not an ambiguity. + * But if one alias is deprecated, prefer the other. + */ if (s->isDeprecated()) s = s2; } @@ -768,7 +799,7 @@ return sprev; } -char *ScopeDsymbol::kind() +const char *ScopeDsymbol::kind() { return "ScopeDsymbol"; } @@ -780,7 +811,7 @@ * Returns NULL if not found */ -#if V2 +#if DMDV2 FuncDeclaration *ScopeDsymbol::findGetMembers() { Dsymbol *s = search_function(this, Id::getmembers);