Coverage Report

Created: 2024-01-17 10:31

/src/llvm-project/clang/include/clang/Basic/SourceMgrAdapter.h
Line
Count
Source (jump to first uncovered line)
1
//=== SourceMgrAdapter.h - SourceMgr to SourceManager Adapter ---*- 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
// This file provides an adapter that maps diagnostics from llvm::SourceMgr
10
// to Clang's SourceManager.
11
//
12
//===----------------------------------------------------------------------===//
13
14
#ifndef LLVM_CLANG_SOURCEMGRADAPTER_H
15
#define LLVM_CLANG_SOURCEMGRADAPTER_H
16
17
#include "clang/Basic/SourceManager.h"
18
#include "llvm/ADT/DenseMap.h"
19
#include "llvm/Support/SourceMgr.h"
20
#include <string>
21
#include <utility>
22
23
namespace clang {
24
25
class DiagnosticsEngine;
26
class FileEntry;
27
28
/// An adapter that can be used to translate diagnostics from one or more
29
/// llvm::SourceMgr instances to a ,
30
class SourceMgrAdapter {
31
  /// Clang source manager.
32
  SourceManager &SrcMgr;
33
34
  /// Clang diagnostics engine.
35
  DiagnosticsEngine &Diagnostics;
36
37
  /// Diagnostic IDs for errors, warnings, and notes.
38
  unsigned ErrorDiagID, WarningDiagID, NoteDiagID;
39
40
  /// The default file to use when mapping buffers.
41
  OptionalFileEntryRef DefaultFile;
42
43
  /// A mapping from (LLVM source manager, buffer ID) pairs to the
44
  /// corresponding file ID within the Clang source manager.
45
  llvm::DenseMap<std::pair<const llvm::SourceMgr *, unsigned>, FileID>
46
      FileIDMapping;
47
48
  /// Diagnostic handler.
49
  static void handleDiag(const llvm::SMDiagnostic &Diag, void *Context);
50
51
public:
52
  /// Create a new \c SourceMgr adaptor that maps to the given source
53
  /// manager and diagnostics engine.
54
  SourceMgrAdapter(SourceManager &SM, DiagnosticsEngine &Diagnostics,
55
                   unsigned ErrorDiagID, unsigned WarningDiagID,
56
                   unsigned NoteDiagID,
57
                   OptionalFileEntryRef DefaultFile = std::nullopt);
58
59
  ~SourceMgrAdapter();
60
61
  /// Map a source location in the given LLVM source manager to its
62
  /// corresponding location in the Clang source manager.
63
  SourceLocation mapLocation(const llvm::SourceMgr &LLVMSrcMgr,
64
                             llvm::SMLoc Loc);
65
66
  /// Map a source range in the given LLVM source manager to its corresponding
67
  /// range in the Clang source manager.
68
  SourceRange mapRange(const llvm::SourceMgr &LLVMSrcMgr, llvm::SMRange Range);
69
70
  /// Handle the given diagnostic from an LLVM source manager.
71
  void handleDiag(const llvm::SMDiagnostic &Diag);
72
73
  /// Retrieve the diagnostic handler to use with the underlying SourceMgr.
74
0
  llvm::SourceMgr::DiagHandlerTy getDiagHandler() {
75
0
    return &SourceMgrAdapter::handleDiag;
76
0
  }
77
78
  /// Retrieve the context to use with the diagnostic handler produced by
79
  /// \c getDiagHandler().
80
0
  void *getDiagContext() { return this; }
81
};
82
83
} // end namespace clang
84
85
#endif