Clang: Fix updating dependencies

...if the registered document comes with unsaved content.

This can easily happen if the document is opened and modified by a
refactoring action.

Task-number: QTCREATORBUG-17295
Change-Id: I3a95fb495b6122248ceaa80985e838851ba2c0e5
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Nikolai Kosjar
2016-11-22 16:41:01 +01:00
parent 6cf1f7968f
commit c4d9f6ac3f
4 changed files with 24 additions and 1 deletions

View File

@@ -364,6 +364,11 @@ const QSet<Utf8String> Document::dependedFilePaths() const
return d->dependedFilePaths;
}
void Document::setDependedFilePaths(const QSet<Utf8String> &filePaths)
{
d->dependedFilePaths = filePaths;
}
void Document::setDirty()
{
d->needsToBeReparsedChangeTimePoint = Clock::now();

View File

@@ -111,6 +111,7 @@ public: // for tests
void parse() const;
void reparse() const;
const QSet<Utf8String> dependedFilePaths() const;
void setDependedFilePaths(const QSet<Utf8String> &filePaths);
TranslationUnitUpdater createUpdater() const;
void setHasParseOrReparseFailed(bool hasFailed);
TimePoint isNeededReparseChangeTimePoint() const;

View File

@@ -64,8 +64,12 @@ std::vector<Document> Documents::create(const QVector<FileContainer> &fileContai
std::vector<Document> createdDocuments;
for (const FileContainer &fileContainer : fileContainers)
for (const FileContainer &fileContainer : fileContainers) {
if (fileContainer.hasUnsavedFileContent())
updateDocumentsWithChangedDependency(fileContainer.filePath());
createdDocuments.push_back(createDocument(fileContainer));
}
return createdDocuments;
}

View File

@@ -73,6 +73,7 @@ protected:
ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::Documents documents{projects, unsavedFiles};
const Utf8String filePath = Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp");
const Utf8String otherFilePath = Utf8StringLiteral(TESTDATA_DIR"/translationunits.h");
const Utf8String headerPath = Utf8StringLiteral(TESTDATA_DIR"/translationunits.h");
const Utf8String nonExistingFilePath = Utf8StringLiteral("foo.cpp");
const Utf8String projectPartId = Utf8StringLiteral("projectPartId");
@@ -121,6 +122,18 @@ TEST_F(Documents, Add)
IsDocument(filePath, projectPartId, 74u));
}
TEST_F(Documents, CreateWithUnsavedContentSetsDependenciesDirty)
{
ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u);
ClangBackEnd::FileContainer fileContainerWithUnsavedContent(otherFilePath, projectPartId, Utf8StringVector(), Utf8String(), true, 2u);
auto dependentDocument = documents.create({fileContainer}).at(0);
dependentDocument.setDependedFilePaths(QSet<Utf8String>() << filePath << otherFilePath);
documents.create({fileContainerWithUnsavedContent});
ASSERT_TRUE(dependentDocument.isNeedingReparse());
}
TEST_F(Documents, AddAndTestCreatedTranslationUnit)
{
ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u);