diff --git a/src/tools/clangbackend/ipcsource/commandlinearguments.cpp b/src/tools/clangbackend/ipcsource/commandlinearguments.cpp index 120fe9e2101..41c80430be9 100644 --- a/src/tools/clangbackend/ipcsource/commandlinearguments.cpp +++ b/src/tools/clangbackend/ipcsource/commandlinearguments.cpp @@ -30,9 +30,12 @@ #include "commandlinearguments.h" +#include + namespace ClangBackEnd { -CommandLineArguments::CommandLineArguments(const std::vector &projectPartArguments, +CommandLineArguments::CommandLineArguments(const char *filePath, + const std::vector &projectPartArguments, const Utf8StringVector &fileArguments, bool addVerboseOption) { @@ -46,6 +49,7 @@ CommandLineArguments::CommandLineArguments(const std::vector &proj m_arguments.push_back(argument.constData()); if (addVerboseOption) m_arguments.push_back("-v"); + m_arguments.push_back(filePath); } const char * const *CommandLineArguments::data() const @@ -58,4 +62,19 @@ int CommandLineArguments::count() const return int(m_arguments.size()); } +const char *CommandLineArguments::at(int position) const +{ + return m_arguments.at(uint(position)); +} + +void CommandLineArguments::print() const +{ + using namespace std; + + cerr << "Arguments to libclang:"; + for (const auto &argument : m_arguments) + cerr << ' ' << argument; + cerr << endl; +} + } // namespace ClangBackEnd diff --git a/src/tools/clangbackend/ipcsource/commandlinearguments.h b/src/tools/clangbackend/ipcsource/commandlinearguments.h index a7a4e5aafd9..225b6407b30 100644 --- a/src/tools/clangbackend/ipcsource/commandlinearguments.h +++ b/src/tools/clangbackend/ipcsource/commandlinearguments.h @@ -40,12 +40,16 @@ namespace ClangBackEnd { class CommandLineArguments { public: - CommandLineArguments(const std::vector &projectPartArguments, + CommandLineArguments(const char *filePath, + const std::vector &projectPartArguments, const Utf8StringVector &fileArguments, bool addVerboseOption); const char * const *data() const; int count() const; + const char * at(int position) const; + + void print() const; private: std::vector m_arguments; diff --git a/src/tools/clangbackend/ipcsource/translationunit.cpp b/src/tools/clangbackend/ipcsource/translationunit.cpp index 5740c854463..1f483244bf1 100644 --- a/src/tools/clangbackend/ipcsource/translationunit.cpp +++ b/src/tools/clangbackend/ipcsource/translationunit.cpp @@ -276,11 +276,12 @@ void TranslationUnit::createTranslationUnitIfNeeded() const if (!d->translationUnit) { d->translationUnit = CXTranslationUnit(); - const bool verboseMode = isVerboseModeEnabled(); - const CommandLineArguments args(d->projectPart.arguments(), d->fileArguments, verboseMode); + const auto args = commandLineArguments(); + if (isVerboseModeEnabled()) + args.print(); CXErrorCode errorCode = clang_parseTranslationUnit2(index(), - d->filePath.constData(), + NULL, args.data(), args.count(), unsavedFiles().cxUnsavedFiles(), @@ -292,7 +293,6 @@ void TranslationUnit::createTranslationUnitIfNeeded() const updateIncludeFilePaths(); - updateLastProjectPartChangeTimePoint(); } } @@ -356,6 +356,14 @@ void TranslationUnit::updateIncludeFilePaths() const d->translationUnits.addWatchedFiles(d->dependedFilePaths); } +CommandLineArguments TranslationUnit::commandLineArguments() const +{ + return CommandLineArguments(d->filePath.constData(), + d->projectPart.arguments(), + d->fileArguments, + isVerboseModeEnabled()); +} + uint TranslationUnit::defaultOptions() { return CXTranslationUnit_CacheCompletionResults diff --git a/src/tools/clangbackend/ipcsource/translationunit.h b/src/tools/clangbackend/ipcsource/translationunit.h index afad398b22f..0b22359d744 100644 --- a/src/tools/clangbackend/ipcsource/translationunit.h +++ b/src/tools/clangbackend/ipcsource/translationunit.h @@ -52,6 +52,7 @@ class ProjectPart; class DiagnosticSet; class FileContainer; class TranslationUnits; +class CommandLineArguments; using time_point = std::chrono::steady_clock::time_point; @@ -106,6 +107,8 @@ public: void setDirtyIfDependencyIsMet(const Utf8String &filePath); + CommandLineArguments commandLineArguments() const; + private: void checkIfNull() const; void checkIfFileExists() const; diff --git a/tests/unit/unittest/translationunittest.cpp b/tests/unit/unittest/translationunittest.cpp index ebd5027b9dc..452aa171aec 100644 --- a/tests/unit/unittest/translationunittest.cpp +++ b/tests/unit/unittest/translationunittest.cpp @@ -28,6 +28,7 @@ ** ****************************************************************************/ +#include #include #include #include @@ -61,6 +62,7 @@ using ClangBackEnd::TranslationUnits; using testing::IsNull; using testing::NotNull; +using testing::Eq; using testing::Gt; using testing::Contains; using testing::EndsWith; @@ -148,6 +150,13 @@ TEST_F(TranslationUnit, ResetedTranslationUnitIsNull) ASSERT_TRUE(translationUnit.isNull()); } +TEST_F(TranslationUnit, LastCommandLineArgumentIsFilePath) +{ + const auto arguments = translationUnit.commandLineArguments(); + + ASSERT_THAT(arguments.at(arguments.count() - 1), Eq(translationUnitFilePath)); +} + TEST_F(TranslationUnit, TimeStampForProjectPartChangeIsUpdatedAsNewCxTranslationUnitIsGenerated) { auto lastChangeTimePoint = translationUnit.lastProjectPartChangeTimePoint();