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 23namespace clang { 24 25class DiagnosticsEngine; 26class FileEntry; 27 28/// An adapter that can be used to translate diagnostics from one or more 29/// llvm::SourceMgr instances to a , 30class 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 51public: 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 llvm::SourceMgr::DiagHandlerTy getDiagHandler() { 75 return &SourceMgrAdapter::handleDiag; 76 } 77 78 /// Retrieve the context to use with the diagnostic handler produced by 79 /// \c getDiagHandler(). 80 void *getDiagContext() { return this; } 81}; 82 83} // end namespace clang 84 85#endif 86