forked from qt-creator/qt-creator
Clang: Avoid needless reparse after first parse
Change-Id: Ie97818f29d1df61380cd1c22ef2598091050b10d Reviewed-by: Marco Bubke <marco.bubke@theqtcompany.com>
This commit is contained in:
@@ -84,7 +84,7 @@ public:
|
|||||||
CXIndex index = nullptr;
|
CXIndex index = nullptr;
|
||||||
uint documentRevision = 0;
|
uint documentRevision = 0;
|
||||||
bool needsToBeReparsed = false;
|
bool needsToBeReparsed = false;
|
||||||
bool hasNewDiagnostics = false;
|
bool hasNewDiagnostics = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
TranslationUnitData::TranslationUnitData(const Utf8String &filePath,
|
TranslationUnitData::TranslationUnitData(const Utf8String &filePath,
|
||||||
|
@@ -62,10 +62,8 @@ void TranslationUnits::create(const QVector<FileContainer> &fileContainers)
|
|||||||
{
|
{
|
||||||
checkIfTranslationUnitsDoesNotExists(fileContainers);
|
checkIfTranslationUnitsDoesNotExists(fileContainers);
|
||||||
|
|
||||||
for (const FileContainer &fileContainer : fileContainers) {
|
for (const FileContainer &fileContainer : fileContainers)
|
||||||
createTranslationUnit(fileContainer);
|
createTranslationUnit(fileContainer);
|
||||||
updateTranslationUnitsWithChangedDependency(fileContainer.filePath());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TranslationUnits::update(const QVector<FileContainer> &fileContainers)
|
void TranslationUnits::update(const QVector<FileContainer> &fileContainers)
|
||||||
|
@@ -77,11 +77,18 @@ using ClangBackEnd::TranslationUnitDoesNotExistMessage;
|
|||||||
using ClangBackEnd::ProjectPartsDoNotExistMessage;
|
using ClangBackEnd::ProjectPartsDoNotExistMessage;
|
||||||
using ClangBackEnd::UpdateTranslationUnitsForEditorMessage;
|
using ClangBackEnd::UpdateTranslationUnitsForEditorMessage;
|
||||||
|
|
||||||
MATCHER_P3(HasDirtyTranslationUnit, filePath, projectPartId, documentRevision,
|
MATCHER_P5(HasDirtyTranslationUnit,
|
||||||
|
filePath,
|
||||||
|
projectPartId,
|
||||||
|
documentRevision,
|
||||||
|
isNeedingReparse,
|
||||||
|
hasNewDiagnostics,
|
||||||
std::string(negation ? "isn't" : "is")
|
std::string(negation ? "isn't" : "is")
|
||||||
+ " translation unit with file path "+ PrintToString(filePath)
|
+ " translation unit with file path "+ PrintToString(filePath)
|
||||||
+ " and project " + PrintToString(projectPartId)
|
+ " and project " + PrintToString(projectPartId)
|
||||||
+ " and document revision " + PrintToString(documentRevision)
|
+ " and document revision " + PrintToString(documentRevision)
|
||||||
|
+ " and isNeedingReparse = " + PrintToString(isNeedingReparse)
|
||||||
|
+ " and hasNewDiagnostics = " + PrintToString(hasNewDiagnostics)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
auto &&translationUnits = arg.translationUnitsForTestOnly();
|
auto &&translationUnits = arg.translationUnitsForTestOnly();
|
||||||
@@ -89,16 +96,24 @@ MATCHER_P3(HasDirtyTranslationUnit, filePath, projectPartId, documentRevision,
|
|||||||
auto translationUnit = translationUnits.translationUnit(filePath, projectPartId);
|
auto translationUnit = translationUnits.translationUnit(filePath, projectPartId);
|
||||||
|
|
||||||
if (translationUnit.documentRevision() == documentRevision) {
|
if (translationUnit.documentRevision() == documentRevision) {
|
||||||
if (translationUnit.hasNewDiagnostics()) {
|
|
||||||
if (translationUnit.isNeedingReparse())
|
|
||||||
return true;
|
|
||||||
|
|
||||||
|
if (translationUnit.hasNewDiagnostics() && !hasNewDiagnostics) {
|
||||||
|
*result_listener << "hasNewDiagnostics is true";
|
||||||
|
return false;
|
||||||
|
} else if (!translationUnit.hasNewDiagnostics() && hasNewDiagnostics) {
|
||||||
|
*result_listener << "hasNewDiagnostics is false";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (translationUnit.isNeedingReparse() && !isNeedingReparse) {
|
||||||
|
*result_listener << "isNeedingReparse is true";
|
||||||
|
return false;
|
||||||
|
} else if (!translationUnit.isNeedingReparse() && isNeedingReparse) {
|
||||||
*result_listener << "isNeedingReparse is false";
|
*result_listener << "isNeedingReparse is false";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
*result_listener << "hasNewDiagnostics is false";
|
return true;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*result_listener << "revision number is " << PrintToString(translationUnit.documentRevision());
|
*result_listener << "revision number is " << PrintToString(translationUnit.documentRevision());
|
||||||
@@ -406,8 +421,18 @@ TEST_F(ClangIpcServer, TicketNumberIsForwarded)
|
|||||||
clangServer.completeCode(completeCodeMessage);
|
clangServer.completeCode(completeCodeMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ClangIpcServer, TranslationUnitIsDirtyAfterCreation)
|
TEST_F(ClangIpcServer, TranslationUnitAfterCreationNeedsNoReparseAndHasNewDiagnostics)
|
||||||
{
|
{
|
||||||
ASSERT_THAT(clangServer, HasDirtyTranslationUnit(functionTestFilePath, projectPartId, 0));
|
ASSERT_THAT(clangServer, HasDirtyTranslationUnit(functionTestFilePath, projectPartId, 0U, false, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(ClangIpcServer, TranslationUnitAfterUpdateNeedsReparseAndHasNewDiagnostics)
|
||||||
|
{
|
||||||
|
const auto fileContainer = FileContainer(functionTestFilePath, projectPartId,unsavedContent(unsavedTestFilePath), true, 1);
|
||||||
|
|
||||||
|
clangServer.updateTranslationUnitsForEditor({{fileContainer}});
|
||||||
|
|
||||||
|
ASSERT_THAT(clangServer, HasDirtyTranslationUnit(functionTestFilePath, projectPartId, 1U, true, true));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -194,6 +194,38 @@ TEST_F(TranslationUnit, DependedFilePaths)
|
|||||||
Contains(Utf8StringLiteral(TESTDATA_DIR"/translationunits.h"))));
|
Contains(Utf8StringLiteral(TESTDATA_DIR"/translationunits.h"))));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(TranslationUnit, NeedsNoReparseAfterCreation)
|
||||||
|
{
|
||||||
|
translationUnit.cxTranslationUnit();
|
||||||
|
|
||||||
|
ASSERT_FALSE(translationUnit.isNeedingReparse());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(TranslationUnit, HasNewDiagnosticsAfterCreation)
|
||||||
|
{
|
||||||
|
translationUnit.cxTranslationUnit();
|
||||||
|
|
||||||
|
ASSERT_TRUE(translationUnit.hasNewDiagnostics());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(TranslationUnit, NeedsReparseAfterChangeOfMainFile)
|
||||||
|
{
|
||||||
|
translationUnit.cxTranslationUnit();
|
||||||
|
|
||||||
|
translationUnit.setDirtyIfDependencyIsMet(translationUnitFilePath);
|
||||||
|
|
||||||
|
ASSERT_TRUE(translationUnit.isNeedingReparse());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(TranslationUnit, HasNewDiagnosticsAfterChangeOfMainFile)
|
||||||
|
{
|
||||||
|
translationUnit.cxTranslationUnit();
|
||||||
|
|
||||||
|
translationUnit.setDirtyIfDependencyIsMet(translationUnitFilePath);
|
||||||
|
|
||||||
|
ASSERT_TRUE(translationUnit.hasNewDiagnostics());
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(TranslationUnit, NoNeedForReparsingForIndependendFile)
|
TEST_F(TranslationUnit, NoNeedForReparsingForIndependendFile)
|
||||||
{
|
{
|
||||||
translationUnit.cxTranslationUnit();
|
translationUnit.cxTranslationUnit();
|
||||||
@@ -234,6 +266,7 @@ TEST_F(TranslationUnit, NeedsNoReparsingAfterReparsing)
|
|||||||
TEST_F(TranslationUnit, HasNoNewDiagnosticsForIndependendFile)
|
TEST_F(TranslationUnit, HasNoNewDiagnosticsForIndependendFile)
|
||||||
{
|
{
|
||||||
translationUnit.cxTranslationUnit();
|
translationUnit.cxTranslationUnit();
|
||||||
|
translationUnit.diagnostics(); // Reset hasNewDiagnostics
|
||||||
|
|
||||||
translationUnit.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/otherfiles.h"));
|
translationUnit.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/otherfiles.h"));
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user