c/clang:file location
c/clang/demo:filename c/clang:fix undefined filename c/clang:file use uintptr c/clang:change cpp format
This commit is contained in:
@@ -29,15 +29,25 @@ func (c *Context) setClassName(name string) {
|
|||||||
var context = newContext()
|
var context = newContext()
|
||||||
|
|
||||||
func print_cursor_info(cursor clang.Cursor) {
|
func print_cursor_info(cursor clang.Cursor) {
|
||||||
|
loc := cursor.Location()
|
||||||
|
var file clang.File
|
||||||
|
var line, column c.Uint
|
||||||
|
|
||||||
|
loc.SpellingLocation(&file, &line, &column, nil)
|
||||||
|
filename := file.FileName()
|
||||||
|
|
||||||
|
c.Printf(c.Str("%s:%d:%d\n"), filename.CStr(), line, column)
|
||||||
|
|
||||||
cursorStr := cursor.String()
|
cursorStr := cursor.String()
|
||||||
symbol := cursor.Mangling()
|
symbol := cursor.Mangling()
|
||||||
defer symbol.Dispose()
|
defer symbol.Dispose()
|
||||||
defer cursorStr.Dispose()
|
defer cursorStr.Dispose()
|
||||||
|
defer filename.Dispose()
|
||||||
|
|
||||||
if context.namespaceName != "" && context.className != "" {
|
if context.namespaceName != "" && context.className != "" {
|
||||||
fmt.Printf("%s:%s", context.namespaceName, context.className)
|
fmt.Printf("%s:%s:", context.namespaceName, context.className)
|
||||||
} else if context.namespaceName != "" {
|
} else if context.namespaceName != "" {
|
||||||
fmt.Printf("%s", context.namespaceName)
|
fmt.Printf("%s:", context.namespaceName)
|
||||||
}
|
}
|
||||||
c.Printf(c.Str("%s\n"), cursorStr.CStr())
|
c.Printf(c.Str("%s\n"), cursorStr.CStr())
|
||||||
|
|
||||||
@@ -50,7 +60,7 @@ func print_cursor_info(cursor clang.Cursor) {
|
|||||||
c.Printf(c.Str("Parameters(%d): ( "), cursor.NumArguments())
|
c.Printf(c.Str("Parameters(%d): ( "), cursor.NumArguments())
|
||||||
|
|
||||||
for i := 0; i < int(cursor.NumArguments()); i++ {
|
for i := 0; i < int(cursor.NumArguments()); i++ {
|
||||||
argCurSor := cursor.Argument(uint8(i))
|
argCurSor := cursor.Argument(c.Uint(i))
|
||||||
argType := argCurSor.Type().String()
|
argType := argCurSor.Type().String()
|
||||||
argName := argCurSor.String()
|
argName := argCurSor.String()
|
||||||
c.Printf(c.Str("%s %s"), argType.CStr(), argName.CStr())
|
c.Printf(c.Str("%s %s"), argType.CStr(), argName.CStr())
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
#ifndef ZOO_H
|
|
||||||
#define ZOO_H
|
|
||||||
|
|
||||||
namespace forest
|
|
||||||
{
|
|
||||||
|
|
||||||
class Bear
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void roar();
|
|
||||||
int eat(int berries, int fish);
|
|
||||||
void sleep(const char *where);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace forest
|
|
||||||
|
|
||||||
namespace ocean
|
|
||||||
{
|
|
||||||
|
|
||||||
class Shark
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void roar();
|
|
||||||
int eat(int fish, int seals);
|
|
||||||
void sleep(const char *where);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace ocean
|
|
||||||
|
|
||||||
class Eagle
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void roar();
|
|
||||||
int eat(int mice, int fish);
|
|
||||||
void sleep(const char *where);
|
|
||||||
};
|
|
||||||
|
|
||||||
void zookeeper(int money);
|
|
||||||
|
|
||||||
#endif // ZOO_H
|
|
||||||
@@ -3,65 +3,48 @@
|
|||||||
|
|
||||||
typedef enum CXChildVisitResult (*wrap_CXCursorVisitor)(CXCursor *cursor, CXCursor *parent, CXClientData client_data);
|
typedef enum CXChildVisitResult (*wrap_CXCursorVisitor)(CXCursor *cursor, CXCursor *parent, CXClientData client_data);
|
||||||
|
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
CXClientData data;
|
CXClientData data;
|
||||||
wrap_CXCursorVisitor visitor;
|
wrap_CXCursorVisitor visitor;
|
||||||
} wrap_data;
|
} wrap_data;
|
||||||
|
|
||||||
CXChildVisitResult wrap_visitor(CXCursor cursor, CXCursor parent, CXClientData data)
|
CXChildVisitResult wrap_visitor(CXCursor cursor, CXCursor parent, CXClientData data) {
|
||||||
{
|
|
||||||
wrap_data *d = (wrap_data *)(data);
|
wrap_data *d = (wrap_data *)(data);
|
||||||
return d->visitor(&cursor, &parent, d->data);
|
return d->visitor(&cursor, &parent, d->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C"
|
extern "C" {
|
||||||
{
|
|
||||||
|
|
||||||
CXString wrap_clang_getCursorSpelling(CXCursor *cur)
|
CXString wrap_clang_getCursorSpelling(CXCursor *cur) { return clang_getCursorSpelling(*cur); }
|
||||||
{
|
|
||||||
return clang_getCursorSpelling(*cur);
|
|
||||||
}
|
|
||||||
|
|
||||||
CXString wrap_clang_Cursor_getMangling(CXCursor *cur)
|
CXString wrap_clang_Cursor_getMangling(CXCursor *cur) { return clang_Cursor_getMangling(*cur); }
|
||||||
{
|
|
||||||
return clang_Cursor_getMangling(*cur);
|
|
||||||
}
|
|
||||||
|
|
||||||
int wrap_clang_Cursor_getNumArguments(CXCursor *cur)
|
int wrap_clang_Cursor_getNumArguments(CXCursor *cur) { return clang_Cursor_getNumArguments(*cur); }
|
||||||
{
|
|
||||||
return clang_Cursor_getNumArguments(*cur);
|
|
||||||
}
|
|
||||||
|
|
||||||
void wrap_clang_Cursor_getArgument(CXCursor *C, unsigned i, CXCursor *argCur)
|
void wrap_clang_Cursor_getArgument(CXCursor *C, unsigned i, CXCursor *argCur) {
|
||||||
{
|
*argCur = clang_Cursor_getArgument(*C, i);
|
||||||
*argCur = clang_Cursor_getArgument(*C, i);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void wrap_clang_getTranslationUnitCursor(CXTranslationUnit uint, CXCursor *cur)
|
void wrap_clang_getTranslationUnitCursor(CXTranslationUnit uint, CXCursor *cur) {
|
||||||
{
|
*cur = clang_getTranslationUnitCursor(uint);
|
||||||
*cur = clang_getTranslationUnitCursor(uint);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void wrap_clang_getCursorType(CXCursor *cur, CXType *typ)
|
void wrap_clang_getCursorType(CXCursor *cur, CXType *typ) { *typ = clang_getCursorType(*cur); }
|
||||||
{
|
|
||||||
*typ = clang_getCursorType(*cur);
|
|
||||||
}
|
|
||||||
|
|
||||||
void wrap_clang_getCursorResultType(CXCursor *cur, CXType *typ)
|
void wrap_clang_getCursorResultType(CXCursor *cur, CXType *typ) { *typ = clang_getCursorResultType(*cur); }
|
||||||
{
|
|
||||||
*typ = clang_getCursorResultType(*cur);
|
|
||||||
}
|
|
||||||
|
|
||||||
CXString wrap_clang_getTypeSpelling(CXType *typ)
|
CXString wrap_clang_getTypeSpelling(CXType *typ) { return clang_getTypeSpelling(*typ); }
|
||||||
{
|
|
||||||
return clang_getTypeSpelling(*typ);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned wrap_clang_visitChildren(CXCursor *parent, wrap_CXCursorVisitor visitor, CXClientData client_data)
|
void wrap_clang_getCursorLocation(CXCursor *cur, CXSourceLocation *loc) { *loc = clang_getCursorLocation(*cur); }
|
||||||
{
|
|
||||||
wrap_data data = {client_data, visitor};
|
void wrap_clang_getSpellingLocation(CXSourceLocation *loc, CXFile *file, unsigned *line, unsigned *column,
|
||||||
return clang_visitChildren(*parent, wrap_visitor, CXClientData(&data));
|
unsigned *offset) {
|
||||||
}
|
clang_getSpellingLocation(*loc, file, line, column, offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned wrap_clang_visitChildren(CXCursor *parent, wrap_CXCursorVisitor visitor, CXClientData client_data) {
|
||||||
|
wrap_data data = {client_data, visitor};
|
||||||
|
return clang_visitChildren(*parent, wrap_visitor, CXClientData(&data));
|
||||||
|
}
|
||||||
|
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|||||||
356
c/clang/clang.go
356
c/clang/clang.go
@@ -27,160 +27,6 @@ const (
|
|||||||
LLGoPackage = "link: -L$(llvm-config --libdir) -lclang; -lclang"
|
LLGoPackage = "link: -L$(llvm-config --libdir) -lclang; -lclang"
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
|
||||||
* Opaque pointer representing client data that will be passed through
|
|
||||||
* to various callbacks and visitors.
|
|
||||||
*/
|
|
||||||
type ClientData = c.Pointer
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides the contents of a file that has not yet been saved to disk.
|
|
||||||
*
|
|
||||||
* Each CXUnsavedFile instance provides the name of a file on the
|
|
||||||
* system along with the current contents of that file that have not
|
|
||||||
* yet been saved to disk.
|
|
||||||
*/
|
|
||||||
type UnsavedFile struct {
|
|
||||||
/**
|
|
||||||
* The file whose contents have not yet been saved.
|
|
||||||
*
|
|
||||||
* This file must already exist in the file system.
|
|
||||||
*/
|
|
||||||
Filename *c.Char
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A buffer containing the unsaved contents of this file.
|
|
||||||
*/
|
|
||||||
Contents *c.Char
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The length of the unsaved contents of this buffer.
|
|
||||||
*/
|
|
||||||
Length c.Ulong
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An "index" that consists of a set of translation units that would
|
|
||||||
* typically be linked together into an executable or library.
|
|
||||||
*/
|
|
||||||
type Index struct {
|
|
||||||
Unused [0]byte
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides a shared context for creating translation units.
|
|
||||||
*
|
|
||||||
* It provides two options:
|
|
||||||
*
|
|
||||||
* - excludeDeclarationsFromPCH: When non-zero, allows enumeration of "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. If zero, all declarations
|
|
||||||
* will be enumerated.
|
|
||||||
*
|
|
||||||
* Here is an example:
|
|
||||||
*
|
|
||||||
* \code
|
|
||||||
* // excludeDeclsFromPCH = 1, displayDiagnostics=1
|
|
||||||
* Idx = clang_createIndex(1, 1);
|
|
||||||
*
|
|
||||||
* // IndexTest.pch was produced with the following command:
|
|
||||||
* // "clang -x c IndexTest.h -emit-ast -o IndexTest.pch"
|
|
||||||
* TU = clang_createTranslationUnit(Idx, "IndexTest.pch");
|
|
||||||
*
|
|
||||||
* // This will load all the symbols from 'IndexTest.pch'
|
|
||||||
* clang_visitChildren(clang_getTranslationUnitCursor(TU),
|
|
||||||
* TranslationUnitVisitor, 0);
|
|
||||||
* clang_disposeTranslationUnit(TU);
|
|
||||||
*
|
|
||||||
* // This will load all the symbols from 'IndexTest.c', excluding symbols
|
|
||||||
* // from 'IndexTest.pch'.
|
|
||||||
* char *args[] = { "-Xclang", "-include-pch=IndexTest.pch" };
|
|
||||||
* TU = clang_createTranslationUnitFromSourceFile(Idx, "IndexTest.c", 2, args,
|
|
||||||
* 0, 0);
|
|
||||||
* clang_visitChildren(clang_getTranslationUnitCursor(TU),
|
|
||||||
* TranslationUnitVisitor, 0);
|
|
||||||
* clang_disposeTranslationUnit(TU);
|
|
||||||
* \endcode
|
|
||||||
*
|
|
||||||
* This process of creating the 'pch', loading it separately, and using it (via
|
|
||||||
* -include-pch) allows 'excludeDeclsFromPCH' to remove redundant callbacks
|
|
||||||
* (which gives the indexer the same performance benefit as the compiler).
|
|
||||||
*/
|
|
||||||
//go:linkname CreateIndex C.clang_createIndex
|
|
||||||
func CreateIndex(excludeDeclarationsFromPCH, displayDiagnostics c.Int) *Index
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroy the given index.
|
|
||||||
*
|
|
||||||
* The index must not be destroyed until all of the translation units created
|
|
||||||
* within that index have been destroyed.
|
|
||||||
*/
|
|
||||||
// llgo:link (*Index).Dispose C.clang_disposeIndex
|
|
||||||
func (*Index) Dispose() {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Flags that control the creation of translation units.
|
|
||||||
*
|
|
||||||
* The enumerators in this enumeration type are meant to be bitwise
|
|
||||||
* ORed together to specify which options should be used when
|
|
||||||
* constructing the translation unit.
|
|
||||||
*/
|
|
||||||
const (
|
|
||||||
TranslationUnit_None = 0x0
|
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Same as \c clang_parseTranslationUnit2, but returns
|
|
||||||
* the \c CXTranslationUnit instead of an error code. In case of an error this
|
|
||||||
* routine returns a \c NULL \c CXTranslationUnit, without further detailed
|
|
||||||
* error codes.
|
|
||||||
*/
|
|
||||||
// llgo:link (*Index).ParseTranslationUnit C.clang_parseTranslationUnit
|
|
||||||
func (*Index) ParseTranslationUnit(
|
|
||||||
sourceFilename *c.Char, commandLineArgs **c.Char, numCommandLineArgs c.Int,
|
|
||||||
unsavedFiles *UnsavedFile, numUnsavedFiles c.Uint, options c.Uint) *TranslationUnit {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A single translation unit, which resides in an index.
|
|
||||||
*/
|
|
||||||
type TranslationUnit struct {
|
|
||||||
Unused [0]byte
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroy the specified CXTranslationUnit object.
|
|
||||||
*/
|
|
||||||
// llgo:link (*TranslationUnit).Dispose C.clang_disposeTranslationUnit
|
|
||||||
func (*TranslationUnit) Dispose() {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the cursor that represents the given translation unit.
|
|
||||||
*
|
|
||||||
* The translation unit cursor can be used to start traversing the
|
|
||||||
* various declarations within the given translation unit.
|
|
||||||
*/
|
|
||||||
func (p *TranslationUnit) Cursor() (ret Cursor) {
|
|
||||||
p.wrapCursor(&ret)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//llgo:link (*TranslationUnit).wrapCursor C.wrap_clang_getTranslationUnitCursor
|
|
||||||
func (t *TranslationUnit) wrapCursor(cursor *Cursor) {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Describes the kind of entity that a cursor refers to.
|
|
||||||
*/
|
|
||||||
type CursorKind c.Int
|
|
||||||
|
|
||||||
/* for debug/testing */
|
|
||||||
// llgo:link CursorKind.String C.clang_getCursorKindSpelling
|
|
||||||
func (CursorKind) String() (ret String) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
/* Declarations */
|
/* Declarations */
|
||||||
/**
|
/**
|
||||||
@@ -1279,6 +1125,161 @@ const (
|
|||||||
OverloadCandidate = 700
|
OverloadCandidate = 700
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opaque pointer representing client data that will be passed through
|
||||||
|
* to various callbacks and visitors.
|
||||||
|
*/
|
||||||
|
type ClientData = c.Pointer
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides the contents of a file that has not yet been saved to disk.
|
||||||
|
*
|
||||||
|
* Each CXUnsavedFile instance provides the name of a file on the
|
||||||
|
* system along with the current contents of that file that have not
|
||||||
|
* yet been saved to disk.
|
||||||
|
*/
|
||||||
|
type UnsavedFile struct {
|
||||||
|
/**
|
||||||
|
* The file whose contents have not yet been saved.
|
||||||
|
*
|
||||||
|
* This file must already exist in the file system.
|
||||||
|
*/
|
||||||
|
Filename *c.Char
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A buffer containing the unsaved contents of this file.
|
||||||
|
*/
|
||||||
|
Contents *c.Char
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The length of the unsaved contents of this buffer.
|
||||||
|
*/
|
||||||
|
Length c.Ulong
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An "index" that consists of a set of translation units that would
|
||||||
|
* typically be linked together into an executable or library.
|
||||||
|
*/
|
||||||
|
type Index struct {
|
||||||
|
Unused [0]byte
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides a shared context for creating translation units.
|
||||||
|
*
|
||||||
|
* It provides two options:
|
||||||
|
*
|
||||||
|
* - excludeDeclarationsFromPCH: When non-zero, allows enumeration of "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. If zero, all declarations
|
||||||
|
* will be enumerated.
|
||||||
|
*
|
||||||
|
* Here is an example:
|
||||||
|
*
|
||||||
|
* \code
|
||||||
|
* // excludeDeclsFromPCH = 1, displayDiagnostics=1
|
||||||
|
* Idx = clang_createIndex(1, 1);
|
||||||
|
*
|
||||||
|
* // IndexTest.pch was produced with the following command:
|
||||||
|
* // "clang -x c IndexTest.h -emit-ast -o IndexTest.pch"
|
||||||
|
* TU = clang_createTranslationUnit(Idx, "IndexTest.pch");
|
||||||
|
*
|
||||||
|
* // This will load all the symbols from 'IndexTest.pch'
|
||||||
|
* clang_visitChildren(clang_getTranslationUnitCursor(TU),
|
||||||
|
* TranslationUnitVisitor, 0);
|
||||||
|
* clang_disposeTranslationUnit(TU);
|
||||||
|
*
|
||||||
|
* // This will load all the symbols from 'IndexTest.c', excluding symbols
|
||||||
|
* // from 'IndexTest.pch'.
|
||||||
|
* char *args[] = { "-Xclang", "-include-pch=IndexTest.pch" };
|
||||||
|
* TU = clang_createTranslationUnitFromSourceFile(Idx, "IndexTest.c", 2, args,
|
||||||
|
* 0, 0);
|
||||||
|
* clang_visitChildren(clang_getTranslationUnitCursor(TU),
|
||||||
|
* TranslationUnitVisitor, 0);
|
||||||
|
* clang_disposeTranslationUnit(TU);
|
||||||
|
* \endcode
|
||||||
|
*
|
||||||
|
* This process of creating the 'pch', loading it separately, and using it (via
|
||||||
|
* -include-pch) allows 'excludeDeclsFromPCH' to remove redundant callbacks
|
||||||
|
* (which gives the indexer the same performance benefit as the compiler).
|
||||||
|
*/
|
||||||
|
//go:linkname CreateIndex C.clang_createIndex
|
||||||
|
func CreateIndex(excludeDeclarationsFromPCH, displayDiagnostics c.Int) *Index
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy the given index.
|
||||||
|
*
|
||||||
|
* The index must not be destroyed until all of the translation units created
|
||||||
|
* within that index have been destroyed.
|
||||||
|
*/
|
||||||
|
// llgo:link (*Index).Dispose C.clang_disposeIndex
|
||||||
|
func (*Index) Dispose() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flags that control the creation of translation units.
|
||||||
|
*
|
||||||
|
* The enumerators in this enumeration type are meant to be bitwise
|
||||||
|
* ORed together to specify which options should be used when
|
||||||
|
* constructing the translation unit.
|
||||||
|
*/
|
||||||
|
const (
|
||||||
|
TranslationUnit_None = 0x0
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Same as \c clang_parseTranslationUnit2, but returns
|
||||||
|
* the \c CXTranslationUnit instead of an error code. In case of an error this
|
||||||
|
* routine returns a \c NULL \c CXTranslationUnit, without further detailed
|
||||||
|
* error codes.
|
||||||
|
*/
|
||||||
|
// llgo:link (*Index).ParseTranslationUnit C.clang_parseTranslationUnit
|
||||||
|
func (*Index) ParseTranslationUnit(
|
||||||
|
sourceFilename *c.Char, commandLineArgs **c.Char, numCommandLineArgs c.Int,
|
||||||
|
unsavedFiles *UnsavedFile, numUnsavedFiles c.Uint, options c.Uint) *TranslationUnit {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A single translation unit, which resides in an index.
|
||||||
|
*/
|
||||||
|
type TranslationUnit struct {
|
||||||
|
Unused [0]byte
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy the specified CXTranslationUnit object.
|
||||||
|
*/
|
||||||
|
// llgo:link (*TranslationUnit).Dispose C.clang_disposeTranslationUnit
|
||||||
|
func (*TranslationUnit) Dispose() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the cursor that represents the given translation unit.
|
||||||
|
*
|
||||||
|
* The translation unit cursor can be used to start traversing the
|
||||||
|
* various declarations within the given translation unit.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//llgo:link (*TranslationUnit).wrapCursor C.wrap_clang_getTranslationUnitCursor
|
||||||
|
func (t *TranslationUnit) wrapCursor(cursor *Cursor) {}
|
||||||
|
|
||||||
|
func (t *TranslationUnit) Cursor() (ret Cursor) {
|
||||||
|
t.wrapCursor(&ret)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes the kind of entity that a cursor refers to.
|
||||||
|
*/
|
||||||
|
type CursorKind c.Int
|
||||||
|
|
||||||
|
/* for debug/testing */
|
||||||
|
// llgo:link CursorKind.String C.clang_getCursorKindSpelling
|
||||||
|
func (CursorKind) String() (ret String) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A cursor representing some element in the abstract syntax tree for
|
* A cursor representing some element in the abstract syntax tree for
|
||||||
* a translation unit.
|
* a translation unit.
|
||||||
@@ -1303,11 +1304,32 @@ type Cursor struct {
|
|||||||
data [3]c.Pointer
|
data [3]c.Pointer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of an element in the abstract syntax tree.
|
||||||
|
*
|
||||||
|
*/
|
||||||
type Type struct {
|
type Type struct {
|
||||||
Kind CursorKind
|
Kind CursorKind
|
||||||
data [2]c.Pointer
|
data [2]c.Pointer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A particular source file that is part of a translation unit.
|
||||||
|
*/
|
||||||
|
type File uintptr
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Identifies a specific source location within a translation
|
||||||
|
* unit.
|
||||||
|
*
|
||||||
|
* Use clang_getExpansionLocation() or clang_getSpellingLocation()
|
||||||
|
* to map a source location to a particular file, line, and column.
|
||||||
|
*/
|
||||||
|
type SourceLocation struct {
|
||||||
|
ptrData [2]c.Pointer
|
||||||
|
intData c.Uint
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve a name for the entity referenced by this cursor.
|
* Retrieve a name for the entity referenced by this cursor.
|
||||||
*/
|
*/
|
||||||
@@ -1338,7 +1360,7 @@ func (c Cursor) Mangling() (ret String) {
|
|||||||
// llgo:link (*Cursor).wrapType C.wrap_clang_getCursorType
|
// llgo:link (*Cursor).wrapType C.wrap_clang_getCursorType
|
||||||
func (c *Cursor) wrapType(ret *Type) {}
|
func (c *Cursor) wrapType(ret *Type) {}
|
||||||
|
|
||||||
func (c *Cursor) Type() (ret Type) {
|
func (c Cursor) Type() (ret Type) {
|
||||||
c.wrapType(&ret)
|
c.wrapType(&ret)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -1351,7 +1373,7 @@ func (c *Cursor) Type() (ret Type) {
|
|||||||
// llgo:link (*Cursor).wrapResultType C.wrap_clang_getCursorResultType
|
// llgo:link (*Cursor).wrapResultType C.wrap_clang_getCursorResultType
|
||||||
func (c *Cursor) wrapResultType(ret *Type) {}
|
func (c *Cursor) wrapResultType(ret *Type) {}
|
||||||
|
|
||||||
func (c *Cursor) ResultType() (ret Type) {
|
func (c Cursor) ResultType() (ret Type) {
|
||||||
c.wrapResultType(&ret)
|
c.wrapResultType(&ret)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -1380,13 +1402,28 @@ func (c Cursor) NumArguments() (num c.Int) {
|
|||||||
* invalid cursor is returned.
|
* invalid cursor is returned.
|
||||||
*/
|
*/
|
||||||
// llgo:link (*Cursor).wrapArgument C.wrap_clang_Cursor_getArgument
|
// llgo:link (*Cursor).wrapArgument C.wrap_clang_Cursor_getArgument
|
||||||
func (*Cursor) wrapArgument(index uint8, arg *Cursor) {}
|
func (*Cursor) wrapArgument(index c.Uint, arg *Cursor) {}
|
||||||
|
|
||||||
func (c Cursor) Argument(index uint8) (arg Cursor) {
|
func (c Cursor) Argument(index c.Uint) (arg Cursor) {
|
||||||
c.wrapArgument(index, &arg)
|
c.wrapArgument(index, &arg)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// llgo:link (*Cursor).wrapLocation C.wrap_clang_getCursorLocation
|
||||||
|
func (c *Cursor) wrapLocation(loc *SourceLocation) {}
|
||||||
|
|
||||||
|
func (c Cursor) Location() (loc SourceLocation) {
|
||||||
|
c.wrapLocation(&loc)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// llgo:link (*SourceLocation).wrapSpellingLocation C.wrap_clang_getSpellingLocation
|
||||||
|
func (l *SourceLocation) wrapSpellingLocation(file *File, line, column, offset *c.Uint) {}
|
||||||
|
|
||||||
|
func (l SourceLocation) SpellingLocation(file *File, line, column, offset *c.Uint) {
|
||||||
|
l.wrapSpellingLocation(file, line, column, offset)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pretty-print the underlying type using the rules of the
|
* Pretty-print the underlying type using the rules of the
|
||||||
* language of the translation unit from which it came.
|
* language of the translation unit from which it came.
|
||||||
@@ -1402,6 +1439,9 @@ func (t Type) String() (ret String) {
|
|||||||
return t.wrapString()
|
return t.wrapString()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//llgo:link File.FileName C.clang_getFileName
|
||||||
|
func (File) FileName() (ret String) { return }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Describes how the traversal of the children of a particular
|
* Describes how the traversal of the children of a particular
|
||||||
* cursor should proceed after visiting a particular child cursor.
|
* cursor should proceed after visiting a particular child cursor.
|
||||||
|
|||||||
Reference in New Issue
Block a user