From 3d96108bbdd68f24665933152379010866011f32 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 4 May 2016 12:18:52 +0200 Subject: [PATCH] AutoTest: Fix reparsing of header files... ...when having split source and headers and defining test data functions inside the source file. If we just reparse a header file (e.g. when opening the respective file inside the editor) we have no explicit information where the definition of the functions is. This lead to not finding the information necessary for displaying data tags and throwing away old information as they have been marked for removal. Change-Id: Ieb8ed9f7c758fe2c793e60ca2c30b4025106363b Reviewed-by: David Schulz --- src/plugins/autotest/testcodeparser.cpp | 53 ++++++++++++------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/src/plugins/autotest/testcodeparser.cpp b/src/plugins/autotest/testcodeparser.cpp index 990f7348f36..e39400d2e9a 100644 --- a/src/plugins/autotest/testcodeparser.cpp +++ b/src/plugins/autotest/testcodeparser.cpp @@ -404,31 +404,31 @@ static CPlusPlus::Document::Ptr declaringDocument(CPlusPlus::Document::Ptr doc, return declaringDoc; } -static bool hasFunctionWithDataTagUsage(const QMap &testFunctions) -{ - foreach (const QString &functionName, testFunctions.keys()) { - if (functionName.endsWith(QLatin1String("_data")) && - testFunctions.contains(functionName.left(functionName.size() - 5))) { - return true; - } - } - return false; -} - -static QMap checkForDataTags(const QString &fileName, +static QSet filesWithDataFunctionDefinitions( const QMap &testFunctions) { - if (hasFunctionWithDataTagUsage(testFunctions)) { - const CPlusPlus::Snapshot snapshot = CPlusPlus::CppModelManagerBase::instance()->snapshot(); - const QByteArray fileContent = getFileContent(fileName); - CPlusPlus::Document::Ptr document = snapshot.preprocessedDocument(fileContent, fileName); - document->check(); - CPlusPlus::AST *ast = document->translationUnit()->ast(); - TestDataFunctionVisitor visitor(document); - visitor.accept(ast); - return visitor.dataTags(); + QSet result; + QMap::ConstIterator it = testFunctions.begin(); + const QMap::ConstIterator end = testFunctions.end(); + + for ( ; it != end; ++it) { + const QString &key = it.key(); + if (key.endsWith(QLatin1String("_data")) && testFunctions.contains(key.left(key.size() - 5))) + result.insert(it.value().m_name); } - return QMap(); + return result; +} + +static QMap checkForDataTags(const QString &fileName) +{ + const CPlusPlus::Snapshot snapshot = CPlusPlus::CppModelManagerBase::instance()->snapshot(); + const QByteArray fileContent = getFileContent(fileName); + CPlusPlus::Document::Ptr document = snapshot.preprocessedDocument(fileContent, fileName); + document->check(); + CPlusPlus::AST *ast = document->translationUnit()->ast(); + TestDataFunctionVisitor visitor(document); + visitor.accept(ast); + return visitor.dataTags(); } /****** end of helpers ******/ @@ -549,12 +549,11 @@ static void checkDocumentForTestCode(QFutureInterface futureInt return; const QMap testFunctions = visitor.privateSlots(); + const QSet &files = filesWithDataFunctionDefinitions(testFunctions); - QMap dataTags = - checkForDataTags(declaringDoc->fileName(), testFunctions); - - if (declaringDoc->fileName() != document->fileName()) - dataTags.unite(checkForDataTags(document->fileName(), testFunctions)); + QMap dataTags; + foreach (const QString &file, files) + dataTags.unite(checkForDataTags(file)); TestParseResult parseResult(TestTreeModel::AutoTest); parseResult.fileName = declaringDoc->fileName();