From a50bd54164393ca3cd08016e7099bdeb531b5014 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 16 Jan 2009 23:03:56 +0000 Subject: [PATCH] Make FullSourceLoc derive from SourceLocation instead of containing one. Containment is generally better than derivation, but in this case FullSourceLoc really 'isa' SourceLocation. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62375 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/SourceLocation.h | 37 +++++++++---------- lib/Basic/SourceLocation.cpp | 54 ++++++++++++++-------------- 2 files changed, 43 insertions(+), 48 deletions(-) diff --git a/include/clang/Basic/SourceLocation.h b/include/clang/Basic/SourceLocation.h index 22d5ff5d3a..b3cb787544 100644 --- a/include/clang/Basic/SourceLocation.h +++ b/include/clang/Basic/SourceLocation.h @@ -207,24 +207,18 @@ public: static SourceRange ReadVal(llvm::Deserializer& D); }; -/// FullSourceLoc - A tuple containing both a SourceLocation -/// and its associated SourceManager. Useful for argument passing to functions -/// that expect both objects. -class FullSourceLoc { - SourceLocation Loc; +/// FullSourceLoc - A SourceLocation and its associated SourceManager. Useful +/// for argument passing to functions that expect both objects. +class FullSourceLoc : public SourceLocation { SourceManager* SrcMgr; public: // Creates a FullSourceLoc where isValid() returns false. - explicit FullSourceLoc() - : Loc(SourceLocation()), SrcMgr((SourceManager*) 0) {} + explicit FullSourceLoc() : SrcMgr((SourceManager*) 0) {} - explicit FullSourceLoc(SourceLocation loc, SourceManager& smgr) - : Loc(loc), SrcMgr(&smgr) {} + explicit FullSourceLoc(SourceLocation Loc, SourceManager &SM) + : SourceLocation(Loc), SrcMgr(&SM) {} - bool isValid() const { return Loc.isValid(); } - bool isInvalid() const { return Loc.isInvalid(); } - - SourceLocation getLocation() const { return Loc; } + SourceLocation getLocation() const { return *this; } SourceManager& getManager() { assert (SrcMgr && "SourceManager is NULL."); @@ -258,19 +252,20 @@ public: bool isInSystemHeader() const; - bool operator==(const FullSourceLoc& RHS) const { - return SrcMgr == RHS.SrcMgr && Loc == RHS.Loc; - } - - bool operator!=(const FullSourceLoc& RHS) const { - return SrcMgr != RHS.SrcMgr || Loc != RHS.Loc; - } - /// Prints information about this FullSourceLoc to stderr. Useful for /// debugging. void dump() const; }; +inline bool operator==(const FullSourceLoc &LHS, const FullSourceLoc &RHS) { + return LHS.getRawEncoding() == RHS.getRawEncoding() && + &LHS.getManager() == &RHS.getManager(); +} + +inline bool operator!=(const FullSourceLoc &LHS, const FullSourceLoc &RHS) { + return !(LHS == RHS); +} + } // end namespace clang #endif diff --git a/lib/Basic/SourceLocation.cpp b/lib/Basic/SourceLocation.cpp index c68cb8ba92..2b7584efda 100644 --- a/lib/Basic/SourceLocation.cpp +++ b/lib/Basic/SourceLocation.cpp @@ -38,74 +38,74 @@ SourceRange SourceRange::ReadVal(llvm::Deserializer& D) { } FullSourceLoc FullSourceLoc::getInstantiationLoc() const { - assert (isValid()); - return FullSourceLoc(SrcMgr->getInstantiationLoc(Loc), *SrcMgr); + assert(isValid()); + return FullSourceLoc(SrcMgr->getInstantiationLoc(*this), *SrcMgr); } FullSourceLoc FullSourceLoc::getSpellingLoc() const { assert(isValid()); - return FullSourceLoc(SrcMgr->getSpellingLoc(Loc), *SrcMgr); + return FullSourceLoc(SrcMgr->getSpellingLoc(*this), *SrcMgr); } FullSourceLoc FullSourceLoc::getIncludeLoc() const { - assert (isValid()); - return FullSourceLoc(SrcMgr->getIncludeLoc(Loc), *SrcMgr); + assert(isValid()); + return FullSourceLoc(SrcMgr->getIncludeLoc(*this), *SrcMgr); } unsigned FullSourceLoc::getLineNumber() const { - assert (isValid()); - return SrcMgr->getLineNumber(Loc); + assert(isValid()); + return SrcMgr->getLineNumber(*this); } unsigned FullSourceLoc::getColumnNumber() const { - assert (isValid()); - return SrcMgr->getColumnNumber(Loc); + assert(isValid()); + return SrcMgr->getColumnNumber(*this); } unsigned FullSourceLoc::getInstantiationLineNumber() const { - assert (isValid()); - return SrcMgr->getInstantiationLineNumber(Loc); + assert(isValid()); + return SrcMgr->getInstantiationLineNumber(*this); } unsigned FullSourceLoc::getInstantiationColumnNumber() const { - assert (isValid()); - return SrcMgr->getInstantiationColumnNumber(Loc); + assert(isValid()); + return SrcMgr->getInstantiationColumnNumber(*this); } unsigned FullSourceLoc::getSpellingLineNumber() const { - assert (isValid()); - return SrcMgr->getSpellingLineNumber(Loc); + assert(isValid()); + return SrcMgr->getSpellingLineNumber(*this); } unsigned FullSourceLoc::getSpellingColumnNumber() const { - assert (isValid()); - return SrcMgr->getSpellingColumnNumber(Loc); + assert(isValid()); + return SrcMgr->getSpellingColumnNumber(*this); } const char* FullSourceLoc::getSourceName() const { - assert (isValid()); - return SrcMgr->getSourceName(Loc); + assert(isValid()); + return SrcMgr->getSourceName(*this); } const FileEntry* FullSourceLoc::getFileEntryForLoc() const { - assert (isValid()); - return SrcMgr->getFileEntryForLoc(Loc); + assert(isValid()); + return SrcMgr->getFileEntryForLoc(*this); } bool FullSourceLoc::isInSystemHeader() const { - assert (isValid()); - return SrcMgr->isInSystemHeader(Loc); + assert(isValid()); + return SrcMgr->isInSystemHeader(*this); } const char *FullSourceLoc::getCharacterData() const { assert(isValid()); - return SrcMgr->getCharacterData(Loc); + return SrcMgr->getCharacterData(*this); } const llvm::MemoryBuffer* FullSourceLoc::getBuffer() const { - assert (isValid()); - return SrcMgr->getBuffer(Loc.getFileID()); + assert(isValid()); + return SrcMgr->getBuffer(getFileID()); } void FullSourceLoc::dump() const { @@ -114,7 +114,7 @@ void FullSourceLoc::dump() const { return; } - if (Loc.isFileID()) { + if (isFileID()) { // The instantiation and spelling pos is identical for file locs. fprintf(stderr, "File Loc from '%s': %d: %d\n", getSourceName(), getInstantiationLineNumber(), -- 2.40.0