diff options
Diffstat (limited to 'src/plugins/projectexplorer/gnumakeparser.cpp')
-rw-r--r-- | src/plugins/projectexplorer/gnumakeparser.cpp | 169 |
1 files changed, 30 insertions, 139 deletions
diff --git a/src/plugins/projectexplorer/gnumakeparser.cpp b/src/plugins/projectexplorer/gnumakeparser.cpp index c1453445317..1e3616e6270 100644 --- a/src/plugins/projectexplorer/gnumakeparser.cpp +++ b/src/plugins/projectexplorer/gnumakeparser.cpp @@ -29,7 +29,7 @@ #include "task.h" #include <utils/qtcassert.h> -#include <utils/temporarydirectory.h> +#include <utils/temporaryfile.h> #include <QDir> #include <QFile> @@ -68,9 +68,9 @@ void GnuMakeParser::stdOutput(const QString &line) QRegularExpressionMatch match = m_makeDir.match(lne); if (match.hasMatch()) { if (match.captured(6) == QLatin1String("Leaving")) - removeDirectory(match.captured(7)); + dropSearchDir(FilePath::fromString(match.captured(7))); else - addDirectory(match.captured(7)); + addSearchDir(FilePath::fromString(match.captured(7))); return; } @@ -128,10 +128,9 @@ void GnuMakeParser::stdError(const QString &line) if (res.isFatal) ++m_fatalErrorCount; if (!m_suppressIssues) { - taskAdded(BuildSystemTask(res.type, res.description, - FilePath::fromUserInput(match.captured(1)) /* filename */, - match.captured(4).toInt() /* line */), - 1, 0); + emitTask(BuildSystemTask(res.type, res.description, + absoluteFilePath(FilePath::fromUserInput(match.captured(1))), + match.captured(4).toInt() /* line */)); } return; } @@ -142,61 +141,18 @@ void GnuMakeParser::stdError(const QString &line) if (res.isFatal) ++m_fatalErrorCount; if (!m_suppressIssues) - taskAdded(BuildSystemTask(res.type, res.description), 1, 0); + emitTask(BuildSystemTask(res.type, res.description)); return; } IOutputParser::stdError(line); } -void GnuMakeParser::addDirectory(const QString &dir) +void GnuMakeParser::emitTask(const ProjectExplorer::Task &task) { - if (dir.isEmpty()) - return; - m_directories.append(dir); -} - -void GnuMakeParser::removeDirectory(const QString &dir) -{ - m_directories.removeOne(dir); -} - -void GnuMakeParser::taskAdded(const Task &task, int linkedLines, int skippedLines) -{ - Task editable(task); - - if (task.type == Task::Error) { - // assume that all make errors will be follow up errors: + if (task.type == Task::Error) // Assume that all make errors will be follow up errors. m_suppressIssues = true; - } - - QString filePath(task.file.toString()); - - if (!filePath.isEmpty() && !QDir::isAbsolutePath(filePath)) { - QFileInfoList possibleFiles; - foreach (const QString &dir, searchDirectories()) { - QFileInfo candidate(dir + QLatin1Char('/') + filePath); - if (candidate.exists() - && !possibleFiles.contains(candidate)) { - possibleFiles << candidate; - } - } - if (possibleFiles.size() == 1) - editable.file = Utils::FilePath::fromFileInfo(possibleFiles.first()); - // Let the Makestep apply additional heuristics (based on - // files in ther project) if we cannot uniquely - // identify the file! - } - - IOutputParser::taskAdded(editable, linkedLines, skippedLines); -} - -QStringList GnuMakeParser::searchDirectories() const -{ - QStringList dirs = m_directories; - if (!workingDirectory().isEmpty()) - dirs << workingDirectory().toString(); - return dirs; + emit addTask(task, 1, 0); } } // ProjectExplorer @@ -417,117 +373,52 @@ void ProjectExplorerPlugin::testGnuMakeParserParsing() QFETCH(QString, outputLines); QFETCH(QStringList, additionalSearchDirs); - QStringList searchDirs = childParser->searchDirectories(); + FilePaths searchDirs = childParser->searchDirectories(); // add extra directories: foreach (const QString &dir, extraSearchDirs) - childParser->addDirectory(dir); + childParser->addSearchDir(FilePath::fromString(dir)); testbench.testParsing(input, inputChannel, tasks, childStdOutLines, childStdErrLines, outputLines); // make sure we still have all the original dirs - QStringList newSearchDirs = tester->directories; - foreach (const QString &dir, searchDirs) { + FilePaths newSearchDirs = tester->directories; + foreach (const FilePath &dir, searchDirs) { QVERIFY(newSearchDirs.contains(dir)); newSearchDirs.removeOne(dir); } // make sure we have all additional dirs: foreach (const QString &dir, additionalSearchDirs) { - QVERIFY(newSearchDirs.contains(dir)); - newSearchDirs.removeOne(dir); + const FilePath fp = FilePath::fromString(dir); + QVERIFY(newSearchDirs.contains(fp)); + newSearchDirs.removeOne(fp); } // make sure we have no extra cruft: QVERIFY(newSearchDirs.isEmpty()); delete tester; } -void ProjectExplorerPlugin::testGnuMakeParserTaskMangling_data() -{ - QTest::addColumn<QStringList>("files"); - QTest::addColumn<QStringList>("searchDirectories"); - QTest::addColumn<Task>("inputTask"); - QTest::addColumn<Task>("outputTask"); - - QTest::newRow("no filename") - << QStringList() - << QStringList() - << Task(CompileTask(Task::Error, - "no filename, no mangling")) - << Task(CompileTask(Task::Error, - "no filename, no mangling")); - - QTest::newRow("no mangling") - << QStringList() - << QStringList() - << Task(CompileTask(Task::Error, - "unknown filename, no mangling", - FilePath::fromUserInput("some/path/unknown.cpp"))) - << Task(CompileTask(Task::Error, - "unknown filename, no mangling", - FilePath::fromUserInput("some/path/unknown.cpp"))); - - QTest::newRow("find file") - << QStringList("test/file.cpp") - << QStringList("test") - << Task(CompileTask(Task::Error, - "mangling", - FilePath::fromUserInput("file.cpp"), - 10)) - << Task(CompileTask(Task::Error, - "mangling", - FilePath::fromUserInput("$TMPDIR/test/file.cpp"), - 10)); -} - void ProjectExplorerPlugin::testGnuMakeParserTaskMangling() { + TemporaryFile theMakeFile("Makefile.XXXXXX"); + QVERIFY2(theMakeFile.open(), qPrintable(theMakeFile.errorString())); + QFileInfo fi(theMakeFile); + QVERIFY2(fi.fileName().startsWith("Makefile"), qPrintable(theMakeFile.fileName())); + OutputParserTester testbench; auto *childParser = new GnuMakeParser; testbench.appendOutputParser(childParser); - - QFETCH(QStringList, files); - QFETCH(QStringList, searchDirectories); - QFETCH(Task, inputTask); - QFETCH(Task, outputTask); - - // setup files: - const QString tempdir - = Utils::TemporaryDirectory::masterDirectoryPath() + '/' + QUuid::createUuid().toString() + '/'; - QDir filedir(tempdir); - foreach (const QString &file, files) { - Q_ASSERT(!file.startsWith('/')); - Q_ASSERT(!file.contains("../")); - - filedir.mkpath(file.left(file.lastIndexOf('/'))); - - QFile tempfile(tempdir + file); - if (!tempfile.open(QIODevice::WriteOnly)) - continue; - tempfile.write("Delete me again!"); - tempfile.close(); - } - - // setup search dirs: - foreach (const QString &dir, searchDirectories) { - Q_ASSERT(!dir.startsWith(QLatin1Char('/'))); - Q_ASSERT(!dir.contains(QLatin1String("../"))); - childParser->addDirectory(tempdir + dir); - } - - // fix up output task file: - QString filePath = outputTask.file.toString(); - if (filePath.startsWith(QLatin1String("$TMPDIR/"))) - outputTask.file = Utils::FilePath::fromString(filePath.replace(QLatin1String("$TMPDIR/"), tempdir)); - - // test mangling: - testbench.testTaskMangling(inputTask, outputTask); - - // clean up: - foreach (const QString &file, files) - filedir.rmpath(tempdir + file); + childParser->addSearchDir(FilePath::fromString(fi.absolutePath())); + testbench.testParsing( + fi.fileName() + ":360: *** missing separator (did you mean TAB instead of 8 spaces?). Stop.", + OutputParserTester::STDERR, + {BuildSystemTask(Task::Error, + "missing separator (did you mean TAB instead of 8 spaces?). Stop.", + FilePath::fromString(theMakeFile.fileName()), 360)}, + QString(), QString(), QString()); } } // ProjectExplorer |