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

@@ -57,6 +57,7 @@ ConnectionServer::ConnectionServer(const QString &connectionName)
ConnectionServer::~ConnectionServer()
{
killTimer(aliveTimerId);
removeServer();
}

View File

@@ -38,11 +38,9 @@
namespace ClangBackEnd {
DiagnosticsChangedMessage::DiagnosticsChangedMessage(const FileContainer &file,
const QVector<DiagnosticContainer> &diagnostics,
quint32 documentRevision)
const QVector<DiagnosticContainer> &diagnostics)
: file_(file),
diagnostics_(diagnostics),
documentRevision_(documentRevision)
diagnostics_(diagnostics)
{
}
@@ -56,16 +54,10 @@ const QVector<DiagnosticContainer> &DiagnosticsChangedMessage::diagnostics() con
return diagnostics_;
}
quint32 DiagnosticsChangedMessage::documentRevision() const
{
return documentRevision_;
}
QDataStream &operator<<(QDataStream &out, const DiagnosticsChangedMessage &message)
{
out << message.file_;
out << message.diagnostics_;
out << message.documentRevision_;
return out;
}
@@ -74,7 +66,6 @@ QDataStream &operator>>(QDataStream &in, DiagnosticsChangedMessage &message)
{
in >> message.file_;
in >> message.diagnostics_;
in >> message.documentRevision_;
return in;
}
@@ -94,8 +85,7 @@ bool operator<(const DiagnosticsChangedMessage &first, const DiagnosticsChangedM
QDebug operator<<(QDebug debug, const DiagnosticsChangedMessage &message)
{
debug.nospace() << "DiagnosticsChangedMessage("
<< message.file_ << QStringLiteral(", ")
<< message.documentRevision_
<< message.file_
<< ")";
return debug;

View File

@@ -51,17 +51,14 @@ class CMBIPC_EXPORT DiagnosticsChangedMessage
public:
DiagnosticsChangedMessage() = default;
DiagnosticsChangedMessage(const FileContainer &file,
const QVector<DiagnosticContainer> &diagnostics,
quint32 documentRevision);
const QVector<DiagnosticContainer> &diagnostics);
const FileContainer &file() const;
const QVector<DiagnosticContainer> &diagnostics() const;
quint32 documentRevision() const;
private:
FileContainer file_;
QVector<DiagnosticContainer> diagnostics_;
quint32 documentRevision_;
};
CMBIPC_EXPORT QDataStream &operator<<(QDataStream &out, const DiagnosticsChangedMessage &message);

View File

