summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-05-26 12:35:20 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2010-05-26 12:35:40 +0200
commit040e2a30498f14a4b648e047287308e921c58d50 (patch)
tree4d76e3aaaaeb40472e6d940f888fd9f73ad41e4a /src/plugins/cpptools
parent65780999820b2be8c2a373ec4a6896c9b805dc3e (diff)
downloadqt-creator-040e2a30498f14a4b648e047287308e921c58d50.tar.gz
Ported global completion to use the new LookupContext.
Diffstat (limited to 'src/plugins/cpptools')
-rw-r--r--src/plugins/cpptools/cppcodecompletion.cpp88
-rw-r--r--src/plugins/cpptools/cppcodecompletion.h4
2 files changed, 70 insertions, 22 deletions
diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index a68a4cd127..09166ef052 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -767,11 +767,18 @@ int CppCodeCompletion::startCompletionInternal(TextEditor::BaseTextEditor *edit,
return -1;
typeOfExpression.init(thisDocument, snapshot);
- Symbol *lastVisibleSymbol = thisDocument->lastVisibleSymbolAt(line, column);
+
+ Scope *scope = thisDocument->scopeAt(line, column);
+ Q_ASSERT(scope != 0);
if (expression.isEmpty()) {
- if (m_completionOperator == T_EOF_SYMBOL || m_completionOperator == T_COLON_COLON)
- return globalCompletion(lastVisibleSymbol, thisDocument, snapshot);
+ if (m_completionOperator == T_EOF_SYMBOL || m_completionOperator == T_COLON_COLON) {
+ (void) typeOfExpression(expression, scope);
+ globalCompletion(scope);
+ if (m_completions.isEmpty())
+ return -1;
+ return m_startPosition;
+ }
else if (m_completionOperator == T_SIGNAL || m_completionOperator == T_SLOT) {
// Apply signal/slot completion on 'this'
@@ -779,9 +786,6 @@ int CppCodeCompletion::startCompletionInternal(TextEditor::BaseTextEditor *edit,
}
}
- Scope *scope = thisDocument->scopeAt(line, column);
- Q_ASSERT(scope != 0);
-
if (debug)
qDebug() << "scope:" << scope->owner()->fileName() << scope->owner()->line() << scope->owner()->column();
@@ -871,26 +875,69 @@ int CppCodeCompletion::startCompletionInternal(TextEditor::BaseTextEditor *edit,
return -1;
}
-int CppCodeCompletion::globalCompletion(Symbol *lastVisibleSymbol,
- Document::Ptr thisDocument,
- const Snapshot &snapshot)
+void CppCodeCompletion::globalCompletion(Scope *currentScope)
{
- if (m_completionOperator == T_EOF_SYMBOL) {
- addKeywords();
- addMacros(thisDocument->fileName(), snapshot);
+ const LookupContext &context = typeOfExpression.context();
+
+ if (m_completionOperator == T_COLON_COLON) {
+ completeNamespace(context.globalNamespace());
+ return;
}
- Document::Ptr exprDoc = Document::create(QLatin1String("<expression>"));
- const DeprecatedLookupContext context(lastVisibleSymbol, exprDoc, thisDocument, snapshot);
- const QList<Scope *> scopes = context.expand(context.visibleScopes());
+ addKeywords();
+ addMacros(context.thisDocument()->fileName(), context.snapshot());
+
+ QList<ClassOrNamespace *> usingBindings;
+ ClassOrNamespace *currentBinding = 0;
- foreach (Scope *scope, scopes) {
- for (unsigned i = 0; i < scope->symbolCount(); ++i) {
- addCompletionItem(scope->symbolAt(i));
+ for (Scope *scope = currentScope; scope; scope = scope->enclosingScope()) {
+ if (scope->isBlockScope()) {
+ if (ClassOrNamespace *binding = context.lookupType(scope->owner())) {
+ for (unsigned i = 0; i < scope->symbolCount(); ++i) {
+ Symbol *member = scope->symbolAt(i);
+ if (! member->name())
+ continue;
+ else if (UsingNamespaceDirective *u = member->asUsingNamespaceDirective()) {
+ if (ClassOrNamespace *b = binding->lookupType(u->name()))
+ usingBindings.append(b);
+ }
+ }
+ }
+ } else if (scope->isFunctionScope() || scope->isClassScope() || scope->isNamespaceScope()) {
+ currentBinding = context.lookupType(scope->owner());
+ break;
+ }
+ }
+
+ for (; currentBinding; currentBinding = currentBinding->parent()) {
+ const QList<Symbol *> symbols = currentBinding->symbols();
+
+ if (! symbols.isEmpty()) {
+ if (symbols.first()->isNamespace())
+ completeNamespace(currentBinding);
+ else
+ completeClass(currentBinding, false);
}
}
- return m_startPosition;
+ foreach (ClassOrNamespace *b, usingBindings)
+ completeNamespace(b);
+
+ for (Scope *scope = currentScope; scope; scope = scope->enclosingScope()) {
+ if (scope->isBlockScope()) {
+ for (unsigned i = 0; i < scope->symbolCount(); ++i) {
+ addCompletionItem(scope->symbolAt(i));
+ }
+ } else if (scope->isFunctionScope()) {
+ Scope *arguments = scope->owner()->asFunction()->arguments();
+ for (unsigned i = 0; i < arguments->symbolCount(); ++i) {
+ addCompletionItem(arguments->symbolAt(i));
+ }
+ break;
+ } else {
+ break;
+ }
+ }
}
bool CppCodeCompletion::completeConstructorOrFunction(const QList<LookupItem> &results,
@@ -1508,6 +1555,9 @@ bool CppCodeCompletion::completeQtMethod(const QList<LookupItem> &results,
void CppCodeCompletion::completions(QList<TextEditor::CompletionItem> *completions)
{
const int length = m_editor->position() - m_startPosition;
+ if (length < 0)
+ return;
+
const QString key = m_editor->textAt(m_startPosition, length);
if (length == 0)
diff --git a/src/plugins/cpptools/cppcodecompletion.h b/src/plugins/cpptools/cppcodecompletion.h
index edc76104bf..39d23adf68 100644
--- a/src/plugins/cpptools/cppcodecompletion.h
+++ b/src/plugins/cpptools/cppcodecompletion.h
@@ -96,9 +96,7 @@ private:
bool completeInclude(const QTextCursor &cursor);
void completePreprocessor();
- int globalCompletion(CPlusPlus::Symbol *lastVisibleSymbol,
- CPlusPlus::Document::Ptr thisDocument,
- const CPlusPlus::Snapshot &snapshot);
+ void globalCompletion(CPlusPlus::Scope *scope);
bool completeConstructorOrFunction(const QList<CPlusPlus::LookupItem> &results,
int endOfExpression, bool toolTipOnly);