SymbolMap CursorInfo::targetInfos(const SymbolMap &map) const { SymbolMap ret; for (Set<Location>::const_iterator it = targets.begin(); it != targets.end(); ++it) { SymbolMap::const_iterator found = RTags::findCursorInfo(map, *it); if (found != map.end()) { ret[*it] = found->second; } else { ret[*it] = CursorInfo(); // we need this one for inclusion directives which target a // non-existing CursorInfo } } return ret; }
SymbolMap CursorInfo::targetInfos(const SymbolMap &map, const SymbolMap *errors) const { SymbolMap ret; for (Set<Location>::const_iterator it = targets.begin(); it != targets.end(); ++it) { SymbolMap::const_iterator found = RTags::findCursorInfo(map, *it, String(), errors); // ### could/should I pass symbolName as context here? if (found != map.end()) { ret[*it] = found->second; } else { ret[*it] = CursorInfo(); // we need this one for inclusion directives which target a // non-existing CursorInfo } } return ret; }
CursorInfo CursorInfo::bestTarget(const SymbolMap &map, const SymbolMap *errors, Location *loc) const { const SymbolMap targets = targetInfos(map, errors); SymbolMap::const_iterator best = targets.end(); int bestRank = -1; for (SymbolMap::const_iterator it = targets.begin(); it != targets.end(); ++it) { const CursorInfo &ci = it->second; const int r = targetRank(ci); if (r > bestRank || (r == bestRank && ci.isDefinition())) { bestRank = r; best = it; } } if (best != targets.end()) { if (loc) *loc = best->first; return best->second; } return CursorInfo(); }