int ClassDeclaration::isFuncHidden(FuncDeclaration *fd) { //printf("ClassDeclaration::isFuncHidden(class = %s, fd = %s)\n", toChars(), fd->toChars()); Dsymbol *s = search(Loc(), fd->ident, IgnoreAmbiguous | IgnoreErrors); if (!s) { //printf("not found\n"); /* Because, due to a hack, if there are multiple definitions * of fd->ident, NULL is returned. */ return 0; } s = s->toAlias(); OverloadSet *os = s->isOverloadSet(); if (os) { for (size_t i = 0; i < os->a.dim; i++) { Dsymbol *s2 = os->a[i]; FuncDeclaration *f2 = s2->isFuncDeclaration(); if (f2 && overloadApply(f2, (void *)fd, &isf)) return 0; } return 1; } else { FuncDeclaration *fdstart = s->isFuncDeclaration(); //printf("%s fdstart = %p\n", s->kind(), fdstart); if (overloadApply(fdstart, (void *)fd, &isf)) return 0; return !fd->parent->isTemplateMixin(); } }
int ClassDeclaration::isFuncHidden(FuncDeclaration *fd) { //printf("ClassDeclaration::isFuncHidden(class = %s, fd = %s)\n", toChars(), fd->toChars()); Dsymbol *s = search(0, fd->ident, 4|2); if (!s) { //printf("not found\n"); /* Because, due to a hack, if there are multiple definitions * of fd->ident, NULL is returned. */ return 0; } s = s->toAlias(); OverloadSet *os = s->isOverloadSet(); if (os) { for (size_t i = 0; i < os->a.dim; i++) { Dsymbol *s2 = os->a.tdata()[i]; FuncDeclaration *f2 = s2->isFuncDeclaration(); if (f2 && overloadApply(f2, &isf, fd)) return 0; } return 1; } else { FuncDeclaration *fdstart = s->isFuncDeclaration(); //printf("%s fdstart = %p\n", s->kind(), fdstart); return !overloadApply(fdstart, &isf, fd); } }
/******************************************* * Look for constructor declaration. */ Dsymbol *AggregateDeclaration::searchCtor() { Dsymbol *s = search(Loc(), Id::ctor); if (s) { if (!(s->isCtorDeclaration() || s->isTemplateDeclaration() || s->isOverloadSet())) { error("%s %s is not a constructor; identifiers starting with __ are reserved for the implementation", s->kind(), s->toChars()); errors = true; s = NULL; } } return s; }
Dsymbol *ScopeDsymbol::search(Loc loc, Identifier *ident, int flags) { //printf("%s->ScopeDsymbol::search(ident='%s', flags=x%x)\n", toChars(), ident->toChars(), flags); //if (strcmp(ident->toChars(),"c") == 0) *(char*)0=0; // Look in symbols declared in this module Dsymbol *s1 = symtab ? symtab->lookup(ident) : NULL; //printf("\ts1 = %p, imports = %p, %d\n", s1, imports, imports ? imports->dim : 0); if (s1) { //printf("\ts = '%s.%s'\n",toChars(),s1->toChars()); return s1; } if (imports) { Dsymbol *s = NULL; OverloadSet *a = NULL; // Look in imported modules for (size_t i = 0; i < imports->dim; i++) { // If private import, don't search it if ((flags & IgnorePrivateMembers) && prots[i] == PROTprivate) continue; Dsymbol *ss = (*imports)[i]; //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 */ Dsymbol *s2 = ss->search(loc, ident, ss->isModule() ? IgnorePrivateMembers : IgnoreNone); if (!s) { s = s2; if (s && s->isOverloadSet()) a = mergeOverloadSet(a, s); } else if (s2 && s != s2) { if (s->toAlias() == s2->toAlias() || s->getType() == s2->getType() && s->getType()) { /* After following aliases, we found the same * symbol, so it's not an ambiguity. But if one * alias is deprecated or less accessible, prefer * the other. */ if (s->isDeprecated() || s2->prot() > s->prot() && s2->prot() != PROTnone) s = s2; } else { /* Two imports of the same module should be regarded as * the same. */ Import *i1 = s->isImport(); Import *i2 = s2->isImport(); if (!(i1 && i2 && (i1->mod == i2->mod || (!i1->parent->isImport() && !i2->parent->isImport() && i1->ident->equals(i2->ident)) ) ) ) { /* Bugzilla 8668: * Public selective import adds AliasDeclaration in module. * To make an overload set, resolve aliases in here and * get actual overload roots which accessible via s and s2. */ s = s->toAlias(); s2 = s2->toAlias(); /* If both s2 and s are overloadable (though we only * need to check s once) */ if ((s2->isOverloadSet() || s2->isOverloadable()) && (a || s->isOverloadable())) { a = mergeOverloadSet(a, s2); continue; } if (flags & IgnoreAmbiguous) // if return NULL on ambiguity return NULL; if (!(flags & IgnoreErrors)) ScopeDsymbol::multiplyDefined(loc, s, s2); break; } } } } if (s) { /* Build special symbol if we had multiple finds */ if (a) { if (!s->isOverloadSet()) a = mergeOverloadSet(a, s); s = a; } if (!(flags & IgnoreErrors) && s->prot() == PROTprivate && !s->parent->isTemplateMixin()) { if (!s->isImport()) error(loc, "%s %s is private", s->kind(), s->toPrettyChars()); } return s; } } return s1; }