Path: blob/main/contrib/llvm-project/clang/lib/Basic/SourceLocation.cpp
35232 views
//===- SourceLocation.cpp - Compact identifier for Source Files -----------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file defines accessor methods for the FullSourceLoc class.9//10//===----------------------------------------------------------------------===//1112#include "clang/Basic/SourceLocation.h"13#include "clang/Basic/LLVM.h"14#include "clang/Basic/PrettyStackTrace.h"15#include "clang/Basic/SourceManager.h"16#include "llvm/ADT/DenseMapInfo.h"17#include "llvm/ADT/FoldingSet.h"18#include "llvm/ADT/StringRef.h"19#include "llvm/Support/Compiler.h"20#include "llvm/Support/MemoryBuffer.h"21#include "llvm/Support/raw_ostream.h"22#include <cassert>23#include <string>24#include <utility>2526using namespace clang;2728//===----------------------------------------------------------------------===//29// PrettyStackTraceLoc30//===----------------------------------------------------------------------===//3132void PrettyStackTraceLoc::print(raw_ostream &OS) const {33if (Loc.isValid()) {34Loc.print(OS, SM);35OS << ": ";36}37OS << Message << '\n';38}3940//===----------------------------------------------------------------------===//41// SourceLocation42//===----------------------------------------------------------------------===//4344static_assert(std::is_trivially_destructible_v<SourceLocation>,45"SourceLocation must be trivially destructible because it is "46"used in unions");4748static_assert(std::is_trivially_destructible_v<SourceRange>,49"SourceRange must be trivially destructible because it is "50"used in unions");5152unsigned SourceLocation::getHashValue() const {53return llvm::DenseMapInfo<UIntTy>::getHashValue(ID);54}5556void llvm::FoldingSetTrait<SourceLocation>::Profile(57const SourceLocation &X, llvm::FoldingSetNodeID &ID) {58ID.AddInteger(X.ID);59}6061void SourceLocation::print(raw_ostream &OS, const SourceManager &SM)const{62if (!isValid()) {63OS << "<invalid loc>";64return;65}6667if (isFileID()) {68PresumedLoc PLoc = SM.getPresumedLoc(*this);6970if (PLoc.isInvalid()) {71OS << "<invalid>";72return;73}74// The macro expansion and spelling pos is identical for file locs.75OS << PLoc.getFilename() << ':' << PLoc.getLine()76<< ':' << PLoc.getColumn();77return;78}7980SM.getExpansionLoc(*this).print(OS, SM);8182OS << " <Spelling=";83SM.getSpellingLoc(*this).print(OS, SM);84OS << '>';85}8687LLVM_DUMP_METHOD std::string88SourceLocation::printToString(const SourceManager &SM) const {89std::string S;90llvm::raw_string_ostream OS(S);91print(OS, SM);92return S;93}9495LLVM_DUMP_METHOD void SourceLocation::dump(const SourceManager &SM) const {96print(llvm::errs(), SM);97llvm::errs() << '\n';98}99100LLVM_DUMP_METHOD void SourceRange::dump(const SourceManager &SM) const {101print(llvm::errs(), SM);102llvm::errs() << '\n';103}104105static PresumedLoc PrintDifference(raw_ostream &OS, const SourceManager &SM,106SourceLocation Loc, PresumedLoc Previous) {107if (Loc.isFileID()) {108109PresumedLoc PLoc = SM.getPresumedLoc(Loc);110111if (PLoc.isInvalid()) {112OS << "<invalid sloc>";113return Previous;114}115116if (Previous.isInvalid() ||117strcmp(PLoc.getFilename(), Previous.getFilename()) != 0) {118OS << PLoc.getFilename() << ':' << PLoc.getLine() << ':'119<< PLoc.getColumn();120} else if (Previous.isInvalid() || PLoc.getLine() != Previous.getLine()) {121OS << "line" << ':' << PLoc.getLine() << ':' << PLoc.getColumn();122} else {123OS << "col" << ':' << PLoc.getColumn();124}125return PLoc;126}127auto PrintedLoc = PrintDifference(OS, SM, SM.getExpansionLoc(Loc), Previous);128129OS << " <Spelling=";130PrintedLoc = PrintDifference(OS, SM, SM.getSpellingLoc(Loc), PrintedLoc);131OS << '>';132return PrintedLoc;133}134135void SourceRange::print(raw_ostream &OS, const SourceManager &SM) const {136137OS << '<';138auto PrintedLoc = PrintDifference(OS, SM, B, {});139if (B != E) {140OS << ", ";141PrintDifference(OS, SM, E, PrintedLoc);142}143OS << '>';144}145146LLVM_DUMP_METHOD std::string147SourceRange::printToString(const SourceManager &SM) const {148std::string S;149llvm::raw_string_ostream OS(S);150print(OS, SM);151return S;152}153154//===----------------------------------------------------------------------===//155// FullSourceLoc156//===----------------------------------------------------------------------===//157158FileID FullSourceLoc::getFileID() const {159assert(isValid());160return SrcMgr->getFileID(*this);161}162163FullSourceLoc FullSourceLoc::getExpansionLoc() const {164assert(isValid());165return FullSourceLoc(SrcMgr->getExpansionLoc(*this), *SrcMgr);166}167168std::pair<FileID, unsigned> FullSourceLoc::getDecomposedExpansionLoc() const {169return SrcMgr->getDecomposedExpansionLoc(*this);170}171172FullSourceLoc FullSourceLoc::getSpellingLoc() const {173assert(isValid());174return FullSourceLoc(SrcMgr->getSpellingLoc(*this), *SrcMgr);175}176177FullSourceLoc FullSourceLoc::getFileLoc() const {178assert(isValid());179return FullSourceLoc(SrcMgr->getFileLoc(*this), *SrcMgr);180}181182PresumedLoc FullSourceLoc::getPresumedLoc(bool UseLineDirectives) const {183if (!isValid())184return PresumedLoc();185186return SrcMgr->getPresumedLoc(*this, UseLineDirectives);187}188189bool FullSourceLoc::isMacroArgExpansion(FullSourceLoc *StartLoc) const {190assert(isValid());191return SrcMgr->isMacroArgExpansion(*this, StartLoc);192}193194FullSourceLoc FullSourceLoc::getImmediateMacroCallerLoc() const {195assert(isValid());196return FullSourceLoc(SrcMgr->getImmediateMacroCallerLoc(*this), *SrcMgr);197}198199std::pair<FullSourceLoc, StringRef> FullSourceLoc::getModuleImportLoc() const {200if (!isValid())201return std::make_pair(FullSourceLoc(), StringRef());202203std::pair<SourceLocation, StringRef> ImportLoc =204SrcMgr->getModuleImportLoc(*this);205return std::make_pair(FullSourceLoc(ImportLoc.first, *SrcMgr),206ImportLoc.second);207}208209unsigned FullSourceLoc::getFileOffset() const {210assert(isValid());211return SrcMgr->getFileOffset(*this);212}213214unsigned FullSourceLoc::getLineNumber(bool *Invalid) const {215assert(isValid());216return SrcMgr->getLineNumber(getFileID(), getFileOffset(), Invalid);217}218219unsigned FullSourceLoc::getColumnNumber(bool *Invalid) const {220assert(isValid());221return SrcMgr->getColumnNumber(getFileID(), getFileOffset(), Invalid);222}223224const FileEntry *FullSourceLoc::getFileEntry() const {225assert(isValid());226return SrcMgr->getFileEntryForID(getFileID());227}228229OptionalFileEntryRef FullSourceLoc::getFileEntryRef() const {230assert(isValid());231return SrcMgr->getFileEntryRefForID(getFileID());232}233234unsigned FullSourceLoc::getExpansionLineNumber(bool *Invalid) const {235assert(isValid());236return SrcMgr->getExpansionLineNumber(*this, Invalid);237}238239unsigned FullSourceLoc::getExpansionColumnNumber(bool *Invalid) const {240assert(isValid());241return SrcMgr->getExpansionColumnNumber(*this, Invalid);242}243244unsigned FullSourceLoc::getSpellingLineNumber(bool *Invalid) const {245assert(isValid());246return SrcMgr->getSpellingLineNumber(*this, Invalid);247}248249unsigned FullSourceLoc::getSpellingColumnNumber(bool *Invalid) const {250assert(isValid());251return SrcMgr->getSpellingColumnNumber(*this, Invalid);252}253254bool FullSourceLoc::isInSystemHeader() const {255assert(isValid());256return SrcMgr->isInSystemHeader(*this);257}258259bool FullSourceLoc::isBeforeInTranslationUnitThan(SourceLocation Loc) const {260assert(isValid());261return SrcMgr->isBeforeInTranslationUnit(*this, Loc);262}263264LLVM_DUMP_METHOD void FullSourceLoc::dump() const {265SourceLocation::dump(*SrcMgr);266}267268const char *FullSourceLoc::getCharacterData(bool *Invalid) const {269assert(isValid());270return SrcMgr->getCharacterData(*this, Invalid);271}272273StringRef FullSourceLoc::getBufferData(bool *Invalid) const {274assert(isValid());275return SrcMgr->getBufferData(SrcMgr->getFileID(*this), Invalid);276}277278std::pair<FileID, unsigned> FullSourceLoc::getDecomposedLoc() const {279return SrcMgr->getDecomposedLoc(*this);280}281282283