Changeset View
Changeset View
Standalone View
Standalone View
plugins/cppcheck/problemmodel.cpp
Show First 20 Lines • Show All 42 Lines • ▼ Show 20 Line(s) | |||||
43 | namespace Strings { | 43 | namespace Strings { | ||
44 | QString problemModelId() { return QStringLiteral("Cppcheck"); } | 44 | QString problemModelId() { return QStringLiteral("Cppcheck"); } | ||
45 | } | 45 | } | ||
46 | 46 | | |||
47 | ProblemModel::ProblemModel(Plugin* plugin) | 47 | ProblemModel::ProblemModel(Plugin* plugin) | ||
48 | : KDevelop::ProblemModel(plugin) | 48 | : KDevelop::ProblemModel(plugin) | ||
49 | , m_plugin(plugin) | 49 | , m_plugin(plugin) | ||
50 | , m_project(nullptr) | 50 | , m_project(nullptr) | ||
51 | , m_pathLocation(KDevelop::DocumentRange::invalid()) | ||||
51 | { | 52 | { | ||
52 | setFeatures(CanDoFullUpdate | ScopeFilter | SeverityFilter | Grouping | CanByPassScopeFilter); | 53 | setFeatures(CanDoFullUpdate | ScopeFilter | SeverityFilter | Grouping | CanByPassScopeFilter); | ||
53 | reset(); | 54 | reset(); | ||
54 | problemModelSet()->addModel(Strings::problemModelId(), i18n("Cppcheck"), this); | 55 | problemModelSet()->addModel(Strings::problemModelId(), i18n("Cppcheck"), this); | ||
55 | } | 56 | } | ||
56 | 57 | | |||
57 | ProblemModel::~ProblemModel() | 58 | ProblemModel::~ProblemModel() | ||
58 | { | 59 | { | ||
59 | problemModelSet()->removeModel(Strings::problemModelId()); | 60 | problemModelSet()->removeModel(Strings::problemModelId()); | ||
60 | } | 61 | } | ||
61 | 62 | | |||
62 | KDevelop::IProject* ProblemModel::project() const | 63 | KDevelop::IProject* ProblemModel::project() const | ||
63 | { | 64 | { | ||
64 | return m_project; | 65 | return m_project; | ||
65 | } | 66 | } | ||
66 | 67 | | |||
67 | void ProblemModel::fixProblemFinalLocation(KDevelop::IProblem::Ptr problem) | 68 | void ProblemModel::fixProblemFinalLocation(KDevelop::IProblem::Ptr problem) | ||
68 | { | 69 | { | ||
69 | // Fix problems with incorrect range, which produced by cppcheck's errors | 70 | // Fix problems with incorrect range, which produced by cppcheck's errors | ||
70 | // without <location> element. In this case location automatically gets "/". | 71 | // without <location> element. In this case location automatically gets "/". | ||
71 | // To avoid this we set project's root path as problem location. | 72 | // To avoid this we set current analysis path as problem location. | ||
72 | 73 | | |||
73 | Q_ASSERT(m_project); | 74 | if (problem->finalLocation().document.isEmpty()) { | ||
74 | 75 | problem->setFinalLocation(m_pathLocation); | |||
75 | auto range = problem->finalLocation(); | | |||
76 | if (range.document.isEmpty()) { | | |||
77 | range.document = KDevelop::IndexedString(m_project->path().toLocalFile()); | | |||
78 | problem->setFinalLocation(range); | | |||
79 | } | 76 | } | ||
80 | 77 | | |||
81 | const auto& diagnostics = problem->diagnostics(); | 78 | const auto& diagnostics = problem->diagnostics(); | ||
82 | for (auto& diagnostic : diagnostics) { | 79 | for (auto& diagnostic : diagnostics) { | ||
83 | fixProblemFinalLocation(diagnostic); | 80 | fixProblemFinalLocation(diagnostic); | ||
84 | } | 81 | } | ||
85 | } | 82 | } | ||
86 | 83 | | |||
87 | bool ProblemModel::problemExists(KDevelop::IProblem::Ptr newProblem) | 84 | bool ProblemModel::problemExists(KDevelop::IProblem::Ptr newProblem) | ||
88 | { | 85 | { | ||
89 | for (auto problem : qAsConst(m_problems)) { | 86 | for (auto problem : qAsConst(m_problems)) { | ||
90 | if (newProblem->source() == problem->source() && | 87 | if (newProblem->source() == problem->source() && | ||
91 | newProblem->severity() == problem->severity() && | 88 | newProblem->severity() == problem->severity() && | ||
92 | newProblem->finalLocation() == problem->finalLocation() && | 89 | newProblem->finalLocation() == problem->finalLocation() && | ||
93 | newProblem->description() == problem->description() && | 90 | newProblem->description() == problem->description() && | ||
94 | newProblem->explanation() == problem->explanation()) | 91 | newProblem->explanation() == problem->explanation()) | ||
95 | return true; | 92 | return true; | ||
96 | } | 93 | } | ||
97 | 94 | | |||
98 | return false; | 95 | return false; | ||
99 | } | 96 | } | ||
100 | 97 | | |||
98 | void ProblemModel::setMessage(const QString& message) | ||||
99 | { | ||||
100 | setPlaceholderText(message, m_pathLocation, i18n("Cppcheck")); | ||||
101 | } | ||||
102 | | ||||
101 | void ProblemModel::addProblems(const QVector<KDevelop::IProblem::Ptr>& problems) | 103 | void ProblemModel::addProblems(const QVector<KDevelop::IProblem::Ptr>& problems) | ||
102 | { | 104 | { | ||
103 | static int maxLength = 0; | 105 | static int maxLength = 0; | ||
104 | 106 | | |||
105 | if (m_problems.isEmpty()) { | 107 | if (m_problems.isEmpty()) { | ||
106 | maxLength = 0; | 108 | maxLength = 0; | ||
107 | } | 109 | } | ||
108 | 110 | | |||
Show All 12 Lines | 122 | if (maxLength < problem->description().length()) { | |||
121 | maxLength = problem->description().length(); | 123 | maxLength = problem->description().length(); | ||
122 | setProblems(m_problems); | 124 | setProblems(m_problems); | ||
123 | } | 125 | } | ||
124 | } | 126 | } | ||
125 | } | 127 | } | ||
126 | 128 | | |||
127 | void ProblemModel::setProblems() | 129 | void ProblemModel::setProblems() | ||
128 | { | 130 | { | ||
131 | setMessage(i18n("Analysis completed, no problems detected.")); | ||||
129 | setProblems(m_problems); | 132 | setProblems(m_problems); | ||
130 | } | 133 | } | ||
131 | 134 | | |||
132 | void ProblemModel::reset() | 135 | void ProblemModel::reset() | ||
133 | { | 136 | { | ||
134 | reset(nullptr, QString()); | 137 | reset(nullptr, QString()); | ||
135 | } | 138 | } | ||
136 | 139 | | |||
137 | void ProblemModel::reset(KDevelop::IProject* project, const QString& path) | 140 | void ProblemModel::reset(KDevelop::IProject* project, const QString& path) | ||
138 | { | 141 | { | ||
139 | m_project = project; | 142 | m_project = project; | ||
143 | | ||||
140 | m_path = path; | 144 | m_path = path; | ||
145 | m_pathLocation.document = KDevelop::IndexedString(m_path); | ||||
141 | 146 | | |||
142 | clearProblems(); | 147 | clearProblems(); | ||
143 | m_problems.clear(); | 148 | m_problems.clear(); | ||
144 | 149 | | |||
145 | QString tooltip = i18nc("@info:tooltip", "Re-Run Last Cppcheck Analysis"); | 150 | QString tooltip; | ||
146 | if (m_project) { | 151 | if (m_project) { | ||
147 | tooltip += QStringLiteral(" (%1)").arg(prettyPathName(m_path)); | 152 | setMessage(i18n("Analysis started...")); | ||
153 | tooltip = i18nc("@info:tooltip %1 is the path of the file", "Re-run last Cppcheck analysis (%1)", prettyPathName(m_path)); | ||||
154 | } else { | ||||
155 | tooltip = i18nc("@info:tooltip", "Re-run last Cppcheck analysis"); | ||||
kfunk: Tooltips have no title-capitalization.
-> "Re-run last Cppcheck analysis" | |||||
148 | } | 156 | } | ||
157 | | ||||
149 | setFullUpdateTooltip(tooltip); | 158 | setFullUpdateTooltip(tooltip); | ||
150 | } | 159 | } | ||
151 | 160 | | |||
152 | void ProblemModel::show() | 161 | void ProblemModel::show() | ||
153 | { | 162 | { | ||
154 | problemModelSet()->showModel(Strings::problemModelId()); | 163 | problemModelSet()->showModel(Strings::problemModelId()); | ||
155 | } | 164 | } | ||
156 | 165 | | |||
157 | void ProblemModel::forceFullUpdate() | 166 | void ProblemModel::forceFullUpdate() | ||
158 | { | 167 | { | ||
159 | if (m_project && !m_plugin->isRunning()) { | 168 | if (m_project && !m_plugin->isRunning()) { | ||
160 | m_plugin->runCppcheck(m_project, m_path); | 169 | m_plugin->runCppcheck(m_project, m_path); | ||
161 | } | 170 | } | ||
162 | } | 171 | } | ||
163 | 172 | | |||
164 | } | 173 | } |
Tooltips have no title-capitalization.
-> "Re-run last Cppcheck analysis"