]> granicus.if.org Git - clang/commitdiff
[AST] Add {DeclRefExpr,MemberExpr,ImplicitCastExpr}::{getLocStart,getLocEnd} methods.
authorDaniel Dunbar <daniel@zuster.org>
Fri, 9 Mar 2012 15:39:15 +0000 (15:39 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Fri, 9 Mar 2012 15:39:15 +0000 (15:39 +0000)
 - 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
lib/AST/Expr.cpp

index 2834f6e5a0da1c30782a5f41cf762289802a3cbe..578dbe0a821910cde39d1f1bedfce4afc96f0920 100644 (file)
@@ -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;
index 18cc5b37bf7badfdf9d8a4330fd394a468027487..0266cd63bbc953909a720c1cd41ce541900760e6 100644 (file)
@@ -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 {