rbgccxml 0.1.1 → 0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +19 -9
- data/lib/rbgccxml/node.rb +81 -30
- data/lib/rbgccxml/nodes/argument.rb +1 -1
- data/lib/rbgccxml/nodes/class.rb +4 -8
- data/lib/rbgccxml/nodes/constructor.rb +2 -5
- data/lib/rbgccxml/nodes/enum_value.rb +20 -0
- data/lib/rbgccxml/nodes/enumeration.rb +10 -0
- data/lib/rbgccxml/nodes/file.rb +1 -2
- data/lib/rbgccxml/nodes/function.rb +1 -2
- data/lib/rbgccxml/nodes/method.rb +11 -1
- data/lib/rbgccxml/nodes/namespace.rb +1 -1
- data/lib/rbgccxml/nodes/struct.rb +2 -2
- data/lib/rbgccxml/nodes/type.rb +28 -1
- data/lib/rbgccxml/nodes/types/cv_qualified_type.rb +20 -0
- data/lib/rbgccxml/nodes/types/fundamental_type.rb +8 -2
- data/lib/rbgccxml/nodes/types/pointer_type.rb +6 -8
- data/lib/rbgccxml/nodes/types/reference_type.rb +14 -0
- data/lib/rbgccxml/nodes/types/typedef.rb +0 -1
- data/lib/rbgccxml/parser.rb +1 -1
- data/lib/rbgccxml/query_result.rb +51 -19
- data/lib/rbgccxml/rbgccxml.rb +1 -1
- data/lib/rbgccxml/xml_parsing.rb +109 -14
- data/lib/rbgccxml.rb +4 -0
- data/test/classes_test.rb +2 -2
- data/test/enumerations_test.rb +44 -0
- data/test/functions_test.rb +1 -59
- data/test/methods_test.rb +11 -0
- data/test/node_test.rb +19 -0
- data/test/query_results_test.rb +228 -0
- data/test/test_helper.rb +4 -0
- data/test/types_test.rb +78 -0
- metadata +11 -3
data/Rakefile
CHANGED
@@ -4,7 +4,7 @@ require 'rake/contrib/sshpublisher'
|
|
4
4
|
require 'rake/gempackagetask'
|
5
5
|
|
6
6
|
PROJECT_NAME = "rbgccxml"
|
7
|
-
RBGCCXML_VERSION = "0.
|
7
|
+
RBGCCXML_VERSION = "0.8"
|
8
8
|
|
9
9
|
task :default => :test
|
10
10
|
|
@@ -25,15 +25,25 @@ end
|
|
25
25
|
RUBYFORGE_USERNAME = "jameskilton"
|
26
26
|
PROJECT_WEB_PATH = "/var/www/gforge-projects/rbplusplus/rbgccxml"
|
27
27
|
|
28
|
-
|
29
|
-
desc "
|
30
|
-
task :
|
31
|
-
|
32
|
-
|
28
|
+
namespace :web do
|
29
|
+
desc "Put the website together"
|
30
|
+
task :build => :rdoc do
|
31
|
+
unless File.directory?("publish")
|
32
|
+
mkdir "publish"
|
33
|
+
end
|
34
|
+
sh "cp -r html/* publish/"
|
35
|
+
end
|
36
|
+
|
37
|
+
# As part of the rbplusplus project, this just goes in a subfolder
|
38
|
+
desc "Update the website"
|
39
|
+
task :upload => "web:build" do |t|
|
40
|
+
Rake::SshDirPublisher.new("#{RUBYFORGE_USERNAME}@rubyforge.org", PROJECT_WEB_PATH, "publish").upload
|
41
|
+
end
|
42
|
+
|
43
|
+
desc "Clean up generated web files"
|
44
|
+
task :clean do
|
45
|
+
rm_rf "publish"
|
33
46
|
end
|
34
|
-
sh "cp -r html/* publish/"
|
35
|
-
Rake::SshDirPublisher.new("#{RUBYFORGE_USERNAME}@rubyforge.org", PROJECT_WEB_PATH, "publish").upload
|
36
|
-
rm_rf "publish"
|
37
47
|
end
|
38
48
|
|
39
49
|
spec = Gem::Specification.new do |s|
|
data/lib/rbgccxml/node.rb
CHANGED
@@ -8,7 +8,7 @@ module RbGCCXML
|
|
8
8
|
#
|
9
9
|
# Any Node further down the heirarchy chain can and should define which
|
10
10
|
# finder methods are and are not avaiable at that level. For example, the
|
11
|
-
# Class
|
11
|
+
# Class node cannot search for other Namespaces within that class.
|
12
12
|
class Node
|
13
13
|
attr_reader :node
|
14
14
|
|
@@ -17,88 +17,117 @@ module RbGCCXML
|
|
17
17
|
def initialize(node)
|
18
18
|
@node = node
|
19
19
|
end
|
20
|
-
|
20
|
+
protected :initialize
|
21
|
+
|
21
22
|
# Get the C++ name of this node
|
22
23
|
def name
|
23
24
|
@node.attributes['name']
|
24
25
|
end
|
25
|
-
|
26
|
+
|
26
27
|
# Get the fully qualified (demangled) C++ name of this node.
|
27
|
-
# The 'demangled' attribute of the node for methods / functions is the
|
28
|
-
# full signature, so cut that out.
|
29
28
|
def qualified_name
|
30
29
|
if @node.attributes["demangled"]
|
30
|
+
# The 'demangled' attribute of the node for methods / functions is the
|
31
|
+
# full signature, so cut that part out.
|
31
32
|
@node.attributes["demangled"].split(/\(/)[0]
|
32
33
|
else
|
33
|
-
|
34
|
+
parent ? "#{parent.qualified_name}::#{name}" : name
|
34
35
|
end
|
35
36
|
end
|
36
37
|
|
37
|
-
#
|
38
|
-
def
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
38
|
+
# Is this node const qualified?
|
39
|
+
def const?
|
40
|
+
@node.attributes["const"] ? @node.attributes["const"] == "1" : false
|
41
|
+
end
|
42
|
+
|
43
|
+
# Does this node have public access?
|
44
|
+
def public?
|
45
|
+
@node.attributes["access"] ? @node.attributes["access"] == "public" : true
|
46
|
+
end
|
47
|
+
|
48
|
+
# Does this node have protected access?
|
49
|
+
def protected?
|
50
|
+
@node.attributes["access"] ? @node.attributes["access"] == "protected" : false
|
51
|
+
end
|
52
|
+
|
53
|
+
# Does this node have private access?
|
54
|
+
def private?
|
55
|
+
@node.attributes["access"] ? @node.attributes["access"] == "private" : false
|
56
|
+
end
|
57
|
+
|
58
|
+
# Forward up attribute array for easy access to the
|
59
|
+
# underlying XML node
|
60
|
+
def attributes
|
61
|
+
@node.attributes
|
45
62
|
end
|
46
63
|
|
47
|
-
#
|
64
|
+
# Returns the full file name of the file this node is found in.
|
48
65
|
def file_name(basename = true)
|
49
66
|
file_id = @node.attributes["file"]
|
50
|
-
file_node = XMLParsing
|
67
|
+
file_node = XMLParsing.find(:type => "File", :id => file_id)
|
51
68
|
name = file_node.attributes["name"]
|
52
69
|
basename ? ::File.basename(name) : name
|
53
70
|
end
|
54
71
|
|
55
|
-
#
|
72
|
+
# Returns the parent node of this node. e.g. function.parent will get the class
|
56
73
|
# the function is contained in.
|
57
74
|
def parent
|
58
|
-
return nil if @node.attributes["context"] == "_1"
|
59
|
-
XMLParsing
|
75
|
+
return nil if @node.attributes["context"].nil? || @node.attributes["context"] == "_1"
|
76
|
+
XMLParsing.find(:id => @node.attributes["context"])
|
60
77
|
end
|
61
78
|
|
62
79
|
# Find all namespaces. There are two ways of calling this method:
|
63
80
|
# #namespaces => Get all namespaces in this scope
|
64
81
|
# #namespaces(name) => Shortcut for namespaces.find(:name => name)
|
82
|
+
#
|
83
|
+
# Returns a QueryResult unless only one node was found
|
65
84
|
def namespaces(name = nil)
|
66
85
|
if name
|
67
86
|
namespaces.find(:name => name)
|
68
87
|
else
|
69
|
-
XMLParsing
|
88
|
+
XMLParsing.find_nested_nodes_of_type(@node, "Namespace")
|
70
89
|
end
|
71
90
|
end
|
72
91
|
|
73
|
-
# Find all classes in this scope.
|
74
|
-
#
|
92
|
+
# Find all classes in this scope.
|
93
|
+
# See Node.namespaces
|
75
94
|
def classes(name = nil)
|
76
95
|
if name
|
77
96
|
classes.find(:name => name)
|
78
97
|
else
|
79
|
-
XMLParsing
|
98
|
+
XMLParsing.find_nested_nodes_of_type(@node, "Class")
|
80
99
|
end
|
81
100
|
end
|
82
101
|
|
83
|
-
# Find all structs in this scope.
|
84
|
-
#
|
102
|
+
# Find all structs in this scope.
|
103
|
+
# See Node.namespaces
|
85
104
|
def structs(name = nil)
|
86
105
|
if name
|
87
106
|
structs.find(:name => name)
|
88
107
|
else
|
89
|
-
XMLParsing
|
108
|
+
XMLParsing.find_nested_nodes_of_type(@node, "Struct")
|
90
109
|
end
|
91
110
|
end
|
92
111
|
|
93
112
|
# Find all functions in this scope. Functions are free non-class
|
94
113
|
# functions. To search for class methods, use #methods.
|
95
|
-
#
|
96
|
-
#
|
114
|
+
#
|
115
|
+
# See Node.namespaces
|
97
116
|
def functions(name = nil)
|
98
117
|
if name
|
99
118
|
functions.find(:name => name)
|
100
119
|
else
|
101
|
-
XMLParsing
|
120
|
+
XMLParsing.find_nested_nodes_of_type(@node, "Function")
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
# Find all enumerations in this scope.
|
125
|
+
# See Node.namespaces
|
126
|
+
def enumerations(name = nil)
|
127
|
+
if name
|
128
|
+
enumerations.find(:name => name)
|
129
|
+
else
|
130
|
+
XMLParsing.find_nested_nodes_of_type(@node, "Enumeration")
|
102
131
|
end
|
103
132
|
end
|
104
133
|
|
@@ -111,12 +140,34 @@ module RbGCCXML
|
|
111
140
|
def ==(val)
|
112
141
|
if val.is_a?(String)
|
113
142
|
return true if self.name == val
|
114
|
-
|
143
|
+
# Need to take care of '*' which is a regex character, and any leading ::,
|
144
|
+
# which are redundant in our case.
|
145
|
+
if val =~ /::/
|
146
|
+
return true if self.qualified_name =~ /#{val.gsub("*", "\\*").gsub(/^::/, "")}/
|
147
|
+
end
|
148
|
+
|
115
149
|
false
|
150
|
+
elsif val.is_a?(Regexp)
|
151
|
+
self =~ val
|
116
152
|
else
|
117
153
|
super
|
118
154
|
end
|
119
155
|
end
|
156
|
+
|
157
|
+
# Regexp comparison operator for consistency. See Node.==
|
158
|
+
def =~(val)
|
159
|
+
if val.is_a?(Regexp)
|
160
|
+
self.name =~ val || self.qualified_name =~ val
|
161
|
+
else
|
162
|
+
super
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
# Print out the name of this node. If passed in <tt>true</tt> then will
|
167
|
+
# print out the fully qualified name of this node.
|
168
|
+
def to_s(full = false)
|
169
|
+
full ? self.qualified_name : self.name
|
170
|
+
end
|
120
171
|
end
|
121
172
|
|
122
173
|
end
|
data/lib/rbgccxml/nodes/class.rb
CHANGED
@@ -1,22 +1,18 @@
|
|
1
1
|
module RbGCCXML
|
2
|
-
# Node type represending <Class
|
2
|
+
# Node type represending <Class> nodes.
|
3
3
|
class Class < Node
|
4
4
|
|
5
|
-
# Classes cannot have nested namespaces
|
5
|
+
# Disabled: Classes cannot have nested namespaces
|
6
6
|
def namespaces(name = nil)
|
7
7
|
raise NotQueryableException.new("Cannot query for Namespaces while in a Class")
|
8
8
|
end
|
9
9
|
|
10
|
-
# Find all the constructors for this class
|
10
|
+
# Find all the constructors for this class.
|
11
11
|
def constructors
|
12
12
|
XMLParsing::find_nested_nodes_of_type(@node, "Constructor")
|
13
13
|
end
|
14
14
|
|
15
|
-
# Find all methods for this class.
|
16
|
-
#
|
17
|
-
# <tt>methods</tt>:: Get all methods in this scope
|
18
|
-
# <tt>methods(name)</tt>:: Shortcut for methods.find(:name => name)
|
19
|
-
#
|
15
|
+
# Find all methods for this class. See Node.namespaces
|
20
16
|
def methods(name = nil)
|
21
17
|
if name
|
22
18
|
methods.find(:name => name)
|
@@ -1,10 +1,7 @@
|
|
1
1
|
module RbGCCXML
|
2
|
-
# Class representing <Constructor
|
3
|
-
# Has arguments
|
2
|
+
# Class representing <Constructor> nodes.
|
4
3
|
class Constructor < Function
|
5
|
-
|
6
|
-
# Constructors do not have a return_type, this raises an
|
7
|
-
# exception.
|
4
|
+
# Disabled: Constructors do not have a return_type.
|
8
5
|
def return_type
|
9
6
|
raise "There is no return_type of a constructor"
|
10
7
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module RbGCCXML
|
2
|
+
# A specific value entry of an enumeration <EnumValue>
|
3
|
+
class EnumValue < Node
|
4
|
+
|
5
|
+
# Link to the Enumeration Node that holds this EnumValue
|
6
|
+
attr_accessor :parent
|
7
|
+
|
8
|
+
# Get the C++ value of the EnumValue
|
9
|
+
def value
|
10
|
+
node.attributes["init"].to_i
|
11
|
+
end
|
12
|
+
|
13
|
+
# The qualified name of an Enum Value doesn't
|
14
|
+
# include the name of the enum itself
|
15
|
+
def qualified_name #:nodoc:
|
16
|
+
"#{self.parent.parent.qualified_name}::#{self.name}"
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
data/lib/rbgccxml/nodes/file.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module RbGCCXML
|
2
|
-
# Function
|
2
|
+
# Represents the <Function> node. Functions are the end point of the tree.
|
3
3
|
# They have arguments and return types.
|
4
4
|
class Function < Node
|
5
5
|
|
@@ -11,7 +11,6 @@ module RbGCCXML
|
|
11
11
|
end
|
12
12
|
|
13
13
|
# Get the list of arguments for this Function.
|
14
|
-
# Returns an array of Argument nodes
|
15
14
|
def arguments
|
16
15
|
XMLParsing.find_arguments_for(node)
|
17
16
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module RbGCCXML
|
2
|
-
# Node type
|
2
|
+
# Node type representing <Method> nodes, which are representation
|
3
3
|
# of class methods.
|
4
4
|
class Method < Function
|
5
5
|
|
@@ -7,5 +7,15 @@ module RbGCCXML
|
|
7
7
|
def static?
|
8
8
|
@node.attributes["static"] == "1"
|
9
9
|
end
|
10
|
+
|
11
|
+
# Is this a virtual method?
|
12
|
+
def virtual?
|
13
|
+
@node.attributes["virtual"] == "1"
|
14
|
+
end
|
15
|
+
|
16
|
+
# Is this a pure virtual method? A purely virtual method has no body.
|
17
|
+
def purely_virtual?
|
18
|
+
@node.attributes["pure_virtual"] == "1"
|
19
|
+
end
|
10
20
|
end
|
11
21
|
end
|
data/lib/rbgccxml/nodes/type.rb
CHANGED
@@ -1,7 +1,34 @@
|
|
1
1
|
module RbGCCXML
|
2
|
-
|
3
2
|
# The base class for all type management classes.
|
3
|
+
# RbGCCXML has a pretty extensive type querying sub-system that
|
4
|
+
# allows type matching by names, types, base types, etc
|
4
5
|
class Type < Node
|
6
|
+
|
7
|
+
# For types like pointers or references, we recursively track down
|
8
|
+
# the base type when doing comparisons.
|
9
|
+
#
|
10
|
+
# delim needs to be a regex
|
11
|
+
def check_sub_type_without(val, delim)
|
12
|
+
return false unless val =~ delim
|
13
|
+
new_val = val.gsub(delim, "").strip
|
14
|
+
XMLParsing.find_type_of(self.node, "type") == new_val
|
15
|
+
end
|
16
|
+
|
17
|
+
# Get the base type without any qualifiers. E.g, if you've
|
18
|
+
# got the CVQualified type "const my_space::MyClass&, this
|
19
|
+
# will return the node for "my_space::MyClass"
|
20
|
+
#
|
21
|
+
# returns: Node related to the base C++ construct of this type
|
22
|
+
def base_type
|
23
|
+
n = XMLParsing.find_type_of(self.node, "type")
|
24
|
+
n.is_a?(Type) ? n.base_type : n
|
25
|
+
end
|
26
|
+
|
27
|
+
# Is this type a const?
|
28
|
+
def const?
|
29
|
+
found = XMLParsing.find_type_of(self.node, "type")
|
30
|
+
found ? found.const? : false
|
31
|
+
end
|
5
32
|
end
|
6
33
|
|
7
34
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module RbGCCXML
|
2
|
+
# Node that represents <CvQualifiedType>. This gccxml node handles
|
3
|
+
# both const and volitile flags, but for our case we only use the
|
4
|
+
# const flag.
|
5
|
+
class CvQualifiedType < Type
|
6
|
+
|
7
|
+
def ==(val)
|
8
|
+
check_sub_type_without(val, /const/)
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s(full = false)
|
12
|
+
type = XMLParsing.find_type_of(self.node, "type")
|
13
|
+
"const #{type.to_s(full)}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def const?
|
17
|
+
self.node.attributes["const"].to_i == 1
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,8 +1,14 @@
|
|
1
1
|
module RbGCCXML
|
2
|
-
|
3
|
-
# The FundamentalType. This represents all the built-in types
|
2
|
+
# The <FundamentalType>. This represents all the built-in types
|
4
3
|
# of C++ like int, double, char, etc.
|
5
4
|
class FundamentalType < Type
|
5
|
+
|
6
|
+
# We are base types. There's nothing
|
7
|
+
# more to find once we've gotten to this type.
|
8
|
+
def base_type
|
9
|
+
self
|
10
|
+
end
|
11
|
+
|
6
12
|
end
|
7
13
|
|
8
14
|
end
|
@@ -1,16 +1,14 @@
|
|
1
1
|
module RbGCCXML
|
2
|
-
|
3
2
|
# This represents a Pointer of any other kind of type
|
4
3
|
class PointerType < Type
|
5
4
|
|
6
|
-
# Does this type match the given name string?
|
7
5
|
def ==(val)
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
check_sub_type_without(val, /\*/)
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_s(full = false)
|
10
|
+
type = XMLParsing.find_type_of(self.node, "type")
|
11
|
+
"#{type.to_s(full)}*"
|
14
12
|
end
|
15
13
|
end
|
16
14
|
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module RbGCCXML
|
2
|
+
# This deals with C++ Reference nodes (&)
|
3
|
+
class ReferenceType < Type
|
4
|
+
|
5
|
+
def ==(val)
|
6
|
+
check_sub_type_without(val, /\&/)
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_s(full = false)
|
10
|
+
type = XMLParsing.find_type_of(self.node, "type")
|
11
|
+
"#{type.to_s(full)}&"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/rbgccxml/parser.rb
CHANGED
@@ -1,20 +1,35 @@
|
|
1
1
|
module RbGCCXML
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# hash.
|
2
|
+
# All queries return either an instance of this class, or in the case of
|
3
|
+
# a single result, the node found. Use this class to further define query
|
4
|
+
# parameters.
|
6
5
|
class QueryResult < Array
|
7
6
|
|
7
|
+
# To facilitate the management of what could be many nodes found by a single query,
|
8
|
+
# we forward off any unknown methods to each node in the results query.
|
9
|
+
# We assume that if one node accepts the method, then all of them will.
|
10
|
+
def method_missing(name, *args)
|
11
|
+
if self[0].respond_to?(name)
|
12
|
+
self.each do |node|
|
13
|
+
node.send(name, *args)
|
14
|
+
end
|
15
|
+
else
|
16
|
+
super
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
EXPECTED_OPTIONS = [:name, :returns, :arguments, :access] unless defined?(EXPECTED_OPTIONS)
|
21
|
+
|
8
22
|
# Find within this result set any nodes that match the given options
|
9
23
|
# Options can be any or all of the following, based on the type of node:
|
10
24
|
#
|
11
|
-
# All nodes:
|
12
25
|
# <tt>:name</tt>:: The unmangled name of the node. Can be a string or Regexp. Works on all nodes.
|
13
26
|
# <tt>:arguments</tt>:: Search according to argument types.
|
14
27
|
# This needs to be an array of strings or symbols. nil can be
|
15
28
|
# used as a "any" flag. Only works on Functions, Methods, and Constructors
|
16
29
|
# <tt>:returns</tt>:: Search according to the return type. Can be a string or symbol.
|
17
30
|
# Only works on Functions and Methods
|
31
|
+
# <tt>:access</tt>:: Search according to access properties. Can be :public, :protected, or :private.
|
32
|
+
# Only works on Classes and Methods
|
18
33
|
#
|
19
34
|
# All arguments added to the options are processed in an AND format. If you
|
20
35
|
# are looking for 3 random arguments with a return type of int:
|
@@ -38,33 +53,44 @@ module RbGCCXML
|
|
38
53
|
#
|
39
54
|
# find(:returns => "MyClass*")
|
40
55
|
#
|
56
|
+
# There will be cases where you'll want to search *all* of a given type no matter what scope
|
57
|
+
# or nesting exists. To put a finder into this mode, you simply send :all as the first parameter:
|
58
|
+
#
|
59
|
+
# find(:all, [arguments as defined above])
|
60
|
+
#
|
61
|
+
# will find all nodes that fit the normal arguments for a given type (the node type of the first
|
62
|
+
# in the initial result set. e.g. if you run <tt>classes.find(:all)</tt> then all Class nodes)
|
63
|
+
#
|
41
64
|
# Returns: A new QueryResult containing the results, allowing for nested +finds+.
|
42
65
|
# However, If there is only one result, returns that single Node instead.
|
43
|
-
def find(options
|
66
|
+
def find(*options)
|
44
67
|
result = QueryResult.new
|
68
|
+
query_set = self
|
45
69
|
|
46
|
-
|
47
|
-
|
70
|
+
if options[0] == :all
|
71
|
+
node_type = self[0].class.to_s.split(/::/)[-1]
|
72
|
+
query_set = XMLParsing.find_all(:type => node_type)
|
73
|
+
options = options[1]
|
74
|
+
else
|
75
|
+
options = options[0]
|
76
|
+
end
|
48
77
|
|
49
78
|
name = options.delete(:name)
|
50
79
|
returns = options.delete(:returns)
|
51
80
|
arguments = options.delete(:arguments)
|
81
|
+
access = options.delete(:access)
|
52
82
|
|
53
83
|
raise ":arguments must be an array" if arguments && !arguments.is_a?(Array)
|
54
|
-
raise "Unknown keys #{
|
55
|
-
"Expected are:
|
84
|
+
raise "Unknown keys #{options.keys.join(", ")}. " +
|
85
|
+
"Expected are: #{EXPECTED_OPTIONS.join(",")}" unless options.empty?
|
86
|
+
|
87
|
+
found = {}
|
56
88
|
|
57
|
-
|
89
|
+
query_set.each do |node|
|
58
90
|
# C++ name
|
59
91
|
if name
|
60
92
|
found[:name] ||= []
|
61
|
-
if name
|
62
|
-
found_name = (node.attributes["name"] =~ name)
|
63
|
-
else
|
64
|
-
found_name = (node.attributes["name"] == name)
|
65
|
-
end
|
66
|
-
|
67
|
-
found[:name] << node if found_name
|
93
|
+
found[:name] << node if node == name
|
68
94
|
end
|
69
95
|
|
70
96
|
# Return type
|
@@ -92,12 +118,18 @@ module RbGCCXML
|
|
92
118
|
|
93
119
|
found[:arguments] << node if keep
|
94
120
|
end
|
121
|
+
|
122
|
+
# Access type
|
123
|
+
if access
|
124
|
+
found[:access] ||= []
|
125
|
+
found[:access] << node if node.attributes["access"] == access.to_s
|
126
|
+
end
|
95
127
|
end
|
96
128
|
|
97
129
|
# Now we do an intersection of all the found nodes,
|
98
130
|
# which ensures that we AND together all the parts
|
99
131
|
# the user is looking for
|
100
|
-
tmp =
|
132
|
+
tmp = query_set
|
101
133
|
found.each_value do |value|
|
102
134
|
tmp = (tmp & value)
|
103
135
|
end
|
data/lib/rbgccxml/rbgccxml.rb
CHANGED
@@ -3,7 +3,7 @@ module RbGCCXML
|
|
3
3
|
|
4
4
|
class << self
|
5
5
|
|
6
|
-
# This is where it all happens. This method must be after any calls
|
6
|
+
# This is where it all happens. This method must be called after any calls
|
7
7
|
# to RbGCCXML.gccxml_path= or RbGCCXML.add_include_paths.
|
8
8
|
# Files can be one of many formats (and should always be full directory paths):
|
9
9
|
#
|