diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp index ea6c0feb3a298c40bd7c72870c242cd1082a8909..49b09c3aca88f4215abd15f2de43c9c291459751 100644 --- a/src/libs/cplusplus/CppDocument.cpp +++ b/src/libs/cplusplus/CppDocument.cpp @@ -314,11 +314,13 @@ bool Document::parse(ParseMode mode) return _translationUnit->parse(m); } -void Document::check() +void Document::check(CheckMode mode) { Q_ASSERT(!_globalNamespace); Semantic semantic(_control); + if (mode == FastCheck) + semantic.setSkipFunctionBodies(true); _globalNamespace = _control->newNamespace(0); Scope *globals = _globalNamespace->members(); diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h index 3773971efc60fb3fc729d09b689a8c53db64d76a..486d6d7706ce2d22d977290f558df4d03f140d35 100644 --- a/src/libs/cplusplus/CppDocument.h +++ b/src/libs/cplusplus/CppDocument.h @@ -105,7 +105,12 @@ public: bool isParsed() const; bool parse(ParseMode mode = ParseTranlationUnit); - void check(); + enum CheckMode { + FullCheck, + FastCheck + }; + + void check(CheckMode mode = FullCheck); void releaseSource(); void releaseTranslationUnit(); diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index dc0e334d7fe1ce9f75b633877bfc5644b3233c3f..7941df52c864c2ad1c88b72f73e0bb99444779db 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -610,10 +610,16 @@ public: void operator()(Document::Ptr doc) { _doc = doc; + + Document::CheckMode mode = Document::FastCheck; + + if (_workingCopy.contains(doc->fileName())) + mode = Document::FullCheck; + doc->parse(); - doc->check(); + doc->check(mode); - if (_workingCopy.contains(doc->fileName())) { + if (mode == Document::FullCheck) { // run the binding pass NamespaceBindingPtr ns = bind(doc, _snapshot); diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp index ef71c798094a273f4781619c4499c70a2e3692d9..038d70b9a48a9dff38726cba7a748dc98ea2eb2f 100644 --- a/src/shared/cplusplus/CheckDeclaration.cpp +++ b/src/shared/cplusplus/CheckDeclaration.cpp @@ -304,26 +304,28 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast) ast->symbol = fun; _scope->enterSymbol(fun); - if (ast->ctor_initializer) { - bool looksLikeCtor = false; - if (ty.isValid() || ! fun->identity()) - looksLikeCtor = false; - else if (fun->identity()->isNameId() || fun->identity()->isTemplateNameId()) - looksLikeCtor = true; - - if (! looksLikeCtor) { - translationUnit()->error(ast->ctor_initializer->firstToken(), - "only constructors take base initializers"); + if (! semantic()->skipFunctionBodies()) { + if (ast->ctor_initializer) { + bool looksLikeCtor = false; + if (ty.isValid() || ! fun->identity()) + looksLikeCtor = false; + else if (fun->identity()->isNameId() || fun->identity()->isTemplateNameId()) + looksLikeCtor = true; + + if (! looksLikeCtor) { + translationUnit()->error(ast->ctor_initializer->firstToken(), + "only constructors take base initializers"); + } } - } - const int previousVisibility = semantic()->switchVisibility(Symbol::Public); - const int previousMethodKey = semantic()->switchMethodKey(Function::NormalMethod); + const int previousVisibility = semantic()->switchVisibility(Symbol::Public); + const int previousMethodKey = semantic()->switchMethodKey(Function::NormalMethod); - semantic()->check(ast->function_body, fun->members()); + semantic()->check(ast->function_body, fun->members()); - semantic()->switchMethodKey(previousMethodKey); - semantic()->switchVisibility(previousVisibility); + semantic()->switchMethodKey(previousMethodKey); + semantic()->switchVisibility(previousVisibility); + } return false; } diff --git a/src/shared/cplusplus/Semantic.cpp b/src/shared/cplusplus/Semantic.cpp index ff0fa418f87d8ee82372b6b495449633aa81130a..9e7108bbc54f71a218a442446ef5615de6a24a7b 100644 --- a/src/shared/cplusplus/Semantic.cpp +++ b/src/shared/cplusplus/Semantic.cpp @@ -67,6 +67,7 @@ public: Data(Semantic *semantic, Control *control) : semantic(semantic), control(control), + skipFunctionBodies(false), visibility(Symbol::Public), methodKey(Function::NormalMethod), checkSpecifier(0), @@ -89,6 +90,7 @@ public: Semantic *semantic; Control *control; + bool skipFunctionBodies; int visibility; int methodKey; CheckSpecifier *checkSpecifier; @@ -142,6 +144,12 @@ Name *Semantic::check(NameAST *name, Scope *scope) Name *Semantic::check(NestedNameSpecifierAST *name, Scope *scope) { return d->checkName->check(name, scope); } +bool Semantic::skipFunctionBodies() const +{ return d->skipFunctionBodies; } + +void Semantic::setSkipFunctionBodies(bool skipFunctionBodies) +{ d->skipFunctionBodies = skipFunctionBodies; } + int Semantic::currentVisibility() const { return d->visibility; } diff --git a/src/shared/cplusplus/Semantic.h b/src/shared/cplusplus/Semantic.h index ef9753b092d01fa2160302f83ba60710a02dc934..9b9a4195be81c26a612948b356f95a05dab8e83b 100644 --- a/src/shared/cplusplus/Semantic.h +++ b/src/shared/cplusplus/Semantic.h @@ -84,6 +84,9 @@ public: Name *check(NestedNameSpecifierAST *name, Scope *scope); + bool skipFunctionBodies() const; + void setSkipFunctionBodies(bool skipFunctionBodies); + int currentVisibility() const; int switchVisibility(int visibility);