From: Ted Kremenek Date: Tue, 17 Nov 2009 05:31:58 +0000 (+0000) Subject: Have clang_getCursorSource() return NULL when the source location is invalid or refer... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9298cfc7475c48fa42b168c37f628663d65ddde7;p=clang Have clang_getCursorSource() return NULL when the source location is invalid or refers to a built-in buffer. Implements . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89044 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/Index/c-index-api-test.m b/test/Index/c-index-api-test.m index dff3b9bda3..20071baf48 100644 --- a/test/Index/c-index-api-test.m +++ b/test/Index/c-index-api-test.m @@ -8,13 +8,13 @@ // CHECK: :0:0: ObjCInterfaceDecl=Protocol:0:0 [Context=c-index-api-test.m] // CHECK: :0:0: TypedefDecl=id:0:0 [Context=c-index-api-test.m] // CHECK: :0:0: TypedefDecl=Class:0:0 [Context=c-index-api-test.m] -// CHECK: :80:16: StructDecl=__va_list_tag:80:16 [Context=c-index-api-test.m] -// CHECK: :80:42: FieldDecl=gp_offset:80:42 [Context=__va_list_tag] -// CHECK: :80:63: FieldDecl=fp_offset:80:63 [Context=__va_list_tag] -// CHECK: :80:81: FieldDecl=overflow_arg_area:80:81 [Context=__va_list_tag] -// CHECK: :80:107: FieldDecl=reg_save_area:80:107 [Context=__va_list_tag] -// CHECK: :80:123: TypedefDecl=__va_list_tag:80:123 [Context=c-index-api-test.m] -// CHECK: :80:159: TypedefDecl=__builtin_va_list:80:159 [Context=c-index-api-test.m] +// CHECK: :80:16: StructDecl=__va_list_tag:80:16 [Context=c-index-api-test.m] +// CHECK: :80:42: FieldDecl=gp_offset:80:42 [Context=__va_list_tag] +// CHECK: :80:63: FieldDecl=fp_offset:80:63 [Context=__va_list_tag] +// CHECK: :80:81: FieldDecl=overflow_arg_area:80:81 [Context=__va_list_tag] +// CHECK: :80:107: FieldDecl=reg_save_area:80:107 [Context=__va_list_tag] +// CHECK: :80:123: TypedefDecl=__va_list_tag:80:123 [Context=c-index-api-test.m] +// CHECK: :80:159: TypedefDecl=__builtin_va_list:80:159 [Context=c-index-api-test.m] // @interface Foo diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp index cf33d7d8cd..493d4f2de6 100644 --- a/tools/CIndex/CIndex.cpp +++ b/tools/CIndex/CIndex.cpp @@ -980,8 +980,11 @@ const char *clang_getCursorSource(CXCursor C) SourceManager &SourceMgr = ND->getASTContext().getSourceManager(); SourceLocation SLoc = getLocationFromCursor(C, SourceMgr, ND); - if (SLoc.isFileID()) - return SourceMgr.getBufferName(SLoc); + + if (SLoc.isFileID()) { + const char *bufferName = SourceMgr.getBufferName(SLoc); + return bufferName[0] == '<' ? NULL : bufferName; + } // Retrieve the file in which the macro was instantiated, then provide that // buffer name. diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index 36deb2e6d9..3b0e4c8e9c 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -40,11 +40,18 @@ static void PrintCursor(CXCursor Cursor) { } } +static const char* GetCursorSource(CXCursor Cursor) { + const char *source = clang_getCursorSource(Cursor); + if (!source) + return ""; + return basename(source); +} + static void DeclVisitor(CXDecl Dcl, CXCursor Cursor, CXClientData Filter) { if (!Filter || (Cursor.kind == *(enum CXCursorKind *)Filter)) { CXString string; - printf("// CHECK: %s:%d:%d: ", basename(clang_getCursorSource(Cursor)), + printf("// CHECK: %s:%d:%d: ", GetCursorSource(Cursor), clang_getCursorLine(Cursor), clang_getCursorColumn(Cursor)); PrintCursor(Cursor); @@ -58,7 +65,7 @@ static void TranslationUnitVisitor(CXTranslationUnit Unit, CXCursor Cursor, { if (!Filter || (Cursor.kind == *(enum CXCursorKind *)Filter)) { CXString string; - printf("// CHECK: %s:%d:%d: ", basename(clang_getCursorSource(Cursor)), + printf("// CHECK: %s:%d:%d: ", GetCursorSource(Cursor), clang_getCursorLine(Cursor), clang_getCursorColumn(Cursor)); PrintCursor(Cursor); @@ -94,8 +101,8 @@ static void TranslationUnitVisitor(CXTranslationUnit Unit, CXCursor Cursor, /* Nothing found here; that's fine. */ } else if (Ref.kind != CXCursor_FunctionDecl) { CXString string; - printf("// CHECK: %s:%d:%d: ", basename(clang_getCursorSource(Ref)), - curLine, curColumn); + printf("// CHECK: %s:%d:%d: ", GetCursorSource(Ref), + curLine, curColumn); PrintCursor(Ref); string = clang_getDeclSpelling(Ref.decl); printf(" [Context:%s]\n", clang_getCString(string));