1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
#pragma once
#include "cppeditor_global.h"
#include "cpptoolsreuse.h"
#include "cppworkingcopy.h"
#include "projectpart.h"
#include <projectexplorer/project.h>
#include <QFutureInterface>
#include <QObject>
#include <QMutex>
namespace ProjectExplorer { class Project; }
namespace CppEditor {
class CPPEDITOR_EXPORT BaseEditorDocumentParser : public QObject
{
Q_OBJECT
public:
using Ptr = QSharedPointer<BaseEditorDocumentParser>;
static Ptr get(const QString &filePath);
struct Configuration {
bool usePrecompiledHeaders = false;
QByteArray editorDefines;
QString preferredProjectPartId;
bool operator==(const Configuration &other)
{
return usePrecompiledHeaders == other.usePrecompiledHeaders
&& editorDefines == other.editorDefines
&& preferredProjectPartId == other.preferredProjectPartId;
}
};
struct UpdateParams {
UpdateParams(const WorkingCopy &workingCopy,
const ProjectExplorer::Project *activeProject,
Utils::Language languagePreference,
bool projectsUpdated)
: workingCopy(workingCopy)
, activeProject(activeProject ? activeProject->projectFilePath() : Utils::FilePath())
, languagePreference(languagePreference)
, projectsUpdated(projectsUpdated)
{
}
WorkingCopy workingCopy;
const Utils::FilePath activeProject;
Utils::Language languagePreference = Utils::Language::Cxx;
bool projectsUpdated = false;
};
public:
BaseEditorDocumentParser(const QString &filePath);
~BaseEditorDocumentParser() override;
QString filePath() const;
Configuration configuration() const;
void setConfiguration(const Configuration &configuration);
void update(const UpdateParams &updateParams);
void update(const QFutureInterface<void> &future, const UpdateParams &updateParams);
ProjectPartInfo projectPartInfo() const;
signals:
void projectPartInfoUpdated(const ProjectPartInfo &projectPartInfo);
protected:
struct State {
QByteArray editorDefines;
ProjectPartInfo projectPartInfo;
};
State state() const;
void setState(const State &state);
static ProjectPartInfo determineProjectPart(const QString &filePath,
const QString &preferredProjectPartId,
const ProjectPartInfo ¤tProjectPartInfo,
const Utils::FilePath &activeProject,
Utils::Language languagePreference,
bool projectsUpdated);
mutable QMutex m_stateAndConfigurationMutex;
private:
virtual void updateImpl(const QFutureInterface<void> &future,
const UpdateParams &updateParams) = 0;
const QString m_filePath;
Configuration m_configuration;
State m_state;
mutable QMutex m_updateIsRunning;
};
} // namespace CppEditor
|