blob: b40386399297cb04a485cf9a46eb485cc2ca6814 [file] [log] [blame]
Steve Naroff2b8ee6c2009-09-01 15:55:40 +00001/* c-index-test.c */
Steve Naroff50398192009-08-28 15:28:48 +00002
3#include "clang-c/Index.h"
Steve Naroff89922f82009-08-31 00:59:03 +00004#include <stdio.h>
Steve Naroffaf08ddc2009-09-03 15:49:00 +00005#include <string.h>
6
7static void PrintCursor(CXCursor Cursor) {
Steve Naroff77128dd2009-09-15 20:25:34 +00008 if (clang_isInvalid(Cursor.kind))
9 printf("Invalid Cursor => %s\n", clang_getCursorKindSpelling(Cursor.kind));
10 else
11 printf("%s => %s ", clang_getCursorKindSpelling(Cursor.kind),
12 clang_getCursorSpelling(Cursor));
Steve Naroffaf08ddc2009-09-03 15:49:00 +000013}
Steve Naroff89922f82009-08-31 00:59:03 +000014
Steve Naroffc857ea42009-09-02 13:28:54 +000015static void DeclVisitor(CXDecl Dcl, CXCursor Cursor, CXClientData Filter)
16{
Daniel Dunbarbce6f622009-09-03 05:59:50 +000017 if (!Filter || (Cursor.kind == *(enum CXCursorKind *)Filter)) {
Steve Naroffaf08ddc2009-09-03 15:49:00 +000018 PrintCursor(Cursor);
Steve Naroff8b26cbd2009-09-11 00:12:01 +000019 printf("(Context: %s", clang_getDeclSpelling(Dcl));
20 printf(" Source: %s (%d:%d))\n", clang_getCursorSource(Cursor),
Steve Naroffaf08ddc2009-09-03 15:49:00 +000021 clang_getCursorLine(Cursor),
22 clang_getCursorColumn(Cursor));
Daniel Dunbarbce6f622009-09-03 05:59:50 +000023 }
Steve Naroffc857ea42009-09-02 13:28:54 +000024}
25static void TranslationUnitVisitor(CXTranslationUnit Unit, CXCursor Cursor,
26 CXClientData Filter)
27{
28 if (!Filter || (Cursor.kind == *(enum CXCursorKind *)Filter)) {
Steve Naroffaf08ddc2009-09-03 15:49:00 +000029 PrintCursor(Cursor);
Steve Naroff8b26cbd2009-09-11 00:12:01 +000030 printf("(Context: %s", clang_getTranslationUnitSpelling(Unit));
31 printf(" Source: %s (%d:%d))\n", clang_getCursorSource(Cursor),
Steve Naroffaf08ddc2009-09-03 15:49:00 +000032 clang_getCursorLine(Cursor),
33 clang_getCursorColumn(Cursor));
Steve Naroffc857ea42009-09-02 13:28:54 +000034
Steve Naroff4ade6d62009-09-23 17:52:52 +000035 if (Cursor.kind == CXCursor_FunctionDefn) {
36 const char *startBuf, *endBuf;
37 unsigned startLine, startColumn, endLine, endColumn;
38 clang_getDefinitionSpellingAndExtent(Cursor, &startBuf, &endBuf,
39 &startLine, &startColumn,
40 &endLine, &endColumn);
41 /* Probe the entire body, looking for "refs". */
42 unsigned curLine = startLine, curColumn = startColumn;
43 while (startBuf <= endBuf) {
44 if (*startBuf == '\n') {
45 startBuf++;
46 curLine++;
47 curColumn = 1;
48 }
49 CXCursor Ref = clang_getCursor(Unit, clang_getCursorSource(Cursor),
50 curLine, curColumn);
51 if (Ref.kind != CXCursor_FunctionDecl) {
52 PrintCursor(Ref);
53 printf("(Context: %s", clang_getDeclSpelling(Ref.decl));
54 printf(" Source: %s (%d:%d))\n", clang_getCursorSource(Ref),
55 curLine, curColumn);
56 }
57 startBuf++;
58 curColumn++;
59 }
60 }
Steve Naroffc857ea42009-09-02 13:28:54 +000061 clang_loadDeclaration(Cursor.decl, DeclVisitor, 0);
Steve Naroff2d4d6292009-08-31 14:26:51 +000062 }
Steve Naroff89922f82009-08-31 00:59:03 +000063}
Steve Naroff50398192009-08-28 15:28:48 +000064
65/*
66 * First sign of life:-)
67 */
68int main(int argc, char **argv) {
69 CXIndex Idx = clang_createIndex();
70 CXTranslationUnit TU = clang_createTranslationUnit(Idx, argv[1]);
Steve Naroff9efa7672009-09-04 15:44:05 +000071
72 if (argc == 2) {
73 /* malloc - returns a cursor of type CXCursor_FunctionDecl */
74 CXCursor C = clang_getCursor(TU, "/usr/include/stdlib.h", 169, 7);
75 PrintCursor(C);
76 /* methodSignature - returns a cursor of type ObjCInstanceMethodDecl */
77 C = clang_getCursor(TU, "/System/Library/Frameworks/Foundation.framework/Headers/NSInvocation.h", 22, 1);
78 PrintCursor(C);
Steve Naroff77128dd2009-09-15 20:25:34 +000079 C = clang_getCursor(TU, "Large.m", 5, 18);
80 PrintCursor(C);
Steve Naroff9efa7672009-09-04 15:44:05 +000081 } else if (argc == 3) {
Steve Naroff77128dd2009-09-15 20:25:34 +000082 enum CXCursorKind K = CXCursor_NotImplemented;
Steve Naroffaf08ddc2009-09-03 15:49:00 +000083
Steve Naroff9efa7672009-09-04 15:44:05 +000084 if (!strcmp(argv[2], "all")) {
85 clang_loadTranslationUnit(TU, TranslationUnitVisitor, 0);
86 return 1;
87 }
Steve Naroffaf08ddc2009-09-03 15:49:00 +000088 if (!strcmp(argv[2], "category")) K = CXCursor_ObjCCategoryDecl;
89 else if (!strcmp(argv[2], "interface")) K = CXCursor_ObjCInterfaceDecl;
90 else if (!strcmp(argv[2], "protocol")) K = CXCursor_ObjCProtocolDecl;
91 else if (!strcmp(argv[2], "function")) K = CXCursor_FunctionDecl;
92 else if (!strcmp(argv[2], "typedef")) K = CXCursor_TypedefDecl;
93
94 clang_loadTranslationUnit(TU, TranslationUnitVisitor, &K);
95 }
Steve Naroff50398192009-08-28 15:28:48 +000096 return 1;
97}