go-clang

module
v0.0.0-...-bd0b661 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 3, 2012 License: BSD-2-Clause

README

go-clang
========

Naive Go bindings to the C-API of ``CLang``.

Installation
------------

As there is no ``pkg-config`` entry for clang, you may have to tinker
a bit the various CFLAGS and LDFLAGS options, or pass them via the
shell:

::

  $ CGO_CFLAGS="-I/somewhere" \
  CGO_LDFLAGS="-L/somewhere/else" \
  go get bitbucket.org/binet/go-clang/pkg/clang


Example
-------

An example on how to use the AST visitor of ``CLang`` is provided
here:

 https://bitbucket.org/binet/go-clang/src/tip/cmd/go-clang-dump/main.go

::

  package main

  import (
  	"flag"
  	"fmt"
  	"os"

  	"bitbucket.org/binet/go-clang/pkg/clang"
  )

  var fname *string = flag.String("fname", "", "the file to analyze")

  func main() {
  	fmt.Printf(":: go-clang-dump...\n")
  	flag.Parse()
  	fmt.Printf(":: fname: %s\n", *fname)
	fmt.Printf(":: args: %v\n", flag.Args())
	if *fname == "" {
		flag.Usage()
		fmt.Printf("please provide a file name to analyze\n")
		os.Exit(1)
	}
	idx := clang.NewIndex(0, 1)
	defer idx.Dispose()

	nidx := 0
	args := []string{}
	if len(flag.Args()) > 0 && flag.Args()[0] == "-" {
		nidx = 1
		args = make([]string, len(flag.Args()[nidx:]))
		copy(args, flag.Args()[nidx:])
	}

	tu := idx.Parse(*fname, args, 0)

	defer tu.Dispose()

	fmt.Printf("tu: %s\n", tu.Spelling())
	cursor := tu.ToCursor()
	fmt.Printf("cursor-isnull: %v\n", cursor.IsNull())
	fmt.Printf("cursor: %s\n", cursor.Spelling())
	fmt.Printf("cursor-kind: %s\n", cursor.Kind().Spelling())

	tu_fname := tu.File(*fname).Name()
	fmt.Printf("tu-fname: %s\n", tu_fname)

	fct := func(cursor, parent clang.Cursor) clang.ChildVisitResult {
		if cursor.IsNull() {
			fmt.Printf("cursor: <none>\n")
			return clang.CVR_Continue
		}
		fmt.Printf("%s: %s (%s)\n", 
			cursor.Kind().Spelling(), cursor.Spelling(), cursor.USR())
		switch cursor.Kind() {
		case clang.CK_ClassDecl, clang.CK_EnumDecl,
			clang.CK_StructDecl, clang.CK_Namespace:
			return clang.CVR_Recurse
		}
		return clang.CVR_Continue
	}

	cursor.Visit(fct)

	fmt.Printf(":: bye.\n")
  }


which can be installed like so::

  $ go get bitbucket.org/binet/go-clang/cmd/go-clang-dump

Limitations
-----------

- Only a subset of the C-API of ``CLang`` has been provided yet.
  More will come as patches flow in and time goes by.

- Go-doc documentation is lagging (but the doxygen docs from the C-API
  of ``CLang`` are in the ``.go`` files)


Documentation
-------------

Is provided thru ``gopkg``:

 http://gopkgdoc.appspot.com/pkg/bitbucket.org/binet/go-clang/pkg/clang

Directories

Path Synopsis
cmd
go-clang-dump
go-clang-dump shows how to dump the AST of a C/C++ file via the Cursor visitor API.
go-clang-dump shows how to dump the AST of a C/C++ file via the Cursor visitor API.
pkg
clang
clang provides naive bindings to the CLang C-API.
clang provides naive bindings to the CLang C-API.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL