//===- SourceLocation.h - Compact identifier for Source Files ---*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // /// \file /// Defines the clang::SourceLocation class and associated facilities. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_BASIC_SOURCELOCATION_H #define LLVM_CLANG_BASIC_SOURCELOCATION_H #include "clang/Basic/FileEntry.h" #include "clang/Basic/LLVM.h" #include "llvm/ADT/StringRef.h" #include <cassert> #include <cstdint> #include <string> #include <utility> namespace llvm { class FoldingSetNodeID; template <typename T, typename Enable> struct FoldingSetTrait; } // namespace llvm namespace clang { class SourceManager; /// An opaque identifier used by SourceManager which refers to a /// source file (MemoryBuffer) along with its \#include path and \#line data. /// class FileID { … }; /// Encodes a location in the source. The SourceManager can decode this /// to get at the full include stack, line and column information. /// /// Technically, a source location is simply an offset into the manager's view /// of the input source, which is all input buffers (including macro /// expansions) concatenated in an effectively arbitrary order. The manager /// actually maintains two blocks of input buffers. One, starting at offset /// 0 and growing upwards, contains all buffers from this module. The other, /// starting at the highest possible offset and growing downwards, contains /// buffers of loaded modules. /// /// In addition, one bit of SourceLocation is used for quick access to the /// information whether the location is in a file or a macro expansion. /// /// It is important that this type remains small. It is currently 32 bits wide. class SourceLocation { … }; inline bool operator==(const SourceLocation &LHS, const SourceLocation &RHS) { … } inline bool operator!=(const SourceLocation &LHS, const SourceLocation &RHS) { … } // Ordering is meaningful only if LHS and RHS have the same FileID! // Otherwise use SourceManager::isBeforeInTranslationUnit(). inline bool operator<(const SourceLocation &LHS, const SourceLocation &RHS) { … } inline bool operator>(const SourceLocation &LHS, const SourceLocation &RHS) { … } inline bool operator<=(const SourceLocation &LHS, const SourceLocation &RHS) { … } inline bool operator>=(const SourceLocation &LHS, const SourceLocation &RHS) { … } /// A trivial tuple used to represent a source range. class SourceRange { … }; /// Represents a character-granular source range. /// /// The underlying SourceRange can either specify the starting/ending character /// of the range, or it can specify the start of the range and the start of the /// last token of the range (a "token range"). In the token range case, the /// size of the last token must be measured to determine the actual end of the /// range. class CharSourceRange { … }; /// Represents an unpacked "presumed" location which can be presented /// to the user. /// /// A 'presumed' location can be modified by \#line and GNU line marker /// directives and is always the expansion point of a normal location. /// /// You can get a PresumedLoc from a SourceLocation with SourceManager. class PresumedLoc { … }; /// A SourceLocation and its associated SourceManager. /// /// This is useful for argument passing to functions that expect both objects. /// /// This class does not guarantee the presence of either the SourceManager or /// a valid SourceLocation. Clients should use `isValid()` and `hasManager()` /// before calling the member functions. class FullSourceLoc : public SourceLocation { … }; } // namespace clang namespace llvm { /// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and /// DenseSets. template <> struct DenseMapInfo<clang::FileID, void> { … }; /// Define DenseMapInfo so that SourceLocation's can be used as keys in /// DenseMap and DenseSet. This trait class is eqivalent to /// DenseMapInfo<unsigned> which uses SourceLocation::ID is used as a key. template <> struct DenseMapInfo<clang::SourceLocation, void> { … }; // Allow calling FoldingSetNodeID::Add with SourceLocation object as parameter template <> struct FoldingSetTrait<clang::SourceLocation, void> { … }; } // namespace llvm #endif // LLVM_CLANG_BASIC_SOURCELOCATION_H