Clang: Reparse only if files are changed

Includes are now watched by a file watcher. Unsaved file changes are
watched too. If they are changed the translation units which depend on
them are set to a state which require a reparse. Later the diagnostics
of this units are collected and send back to creator.

Change-Id: I2fb5c7dd6644687f22399edd8d18edd6215c9505
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
This commit is contained in:
Marco Bubke
2015-08-31 12:40:14 +02:00
parent aa6aaee510
commit f2b7371af1
39 changed files with 800 additions and 242 deletions

View File

@@ -32,7 +32,9 @@
#include <codecompletionsextractor.h>
#include <filecontainer.h>
#include <projectpart.h>
#include <projects.h>
#include <translationunit.h>
#include <translationunits.h>
#include <unsavedfiles.h>
#include <utf8stringvector.h>
@@ -155,14 +157,16 @@ class CodeCompletionsExtractor : public ::testing::Test
{
protected:
ClangBackEnd::ProjectPart project{Utf8StringLiteral("/path/to/projectfile")};
ClangBackEnd::ProjectParts projects;
ClangBackEnd::UnsavedFiles unsavedFiles;
TranslationUnit functionTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_function.cpp"), unsavedFiles, project};
TranslationUnit variableTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_variable.cpp"), unsavedFiles, project};
TranslationUnit classTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_class.cpp"), unsavedFiles, project};
TranslationUnit namespaceTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_namespace.cpp"), unsavedFiles, project};
TranslationUnit enumerationTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_enumeration.cpp"), unsavedFiles, project};
TranslationUnit constructorTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_constructor.cpp"), unsavedFiles, project};
TranslationUnit briefCommentTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_brief_comment.cpp"), unsavedFiles, project};
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles};
TranslationUnit functionTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_function.cpp"), project, translationUnits};
TranslationUnit variableTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_variable.cpp"), project, translationUnits};
TranslationUnit classTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_class.cpp"), project, translationUnits};
TranslationUnit namespaceTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_namespace.cpp"), project, translationUnits};
TranslationUnit enumerationTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_enumeration.cpp"), project, translationUnits};
TranslationUnit constructorTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_constructor.cpp"), project, translationUnits};
TranslationUnit briefCommentTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_brief_comment.cpp"), project, translationUnits};
};
TEST_F(CodeCompletionsExtractor, Function)
@@ -523,12 +527,11 @@ TEST_F(CodeCompletionsExtractor, NotAvailableFunction)
TEST_F(CodeCompletionsExtractor, UnsavedFile)
{
ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::ProjectPart project(Utf8StringLiteral("/path/to/projectfile"));
TranslationUnit translationUnit(Utf8String::fromUtf8(TESTDATA_DIR"/complete_extractor_function.cpp"), unsavedFiles, project);
TranslationUnit translationUnit(Utf8String::fromUtf8(TESTDATA_DIR"/complete_extractor_function.cpp"), project, translationUnits);
unsavedFiles.createOrUpdate({unsavedDataFileContainer(TESTDATA_DIR"/complete_extractor_function.cpp",
TESTDATA_DIR"/complete_extractor_function_unsaved.cpp")});
ClangCodeCompleteResults completeResults(getResults(translationUnit, 20));
unsavedFiles.clear();
::CodeCompletionsExtractor extractor(completeResults.data());
@@ -539,15 +542,14 @@ TEST_F(CodeCompletionsExtractor, UnsavedFile)
TEST_F(CodeCompletionsExtractor, ChangeUnsavedFile)
{
ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::ProjectPart project(Utf8StringLiteral("/path/to/projectfile"));
TranslationUnit translationUnit(Utf8String::fromUtf8(TESTDATA_DIR"/complete_extractor_function.cpp"), unsavedFiles, project);
TranslationUnit translationUnit(Utf8String::fromUtf8(TESTDATA_DIR"/complete_extractor_function.cpp"), project, translationUnits);
unsavedFiles.createOrUpdate({unsavedDataFileContainer(TESTDATA_DIR"/complete_extractor_function.cpp",
TESTDATA_DIR"/complete_extractor_function_unsaved.cpp")});
ClangCodeCompleteResults completeResults(getResults(translationUnit, 20));
unsavedFiles.createOrUpdate({unsavedDataFileContainer(TESTDATA_DIR"/complete_extractor_function.cpp",
TESTDATA_DIR"/complete_extractor_function_unsaved_2.cpp")});
completeResults = getResults(translationUnit, 20);
unsavedFiles.clear();
::CodeCompletionsExtractor extractor(completeResults.data());
@@ -559,7 +561,7 @@ TEST_F(CodeCompletionsExtractor, ChangeUnsavedFile)
TEST_F(CodeCompletionsExtractor, ArgumentDefinition)
{
variableTranslationUnit.cxTranslationUnit();
project.setArguments({Utf8StringLiteral("-DArgumentDefinition")});
project.setArguments({Utf8StringLiteral("-DArgumentDefinition"), Utf8StringLiteral("-std=gnu++14")});
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 35));
::CodeCompletionsExtractor extractor(completeResults.data());
@@ -572,7 +574,7 @@ TEST_F(CodeCompletionsExtractor, ArgumentDefinition)
TEST_F(CodeCompletionsExtractor, NoArgumentDefinition)
{
variableTranslationUnit.cxTranslationUnit();
project.setArguments(Utf8StringVector());
project.setArguments({Utf8StringLiteral("-std=gnu++14")});
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 35));
::CodeCompletionsExtractor extractor(completeResults.data());