summaryrefslogtreecommitdiffstats
path: root/include/clang-c/Index.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/clang-c/Index.h')
-rw-r--r--include/clang-c/Index.h220
1 files changed, 220 insertions, 0 deletions
diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h
new file mode 100644
index 0000000..3178017
--- /dev/null
+++ b/include/clang-c/Index.h
@@ -0,0 +1,220 @@
+/*===-- clang-c/Index.h - Indexing Public C Interface -------------*- C -*-===*\
+|* *|
+|* The LLVM Compiler Infrastructure *|
+|* *|
+|* This file is distributed under the University of Illinois Open Source *|
+|* License. See LICENSE.TXT for details. *|
+|* *|
+|*===----------------------------------------------------------------------===*|
+|* *|
+|* This header provides a public inferface to a Clang library for extracting *|
+|* high-level symbol information from source files without exposing the full *|
+|* Clang C++ API. *|
+|* *|
+\*===----------------------------------------------------------------------===*/
+
+#ifndef CLANG_C_INDEX_H
+#define CLANG_C_INDEX_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ Clang indeX abstractions. The backing store for the following API's will be
+ clangs AST file (currently based on PCH). AST files are created as follows:
+
+ "clang -emit-ast <sourcefile.langsuffix> -o <sourcefile.ast>".
+
+ Naming Conventions: To avoid namespace pollution, data types are prefixed
+ with "CX" and functions are prefixed with "clang_".
+*/
+typedef void *CXIndex; /* An indexing instance. */
+
+typedef void *CXTranslationUnit; /* A translation unit instance. */
+
+typedef void *CXDecl; /* A specific declaration within a translation unit. */
+typedef void *CXStmt; /* A specific statement within a function/method */
+
+/* Cursors represent declarations, definitions, and references. */
+enum CXCursorKind {
+ /* Declarations */
+ CXCursor_FirstDecl = 1,
+ CXCursor_TypedefDecl = 2,
+ CXCursor_StructDecl = 3,
+ CXCursor_UnionDecl = 4,
+ CXCursor_ClassDecl = 5,
+ CXCursor_EnumDecl = 6,
+ CXCursor_FieldDecl = 7,
+ CXCursor_EnumConstantDecl = 8,
+ CXCursor_FunctionDecl = 9,
+ CXCursor_VarDecl = 10,
+ CXCursor_ParmDecl = 11,
+ CXCursor_ObjCInterfaceDecl = 12,
+ CXCursor_ObjCCategoryDecl = 13,
+ CXCursor_ObjCProtocolDecl = 14,
+ CXCursor_ObjCPropertyDecl = 15,
+ CXCursor_ObjCIvarDecl = 16,
+ CXCursor_ObjCInstanceMethodDecl = 17,
+ CXCursor_ObjCClassMethodDecl = 18,
+ CXCursor_LastDecl = 18,
+
+ /* Definitions */
+ CXCursor_FirstDefn = 32,
+ CXCursor_FunctionDefn = 32,
+ CXCursor_ObjCClassDefn = 33,
+ CXCursor_ObjCCategoryDefn = 34,
+ CXCursor_ObjCInstanceMethodDefn = 35,
+ CXCursor_ObjCClassMethodDefn = 36,
+ CXCursor_LastDefn = 36,
+
+ /* References */
+ CXCursor_FirstRef = 40, /* Decl references */
+ CXCursor_ObjCSuperClassRef = 40,
+ CXCursor_ObjCProtocolRef = 41,
+ CXCursor_ObjCClassRef = 42,
+
+ CXCursor_ObjCSelectorRef = 43, /* Expression references */
+ CXCursor_ObjCIvarRef = 44,
+ CXCursor_VarRef = 45,
+ CXCursor_FunctionRef = 46,
+ CXCursor_EnumConstantRef = 47,
+ CXCursor_MemberRef = 48,
+ CXCursor_LastRef = 48,
+
+ /* Error conditions */
+ CXCursor_FirstInvalid = 70,
+ CXCursor_InvalidFile = 70,
+ CXCursor_NoDeclFound = 71,
+ CXCursor_NotImplemented = 72,
+ CXCursor_LastInvalid = 72
+};
+
+/* A cursor into the CXTranslationUnit. */
+
+typedef struct {
+ enum CXCursorKind kind;
+ CXDecl decl;
+ CXStmt stmt; /* expression reference */
+} CXCursor;
+
+/* A unique token for looking up "visible" CXDecls from a CXTranslationUnit. */
+typedef void *CXEntity;
+
+CXIndex clang_createIndex();
+void clang_disposeIndex(CXIndex);
+
+const char *clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit);
+
+CXTranslationUnit clang_createTranslationUnit(
+ CXIndex, const char *ast_filename
+);
+void clang_disposeTranslationUnit(CXTranslationUnit);
+
+/*
+ Usage: clang_loadTranslationUnit(). Will load the toplevel declarations
+ within a translation unit, issuing a 'callback' for each one.
+
+ void printObjCInterfaceNames(CXTranslationUnit X, CXCursor C) {
+ if (clang_getCursorKind(C) == Cursor_Declaration) {
+ CXDecl D = clang_getCursorDecl(C);
+ if (clang_getDeclKind(D) == CXDecl_ObjC_interface)
+ printf("@interface %s in file %s on line %d column %d\n",
+ clang_getDeclSpelling(D), clang_getCursorSource(C),
+ clang_getCursorLine(C), clang_getCursorColumn(C));
+ }
+ }
+ static void usage {
+ clang_loadTranslationUnit(CXTranslationUnit, printObjCInterfaceNames);
+ }
+*/
+typedef void *CXClientData;
+typedef void (*CXTranslationUnitIterator)(CXTranslationUnit, CXCursor,
+ CXClientData);
+void clang_loadTranslationUnit(CXTranslationUnit, CXTranslationUnitIterator,
+ CXClientData);
+
+/*
+ Usage: clang_loadDeclaration(). Will load the declaration, issuing a
+ 'callback' for each declaration/reference within the respective declaration.
+
+ For interface declarations, this will index the super class, protocols,
+ ivars, methods, etc. For structure declarations, this will index the fields.
+ For functions, this will index the parameters (and body, for function
+ definitions), local declarations/references.
+
+ void getInterfaceDetails(CXDecl X, CXCursor C) {
+ switch (clang_getCursorKind(C)) {
+ case Cursor_ObjC_ClassRef:
+ CXDecl SuperClass = clang_getCursorDecl(C);
+ case Cursor_ObjC_ProtocolRef:
+ CXDecl AdoptsProtocol = clang_getCursorDecl(C);
+ case Cursor_Declaration:
+ CXDecl AnIvarOrMethod = clang_getCursorDecl(C);
+ }
+ }
+ static void usage() {
+ if (clang_getDeclKind(D) == CXDecl_ObjC_interface) {
+ clang_loadDeclaration(D, getInterfaceDetails);
+ }
+ }
+*/
+typedef void (*CXDeclIterator)(CXDecl, CXCursor, CXClientData);
+
+void clang_loadDeclaration(CXDecl, CXDeclIterator, CXClientData);
+
+/*
+ * CXEntity Operations.
+ */
+const char *clang_getDeclarationName(CXEntity);
+const char *clang_getURI(CXEntity);
+CXEntity clang_getEntity(const char *URI);
+/*
+ * CXDecl Operations.
+ */
+CXCursor clang_getCursorFromDecl(CXDecl);
+CXEntity clang_getEntityFromDecl(CXDecl);
+const char *clang_getDeclSpelling(CXDecl);
+unsigned clang_getDeclLine(CXDecl);
+unsigned clang_getDeclColumn(CXDecl);
+const char *clang_getDeclSource(CXDecl);
+
+/*
+ * CXCursor Operations.
+ */
+CXCursor clang_getCursor(CXTranslationUnit, const char *source_name,
+ unsigned line, unsigned column);
+
+enum CXCursorKind clang_getCursorKind(CXCursor);
+unsigned clang_isDeclaration(enum CXCursorKind);
+unsigned clang_isReference(enum CXCursorKind);
+unsigned clang_isDefinition(enum CXCursorKind);
+unsigned clang_isInvalid(enum CXCursorKind);
+
+unsigned clang_getCursorLine(CXCursor);
+unsigned clang_getCursorColumn(CXCursor);
+const char *clang_getCursorSource(CXCursor);
+const char *clang_getCursorSpelling(CXCursor);
+
+/* for debug/testing */
+const char *clang_getCursorKindSpelling(enum CXCursorKind Kind);
+void clang_getDefinitionSpellingAndExtent(CXCursor,
+ const char **startBuf,
+ const char **endBuf,
+ unsigned *startLine,
+ unsigned *startColumn,
+ unsigned *endLine,
+ unsigned *endColumn);
+
+/*
+ * If CXCursorKind == Cursor_Reference, then this will return the referenced
+ * declaration.
+ * If CXCursorKind == Cursor_Declaration, then this will return the declaration.
+ */
+CXDecl clang_getCursorDecl(CXCursor);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
OpenPOWER on IntegriCloud