Introduce Decl::getSourceRange() which, like Stmt::getSourceRange(), represents the range that the declaration covers.

Add initial support for NamespaceDecl, VarDecl, and FunctionDecl:
-NamespaceDecl range is from name to '}'
-VarDecl is from name to possible init expression
-FunctionDecl is from name to last parameter name or to end of its function body.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73821 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp
index b2b643a..bf63932 100644
--- a/lib/AST/Decl.cpp
+++ b/lib/AST/Decl.cpp
@@ -315,6 +315,12 @@
 VarDecl::~VarDecl() {
 }
 
+SourceRange VarDecl::getSourceRange() const {
+  if (getInit())
+    return SourceRange(getLocation(), getInit()->getLocEnd());
+  return SourceRange(getLocation(), getLocation());
+}
+
 bool VarDecl::isTentativeDefinition(ASTContext &Context) const {
   if (!isFileVarDecl() || Context.getLangOptions().CPlusPlus)
     return false;
@@ -371,6 +377,12 @@
   return 0;
 }
 
+void FunctionDecl::setBody(Stmt *B) {
+  Body = B;
+  if (B && EndRangeLoc < B->getLocEnd())
+    EndRangeLoc = B->getLocEnd();
+}
+
 bool FunctionDecl::isMain() const {
   return getDeclContext()->getLookupContext()->isTranslationUnit() &&
     getIdentifier() && getIdentifier()->isStr("main");
@@ -481,6 +493,10 @@
     void *Mem = C.Allocate(sizeof(ParmVarDecl*)*NumParams);
     ParamInfo = new (Mem) ParmVarDecl*[NumParams];
     memcpy(ParamInfo, NewParamInfo, sizeof(ParmVarDecl*)*NumParams);
+
+    // Update source range.
+    if (EndRangeLoc < NewParamInfo[NumParams-1]->getLocEnd())
+      EndRangeLoc = NewParamInfo[NumParams-1]->getLocEnd();
   }
 }