2009-08-27 06:36:44 +08:00
|
|
|
/*===-- 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
|
|
|
|
|
2009-08-28 03:51:58 +08:00
|
|
|
/*
|
|
|
|
Clang indeX abstractions. The backing store for the following API's will be
|
2009-09-02 01:13:31 +08:00
|
|
|
clangs AST file (currently based on PCH). AST files are created as follows:
|
2009-08-28 03:51:58 +08:00
|
|
|
|
2009-09-02 01:13:31 +08:00
|
|
|
"clang -emit-ast <sourcefile.langsuffix> -o <sourcefile.ast>".
|
2009-08-28 03:51:58 +08:00
|
|
|
|
|
|
|
Naming Conventions: To avoid namespace pollution, data types are prefixed
|
|
|
|
with "CX" and functions are prefixed with "clang_".
|
|
|
|
*/
|
2009-08-28 23:28:48 +08:00
|
|
|
typedef void *CXIndex; /* An indexing instance. */
|
2009-08-28 03:51:58 +08:00
|
|
|
|
2009-08-28 23:28:48 +08:00
|
|
|
typedef void *CXTranslationUnit; /* A translation unit instance. */
|
2009-08-28 03:51:58 +08:00
|
|
|
|
2009-08-31 08:59:03 +08:00
|
|
|
typedef void *CXDecl; /* A specific declaration within a translation unit. */
|
2009-09-23 03:25:29 +08:00
|
|
|
typedef void *CXStmt; /* A specific statement within a function/method */
|
2009-08-28 03:51:58 +08:00
|
|
|
|
2009-09-02 21:28:54 +08:00
|
|
|
/* Cursors represent declarations, definitions, and references. */
|
2009-08-31 08:59:03 +08:00
|
|
|
enum CXCursorKind {
|
|
|
|
/* Declarations */
|
|
|
|
CXCursor_FirstDecl = 1,
|
2009-09-02 21:28:54 +08:00
|
|
|
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,
|
2009-08-31 08:59:03 +08:00
|
|
|
|
2009-09-02 21:28:54 +08:00
|
|
|
/* Definitions */
|
|
|
|
CXCursor_FirstDefn = 32,
|
|
|
|
CXCursor_FunctionDefn = 32,
|
|
|
|
CXCursor_ObjCClassDefn = 33,
|
|
|
|
CXCursor_ObjCCategoryDefn = 34,
|
|
|
|
CXCursor_ObjCInstanceMethodDefn = 35,
|
|
|
|
CXCursor_ObjCClassMethodDefn = 36,
|
|
|
|
CXCursor_LastDefn = 36,
|
|
|
|
|
2009-08-31 08:59:03 +08:00
|
|
|
/* References */
|
2009-09-23 03:25:29 +08:00
|
|
|
CXCursor_FirstRef = 40, /* Decl references */
|
2009-09-03 02:26:48 +08:00
|
|
|
CXCursor_ObjCSuperClassRef = 40,
|
|
|
|
CXCursor_ObjCProtocolRef = 41,
|
2009-09-23 03:25:29 +08:00
|
|
|
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,
|
2009-09-16 04:25:34 +08:00
|
|
|
|
|
|
|
/* Error conditions */
|
|
|
|
CXCursor_FirstInvalid = 70,
|
|
|
|
CXCursor_InvalidFile = 70,
|
|
|
|
CXCursor_NoDeclFound = 71,
|
|
|
|
CXCursor_NotImplemented = 72,
|
|
|
|
CXCursor_LastInvalid = 72
|
2009-08-28 03:51:58 +08:00
|
|
|
};
|
|
|
|
|
2009-08-31 08:59:03 +08:00
|
|
|
/* A cursor into the CXTranslationUnit. */
|
2009-09-23 03:25:29 +08:00
|
|
|
|
2009-08-31 08:59:03 +08:00
|
|
|
typedef struct {
|
|
|
|
enum CXCursorKind kind;
|
|
|
|
CXDecl decl;
|
2009-09-23 03:25:29 +08:00
|
|
|
CXStmt stmt; /* expression reference */
|
2009-08-31 08:59:03 +08:00
|
|
|
} CXCursor;
|
2009-08-28 03:51:58 +08:00
|
|
|
|
2009-08-28 23:28:48 +08:00
|
|
|
/* A unique token for looking up "visible" CXDecls from a CXTranslationUnit. */
|
2009-08-28 03:51:58 +08:00
|
|
|
typedef void *CXEntity;
|
|
|
|
|
|
|
|
CXIndex clang_createIndex();
|
2009-09-23 03:25:29 +08:00
|
|
|
void clang_disposeIndex(CXIndex);
|
2009-08-28 03:51:58 +08:00
|
|
|
|
2009-09-03 23:49:00 +08:00
|
|
|
const char *clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit);
|
|
|
|
|
2009-08-28 23:28:48 +08:00
|
|
|
CXTranslationUnit clang_createTranslationUnit(
|
2009-10-20 06:15:09 +08:00
|
|
|
CXIndex, const char *ast_filename,
|
|
|
|
int displayDiagnostics
|
2009-08-28 03:51:58 +08:00
|
|
|
);
|
2009-10-20 06:15:09 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Destroy the specified CXTranslationUnit object.
|
|
|
|
*/
|
|
|
|
void clang_disposeTranslationUnit(CXTranslationUnit);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Return the CXTranslationUnit for a given source file and the provided command line
|
|
|
|
* arguments one would pass to the compiler.
|
|
|
|
*/
|
2009-10-16 04:04:39 +08:00
|
|
|
CXTranslationUnit clang_createTranslationUnitFromSourceFile(
|
|
|
|
CXIndex CIdx,
|
|
|
|
const char *source_filename,
|
|
|
|
int num_clang_command_line_args,
|
2009-10-20 06:15:09 +08:00
|
|
|
const char **clang_command_line_args,
|
|
|
|
int displayDiagnostics
|
2009-10-16 04:04:39 +08:00
|
|
|
);
|
2009-08-28 03:51:58 +08:00
|
|
|
|
2009-10-17 04:01:17 +08:00
|
|
|
/**
|
|
|
|
* \brief Indicate to Clang that it should only enumerate "local" declarations
|
|
|
|
* when loading any new translation units.
|
|
|
|
*
|
|
|
|
* A "local" declaration is one that belongs in the translation unit itself and
|
|
|
|
* not in a precompiled header that was used by the translation unit.
|
|
|
|
*
|
|
|
|
* FIXME: Remove this hook.
|
|
|
|
*/
|
|
|
|
void clang_wantOnlyLocalDeclarations(CXIndex);
|
|
|
|
|
2009-08-28 03:51:58 +08:00
|
|
|
/*
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
*/
|
2009-09-01 23:55:40 +08:00
|
|
|
typedef void *CXClientData;
|
|
|
|
typedef void (*CXTranslationUnitIterator)(CXTranslationUnit, CXCursor,
|
|
|
|
CXClientData);
|
|
|
|
void clang_loadTranslationUnit(CXTranslationUnit, CXTranslationUnitIterator,
|
|
|
|
CXClientData);
|
2009-08-28 03:51:58 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*/
|
2009-09-02 21:28:54 +08:00
|
|
|
typedef void (*CXDeclIterator)(CXDecl, CXCursor, CXClientData);
|
2009-08-31 08:59:03 +08:00
|
|
|
|
2009-09-02 21:28:54 +08:00
|
|
|
void clang_loadDeclaration(CXDecl, CXDeclIterator, CXClientData);
|
2009-08-28 03:51:58 +08:00
|
|
|
|
2009-08-28 23:28:48 +08:00
|
|
|
/*
|
|
|
|
* CXEntity Operations.
|
|
|
|
*/
|
2009-08-28 03:51:58 +08:00
|
|
|
const char *clang_getDeclarationName(CXEntity);
|
|
|
|
const char *clang_getURI(CXEntity);
|
|
|
|
CXEntity clang_getEntity(const char *URI);
|
2009-08-28 23:28:48 +08:00
|
|
|
/*
|
|
|
|
* CXDecl Operations.
|
|
|
|
*/
|
2009-08-28 03:51:58 +08:00
|
|
|
CXCursor clang_getCursorFromDecl(CXDecl);
|
|
|
|
CXEntity clang_getEntityFromDecl(CXDecl);
|
|
|
|
const char *clang_getDeclSpelling(CXDecl);
|
2009-09-26 05:32:34 +08:00
|
|
|
unsigned clang_getDeclLine(CXDecl);
|
|
|
|
unsigned clang_getDeclColumn(CXDecl);
|
2009-09-26 05:45:39 +08:00
|
|
|
const char *clang_getDeclSource(CXDecl);
|
2009-09-26 05:32:34 +08:00
|
|
|
|
2009-08-28 23:28:48 +08:00
|
|
|
/*
|
|
|
|
* CXCursor Operations.
|
|
|
|
*/
|
2009-08-28 03:51:58 +08:00
|
|
|
CXCursor clang_getCursor(CXTranslationUnit, const char *source_name,
|
|
|
|
unsigned line, unsigned column);
|
|
|
|
|
2009-08-28 23:28:48 +08:00
|
|
|
enum CXCursorKind clang_getCursorKind(CXCursor);
|
2009-08-31 08:59:03 +08:00
|
|
|
unsigned clang_isDeclaration(enum CXCursorKind);
|
2009-09-03 02:26:48 +08:00
|
|
|
unsigned clang_isReference(enum CXCursorKind);
|
|
|
|
unsigned clang_isDefinition(enum CXCursorKind);
|
2009-09-16 04:25:34 +08:00
|
|
|
unsigned clang_isInvalid(enum CXCursorKind);
|
2009-08-28 03:51:58 +08:00
|
|
|
|
|
|
|
unsigned clang_getCursorLine(CXCursor);
|
|
|
|
unsigned clang_getCursorColumn(CXCursor);
|
|
|
|
const char *clang_getCursorSource(CXCursor);
|
2009-09-03 02:26:48 +08:00
|
|
|
const char *clang_getCursorSpelling(CXCursor);
|
|
|
|
|
2009-09-24 01:52:52 +08:00
|
|
|
/* 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);
|
2009-08-28 03:51:58 +08:00
|
|
|
|
2009-08-28 23:28:48 +08:00
|
|
|
/*
|
2009-09-17 04:18:54 +08:00
|
|
|
* If CXCursorKind == Cursor_Reference, then this will return the referenced
|
|
|
|
* declaration.
|
2009-08-28 23:28:48 +08:00
|
|
|
* If CXCursorKind == Cursor_Declaration, then this will return the declaration.
|
|
|
|
*/
|
2009-08-28 03:51:58 +08:00
|
|
|
CXDecl clang_getCursorDecl(CXCursor);
|
2009-08-27 06:36:44 +08:00
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|