bool Qualify0(ScopeInfo& nf, const String& type, const String& usings, String& qt) { // Qualify single type based on scoping information const Vector<String>& nd = nf.GetScopes(usings); if(nd.GetCount()) { LTIMING("First test"); qt = nd[0] + type; if(nf.base.Find(qt) >= 0) return true; } if(nf.GetScope() >= 0) { int q = type.ReverseFind(':'); if(q > 0) { LTIMING("Qualifying qualification"); ScopeInfo hnf(nf); hnf.NoBases(); String qn; String qs = type.Mid(0, q - 1); if(IsDigit(*qs)) { qt = type; return true; } if(DoQualify(hnf, qs, usings, qn)) { String tp = type.Mid(q + 1); if(nf.base.Find(qn) >= 0) { qt = qn + "::" + tp; return true; } int scopei = nf.base.Find(qn); if(scopei >= 0) { ScopeInfo nnf(nf.base, scopei); const Vector<String>& bs = nnf.GetBases(); for(int i = 0; i < bs.GetCount(); i++) { qt = bs[i] + tp; if(nf.base.Find(qt) >= 0) return true; } } } if(nf.base.Find(qs) >= 0) { qt = qs; return true; } qt = type; if(nf.base.Find(qt) >= 0) // e.g. std::string return true; qt = type.Mid(q + 1); return true; } else { LTIMING("Bases"); const Vector<String>& bs = nf.GetBases(); for(int i = 0; i < bs.GetCount(); i++) { qt = bs[i] + type; if(nf.base.Find(qt) >= 0) return true; } } } if(type[0] != ':') { LTIMING("Testing scopes"); for(int i = 1; i < nd.GetCount(); i++) { qt = nd[i] + type; if(nf.base.Find(qt) >= 0) return true; } } int q = type.Find(':'); if(q < 0) return false; return Qualify0(nf, type.Mid(q + 1), usings, qt); }