From fb9bfeea738853fc73d0f74fec0f30909beaeb73 Mon Sep 17 00:00:00 2001 From: Alexander Kornienko Date: Tue, 3 Jan 2017 14:35:47 +0000 Subject: [clang-tidy] Add check name to YAML export Add a field indicating the associated check for every replacement to the YAML report generated with the '-export-fixes' option. Update clang-apply-replacements to handle the new format. Patch by Alpha Abdoulaye! Differential revision: https://reviews.llvm.org/D26137 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@290892 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Tooling/DiagnosticsYaml.h | 101 ++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 include/clang/Tooling/DiagnosticsYaml.h (limited to 'include/clang/Tooling/DiagnosticsYaml.h') diff --git a/include/clang/Tooling/DiagnosticsYaml.h b/include/clang/Tooling/DiagnosticsYaml.h new file mode 100644 index 0000000000..f32b9fa9c9 --- /dev/null +++ b/include/clang/Tooling/DiagnosticsYaml.h @@ -0,0 +1,101 @@ +//===-- DiagnosticsYaml.h -- Serialiazation for Diagnosticss ---*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// \brief This file defines the structure of a YAML document for serializing +/// diagnostics. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_TOOLING_DIAGNOSTICSYAML_H +#define LLVM_CLANG_TOOLING_DIAGNOSTICSYAML_H + +#include "clang/Tooling/Core/Diagnostic.h" +#include "clang/Tooling/ReplacementsYaml.h" +#include "llvm/Support/YAMLTraits.h" +#include + +LLVM_YAML_IS_SEQUENCE_VECTOR(clang::tooling::Diagnostic) + +namespace llvm { +namespace yaml { + +template <> struct MappingTraits { + /// \brief Helper to (de)serialize a Diagnostic since we don't have direct + /// access to its data members. + class NormalizedDiagnostic { + public: + NormalizedDiagnostic(const IO &) + : DiagLevel(clang::tooling::Diagnostic::Level::Warning) {} + + NormalizedDiagnostic(const IO &, const clang::tooling::Diagnostic &D) + : DiagnosticName(D.DiagnosticName), Message(D.Message), Fix(D.Fix), + Notes(D.Notes), DiagLevel(D.DiagLevel), + BuildDirectory(D.BuildDirectory) {} + + clang::tooling::Diagnostic denormalize(const IO &) { + return clang::tooling::Diagnostic(DiagnosticName, Message, Fix, Notes, + DiagLevel, BuildDirectory); + } + + std::string DiagnosticName; + clang::tooling::DiagnosticMessage Message; + llvm::StringMap Fix; + SmallVector Notes; + clang::tooling::Diagnostic::Level DiagLevel; + std::string BuildDirectory; + }; + + static void mapping(IO &Io, clang::tooling::Diagnostic &D) { + MappingNormalization Keys( + Io, D); + Io.mapRequired("DiagnosticName", Keys->DiagnosticName); + + // FIXME: Export properly all the different fields. + + std::vector Fixes; + for (auto &Replacements : Keys->Fix) { + for (auto &Replacement : Replacements.second) { + Fixes.push_back(Replacement); + } + } + Io.mapRequired("Replacements", Fixes); + for (auto &Fix : Fixes) { + llvm::Error Err = Keys->Fix[Fix.getFilePath()].add(Fix); + if (Err) { + // FIXME: Implement better conflict handling. + llvm::errs() << "Fix conflicts with existing fix: " + << llvm::toString(std::move(Err)) << "\n"; + } + } + } +}; + +/// \brief Specialized MappingTraits to describe how a +/// TranslationUnitDiagnostics is (de)serialized. +template <> struct MappingTraits { + static void mapping(IO &Io, clang::tooling::TranslationUnitDiagnostics &Doc) { + Io.mapRequired("MainSourceFile", Doc.MainSourceFile); + + std::vector Diagnostics; + for (auto &Diagnostic : Doc.Diagnostics) { + // FIXME: Export all diagnostics, not just the ones with fixes. + // Update MappingTraits::mapping. + if (Diagnostic.Fix.size() > 0) { + Diagnostics.push_back(Diagnostic); + } + } + Io.mapRequired("Diagnostics", Diagnostics); + Doc.Diagnostics = Diagnostics; + } +}; +} // end namespace yaml +} // end namespace llvm + +#endif // LLVM_CLANG_TOOLING_DIAGNOSTICSYAML_H -- cgit v1.2.3