Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===-- DiagnosticsYaml.h -- Serialiazation for Diagnosticss ---*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. ///
  9. /// \file
  10. /// This file defines the structure of a YAML document for serializing
  11. /// diagnostics.
  12. ///
  13. //===----------------------------------------------------------------------===//
  14.  
  15. #ifndef LLVM_CLANG_TOOLING_DIAGNOSTICSYAML_H
  16. #define LLVM_CLANG_TOOLING_DIAGNOSTICSYAML_H
  17.  
  18. #include "clang/Tooling/Core/Diagnostic.h"
  19. #include "clang/Tooling/ReplacementsYaml.h"
  20. #include "llvm/Support/YAMLTraits.h"
  21. #include <string>
  22.  
  23. LLVM_YAML_IS_SEQUENCE_VECTOR(clang::tooling::Diagnostic)
  24. LLVM_YAML_IS_SEQUENCE_VECTOR(clang::tooling::DiagnosticMessage)
  25. LLVM_YAML_IS_SEQUENCE_VECTOR(clang::tooling::FileByteRange)
  26.  
  27. namespace llvm {
  28. namespace yaml {
  29.  
  30. template <> struct MappingTraits<clang::tooling::FileByteRange> {
  31.   static void mapping(IO &Io, clang::tooling::FileByteRange &R) {
  32.     Io.mapRequired("FilePath", R.FilePath);
  33.     Io.mapRequired("FileOffset", R.FileOffset);
  34.     Io.mapRequired("Length", R.Length);
  35.   }
  36. };
  37.  
  38. template <> struct MappingTraits<clang::tooling::DiagnosticMessage> {
  39.   static void mapping(IO &Io, clang::tooling::DiagnosticMessage &M) {
  40.     Io.mapRequired("Message", M.Message);
  41.     Io.mapOptional("FilePath", M.FilePath);
  42.     Io.mapOptional("FileOffset", M.FileOffset);
  43.     std::vector<clang::tooling::Replacement> Fixes;
  44.     for (auto &Replacements : M.Fix) {
  45.       llvm::append_range(Fixes, Replacements.second);
  46.     }
  47.     Io.mapRequired("Replacements", Fixes);
  48.     for (auto &Fix : Fixes) {
  49.       llvm::Error Err = M.Fix[Fix.getFilePath()].add(Fix);
  50.       if (Err) {
  51.         // FIXME: Implement better conflict handling.
  52.         llvm::errs() << "Fix conflicts with existing fix: "
  53.                      << llvm::toString(std::move(Err)) << "\n";
  54.       }
  55.     }
  56.     Io.mapOptional("Ranges", M.Ranges);
  57.   }
  58. };
  59.  
  60. template <> struct MappingTraits<clang::tooling::Diagnostic> {
  61.   /// Helper to (de)serialize a Diagnostic since we don't have direct
  62.   /// access to its data members.
  63.   class NormalizedDiagnostic {
  64.   public:
  65.     NormalizedDiagnostic(const IO &)
  66.         : DiagLevel(clang::tooling::Diagnostic::Level::Warning) {}
  67.  
  68.     NormalizedDiagnostic(const IO &, const clang::tooling::Diagnostic &D)
  69.         : DiagnosticName(D.DiagnosticName), Message(D.Message), Notes(D.Notes),
  70.           DiagLevel(D.DiagLevel), BuildDirectory(D.BuildDirectory) {}
  71.  
  72.     clang::tooling::Diagnostic denormalize(const IO &) {
  73.       return clang::tooling::Diagnostic(DiagnosticName, Message, Notes,
  74.                                         DiagLevel, BuildDirectory);
  75.     }
  76.  
  77.     std::string DiagnosticName;
  78.     clang::tooling::DiagnosticMessage Message;
  79.     SmallVector<clang::tooling::DiagnosticMessage, 1> Notes;
  80.     clang::tooling::Diagnostic::Level DiagLevel;
  81.     std::string BuildDirectory;
  82.   };
  83.  
  84.   static void mapping(IO &Io, clang::tooling::Diagnostic &D) {
  85.     MappingNormalization<NormalizedDiagnostic, clang::tooling::Diagnostic> Keys(
  86.         Io, D);
  87.     Io.mapRequired("DiagnosticName", Keys->DiagnosticName);
  88.     Io.mapRequired("DiagnosticMessage", Keys->Message);
  89.     Io.mapOptional("Notes", Keys->Notes);
  90.     Io.mapOptional("Level", Keys->DiagLevel);
  91.     Io.mapOptional("BuildDirectory", Keys->BuildDirectory);
  92.   }
  93. };
  94.  
  95. /// Specialized MappingTraits to describe how a
  96. /// TranslationUnitDiagnostics is (de)serialized.
  97. template <> struct MappingTraits<clang::tooling::TranslationUnitDiagnostics> {
  98.   static void mapping(IO &Io, clang::tooling::TranslationUnitDiagnostics &Doc) {
  99.     Io.mapRequired("MainSourceFile", Doc.MainSourceFile);
  100.     Io.mapRequired("Diagnostics", Doc.Diagnostics);
  101.   }
  102. };
  103.  
  104. template <> struct ScalarEnumerationTraits<clang::tooling::Diagnostic::Level> {
  105.   static void enumeration(IO &IO, clang::tooling::Diagnostic::Level &Value) {
  106.     IO.enumCase(Value, "Warning", clang::tooling::Diagnostic::Warning);
  107.     IO.enumCase(Value, "Error", clang::tooling::Diagnostic::Error);
  108.     IO.enumCase(Value, "Remark", clang::tooling::Diagnostic::Remark);
  109.   }
  110. };
  111.  
  112. } // end namespace yaml
  113. } // end namespace llvm
  114.  
  115. #endif // LLVM_CLANG_TOOLING_DIAGNOSTICSYAML_H
  116.