public
Description: Ruby library to parse and query C++ header files using GCCXML
Homepage: http://rbplusplus.rubyforge.org/rbgccxml
Clone URL: git://github.com/jameskilton/rbgccxml.git
rbgccxml / README
100644 129 lines (78 sloc) 4.53 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
== What is rbgccxml?
 
RbGCCXML allows one to easily parse out and query C++ code. This library uses GCC-XML to parse out
the C++ code into XML, and then nokogiri for parsing and querying.
 
GCC-XML (http://www.gccxml.org) is an application that takes takes the parse tree of g++ and
constructs a very parsable and queryable XML file with all related information. GCC-XML currently
only works with code declarations; there currently are no plans to support code bodies.
 
Note: For those familiar with pygccxml, the similarities are minimal. Outside of the purpose
of both libraries, rbgccxml was built from scratch to provide a Ruby-esque query API instead of
being a port. However, many thanks to Roman for his work, without which this library would also
not exist.
 
== Requirements
 
* nokogiri
* gccxml_gem (binary gem, choose proper platform)
 
== Installation
 
  gem sources --add http://gemcutter.org
  gem install rbgccxml
 
RbGCCXML will work on all platforms that GCC-XML supports, which is currently all the major platforms
of Linux, Mac and Windows. If you're on a platform for which there isn't a current gccxml_gem build,
please open a ticket on this project's tracker.
 
== The Project
 
RbGCCXML's source is in a git repository hosted on github:
 
Project page:
 
http://github.com/jameskilton/rbgccxml/tree/master
 
Clone with:
 
  git clone git://github.com/jameskilton/rbgccxml.git
 
== Usage
 
=== Parsing
 
All rbgccxml parses start with the RbGCCXML.parse method:
 
  # Parse a single header file
  RbGCCXML.parse("/path/to/header/file.h")
 
  # Parse out all files that match a given glob
  RbGCCXML.parse("/my/headers/**/*.h")
 
  # Parse out a specified set of files"
  RbGCCXML.parse(["/path/to/file1.h", "/path/to/file2.h", ...])
 
  # Parse out multiple globs
  RbGCCXML.parse(["/my/headers/**/*.h", "/other/headers/*.hpp"])
 
=== Configuration
 
As GCC-XML runs on top of GCC, it will need to know about locations of other header files
that may be included by the header files being parsed out. Adding these paths is simple:
 
  RbGCCXML.parse(..., :includes => *directories)
 
where +directories+ can be a single directory string or an array of directories, just like RbGCCXML.parse.
 
Also, if there are other CXXFLAGS that need to be added to the command line for GCC-XML to properly
parse the source headers (say, -D defines), add those via the :cxxflags option.
 
  RbGCCXML.parse(..., :cxxflags => *flags)
 
=== Querying By Name
 
Once the header files have been parsed, RbGCCXML.parse returns a Namespace node that references the
global namespace "::". From here, all the function, class, etc declarations are easily queryable.
 
  source = RbGCCXML.parse("header.h") #=> <Namespace ...>
 
Each major C++ node (class, struct, function, method, argument (of functions, methods,
and constructors)) have a related query method that can be called in various ways:
 
  # Get all classes in the current scope
  source.classes
 
  # Explicitly call #find on these classes
  source.classes.find(...)
 
  # Or use a short cut, if you're just looking for a class by a given name
  source.classes("ClassName")
 
  # Find supports regular expressions as well
  source.classes(/Manager$/)
 
These queries are also nestable as long as there's more code available to query.
To find the class "Math" inside the namespace "core::utils", you can do:
 
  source.namespaces("core").namespaces("utils").classes("Math")
 
or in a short-hand / C++ qualified form:
 
  source.namespaces("core::utils::Math")
 
=== Querying with #find
 
Of course, querying for names is only the tip of the powerful querying that RbGCCXML supports.
 
What if you want to find all methods on a class that return an int and have three arguments of
any type? This is easy with RbGCCXML:
 
  source.classes("TheClass").methods.find(:returns => :int, :arguments => [nil, nil, nil])
 
The keys +returns+ and +arguments+ can be used on their own or together as seen above.
The +arguments+ option must be an array, and if the type of the argument doesn't matter, placing
'nil' in it's place acts as a wildcard. QueryResult#find is also chainable, provided that there
are always more than one result. Otherwise, if there is just one result, only that Node will
be returned and any further chained QueryResult.find methods will fail with NoMethodError.
 
=== The Next Step
 
See RbGCCXML::Node for all methods available on all C++ nodes.
 
See RbGCCXML::QueryResult for the full run-down on #find
 
== Additional Notes
 
Querying for unsigned types is currently not implemented.