2009-08-26 22:36:44 +00: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-27 19:51:58 +00:00
|
|
|
/*
|
|
|
|
Clang indeX abstractions. The backing store for the following API's will be
|
|
|
|
clangs PCH file (which contains AST's, or Abstract Syntax Trees). PCH files
|
|
|
|
are created by the following command:
|
|
|
|
|
|
|
|
"clang -emit-pch <sourcefile.langsuffix> -o <sourcefile.ast>".
|
|
|
|
|
|
|
|
If the ast file format ends up diverging from the pch file format, we will
|
|
|
|
need to add a new switch (-emit-ast). For now, the contents are identical.
|
|
|
|
|
|
|
|
Naming Conventions: To avoid namespace pollution, data types are prefixed
|
|
|
|
with "CX" and functions are prefixed with "clang_".
|
|
|
|
*/
|
2009-08-28 15:28:48 +00:00
|
|
|
typedef void *CXIndex; /* An indexing instance. */
|
2009-08-27 19:51:58 +00:00
|
|
|
|
2009-08-28 15:28:48 +00:00
|
|
|
typedef void *CXTranslationUnit; /* A translation unit instance. */
|
2009-08-27 19:51:58 +00:00
|
|
|
|
2009-08-28 15:28:48 +00:00
|
|
|
typedef void *CXCursor; /* An opaque cursor into the CXTranslationUnit. */
|
2009-08-27 19:51:58 +00:00
|
|
|
|
2009-08-28 15:28:48 +00:00
|
|
|
/* Cursors represent declarations and references (provides line/column info). */
|
2009-08-27 19:51:58 +00:00
|
|
|
enum CXCursorKind {
|
2009-08-28 12:07:44 +00:00
|
|
|
CXCursor_Declaration,
|
|
|
|
CXCursor_Reference,
|
|
|
|
CXCursor_ObjC_ClassRef,
|
|
|
|
CXCursor_ObjC_ProtocolRef,
|
|
|
|
CXCursor_ObjC_MessageRef,
|
|
|
|
CXCursor_ObjC_SelectorRef
|
2009-08-27 19:51:58 +00:00
|
|
|
};
|
|
|
|
|
2009-08-28 15:28:48 +00:00
|
|
|
typedef void *CXDecl; /* A specific declaration within a translation unit. */
|
2009-08-27 19:51:58 +00:00
|
|
|
|
2009-08-28 15:28:48 +00:00
|
|
|
enum CXDeclKind { /* The various kinds of declarations. */
|
2009-08-27 19:51:58 +00:00
|
|
|
CXDecl_any,
|
|
|
|
CXDecl_typedef,
|
|
|
|
CXDecl_enum,
|
|
|
|
CXDecl_enum_constant,
|
|
|
|
CXDecl_record,
|
|
|
|
CXDecl_field,
|
|
|
|
CXDecl_function,
|
|
|
|
CXDecl_variable,
|
|
|
|
CXDecl_parameter,
|
|
|
|
CXDecl_ObjC_interface,
|
|
|
|
CXDecl_ObjC_category,
|
|
|
|
CXDecl_ObjC_protocol,
|
|
|
|
CXDecl_ObjC_property,
|
|
|
|
CXDecl_ObjC_instance_variable,
|
|
|
|
CXDecl_ObjC_instance_method,
|
|
|
|
CXDecl_ObjC_class_method,
|
|
|
|
CXDecl_ObjC_category_implementation,
|
|
|
|
CXDecl_ObjC_class_implementation,
|
|
|
|
CXDecl_ObjC_property_implementation
|
|
|
|
};
|
|
|
|
|
2009-08-28 15:28:48 +00:00
|
|
|
/* A unique token for looking up "visible" CXDecls from a CXTranslationUnit. */
|
2009-08-27 19:51:58 +00:00
|
|
|
typedef void *CXEntity;
|
|
|
|
|
|
|
|
CXIndex clang_createIndex();
|
|
|
|
|
2009-08-28 15:28:48 +00:00
|
|
|
CXTranslationUnit clang_createTranslationUnit(
|
2009-08-27 19:51:58 +00:00
|
|
|
CXIndex, const char *ast_filename
|
|
|
|
);
|
|
|
|
|
|
|
|
/*
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
void clang_loadTranslationUnit(
|
|
|
|
CXTranslationUnit, void (*callback)(CXTranslationUnit, CXCursor)
|
|
|
|
);
|
|
|
|
|
|
|
|
/*
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
void clang_loadDeclaration(CXDecl, void (*callback)(CXDecl, CXCursor));
|
|
|
|
|
2009-08-28 15:28:48 +00:00
|
|
|
/*
|
|
|
|
* CXEntity Operations.
|
|
|
|
*/
|
2009-08-27 19:51:58 +00:00
|
|
|
const char *clang_getDeclarationName(CXEntity);
|
|
|
|
const char *clang_getURI(CXEntity);
|
|
|
|
CXEntity clang_getEntity(const char *URI);
|
2009-08-28 15:28:48 +00:00
|
|
|
/*
|
|
|
|
* CXDecl Operations.
|
|
|
|
*/
|
2009-08-27 19:51:58 +00:00
|
|
|
CXCursor clang_getCursorFromDecl(CXDecl);
|
|
|
|
CXEntity clang_getEntityFromDecl(CXDecl);
|
|
|
|
enum CXDeclKind clang_getDeclKind(CXDecl);
|
|
|
|
const char *clang_getDeclSpelling(CXDecl);
|
2009-08-28 15:28:48 +00:00
|
|
|
/*
|
|
|
|
* CXCursor Operations.
|
|
|
|
*/
|
2009-08-27 19:51:58 +00:00
|
|
|
CXCursor clang_getCursor(CXTranslationUnit, const char *source_name,
|
|
|
|
unsigned line, unsigned column);
|
|
|
|
|
2009-08-28 15:28:48 +00:00
|
|
|
enum CXCursorKind clang_getCursorKind(CXCursor);
|
2009-08-27 19:51:58 +00:00
|
|
|
|
|
|
|
unsigned clang_getCursorLine(CXCursor);
|
|
|
|
unsigned clang_getCursorColumn(CXCursor);
|
|
|
|
const char *clang_getCursorSource(CXCursor);
|
|
|
|
|
2009-08-28 15:28:48 +00:00
|
|
|
/*
|
|
|
|
* If CXCursorKind == Cursor_Reference, then this will return the referenced declaration.
|
|
|
|
* If CXCursorKind == Cursor_Declaration, then this will return the declaration.
|
|
|
|
*/
|
2009-08-27 19:51:58 +00:00
|
|
|
CXDecl clang_getCursorDecl(CXCursor);
|
2009-08-26 22:36:44 +00:00
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|