diff --git a/src/tools/clangbackend/ipcsource/translationunit.cpp b/src/tools/clangbackend/ipcsource/translationunit.cpp index 5aa1a086d91162a20306f782edbbfdf768909744..55e14bca55d39bee309e445f82e6a3f0851f5a38 100644 --- a/src/tools/clangbackend/ipcsource/translationunit.cpp +++ b/src/tools/clangbackend/ipcsource/translationunit.cpp @@ -213,7 +213,7 @@ const QSet<Utf8String> &TranslationUnit::dependedFilePaths() const void TranslationUnit::setDirtyIfDependencyIsMet(const Utf8String &filePath) { - if (d->dependedFilePaths.contains(filePath)) { + if (d->dependedFilePaths.contains(filePath) && isMainFileAndExistsOrIsOtherFile(filePath)) { d->needsToBeReparsed = true; d->hasNewDiagnostics = true; } @@ -249,6 +249,14 @@ bool TranslationUnit::projectPartIsOutdated() const return d->projectPart.lastChangeTimePoint() >= d->lastProjectPartChangeTimePoint; } +bool TranslationUnit::isMainFileAndExistsOrIsOtherFile(const Utf8String &filePath) const +{ + if (filePath == d->filePath) + return QFileInfo::exists(d->filePath); + + return true; +} + void TranslationUnit::createTranslationUnitIfNeeded() const { if (!d->translationUnit) { diff --git a/src/tools/clangbackend/ipcsource/translationunit.h b/src/tools/clangbackend/ipcsource/translationunit.h index f2b4a261a987c9cd7a9544d5b565c8a6a8d121b4..2bd1f153a0aec51d893da3c1ddc5592ca945480b 100644 --- a/src/tools/clangbackend/ipcsource/translationunit.h +++ b/src/tools/clangbackend/ipcsource/translationunit.h @@ -111,6 +111,7 @@ private: void updateLastProjectPartChangeTimePoint() const; void removeTranslationUnitIfProjectPartWasChanged() const; bool projectPartIsOutdated() const; + bool isMainFileAndExistsOrIsOtherFile(const Utf8String &filePath) const; void createTranslationUnitIfNeeded() const; void checkTranslationUnitErrorCode(CXErrorCode errorCode) const; void reparseTranslationUnit() const; diff --git a/tests/unit/unittest/translationunittest.cpp b/tests/unit/unittest/translationunittest.cpp index 4bf26bff393c1eda5d5e13653d591e24cd62151e..f03ff8899910642cda595b9f6f943c9856104599 100644 --- a/tests/unit/unittest/translationunittest.cpp +++ b/tests/unit/unittest/translationunittest.cpp @@ -48,6 +48,8 @@ #include <gtest/gtest.h> #include "gtest-qt-printing.h" +#include <QTemporaryFile> + #include <chrono> #include <thread> @@ -68,12 +70,18 @@ namespace { class TranslationUnit : public ::testing::Test { +protected: + ::TranslationUnit createTemporaryTranslationUnit(); + QByteArray readContentFromTranslationUnitFile() const; + protected: ClangBackEnd::ProjectParts projects; + ProjectPart projectPart{Utf8StringLiteral("/path/to/projectfile")}; + Utf8String translationUnitFilePath = Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp"); ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; - ::TranslationUnit translationUnit{Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp"), - ProjectPart(Utf8StringLiteral("/path/to/projectfile")), + ::TranslationUnit translationUnit{translationUnitFilePath, + projectPart, translationUnits}; }; @@ -86,13 +94,13 @@ TEST_F(TranslationUnit, DefaultTranslationUnitIsInvalid) TEST_F(TranslationUnit, ThrowExceptionForNonExistingFilePath) { - ASSERT_THROW(::TranslationUnit(Utf8StringLiteral("file.cpp"), ProjectPart(Utf8StringLiteral("/path/to/projectfile")), translationUnits), + ASSERT_THROW(::TranslationUnit(Utf8StringLiteral("file.cpp"), projectPart, translationUnits), ClangBackEnd::TranslationUnitFileNotExitsException); } TEST_F(TranslationUnit, ThrowNoExceptionForNonExistingFilePathIfDoNotCheckIfFileExistsIsSet) { - ASSERT_NO_THROW(::TranslationUnit(Utf8StringLiteral("file.cpp"), ProjectPart(Utf8StringLiteral("/path/to/projectfile")), translationUnits, ::TranslationUnit::DoNotCheckIfFileExists)); + ASSERT_NO_THROW(::TranslationUnit(Utf8StringLiteral("file.cpp"), projectPart, translationUnits, ::TranslationUnit::DoNotCheckIfFileExists)); } TEST_F(TranslationUnit, TranslationUnitIsValid) @@ -172,7 +180,7 @@ TEST_F(TranslationUnit, DocumentRevisionInFileContainerGetter) TEST_F(TranslationUnit, DependedFilePaths) { ASSERT_THAT(translationUnit.dependedFilePaths(), - AllOf(Contains(Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp")), + AllOf(Contains(translationUnitFilePath), Contains(Utf8StringLiteral(TESTDATA_DIR"/translationunits.h")))); } @@ -198,7 +206,7 @@ TEST_F(TranslationUnit, NeedsReparsingForMainFile) { translationUnit.cxTranslationUnit(); - translationUnit.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp")); + translationUnit.setDirtyIfDependencyIsMet(translationUnitFilePath); ASSERT_TRUE(translationUnit.isNeedingReparse()); } @@ -235,7 +243,7 @@ TEST_F(TranslationUnit, HasNewDiagnosticsForMainFile) { translationUnit.cxTranslationUnit(); - translationUnit.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp")); + translationUnit.setDirtyIfDependencyIsMet(translationUnitFilePath); ASSERT_TRUE(translationUnit.hasNewDiagnostics()); } @@ -243,20 +251,41 @@ TEST_F(TranslationUnit, HasNewDiagnosticsForMainFile) TEST_F(TranslationUnit, HasNoNewDiagnosticsAfterGettingDiagnostics) { translationUnit.cxTranslationUnit(); - translationUnit.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp")); + translationUnit.setDirtyIfDependencyIsMet(translationUnitFilePath); translationUnit.diagnostics(); ASSERT_FALSE(translationUnit.hasNewDiagnostics()); } -//TEST_F(TranslationUnit, ThrowParseErrorForWrongArguments) -//{ -// ProjectPart project(Utf8StringLiteral("/path/to/projectfile")); -// project.setArguments({Utf8StringLiteral("-fblah")}); -// TranslationUnit translationUnit(Utf8StringLiteral(TESTDATA_DIR"/complete_testfile_1.cpp"), unsavedFiles, project); +TEST_F(TranslationUnit, DeletedFileShouldBeNotSetDirty) +{ + auto translationUnit = createTemporaryTranslationUnit(); + + translationUnit.setDirtyIfDependencyIsMet(translationUnit.filePath()); -// ASSERT_THROW(translationUnit.cxTranslationUnit(), ClangBackEnd::TranslationUnitParseErrorException); -//} + ASSERT_FALSE(translationUnit.isNeedingReparse()); +} +::TranslationUnit TranslationUnit::createTemporaryTranslationUnit() +{ + QTemporaryFile temporaryFile; + EXPECT_TRUE(temporaryFile.open()); + EXPECT_TRUE(temporaryFile.write(readContentFromTranslationUnitFile())); + ::TranslationUnit translationUnit(temporaryFile.fileName(), + projectPart, + translationUnits); + +return translationUnit; } + +QByteArray TranslationUnit::readContentFromTranslationUnitFile() const +{ + QFile contentFile(translationUnitFilePath); + EXPECT_TRUE(contentFile.open(QIODevice::ReadOnly)); + + return contentFile.readAll(); +} + +} +