//===--- ClangSourceBufferImporter.h - Map Clang buffers over ---*- C++ -*-===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2019 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// #ifndef SWIFT_CLANGIMPORTER_CLANGSOURCEBUFFERIMPORTER_H #define SWIFT_CLANGIMPORTER_CLANGSOURCEBUFFERIMPORTER_H #include "swift/Basic/LLVM.h" #include "swift/Basic/SourceLoc.h" #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/IntrusiveRefCntPtr.h" #include "llvm/ADT/SmallVector.h" namespace llvm { class MemoryBuffer; } namespace clang { class SourceManager; } namespace swift { class SourceManager; namespace importer { /// A helper class used to keep alive the Clang source managers where /// diagnostics have been reported. /// /// This is a bit of a hack, but LLVM's source manager (and by extension /// Swift's) does not support buffers going away, so if we want to report /// diagnostics in them we have to do it this way. class ClangSourceBufferImporter { // This is not using SmallPtrSet or similar because we need the // IntrusiveRefCntPtr to stay a ref-counting pointer. SmallVector, 4> sourceManagersWithDiagnostics; llvm::DenseMap mirroredBuffers; SourceManager &swiftSourceManager; public: explicit ClangSourceBufferImporter(SourceManager &sourceMgr) : swiftSourceManager(sourceMgr) {} /// Returns a Swift source location that points into a Clang buffer. /// /// This will keep the Clang buffer alive as long as this object. SourceLoc resolveSourceLocation(const clang::SourceManager &clangSrcMgr, clang::SourceLocation clangLoc); }; } // end namespace importer } // end namespace swift #endif