Remark was added to clang tooling Diagnostic

The diff adds Remark to Diagnostic::Level for clang tooling. That makes
Remark diagnostic level ready to use in clang-tidy checks: the
clang-diagnostic-module-import becomes visible as a part of the change.
This commit is contained in:
Ivan Murashko 2021-05-24 11:21:44 -04:00 committed by Aaron Ballman
parent dcaca7206e
commit 7f2f0247f8
7 changed files with 47 additions and 6 deletions

View File

@ -446,6 +446,9 @@ void ClangTidyDiagnosticConsumer::HandleDiagnostic(
case DiagnosticsEngine::Warning:
CheckName = "clang-diagnostic-warning";
break;
case DiagnosticsEngine::Remark:
CheckName = "clang-diagnostic-remark";
break;
default:
CheckName = "clang-diagnostic-unknown";
break;
@ -460,7 +463,10 @@ void ClangTidyDiagnosticConsumer::HandleDiagnostic(
Level = ClangTidyError::Error;
LastErrorRelatesToUserCode = true;
LastErrorPassesLineFilter = true;
} else if (DiagLevel == DiagnosticsEngine::Remark) {
Level = ClangTidyError::Remark;
}
bool IsWarningAsError = DiagLevel == DiagnosticsEngine::Warning &&
Context.treatAsError(CheckName);
Errors.emplace_back(CheckName, Level, Context.getCurrentBuildDirectory(),

View File

@ -0,0 +1 @@
// A

View File

@ -0,0 +1 @@
module A { header "A.h" }

View File

@ -0,0 +1,15 @@
// RUN: rm -rf %t
// RUN: cp -r %S/Inputs/remarks %t
// RUN: cp %s %t/t.cpp
// RUN: clang-tidy -checks='-*,modernize-use-override,clang-diagnostic-module-import' t.cpp -- \
// RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache \
// RUN: -fsyntax-only \
// RUN: -I%S/Inputs/remarks \
// RUN: -working-directory=%t \
// RUN: -Rmodule-build -Rmodule-import t.cpp 2>&1 |\
// RUN: FileCheck %s -implicit-check-not "remark:"
#include "A.h"
// CHECK: remark: importing module 'A' from {{.*}} [clang-diagnostic-module-import]

View File

@ -67,6 +67,7 @@ struct DiagnosticMessage {
/// fixes to be applied.
struct Diagnostic {
enum Level {
Remark = DiagnosticsEngine::Remark,
Warning = DiagnosticsEngine::Warning,
Error = DiagnosticsEngine::Error
};

View File

@ -106,6 +106,7 @@ template <> struct ScalarEnumerationTraits<clang::tooling::Diagnostic::Level> {
static void enumeration(IO &IO, clang::tooling::Diagnostic::Level &Value) {
IO.enumCase(Value, "Warning", clang::tooling::Diagnostic::Warning);
IO.enumCase(Value, "Error", clang::tooling::Diagnostic::Error);
IO.enumCase(Value, "Remark", clang::tooling::Diagnostic::Remark);
}
};

View File

@ -47,10 +47,11 @@ static Diagnostic makeDiagnostic(StringRef DiagnosticName,
const std::string &Message, int FileOffset,
const std::string &FilePath,
const StringMap<Replacements> &Fix,
const SmallVector<FileByteRange, 1> &Ranges) {
const SmallVector<FileByteRange, 1> &Ranges,
Diagnostic::Level DiagnosticLevel) {
return Diagnostic(DiagnosticName,
makeMessage(Message, FileOffset, FilePath, Fix, Ranges), {},
Diagnostic::Warning, "path/to/build/directory");
DiagnosticLevel, "path/to/build/directory");
}
static const char *YAMLContent =
@ -102,6 +103,14 @@ static const char *YAMLContent =
" Replacements: []\n"
" Level: Warning\n"
" BuildDirectory: 'path/to/build/directory'\n"
" - DiagnosticName: 'diagnostic#4'\n"
" DiagnosticMessage:\n"
" Message: 'message #4'\n"
" FilePath: 'path/to/source3.cpp'\n"
" FileOffset: 72\n"
" Replacements: []\n"
" Level: Remark\n"
" BuildDirectory: 'path/to/build/directory'\n"
"...\n";
TEST(DiagnosticsYamlTest, serializesDiagnostics) {
@ -112,7 +121,8 @@ TEST(DiagnosticsYamlTest, serializesDiagnostics) {
{"path/to/source.cpp",
Replacements({"path/to/source.cpp", 100, 12, "replacement #1"})}};
TUD.Diagnostics.push_back(makeDiagnostic("diagnostic#1", "message #1", 55,
"path/to/source.cpp", Fix1, {}));
"path/to/source.cpp", Fix1, {},
Diagnostic::Warning));
StringMap<Replacements> Fix2 = {
{"path/to/header.h",
@ -120,15 +130,21 @@ TEST(DiagnosticsYamlTest, serializesDiagnostics) {
SmallVector<FileByteRange, 1> Ranges2 =
{makeByteRange(10, 10, "path/to/source.cpp")};
TUD.Diagnostics.push_back(makeDiagnostic("diagnostic#2", "message #2", 60,
"path/to/header.h", Fix2, Ranges2));
"path/to/header.h", Fix2, Ranges2,
Diagnostic::Warning));
TUD.Diagnostics.push_back(makeDiagnostic("diagnostic#3", "message #3", 72,
"path/to/source2.cpp", {}, {}));
"path/to/source2.cpp", {}, {},
Diagnostic::Warning));
TUD.Diagnostics.back().Notes.push_back(
makeMessage("Note1", 88, "path/to/note1.cpp", {}, {}));
TUD.Diagnostics.back().Notes.push_back(
makeMessage("Note2", 99, "path/to/note2.cpp", {}, {}));
TUD.Diagnostics.push_back(makeDiagnostic("diagnostic#4", "message #4", 72,
"path/to/source3.cpp", {}, {},
Diagnostic::Remark));
std::string YamlContent;
raw_string_ostream YamlContentStream(YamlContent);
@ -144,7 +160,7 @@ TEST(DiagnosticsYamlTest, deserializesDiagnostics) {
YAML >> TUDActual;
ASSERT_FALSE(YAML.error());
ASSERT_EQ(3u, TUDActual.Diagnostics.size());
ASSERT_EQ(4u, TUDActual.Diagnostics.size());
EXPECT_EQ("path/to/source.cpp", TUDActual.MainSourceFile);
auto getFixes = [](const StringMap<Replacements> &Fix) {