diff --git a/clang/lib/Index/USRGeneration.cpp b/clang/lib/Index/USRGeneration.cpp index d71f6d5acdd1..6d73ceefcb4d 100644 --- a/clang/lib/Index/USRGeneration.cpp +++ b/clang/lib/Index/USRGeneration.cpp @@ -80,10 +80,16 @@ public: void VisitUnresolvedUsingTypenameDecl(const UnresolvedUsingTypenameDecl *D) { IgnoreResults = true; } - + + bool ShouldGenerateLocation(const NamedDecl *D); + + bool isLocal(const NamedDecl *D) { + return D->getParentFunctionOrMethod() != 0; + } + /// Generate the string component containing the location of the /// declaration. - bool GenLoc(const Decl *D); + bool GenLoc(const Decl *D, bool IncludeOffset); /// String generation methods used both by the visitation methods /// and from other clients that want to directly generate USRs. These @@ -143,8 +149,13 @@ bool USRGenerator::EmitDeclName(const NamedDecl *D) { return startSize == endSize; } -static inline bool ShouldGenerateLocation(const NamedDecl *D) { - return !D->isExternallyVisible(); +bool USRGenerator::ShouldGenerateLocation(const NamedDecl *D) { + if (D->isExternallyVisible()) + return false; + if (D->getParentFunctionOrMethod()) + return true; + const SourceManager &SM = Context->getSourceManager(); + return !SM.isInSystemHeader(D->getLocation()); } void USRGenerator::VisitDeclContext(const DeclContext *DC) { @@ -168,7 +179,7 @@ void USRGenerator::VisitFieldDecl(const FieldDecl *D) { } void USRGenerator::VisitFunctionDecl(const FunctionDecl *D) { - if (ShouldGenerateLocation(D) && GenLoc(D)) + if (ShouldGenerateLocation(D) && GenLoc(D, /*IncludeOffset=*/isLocal(D))) return; VisitDeclContext(D->getDeclContext()); @@ -229,7 +240,7 @@ void USRGenerator::VisitVarDecl(const VarDecl *D) { // VarDecls can be declared 'extern' within a function or method body, // but their enclosing DeclContext is the function, not the TU. We need // to check the storage class to correctly generate the USR. - if (ShouldGenerateLocation(D) && GenLoc(D)) + if (ShouldGenerateLocation(D) && GenLoc(D, /*IncludeOffset=*/isLocal(D))) return; VisitDeclContext(D->getDeclContext()); @@ -249,13 +260,13 @@ void USRGenerator::VisitVarDecl(const VarDecl *D) { void USRGenerator::VisitNonTypeTemplateParmDecl( const NonTypeTemplateParmDecl *D) { - GenLoc(D); + GenLoc(D, /*IncludeOffset=*/true); return; } void USRGenerator::VisitTemplateTemplateParmDecl( const TemplateTemplateParmDecl *D) { - GenLoc(D); + GenLoc(D, /*IncludeOffset=*/true); return; } @@ -329,7 +340,7 @@ void USRGenerator::VisitObjCContainerDecl(const ObjCContainerDecl *D) { // We want to mangle in the location to uniquely distinguish them. if (CD->IsClassExtension()) { Out << "objc(ext)" << ID->getName() << '@'; - GenLoc(CD); + GenLoc(CD, /*IncludeOffset=*/true); } else GenObjCCategory(ID->getName(), CD->getName()); @@ -378,7 +389,7 @@ void USRGenerator::VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D) { void USRGenerator::VisitTagDecl(const TagDecl *D) { // Add the location of the tag decl to handle resolution across // translation units. - if (ShouldGenerateLocation(D) && GenLoc(D)) + if (ShouldGenerateLocation(D) && GenLoc(D, /*IncludeOffset=*/isLocal(D))) return; D = D->getCanonicalDecl(); @@ -449,7 +460,7 @@ void USRGenerator::VisitTagDecl(const TagDecl *D) { } void USRGenerator::VisitTypedefDecl(const TypedefDecl *D) { - if (ShouldGenerateLocation(D) && GenLoc(D)) + if (ShouldGenerateLocation(D) && GenLoc(D, /*IncludeOffset=*/isLocal(D))) return; const DeclContext *DC = D->getDeclContext(); if (const NamedDecl *DCN = dyn_cast(DC)) @@ -459,11 +470,11 @@ void USRGenerator::VisitTypedefDecl(const TypedefDecl *D) { } void USRGenerator::VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D) { - GenLoc(D); + GenLoc(D, /*IncludeOffset=*/true); return; } -bool USRGenerator::GenLoc(const Decl *D) { +bool USRGenerator::GenLoc(const Decl *D, bool IncludeOffset) { if (generatedLoc) return IgnoreResults; generatedLoc = true; @@ -494,10 +505,12 @@ bool USRGenerator::GenLoc(const Decl *D) { IgnoreResults = true; return true; } - // Use the offest into the FileID to represent the location. Using - // a line/column can cause us to look back at the original source file, - // which is expensive. - Out << '@' << Decomposed.second; + if (IncludeOffset) { + // Use the offest into the FileID to represent the location. Using + // a line/column can cause us to look back at the original source file, + // which is expensive. + Out << '@' << Decomposed.second; + } return IgnoreResults; } diff --git a/clang/test/Index/annotate-comments-typedef.m b/clang/test/Index/annotate-comments-typedef.m index b23e53512c9d..751cfaab4931 100644 --- a/clang/test/Index/annotate-comments-typedef.m +++ b/clang/test/Index/annotate-comments-typedef.m @@ -45,5 +45,5 @@ struct Foo1 { /** About Foo1T */ typedef struct Foo1 Foo1T; // FIXME: we don't attach this comment to 'struct Foo1' -// CHECK: TypedefDecl=Foo1T:[[@LINE-2]]:21 (Definition) {{.*}} FullCommentAsHTML=[

