forked from OSchip/llvm-project
[libclang] A couple of enhancements to c-index-test.
-When printing location avoid printing the filename if it is same as the main file, not just if it has '.h' extension. -Make sure we allocate enough bytes for storing as string a huge line number. llvm-svn: 152821
This commit is contained in:
parent
4dcf880ff5
commit
0abc5eb018
|
@ -1555,6 +1555,7 @@ typedef struct {
|
|||
int first_check_printed;
|
||||
int fail_for_error;
|
||||
int abort;
|
||||
const char *main_filename;
|
||||
} IndexData;
|
||||
|
||||
static void printCheck(IndexData *data) {
|
||||
|
@ -1574,13 +1575,15 @@ static void printCXIndexFile(CXIdxClientFile file) {
|
|||
clang_disposeString(filename);
|
||||
}
|
||||
|
||||
static void printCXIndexLoc(CXIdxLoc loc) {
|
||||
static void printCXIndexLoc(CXIdxLoc loc, CXClientData client_data) {
|
||||
IndexData *index_data;
|
||||
CXString filename;
|
||||
const char *cname, *end;
|
||||
const char *cname;
|
||||
CXIdxClientFile file;
|
||||
unsigned line, column;
|
||||
int isHeader;
|
||||
int isMainFile;
|
||||
|
||||
index_data = (IndexData *)client_data;
|
||||
clang_indexLoc_getFileLocation(loc, &file, 0, &line, &column, 0);
|
||||
if (line == 0) {
|
||||
printf("<null loc>");
|
||||
|
@ -1592,16 +1595,29 @@ static void printCXIndexLoc(CXIdxLoc loc) {
|
|||
}
|
||||
filename = clang_getFileName((CXFile)file);
|
||||
cname = clang_getCString(filename);
|
||||
end = cname + strlen(cname);
|
||||
isHeader = (end[-2] == '.' && end[-1] == 'h');
|
||||
|
||||
if (isHeader) {
|
||||
if (strcmp(cname, index_data->main_filename) == 0)
|
||||
isMainFile = 1;
|
||||
else
|
||||
isMainFile = 0;
|
||||
clang_disposeString(filename);
|
||||
|
||||
if (!isMainFile) {
|
||||
printCXIndexFile(file);
|
||||
printf(":");
|
||||
}
|
||||
printf("%d:%d", line, column);
|
||||
}
|
||||
|
||||
static unsigned digitCount(unsigned val) {
|
||||
unsigned c = 1;
|
||||
while (1) {
|
||||
if (val < 10)
|
||||
return c;
|
||||
++c;
|
||||
val /= 10;
|
||||
}
|
||||
}
|
||||
|
||||
static CXIdxClientContainer makeClientContainer(const CXIdxEntityInfo *info,
|
||||
CXIdxLoc loc) {
|
||||
const char *name;
|
||||
|
@ -1615,7 +1631,8 @@ static CXIdxClientContainer makeClientContainer(const CXIdxEntityInfo *info,
|
|||
|
||||
clang_indexLoc_getFileLocation(loc, &file, 0, &line, &column, 0);
|
||||
/* FIXME: free these.*/
|
||||
newStr = (char *)malloc(strlen(name) + 10);
|
||||
newStr = (char *)malloc(strlen(name) +
|
||||
digitCount(line) + digitCount(column) + 3);
|
||||
sprintf(newStr, "%s:%d:%d", name, line, column);
|
||||
return (CXIdxClientContainer)newStr;
|
||||
}
|
||||
|
@ -1722,7 +1739,7 @@ static void printBaseClassInfo(CXClientData client_data,
|
|||
printf(" | cursor: ");
|
||||
PrintCursor(info->cursor);
|
||||
printf(" | loc: ");
|
||||
printCXIndexLoc(info->loc);
|
||||
printCXIndexLoc(info->loc, client_data);
|
||||
}
|
||||
|
||||
static void printProtocolList(const CXIdxObjCProtocolRefListInfo *ProtoInfo,
|
||||
|
@ -1734,7 +1751,7 @@ static void printProtocolList(const CXIdxObjCProtocolRefListInfo *ProtoInfo,
|
|||
printf(" | cursor: ");
|
||||
PrintCursor(ProtoInfo->protocols[i]->cursor);
|
||||
printf(" | loc: ");
|
||||
printCXIndexLoc(ProtoInfo->protocols[i]->loc);
|
||||
printCXIndexLoc(ProtoInfo->protocols[i]->loc, client_data);
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
@ -1770,6 +1787,10 @@ static CXIdxClientFile index_enteredMainFile(CXClientData client_data,
|
|||
index_data = (IndexData *)client_data;
|
||||
printCheck(index_data);
|
||||
|
||||
CXString filename = clang_getFileName(file);
|
||||
index_data->main_filename = clang_getCString(filename);
|
||||
clang_disposeString(filename);
|
||||
|
||||
printf("[enteredMainFile]: ");
|
||||
printCXIndexFile((CXIdxClientFile)file);
|
||||
printf("\n");
|
||||
|
@ -1787,7 +1808,7 @@ static CXIdxClientFile index_ppIncludedFile(CXClientData client_data,
|
|||
printCXIndexFile((CXIdxClientFile)info->file);
|
||||
printf(" | name: \"%s\"", info->filename);
|
||||
printf(" | hash loc: ");
|
||||
printCXIndexLoc(info->hashLoc);
|
||||
printCXIndexLoc(info->hashLoc, client_data);
|
||||
printf(" | isImport: %d | isAngled: %d\n", info->isImport, info->isAngled);
|
||||
|
||||
return (CXIdxClientFile)info->file;
|
||||
|
@ -1818,7 +1839,7 @@ static void index_indexDeclaration(CXClientData client_data,
|
|||
printf(" | cursor: ");
|
||||
PrintCursor(info->cursor);
|
||||
printf(" | loc: ");
|
||||
printCXIndexLoc(info->loc);
|
||||
printCXIndexLoc(info->loc, client_data);
|
||||
printf(" | semantic-container: ");
|
||||
printCXIndexContainer(info->semanticContainer);
|
||||
printf(" | lexical-container: ");
|
||||
|
@ -1856,7 +1877,7 @@ static void index_indexDeclaration(CXClientData client_data,
|
|||
printf(" | cursor: ");
|
||||
PrintCursor(CatInfo->classCursor);
|
||||
printf(" | loc: ");
|
||||
printCXIndexLoc(CatInfo->classLoc);
|
||||
printCXIndexLoc(CatInfo->classLoc, client_data);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
|
@ -1900,7 +1921,7 @@ static void index_indexEntityReference(CXClientData client_data,
|
|||
printf(" | cursor: ");
|
||||
PrintCursor(info->cursor);
|
||||
printf(" | loc: ");
|
||||
printCXIndexLoc(info->loc);
|
||||
printCXIndexLoc(info->loc, client_data);
|
||||
printEntityInfo(" | <parent>:", client_data, info->parentEntity);
|
||||
printf(" | container: ");
|
||||
printCXIndexContainer(info->container);
|
||||
|
|
Loading…
Reference in New Issue