summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cppmodelmanager.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2009-06-03 14:16:13 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2009-06-03 14:16:13 +0200
commitb78200221bdea57896f4a746bbe506027c923b7a (patch)
tree5585eea73ccc29e1a6addcef9098bb25e6e7a1e7 /src/plugins/cpptools/cppmodelmanager.cpp
parent19dd2b814fcd37b106048d202339d63d6232728e (diff)
downloadqt-creator-b78200221bdea57896f4a746bbe506027c923b7a.tar.gz
Warn for undefined namespaces in using namespace directives.
Diffstat (limited to 'src/plugins/cpptools/cppmodelmanager.cpp')
-rw-r--r--src/plugins/cpptools/cppmodelmanager.cpp39
1 files changed, 32 insertions, 7 deletions
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 0451b930e5..0927486d44 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -252,13 +252,16 @@ namespace {
class Process;
-class CheckUndefinedBaseClasses: protected ASTVisitor
+class CheckUndefinedSymbols: protected ASTVisitor
{
public:
- CheckUndefinedBaseClasses(Control *control)
- : ASTVisitor(control), _context(0)
+ CheckUndefinedSymbols(Document::Ptr doc)
+ : ASTVisitor(doc->control()), _process(0), _doc(doc)
{ }
+ void setGlobalNamespaceBinding(NamespaceBindingPtr globalNamespaceBinding)
+ { _globalNamespaceBinding = globalNamespaceBinding; }
+
void operator()(AST *ast, Process *process)
{ _process = process; accept(ast); }
@@ -290,6 +293,26 @@ protected:
"expected class-name %s token", token);
}
}
+
+ return true;
+ }
+
+ virtual bool visit(UsingDirectiveAST *ast)
+ {
+ if (ast->name && ast->name->name && _globalNamespaceBinding) {
+ const Location loc = Location(ast->symbol);
+
+ NamespaceBinding *binding = _globalNamespaceBinding.data();
+
+ if (Scope *enclosingNamespaceScope = ast->symbol->enclosingNamespaceScope())
+ binding = NamespaceBinding::find(enclosingNamespaceScope->owner()->asNamespace(), binding);
+
+ if (! binding || ! binding->resolveNamespace(loc, ast->name->name)) {
+ translationUnit()->warning(ast->name->firstToken(),
+ "expected a namespace after `=' token");
+ }
+ }
+
return true;
}
@@ -297,7 +320,9 @@ protected:
private:
Process *_process;
+ Document::Ptr _doc;
LookupContext _context;
+ NamespaceBindingPtr _globalNamespaceBinding;
};
class Process: public std::unary_function<Document::Ptr, void>
@@ -334,12 +359,12 @@ public:
if (_workingCopy.contains(doc->fileName())) {
// run the binding pass
NamespaceBindingPtr ns = bind(doc, _snapshot);
- Q_UNUSED(ns);
// check for undefined symbols.
+ CheckUndefinedSymbols checkUndefinedSymbols(doc);
+ checkUndefinedSymbols.setGlobalNamespaceBinding(ns);
- CheckUndefinedBaseClasses checkUndefinedBaseClasses(doc->control());
- checkUndefinedBaseClasses(doc->translationUnit()->ast(), this);
+ checkUndefinedSymbols(doc->translationUnit()->ast(), this);
}
doc->releaseTranslationUnit();
@@ -349,7 +374,7 @@ public:
}
};
-LookupContext CheckUndefinedBaseClasses::lookupContext(unsigned line, unsigned column) const
+LookupContext CheckUndefinedSymbols::lookupContext(unsigned line, unsigned column) const
{ return _process->lookupContext(line, column); }
} // end of anonymous namespace