Nicer implementation of ::completeScope()

This commit is contained in:
Roberto Raggi
2009-02-18 15:56:59 +01:00
parent c72c84d837
commit 0ef213dfdd

View File

@@ -775,42 +775,23 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re
bool CppCodeCompletion::completeScope(const QList<TypeOfExpression::Result> &results, bool CppCodeCompletion::completeScope(const QList<TypeOfExpression::Result> &results,
const LookupContext &context) const LookupContext &context)
{ {
if (results.isEmpty()) QList<Symbol *> classes, namespaces;
return false; // nothing to do.
// Search for a class or a namespace. foreach (TypeOfExpression::Result result, results) {
TypeOfExpression::Result result;
foreach (result, results) {
FullySpecifiedType ty = result.first; FullySpecifiedType ty = result.first;
if (ty->isClassType() || ty->isNamespaceType()) if (Class *classTy = ty->asClassType())
break; classes.append(classTy);
else if (Namespace *namespaceTy = ty->asNamespaceType())
namespaces.append(namespaceTy);
} }
FullySpecifiedType exprTy = result.first; if (! classes.isEmpty())
if (! exprTy) { completeClass(classes, context);
return false;
} else if (exprTy->isNamespaceType()) { else if (! namespaces.isEmpty() && m_completions.isEmpty())
QList<Symbol *> candidates; completeNamespace(namespaces, context);
foreach (TypeOfExpression::Result p, results) {
if (Namespace *ns = p.first->asNamespaceType())
candidates.append(ns);
}
completeNamespace(candidates, context);
} else if (exprTy->isClassType()) {
QList<Symbol *> candidates;
foreach (TypeOfExpression::Result p, results) {
if (Class *k = p.first->asClassType())
candidates.append(k);
}
completeClass(candidates, context);
} else if (Symbol *symbol = result.second) {
if (symbol->isTypedef()) {
ResolveClass resolveClass;
const QList<Symbol *> candidates = resolveClass(result, context);
completeClass(candidates, context);
}
}
return ! m_completions.isEmpty(); return ! m_completions.isEmpty();
} }