From 396ec676b7a39665fa3a3f86f8e0520f8d7e93a8 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Fri, 9 Mar 2012 15:39:15 +0000 Subject: [PATCH] [AST] Add {DeclRefExpr,MemberExpr,ImplicitCastExpr}::{getLocStart,getLocEnd} methods. - There are probably a lot more of these worth adding, but these are a start at hitting some of the exprs for which getSourceRange().getBegin() is a poor substitute for getLocStart(). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152410 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/Expr.h | 10 ++++++++++ lib/AST/Expr.cpp | 40 ++++++++++++++++++++++++++-------------- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index 2834f6e5a0..578dbe0a82 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -868,6 +868,8 @@ public: SourceLocation getLocation() const { return Loc; } void setLocation(SourceLocation L) { Loc = L; } SourceRange getSourceRange() const; + SourceLocation getLocStart() const; + SourceLocation getLocEnd() const; /// \brief Determine whether this declaration reference was preceded by a /// C++ nested-name-specifier, e.g., \c N::foo. @@ -2392,6 +2394,8 @@ public: void setMemberLoc(SourceLocation L) { MemberLoc = L; } SourceRange getSourceRange() const; + SourceLocation getLocStart() const; + SourceLocation getLocEnd() const; SourceLocation getExprLoc() const { return MemberLoc; } @@ -2626,6 +2630,12 @@ public: SourceRange getSourceRange() const { return getSubExpr()->getSourceRange(); } + SourceLocation getLocStart() const { + return getSubExpr()->getLocStart(); + } + SourceLocation getLocEnd() const { + return getSubExpr()->getLocEnd(); + } static bool classof(const Stmt *T) { return T->getStmtClass() == ImplicitCastExprClass; diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 18cc5b37bf..0266cd63bb 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -360,6 +360,16 @@ SourceRange DeclRefExpr::getSourceRange() const { R.setEnd(getRAngleLoc()); return R; } +SourceLocation DeclRefExpr::getLocStart() const { + if (hasQualifier()) + return getQualifierLoc().getBeginLoc(); + return getNameInfo().getLocStart(); +} +SourceLocation DeclRefExpr::getLocEnd() const { + if (hasExplicitTemplateArgs()) + return getRAngleLoc(); + return getNameInfo().getLocEnd(); +} // FIXME: Maybe this should use DeclPrinter with a special "print predefined // expr" policy instead. @@ -1016,24 +1026,26 @@ MemberExpr *MemberExpr::Create(ASTContext &C, Expr *base, bool isarrow, } SourceRange MemberExpr::getSourceRange() const { - SourceLocation StartLoc; + return SourceRange(getLocStart(), getLocEnd()); +} +SourceLocation MemberExpr::getLocStart() const { if (isImplicitAccess()) { if (hasQualifier()) - StartLoc = getQualifierLoc().getBeginLoc(); - else - StartLoc = MemberLoc; - } else { - // FIXME: We don't want this to happen. Rather, we should be able to - // detect all kinds of implicit accesses more cleanly. - StartLoc = getBase()->getLocStart(); - if (StartLoc.isInvalid()) - StartLoc = MemberLoc; + return getQualifierLoc().getBeginLoc(); + return MemberLoc; } - SourceLocation EndLoc = hasExplicitTemplateArgs() - ? getRAngleLoc() : getMemberNameInfo().getEndLoc(); - - return SourceRange(StartLoc, EndLoc); + // FIXME: We don't want this to happen. Rather, we should be able to + // detect all kinds of implicit accesses more cleanly. + SourceLocation BaseStartLoc = getBase()->getLocStart(); + if (BaseStartLoc.isValid()) + return BaseStartLoc; + return MemberLoc; +} +SourceLocation MemberExpr::getLocEnd() const { + if (hasExplicitTemplateArgs()) + return getRAngleLoc(); + return getMemberNameInfo().getEndLoc(); } void CastExpr::CheckCastConsistency() const { -- 2.40.0