@@ -39,17 +39,29 @@
namespace ClangBackEnd {
FileContainer::FileContainer(const Utf8String &fileName,
FileContainer::FileContainer(const Utf8String &filePath,
const Utf8String &projectPartId,
const Utf8String &unsavedFileContent,
bool hasUnsavedFileContent)
: filePath_(fileName),
bool hasUnsavedFileContent,
quint32 documentRevision)
: filePath_(filePath),
projectPartId_(projectPartId),
unsavedFileContent_(unsavedFileContent),
documentRevision_(documentRevision),
hasUnsavedFileContent_(hasUnsavedFileContent)
{
}
FileContainer::FileContainer(const Utf8String &filePath,
const Utf8String &projectPartId,
quint32 documentRevision)
: filePath_(filePath),
projectPartId_(projectPartId),
documentRevision_(documentRevision),
hasUnsavedFileContent_(false)
{
}
const Utf8String &FileContainer::filePath() const
{
return filePath_;
@@ -70,11 +82,17 @@ bool FileContainer::hasUnsavedFileContent() const
return hasUnsavedFileContent_;
}
quint32 FileContainer::documentRevision() const
{
return documentRevision_;
}
QDataStream &operator<<(QDataStream &out, const FileContainer &container)
{
out << container.filePath_;
out << container.projectPartId_;
out << container.unsavedFileContent_;
out << container.documentRevision_;
out << container.hasUnsavedFileContent_;
return out;
@@ -85,6 +103,7 @@ QDataStream &operator>>(QDataStream &in, FileContainer &container)
in >> container.filePath_;
in >> container.projectPartId_;
in >> container.unsavedFileContent_;
in >> container.documentRevision_;
in >> container.hasUnsavedFileContent_;
return in;
@@ -106,9 +125,9 @@ bool operator<(const FileContainer &first, const FileContainer &second)
QDebug operator<<(QDebug debug, const FileContainer &container)
{
debug.nospace() << "FileContainer("
<< container.filePath()
<< ", "
<< container.projectPartId();
<< container.filePath() << ", "
<< container.projectPartId() << ", "
<< container.documentRevision();
if (container.hasUnsavedFileContent()) {
const Utf8String fileWithContent = debugWriteFileForInspection(
@@ -126,9 +145,9 @@ QDebug operator<<(QDebug debug, const FileContainer &container)
void PrintTo(const FileContainer &container, ::std::ostream* os)
{
*os << "FileContainer("
<< container.filePath().constData()
<< ", "
<< container.projectPartId().constData();
<< container.filePath().constData() << ", "
<< container.projectPartId().constData() << ", "
<< container.documentRevision();
if (container.hasUnsavedFileContent())
*os << ", "

View File

@@ -50,17 +50,23 @@ public:
FileContainer(const Utf8String &filePath,
const Utf8String &projectPartId,
const Utf8String &unsavedFileContent = Utf8String(),
bool hasUnsavedFileContent = false);
bool hasUnsavedFileContent = false,
quint32 documentRevision = 0);
FileContainer(const Utf8String &filePath,
const Utf8String &projectPartId,
quint32 documentRevision);
const Utf8String &filePath() const;
const Utf8String &projectPartId() const;
const Utf8String &unsavedFileContent() const;
bool hasUnsavedFileContent() const;
quint32 documentRevision() const;
private:
Utf8String filePath_;
Utf8String projectPartId_;
Utf8String unsavedFileContent_;
quint32 documentRevision_;
bool hasUnsavedFileContent_ = false;
};

View File

@@ -35,10 +35,8 @@
namespace ClangBackEnd {
RequestDiagnosticsMessage::RequestDiagnosticsMessage(const FileContainer &file,
quint32 documentRevision)
: file_(file),
documentRevision_(documentRevision)
RequestDiagnosticsMessage::RequestDiagnosticsMessage(const FileContainer &file)
: file_(file)
{
}
@@ -47,15 +45,9 @@ const FileContainer RequestDiagnosticsMessage::file() const
return file_;
}
quint32 RequestDiagnosticsMessage::documentRevision() const
{
return documentRevision_;
}
QDataStream &operator<<(QDataStream &out, const RequestDiagnosticsMessage &message)
{
out << message.file_;
out << message.documentRevision_;
return out;
}
@@ -63,14 +55,13 @@ QDataStream &operator<<(QDataStream &out, const RequestDiagnosticsMessage &messa
QDataStream &operator>>(QDataStream &in, RequestDiagnosticsMessage &message)
{
in >> message.file_;
in >> message.documentRevision_;
return in;
}
bool operator==(const RequestDiagnosticsMessage &first, const RequestDiagnosticsMessage &second)
{
return first.file_ == second.file_ && first.documentRevision_ == second.documentRevision_;
return first.file_ == second.file_;
}
bool operator<(const RequestDiagnosticsMessage &first, const RequestDiagnosticsMessage &second)
@@ -81,8 +72,7 @@ bool operator<(const RequestDiagnosticsMessage &first, const RequestDiagnosticsM
QDebug operator<<(QDebug debug, const RequestDiagnosticsMessage &message)
{
debug.nospace() << "RequestDiagnosticsMessage("
<< message.file() << ", "
<< message.documentRevision()
<< message.file()
<< ")";
return debug;

View File

@@ -46,10 +46,9 @@ class CMBIPC_EXPORT RequestDiagnosticsMessage
public:
RequestDiagnosticsMessage() = default;
RequestDiagnosticsMessage(const FileContainer &file, quint32 documentRevision);
RequestDiagnosticsMessage(const FileContainer &file);
const FileContainer file() const;
quint32 documentRevision() const;
private:
FileContainer file_;