ScopeResult FileScope::findSymbolInUsed(const std::string& symbol) const { ScopeResult result; // symbol can be package name or symbol within package const Package* pkg = findPackage(symbol); if (pkg) { result.pkg = pkg; result.external = isExternal(pkg); return result; } // search in all used packages for (PackagesConstIter iter = packages.begin(); iter != packages.end(); ++iter) { const Package* pkg = iter->second; Decl* decl = pkg->findSymbol(symbol); if (!decl) continue; bool external = isExternal(pkg); bool visible = !(external && !decl->isPublic()); // NOTE: dont check ambiguity here (just return first match) result.decl = decl; result.pkg = pkg; result.external = external; result.visible = visible; } return result; }
ScopeResult FileScope::findSymbol(const std::string& symbol) const { ScopeResult result; // symbol can be package name or symbol within package const Package* pkg = findPackage(symbol); if (pkg) { result.pkg = pkg; result.external = isExternal(pkg); return result; } // return private symbol only if no public symbol is found // ambiguous may also be set with visible = false for (LocalsConstIter iter = locals.begin(); iter != locals.end(); ++iter) { const Package* pkg = *iter; Decl* decl = pkg->findSymbol(symbol); if (!decl) continue; bool external = isExternal(pkg); bool visible = !(external && !decl->isPublic()); if (result.decl) { // already found if (result.visible == visible) { result.ambiguous = true; if (result.visible) break; continue; } if (!result.visible) { // replace with visible symbol result.decl = decl; result.pkg = pkg; result.external = external; result.ambiguous = false; result.visible = visible; } } else { result.decl = decl; result.pkg = pkg; result.external = external; result.visible = visible; } } return result; }