From: Argyrios Kyrtzidis Date: Sat, 30 Jul 2011 17:23:26 +0000 (+0000) Subject: [libclang] Annotation of parameters that got default args from a previous declaration... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0bfe83b5a98ce37bf3a10274bca6f93ca4cb9696;p=clang [libclang] Annotation of parameters that got default args from a previous declarations was broken because the end location of the parameter was the end location of the default arg, resulting in a source range that could begin in one file and end in another. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@136572 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index 938de814e2..1ff9e55cf4 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -1198,6 +1198,8 @@ public: StorageClass S, StorageClass SCAsWritten, Expr *DefArg); + virtual SourceRange getSourceRange() const; + void setObjCMethodScopeInfo(unsigned parameterIndex) { ParmVarDeclBits.IsObjCMethodParam = true; diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index ed8171d3ef..64fd355446 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -1388,6 +1388,16 @@ ParmVarDecl *ParmVarDecl::Create(ASTContext &C, DeclContext *DC, S, SCAsWritten, DefArg); } +SourceRange ParmVarDecl::getSourceRange() const { + if (!hasInheritedDefaultArg()) { + SourceRange ArgRange = getDefaultArgRange(); + if (ArgRange.isValid()) + return SourceRange(getOuterLocStart(), ArgRange.getEnd()); + } + + return DeclaratorDecl::getSourceRange(); +} + Expr *ParmVarDecl::getDefaultArg() { assert(!hasUnparsedDefaultArg() && "Default argument is not yet parsed!"); assert(!hasUninstantiatedDefaultArg() && diff --git a/test/Index/annotate-tokens-with-default-args.cpp b/test/Index/annotate-tokens-with-default-args.cpp new file mode 100644 index 0000000000..2c8844156f --- /dev/null +++ b/test/Index/annotate-tokens-with-default-args.cpp @@ -0,0 +1,16 @@ +#include "annotate-tokens-with-default-args.h" + +void Foo::m(Foo *f) {} + +// RUN: c-index-test -test-annotate-tokens=%s:3:1:4:1 %s | FileCheck %s +// CHECK: Keyword: "void" [3:1 - 3:5] CXXMethod=m:3:11 (Definition) +// CHECK: Identifier: "Foo" [3:6 - 3:9] TypeRef=struct Foo:1:8 +// CHECK: Punctuation: "::" [3:9 - 3:11] CXXMethod=m:3:11 (Definition) +// CHECK: Identifier: "m" [3:11 - 3:12] CXXMethod=m:3:11 (Definition) +// CHECK: Punctuation: "(" [3:12 - 3:13] CXXMethod=m:3:11 (Definition) +// CHECK: Identifier: "Foo" [3:13 - 3:16] TypeRef=struct Foo:1:8 +// CHECK: Punctuation: "*" [3:17 - 3:18] ParmDecl=f:3:18 (Definition) +// CHECK: Identifier: "f" [3:18 - 3:19] ParmDecl=f:3:18 (Definition) +// CHECK: Punctuation: ")" [3:19 - 3:20] CXXMethod=m:3:11 (Definition) +// CHECK: Punctuation: "{" [3:21 - 3:22] UnexposedStmt= +// CHECK: Punctuation: "}" [3:22 - 3:23] UnexposedStmt= diff --git a/test/Index/annotate-tokens-with-default-args.h b/test/Index/annotate-tokens-with-default-args.h new file mode 100644 index 0000000000..323c519351 --- /dev/null +++ b/test/Index/annotate-tokens-with-default-args.h @@ -0,0 +1,3 @@ +struct Foo { + void m(Foo *f = 0); +};