About Foo1T

] FullCommentAsXML=[Foo1Tc:annotate-comments-typedef.m@{{[0-9]+}}@T@Foo1Ttypedef struct Foo1 Foo1T About Foo1T ] +// CHECK: TypedefDecl=Foo1T:[[@LINE-2]]:21 (Definition) {{.*}} FullCommentAsHTML=[

About Foo1T

] FullCommentAsXML=[Foo1Tc:annotate-comments-typedef.m@T@Foo1Ttypedef struct Foo1 Foo1T About Foo1T ] diff --git a/clang/test/Index/cxx11-lambdas.cpp b/clang/test/Index/cxx11-lambdas.cpp index 93db0220359a..afb540a84d5f 100644 --- a/clang/test/Index/cxx11-lambdas.cpp +++ b/clang/test/Index/cxx11-lambdas.cpp @@ -26,8 +26,8 @@ struct X { // RUN: env CINDEXTEST_INDEXLOCALSYMBOLS=1 c-index-test -index-file -std=c++11 %s | FileCheck -check-prefix=CHECK-INDEX %s // CHECK-INDEX: [indexEntityReference]: kind: variable | name: localA | USR: c:cxx11-lambdas.cpp@100@S@X@F@f#@localA | lang: C | cursor: VariableRef=localA:6:9 | loc: 7:21 // CHECK-INDEX: [indexEntityReference]: kind: variable | name: localB | USR: c:cxx11-lambdas.cpp@100@S@X@F@f#@localB | lang: C | cursor: VariableRef=localB:6:17 | loc: 7:29 -// CHECK-INDEX: [indexEntityReference]: kind: typedef | name: Integer | USR: c:cxx11-lambdas.cpp@51@T@Integer | lang: C | cursor: TypeRef=Integer:3:13 | loc: 7:52 -// CHECK-INDEX: [indexEntityReference]: kind: typedef | name: Integer | USR: c:cxx11-lambdas.cpp@51@T@Integer | lang: C | cursor: TypeRef=Integer:3:13 | loc: 7:38 +// CHECK-INDEX: [indexEntityReference]: kind: typedef | name: Integer | USR: c:cxx11-lambdas.cpp@T@Integer | lang: C | cursor: TypeRef=Integer:3:13 | loc: 7:52 +// CHECK-INDEX: [indexEntityReference]: kind: typedef | name: Integer | USR: c:cxx11-lambdas.cpp@T@Integer | lang: C | cursor: TypeRef=Integer:3:13 | loc: 7:38 // CHECK-INDEX: [indexEntityReference]: kind: variable | name: localA | USR: c:cxx11-lambdas.cpp@100@S@X@F@f#@localA | lang: C | cursor: DeclRefExpr=localA:6:9 | loc: 8:14 // CHECK-INDEX: [indexEntityReference]: kind: variable | name: localB | USR: c:cxx11-lambdas.cpp@100@S@X@F@f#@localB | lang: C | cursor: DeclRefExpr=localB:6:17 | loc: 8:23 // CHECK-INDEX: [indexEntityReference]: kind: variable | name: x | USR: c:cxx11-lambdas.cpp@157@S@X@F@f#@Ca@F@operator()#I#1@x | lang: C | cursor: DeclRefExpr=x:7:46 | loc: 8:32 diff --git a/clang/test/Index/index-refs.cpp b/clang/test/Index/index-refs.cpp index 77e2af71f885..adbf02a7c6e2 100644 --- a/clang/test/Index/index-refs.cpp +++ b/clang/test/Index/index-refs.cpp @@ -102,7 +102,7 @@ void foo5() { // CHECK: [indexDeclaration]: kind: c++-class-template | name: TS | {{.*}} | loc: 47:8 // CHECK-NEXT: [indexDeclaration]: kind: struct-template-partial-spec | name: TS | USR: c:@SP>1#T@TS>#t0.0#I | {{.*}} | loc: 50:8 -// CHECK-NEXT: [indexDeclaration]: kind: typedef | name: MyInt | USR: c:index-refs.cpp@593@SP>1#T@TS>#t0.0#I@T@MyInt | {{.*}} | loc: 51:15 | semantic-container: [TS:50:8] | lexical-container: [TS:50:8] +// CHECK-NEXT: [indexDeclaration]: kind: typedef | name: MyInt | USR: c:index-refs.cpp@SP>1#T@TS>#t0.0#I@T@MyInt | {{.*}} | loc: 51:15 | semantic-container: [TS:50:8] | lexical-container: [TS:50:8] /* when indexing implicit instantiations [indexDeclaration]: kind: struct-template-spec | name: TS | USR: c:@S@TS>#I | {{.*}} | loc: 50:8 [indexDeclaration]: kind: typedef | name: MyInt | USR: c:index-refs.cpp@593@S@TS>#I@T@MyInt | {{.*}} | loc: 51:15 | semantic-container: [TS:50:8] | lexical-container: [TS:50:8] diff --git a/clang/test/Index/usrs.cpp b/clang/test/Index/usrs.cpp index e350f5cedf0c..909ce75922a9 100644 --- a/clang/test/Index/usrs.cpp +++ b/clang/test/Index/usrs.cpp @@ -85,7 +85,7 @@ void rdar9371763() { // CHECK: usrs.cpp c:@N@foo@F@bar#I# Extent=[3:3 - 3:18] // CHECK: usrs.cpp c:usrs.cpp@36@N@foo@F@bar#I#@z Extent=[3:12 - 3:17] // CHECK: usrs.cpp c:@N@bar Extent=[5:1 - 8:2] -// CHECK: usrs.cpp c:usrs.cpp@64@N@bar@T@QType Extent=[6:3 - 6:20] +// CHECK: usrs.cpp c:usrs.cpp@N@bar@T@QType Extent=[6:3 - 6:20] // CHECK: usrs.cpp c:@N@bar@F@bar#I# Extent=[7:3 - 7:20] // CHECK: usrs.cpp c:usrs.cpp@94@N@bar@F@bar#I#@z Extent=[7:12 - 7:19] // CHECK: usrs.cpp c:@C@ClsA Extent=[10:1 - 14:2] @@ -101,13 +101,13 @@ void rdar9371763() { // CHECK: usrs.cpp c:@N@foo@C@ClsB@F@ClsB# Extent=[19:5 - 19:27] // CHECK: usrs.cpp c:@N@foo@C@ClsB@F@result#1 Extent=[20:5 - 20:23] // CHECK: usrs.cpp c:@N@foo@C@ClsB@F@result#1 Extent=[24:1 - 26:2] -// CHECK: usrs.cpp c:usrs.cpp@360@aN@C@ClsC Extent=[29:3 - 29:35] -// CHECK: usrs.cpp c:usrs.cpp@396@aN@w Extent=[30:3 - 30:8] +// CHECK: usrs.cpp c:usrs.cpp@aN@C@ClsC Extent=[29:3 - 29:35] +// CHECK: usrs.cpp c:usrs.cpp@aN@w Extent=[30:3 - 30:8] // CHECK: usrs.cpp c:@z Extent=[33:1 - 33:6] // CHECK: usrs.cpp c:@N@foo Extent=[35:1 - 40:2] // CHECK: usrs.cpp c:@N@foo@N@taz Extent=[35:17 - 39:2] // CHECK: usrs.cpp c:@N@foo@N@taz@x Extent=[36:3 - 36:8] -// CHECK: usrs.cpp c:usrs.cpp@457@N@foo@N@taz@F@add#I#I# Extent=[37:3 - 37:56] +// CHECK: usrs.cpp c:usrs.cpp@N@foo@N@taz@F@add#I#I# Extent=[37:3 - 37:56] // CHECK: usrs.cpp c:usrs.cpp@479@N@foo@N@taz@F@add#I#I#@a Extent=[37:25 - 37:30] // CHECK: usrs.cpp c:usrs.cpp@486@N@foo@N@taz@F@add#I#I#@b Extent=[37:32 - 37:37] // CHECK: usrs.cpp c:@N@foo@N@taz@F@sub#I#I# Extent=[38:3 - 38:25] @@ -137,10 +137,10 @@ void rdar9371763() { // CHECK-NOT: ClsB // CHECK: usrs.cpp c:@NA@foo_alias3 // CHECK: usrs.cpp c:@aN Extent=[68:1 - 73:2] -// CHECK: usrs.cpp c:usrs.cpp@1097@aN@C@RDar9371763_Foo Extent=[69:1 - 72:2] +// CHECK: usrs.cpp c:usrs.cpp@aN@C@RDar9371763_Foo Extent=[69:1 - 72:2] // CHECK: usrs.cpp c: Extent=[70:1 - 70:8] -// CHECK: usrs.cpp c:usrs.cpp@1131@aN@C@RDar9371763_Foo@F@bar# Extent=[71:3 - 71:13] -// CHECK: usrs.cpp c:usrs.cpp@1131@aN@C@RDar9371763_Foo@F@bar# Extent=[75:1 - 75:31] +// CHECK: usrs.cpp c:usrs.cpp@aN@C@RDar9371763_Foo@F@bar# Extent=[71:3 - 71:13] +// CHECK: usrs.cpp c:usrs.cpp@aN@C@RDar9371763_Foo@F@bar# Extent=[75:1 - 75:31] // CHECK: usrs.cpp c:@F@rdar9371763# Extent=[77:1 - 80:2] // CHECK: usrs.cpp c:usrs.cpp@1204@F@rdar9371763#@foo Extent=[78:3 - 78:22] diff --git a/clang/test/Index/usrs.m b/clang/test/Index/usrs.m index 0ba0e1afdf0f..c321e851962f 100644 --- a/clang/test/Index/usrs.m +++ b/clang/test/Index/usrs.m @@ -90,19 +90,19 @@ int test_multi_declaration(void) { @end // RUN: c-index-test -test-load-source-usrs all -target x86_64-apple-macosx10.7 %s | FileCheck %s -// CHECK: usrs.m c:usrs.m@67@F@my_helper Extent=[3:1 - 3:60] +// CHECK: usrs.m c:usrs.m@F@my_helper Extent=[3:1 - 3:60] // CHECK: usrs.m c:usrs.m@95@F@my_helper@x Extent=[3:29 - 3:34] // CHECK: usrs.m c:usrs.m@102@F@my_helper@y Extent=[3:36 - 3:41] -// CHECK: usrs.m c:usrs.m@128@Ea Extent=[5:1 - 8:2] -// CHECK: usrs.m c:usrs.m@128@Ea@ABA Extent=[6:3 - 6:6] -// CHECK: usrs.m c:usrs.m@128@Ea@CADABA Extent=[7:3 - 7:9] -// CHECK: usrs.m c:usrs.m@155@Ea Extent=[10:1 - 13:2] -// CHECK: usrs.m c:usrs.m@155@Ea@FOO Extent=[11:3 - 11:6] -// CHECK: usrs.m c:usrs.m@155@Ea@BAR Extent=[12:3 - 12:6] +// CHECK: usrs.m c:usrs.m@Ea Extent=[5:1 - 8:2] +// CHECK: usrs.m c:usrs.m@Ea@ABA Extent=[6:3 - 6:6] +// CHECK: usrs.m c:usrs.m@Ea@CADABA Extent=[7:3 - 7:9] +// CHECK: usrs.m c:usrs.m@Ea Extent=[10:1 - 13:2] +// CHECK: usrs.m c:usrs.m@Ea@FOO Extent=[11:3 - 11:6] +// CHECK: usrs.m c:usrs.m@Ea@BAR Extent=[12:3 - 12:6] // CHECK: usrs.m c:@SA@MyStruct Extent=[15:9 - 18:2] // CHECK: usrs.m c:@SA@MyStruct@FI@wa Extent=[16:3 - 16:9] // CHECK: usrs.m c:@SA@MyStruct@FI@moo Extent=[17:3 - 17:10] -// CHECK: usrs.m c:usrs.m@179@T@MyStruct Extent=[15:1 - 18:11] +// CHECK: usrs.m c:usrs.m@T@MyStruct Extent=[15:1 - 18:11] // CHECK: usrs.m c:@E@Pizza Extent=[20:1 - 23:2] // CHECK: usrs.m c:@E@Pizza@CHEESE Extent=[21:3 - 21:9] // CHECK: usrs.m c:@E@Pizza@MUSHROOMS Extent=[22:3 - 22:12] @@ -123,7 +123,7 @@ int test_multi_declaration(void) { // CHECK: usrs.m c:usrs.m@470objc(cs)Foo(cm)kingkong@local_var Extent=[41:3 - 41:16] // CHECK: usrs.m c:objc(cs)Foo(py)d1 Extent=[44:1 - 44:15] // CHECK: usrs.m c:@z Extent=[47:1 - 47:6] -// CHECK: usrs.m c:usrs.m@529@F@local_func Extent=[49:1 - 49:43] +// CHECK: usrs.m c:usrs.m@F@local_func Extent=[49:1 - 49:43] // CHECK: usrs.m c:usrs.m@551@F@local_func@x Extent=[49:23 - 49:28] // CHECK: usrs.m c:objc(cs)CWithExt Extent=[51:1 - 53:5] // CHECK: usrs.m c:objc(cs)CWithExt(im)meth1 Extent=[52:1 - 52:14]