diff --git a/src/plugins/autotest/autotest.pro b/src/plugins/autotest/autotest.pro index 495b20153b2..18d665b3758 100644 --- a/src/plugins/autotest/autotest.pro +++ b/src/plugins/autotest/autotest.pro @@ -23,6 +23,7 @@ SOURCES += \ testsettingspage.cpp \ testnavigationwidget.cpp \ testoutputreader.cpp \ + itestparser.cpp \ gtest/gtestconfiguration.cpp \ gtest/gtestparser.cpp \ gtest/gtesttreeitem.cpp \ diff --git a/src/plugins/autotest/autotest.qbs b/src/plugins/autotest/autotest.qbs index b768597231b..b3b55a294a0 100644 --- a/src/plugins/autotest/autotest.qbs +++ b/src/plugins/autotest/autotest.qbs @@ -67,6 +67,8 @@ QtcPlugin { "testtreeview.h", "testoutputreader.cpp", "testoutputreader.h", + "itestparser.cpp", + "itestparser.h", "itestframework.h", "testframeworkmanager.cpp", "testframeworkmanager.h" diff --git a/src/plugins/autotest/autotest_utils.h b/src/plugins/autotest/autotest_utils.h index d8dd96c4c5b..47d8e8417a2 100644 --- a/src/plugins/autotest/autotest_utils.h +++ b/src/plugins/autotest/autotest_utils.h @@ -25,13 +25,10 @@ #pragma once -#include #include -#include #include -#include -#include +#include namespace Autotest { namespace Internal { @@ -52,24 +49,6 @@ public: return QString(); } - - static QByteArray getFileContent(QString filePath) - { - QByteArray fileContent; - CppTools::CppModelManager *cppMM = CppTools::CppModelManager::instance(); - CppTools::WorkingCopy wc = cppMM->workingCopy(); - if (wc.contains(filePath)) { - fileContent = wc.source(filePath); - } else { - QString error; - const QTextCodec *codec = Core::EditorManager::defaultTextCodec(); - if (Utils::TextFileFormat::readFileUTF8(filePath, codec, &fileContent, &error) - != Utils::TextFileFormat::ReadSuccess) { - qDebug() << "Failed to read file" << filePath << ":" << error; - } - } - return fileContent; - } }; } // namespace Internal diff --git a/src/plugins/autotest/gtest/gtestparser.cpp b/src/plugins/autotest/gtest/gtestparser.cpp index 9ec7eda3bab..bf7e8718a1e 100644 --- a/src/plugins/autotest/gtest/gtestparser.cpp +++ b/src/plugins/autotest/gtest/gtestparser.cpp @@ -78,7 +78,7 @@ static bool handleGTest(QFutureInterface futureInterface, { const CppTools::CppModelManager *modelManager = CppTools::CppModelManager::instance(); const QString &filePath = doc->fileName(); - const QByteArray &fileContent = TestUtils::getFileContent(filePath); + const QByteArray &fileContent = CppParser::getFileContent(filePath); CPlusPlus::Document::Ptr document = snapshot.preprocessedDocument(fileContent, filePath); document->check(); CPlusPlus::AST *ast = document->translationUnit()->ast(); diff --git a/src/plugins/autotest/itestparser.cpp b/src/plugins/autotest/itestparser.cpp new file mode 100644 index 00000000000..82409df2991 --- /dev/null +++ b/src/plugins/autotest/itestparser.cpp @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "itestparser.h" + +#include +#include +#include + +namespace Autotest { +namespace Internal { + +static CppParser *s_parserInstance = 0; + +CppParser::CppParser() +{ + s_parserInstance = this; +} + +void CppParser::init(const QStringList &filesToParse) +{ + Q_UNUSED(filesToParse); + m_cppSnapshot = CppTools::CppModelManager::instance()->snapshot(); + m_workingCopy = CppTools::CppModelManager::instance()->workingCopy(); +} + +bool CppParser::selectedForBuilding(const QString &fileName) +{ + QList projParts = + CppTools::CppModelManager::instance()->projectPart(fileName); + + return projParts.size() && projParts.at(0)->selectedForBuilding; +} + +QByteArray CppParser::getFileContent(const QString &filePath) +{ + QByteArray fileContent; + if (s_parserInstance->m_workingCopy.contains(filePath)) { + fileContent = s_parserInstance->m_workingCopy.source(filePath); + } else { + QString error; + const QTextCodec *codec = Core::EditorManager::defaultTextCodec(); + if (Utils::TextFileFormat::readFileUTF8(filePath, codec, &fileContent, &error) + != Utils::TextFileFormat::ReadSuccess) { + qDebug() << "Failed to read file" << filePath << ":" << error; + } + } + return fileContent; +} + +void CppParser::release() +{ + m_cppSnapshot = CPlusPlus::Snapshot(); + m_workingCopy = CppTools::WorkingCopy(); +} + +} // namespace Internal +} // namespace Autotest diff --git a/src/plugins/autotest/itestparser.h b/src/plugins/autotest/itestparser.h index 98bd0c5cad9..e6ebf74b93f 100644 --- a/src/plugins/autotest/itestparser.h +++ b/src/plugins/autotest/itestparser.h @@ -30,7 +30,7 @@ #include #include -#include +#include #include namespace Autotest { @@ -64,6 +64,7 @@ public: virtual void init(const QStringList &filesToParse) = 0; virtual bool processDocument(QFutureInterface futureInterface, const QString &fileName) = 0; + virtual void release() = 0; void setId(const Core::Id &id) { m_id = id; } Core::Id id() const { return m_id; } @@ -74,22 +75,15 @@ private: class CppParser : public ITestParser { public: - void init(const QStringList &filesToParse) override - { - Q_UNUSED(filesToParse); - m_cppSnapshot = CppTools::CppModelManager::instance()->snapshot(); - } - - static bool selectedForBuilding(const QString &fileName) - { - QList projParts = - CppTools::CppModelManager::instance()->projectPart(fileName); - - return projParts.size() && projParts.at(0)->selectedForBuilding; - } + CppParser(); + void init(const QStringList &filesToParse) override; + static bool selectedForBuilding(const QString &fileName); + static QByteArray getFileContent(const QString &filePath); + void release() override; protected: CPlusPlus::Snapshot m_cppSnapshot; + CppTools::WorkingCopy m_workingCopy; }; } // namespace Internal diff --git a/src/plugins/autotest/qtest/qttestparser.cpp b/src/plugins/autotest/qtest/qttestparser.cpp index 157a7fc2ab6..1c273a5e387 100644 --- a/src/plugins/autotest/qtest/qttestparser.cpp +++ b/src/plugins/autotest/qtest/qttestparser.cpp @@ -81,7 +81,7 @@ static bool qtTestLibDefined(const QString &fileName) static QString testClass(const CppTools::CppModelManager *modelManager, const CPlusPlus::Snapshot &snapshot, const QString &fileName) { - const QByteArray &fileContent = TestUtils::getFileContent(fileName); + const QByteArray &fileContent = CppParser::getFileContent(fileName); CPlusPlus::Document::Ptr document = modelManager->document(fileName); if (document.isNull()) return QString(); @@ -150,7 +150,7 @@ static QSet filesWithDataFunctionDefinitions( static QMap checkForDataTags(const QString &fileName, const CPlusPlus::Snapshot &snapshot) { - const QByteArray fileContent = TestUtils::getFileContent(fileName); + const QByteArray fileContent = CppParser::getFileContent(fileName); CPlusPlus::Document::Ptr document = snapshot.preprocessedDocument(fileContent, fileName); document->check(); CPlusPlus::AST *ast = document->translationUnit()->ast(); diff --git a/src/plugins/autotest/quick/quicktestparser.cpp b/src/plugins/autotest/quick/quicktestparser.cpp index 87dcc301228..7c0074ff736 100644 --- a/src/plugins/autotest/quick/quicktestparser.cpp +++ b/src/plugins/autotest/quick/quicktestparser.cpp @@ -107,7 +107,7 @@ static QString quickTestName(const CPlusPlus::Document::Ptr &doc) const QByteArray name = macro.macro().name(); if (QuickTestUtils::isQuickTestMacro(name)) { CPlusPlus::Document::Block arg = macro.arguments().at(0); - return QLatin1String(TestUtils::getFileContent(doc->fileName()) + return QLatin1String(CppParser::getFileContent(doc->fileName()) .mid(arg.bytesBegin(), arg.bytesEnd() - arg.bytesBegin())); } } diff --git a/src/plugins/autotest/quick/quicktestparser.h b/src/plugins/autotest/quick/quicktestparser.h index 1e968c743e2..76ace6e435e 100644 --- a/src/plugins/autotest/quick/quicktestparser.h +++ b/src/plugins/autotest/quick/quicktestparser.h @@ -27,6 +27,8 @@ #include "../itestparser.h" +#include + namespace Autotest { namespace Internal { diff --git a/src/plugins/autotest/testcodeparser.cpp b/src/plugins/autotest/testcodeparser.cpp index 584d622527e..857c16b25f3 100644 --- a/src/plugins/autotest/testcodeparser.cpp +++ b/src/plugins/autotest/testcodeparser.cpp @@ -76,6 +76,7 @@ TestCodeParser::TestCodeParser(TestTreeModel *parent) this, [this] (int index) { emit testParseResultReady(m_futureWatcher.resultAt(index)); }); + connect(this, &TestCodeParser::parsingFinished, this, &TestCodeParser::releaseParserInternals); } TestCodeParser::~TestCodeParser() @@ -425,5 +426,11 @@ void TestCodeParser::onPartialParsingFinished() } } +void TestCodeParser::releaseParserInternals() +{ + for (ITestParser *parser : m_testCodeParsers) + parser->release(); +} + } // namespace Internal } // namespace Autotest diff --git a/src/plugins/autotest/testcodeparser.h b/src/plugins/autotest/testcodeparser.h index 830b52f92ec..9bb1480b0a7 100644 --- a/src/plugins/autotest/testcodeparser.h +++ b/src/plugins/autotest/testcodeparser.h @@ -27,6 +27,8 @@ #include "itestparser.h" +#include + #include #include #include @@ -84,6 +86,7 @@ private: void onAllTasksFinished(Core::Id type); void onFinished(); void onPartialParsingFinished(); + void releaseParserInternals(); TestTreeModel *m_model;