rbgccxml 0.9.1 → 1.0
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 +8 -10
- data/lib/rbgccxml/node.rb +65 -64
- data/lib/rbgccxml/node_cache.rb +93 -0
- data/lib/rbgccxml/nodes/argument.rb +4 -1
- data/lib/rbgccxml/nodes/base.rb +1 -1
- data/lib/rbgccxml/nodes/class.rb +22 -15
- data/lib/rbgccxml/nodes/enum_value.rb +2 -4
- data/lib/rbgccxml/nodes/enumeration.rb +1 -1
- data/lib/rbgccxml/nodes/field.rb +3 -1
- data/lib/rbgccxml/nodes/function.rb +2 -2
- data/lib/rbgccxml/nodes/method.rb +3 -3
- data/lib/rbgccxml/nodes/namespace.rb +14 -0
- data/lib/rbgccxml/nodes/type.rb +4 -3
- data/lib/rbgccxml/nodes/types/array_type.rb +3 -2
- data/lib/rbgccxml/nodes/types/cv_qualified_type.rb +12 -6
- data/lib/rbgccxml/nodes/types/pointer_type.rb +2 -1
- data/lib/rbgccxml/nodes/types/reference_type.rb +2 -1
- data/lib/rbgccxml/parser.rb +7 -5
- data/lib/rbgccxml/query_result.rb +8 -2
- data/lib/rbgccxml/sax_parser.rb +69 -0
- data/lib/rbgccxml.rb +3 -1
- data/lib/vendor/facets/once.rb +59 -0
- data/test/arguments_test.rb +14 -14
- data/test/classes_test.rb +85 -80
- data/test/enumerations_test.rb +29 -31
- data/test/function_pointers_test.rb +7 -7
- data/test/functions_test.rb +20 -20
- data/test/methods_test.rb +26 -25
- data/test/namespaces_test.rb +6 -6
- data/test/node_test.rb +7 -7
- data/test/parser_test.rb +23 -23
- data/test/query_results_test.rb +81 -81
- data/test/structs_test.rb +19 -20
- data/test/test_helper.rb +5 -18
- data/test/types_test.rb +60 -58
- data/test/variables_test.rb +12 -12
- metadata +58 -63
- data/lib/rbgccxml/xml_parsing.rb +0 -152
data/Rakefile
CHANGED
@@ -1,17 +1,18 @@
|
|
1
|
-
require 'rake/testtask'
|
2
1
|
require 'rake/rdoctask'
|
3
2
|
require 'rake/contrib/sshpublisher'
|
4
3
|
require 'rake/gempackagetask'
|
5
4
|
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
|
6
7
|
PROJECT_NAME = "rbgccxml"
|
7
|
-
RBGCCXML_VERSION = "0
|
8
|
+
RBGCCXML_VERSION = "1.0"
|
8
9
|
|
9
|
-
task :default => :
|
10
|
+
task :default => :spec
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
t.
|
14
|
-
t.
|
12
|
+
desc "Run all specs"
|
13
|
+
RSpec::Core::RakeTask.new do |t|
|
14
|
+
t.ruby_opts = ["-Itest"]
|
15
|
+
t.pattern = "test/**/*.rb"
|
15
16
|
end
|
16
17
|
|
17
18
|
Rake::RDocTask.new do |rd|
|
@@ -58,9 +59,6 @@ spec = Gem::Specification.new do |s|
|
|
58
59
|
s.add_dependency "nokogiri", "~> 1.4.0"
|
59
60
|
s.add_dependency "gccxml_gem", "~> 0.9"
|
60
61
|
|
61
|
-
s.add_development_dependency "test-unit", "1.2.3"
|
62
|
-
s.add_development_dependency "mocha", "~> 0.9"
|
63
|
-
|
64
62
|
s.description = <<-END
|
65
63
|
Rbgccxml is a library that parses out GCCXML (http://www.gccxml.org) output
|
66
64
|
and provides a simple but very powerful querying API for finding exactly
|
data/lib/rbgccxml/node.rb
CHANGED
@@ -13,61 +13,79 @@ module RbGCCXML
|
|
13
13
|
# attempt to will throw a NotQueryableException.
|
14
14
|
class Node
|
15
15
|
|
16
|
-
#
|
17
|
-
|
16
|
+
# GCC_XML id of this node
|
17
|
+
attr_accessor :id
|
18
18
|
|
19
|
-
#
|
19
|
+
# The C++ scoping parent of this node
|
20
|
+
attr_accessor :parent
|
21
|
+
|
22
|
+
# Any children this node has
|
23
|
+
attr_accessor :children
|
24
|
+
|
25
|
+
# The base name of this node
|
26
|
+
attr_accessor :name
|
27
|
+
|
28
|
+
# Hash of all the attributes
|
29
|
+
attr_accessor :attributes
|
30
|
+
|
31
|
+
# HACK A linking ivar that lets types figure out where they sit,
|
32
|
+
# for example an argument type can find the <Argument> it's
|
33
|
+
# a part of.
|
34
|
+
attr_accessor :container
|
35
|
+
|
36
|
+
# Initialize this node according to the attributes passed in
|
20
37
|
# Only to be used internally. Use query methods on the object
|
21
38
|
# returned by RbGCCXML::parse
|
22
|
-
def initialize(
|
23
|
-
@
|
24
|
-
|
25
|
-
|
39
|
+
def initialize(attributes)
|
40
|
+
@id = attributes["id"]
|
41
|
+
@name = attributes["name"]
|
42
|
+
@demangled = attributes["demangled"]
|
26
43
|
|
27
|
-
|
28
|
-
|
29
|
-
@
|
44
|
+
@attributes = attributes
|
45
|
+
|
46
|
+
@children = []
|
30
47
|
end
|
31
48
|
|
32
49
|
# Get the fully qualified (demangled) C++ name of this node.
|
33
50
|
def qualified_name
|
34
|
-
if @
|
51
|
+
if @demangled
|
35
52
|
# The 'demangled' attribute of the node for methods / functions is the
|
36
53
|
# full signature, so cut that part out.
|
37
|
-
@
|
54
|
+
@demangled.split(/\(/)[0]
|
38
55
|
else
|
39
|
-
parent ? "#{parent.qualified_name}::#{name}" : name
|
56
|
+
@parent ? "#{@parent.qualified_name}::#{@name}" : @name
|
40
57
|
end
|
41
58
|
end
|
59
|
+
once :qualified_name
|
42
60
|
|
43
61
|
# Is this node const qualified?
|
44
62
|
def const?
|
45
|
-
@
|
63
|
+
@attributes["const"] ? @attributes["const"] == "1" : false
|
46
64
|
end
|
47
65
|
|
48
66
|
# Does this node have public access?
|
49
67
|
def public?
|
50
|
-
@
|
68
|
+
@attributes["access"] ? @attributes["access"] == "public" : true
|
51
69
|
end
|
52
70
|
|
53
71
|
# Does this node have protected access?
|
54
72
|
def protected?
|
55
|
-
@
|
73
|
+
@attributes["access"] ? @attributes["access"] == "protected" : false
|
56
74
|
end
|
57
75
|
|
58
76
|
# Does this node have private access?
|
59
77
|
def private?
|
60
|
-
@
|
78
|
+
@attributes["access"] ? @attributes["access"] == "private" : false
|
61
79
|
end
|
62
80
|
|
63
|
-
#
|
64
|
-
def
|
65
|
-
@
|
81
|
+
# Is this node automatically generated by gcc?
|
82
|
+
def artificial?
|
83
|
+
@attributes["artificial"] ? @attributes["artificial"] == "1" : false
|
66
84
|
end
|
67
85
|
|
68
86
|
# Access indivitual attributes directly
|
69
87
|
def [](val)
|
70
|
-
@
|
88
|
+
@attributes[val]
|
71
89
|
end
|
72
90
|
|
73
91
|
# Some C++ nodes are actually wrappers around other nodes. For example,
|
@@ -83,90 +101,68 @@ module RbGCCXML
|
|
83
101
|
# Returns the full path to the file this node is found in.
|
84
102
|
# Returns nil if no File node is found for this node
|
85
103
|
def file
|
86
|
-
file_id = @
|
87
|
-
file_node =
|
88
|
-
file_node ? file_node.
|
89
|
-
end
|
90
|
-
|
91
|
-
# Returns the parent node of this node. e.g. function.parent will get the class
|
92
|
-
# the function is contained in.
|
93
|
-
def parent
|
94
|
-
return nil if @node["context"].nil? || @node["context"] == "_1"
|
95
|
-
XMLParsing.find(:id => @node["context"])
|
104
|
+
file_id = @attributes["file"]
|
105
|
+
file_node = NodeCache.find(file_id)
|
106
|
+
file_node ? file_node.name : nil
|
96
107
|
end
|
108
|
+
once :file
|
97
109
|
|
98
110
|
# This is a unified search routine for finding nested nodes. It
|
99
111
|
# simplifies the search routines below significantly.
|
100
|
-
def
|
101
|
-
|
102
|
-
|
103
|
-
case matcher
|
104
|
-
when String
|
105
|
-
res = res.find(:name => matcher)
|
106
|
-
when Regexp
|
107
|
-
res = res.find_all { |t| t.name =~ matcher }
|
108
|
-
when nil
|
109
|
-
# Do nothing, since not specifying a matcher is okay.
|
110
|
-
else
|
111
|
-
message = "Can't handle a match condition of type #{matcher.class}."
|
112
|
-
raise UnsupportedMatcherException.new(message)
|
113
|
-
end
|
114
|
-
|
115
|
-
res = res.find_all(&block) if block
|
116
|
-
|
117
|
-
res
|
112
|
+
def find_children_of_type(type, matcher = nil)
|
113
|
+
NodeCache.find_children_of_type(self, type, matcher)
|
118
114
|
end
|
119
|
-
private :
|
115
|
+
private :find_children_of_type
|
120
116
|
|
121
117
|
# Find all namespaces. There are two ways of calling this method:
|
122
118
|
# #namespaces => Get all namespaces in this scope
|
123
119
|
# #namespaces(name) => Shortcut for namespaces.find(:name => name)
|
124
120
|
#
|
125
121
|
# Returns a QueryResult unless only one node was found
|
126
|
-
def namespaces(name = nil
|
127
|
-
|
122
|
+
def namespaces(name = nil)
|
123
|
+
find_children_of_type("Namespace", name)
|
128
124
|
end
|
129
125
|
|
130
126
|
# Find all classes in this scope.
|
131
127
|
#
|
132
128
|
# See Node.namespaces
|
133
|
-
def classes(name = nil
|
134
|
-
|
129
|
+
def classes(name = nil)
|
130
|
+
find_children_of_type("Class", name)
|
135
131
|
end
|
136
132
|
|
137
133
|
# Find all structs in this scope.
|
138
134
|
#
|
139
135
|
# See Node.namespaces
|
140
|
-
def structs(name = nil
|
141
|
-
|
136
|
+
def structs(name = nil)
|
137
|
+
find_children_of_type("Struct", name)
|
142
138
|
end
|
143
139
|
|
144
140
|
# Find all functions in this scope.
|
145
141
|
#
|
146
142
|
# See Node.namespaces
|
147
|
-
def functions(name = nil
|
148
|
-
|
143
|
+
def functions(name = nil)
|
144
|
+
find_children_of_type("Function", name)
|
149
145
|
end
|
150
146
|
|
151
147
|
# Find all enumerations in this scope.
|
152
148
|
#
|
153
149
|
# See Node.namespaces
|
154
|
-
def enumerations(name = nil
|
155
|
-
|
150
|
+
def enumerations(name = nil)
|
151
|
+
find_children_of_type("Enumeration", name)
|
156
152
|
end
|
157
153
|
|
158
154
|
# Find all variables in this scope
|
159
155
|
#
|
160
156
|
# See Node.namespaces
|
161
|
-
def variables(name = nil
|
162
|
-
|
157
|
+
def variables(name = nil)
|
158
|
+
find_children_of_type("Variable", name)
|
163
159
|
end
|
164
160
|
|
165
161
|
# Find all typedefs in this scope
|
166
162
|
#
|
167
163
|
# See Node.namespaces
|
168
|
-
def typedefs(name = nil
|
169
|
-
|
164
|
+
def typedefs(name = nil)
|
165
|
+
find_children_of_type("Typedef", name)
|
170
166
|
end
|
171
167
|
|
172
168
|
# Print out the full C++ valid code for this node.
|
@@ -175,6 +171,11 @@ module RbGCCXML
|
|
175
171
|
def to_cpp(qualified = true)
|
176
172
|
qualified ? self.qualified_name : self.name
|
177
173
|
end
|
174
|
+
|
175
|
+
def to_s
|
176
|
+
"#<#{self.class.name} @attributes=#{self.attributes.inspect}>"
|
177
|
+
end
|
178
|
+
alias :inspect :to_s
|
178
179
|
end
|
179
180
|
|
180
181
|
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module RbGCCXML
|
2
|
+
|
3
|
+
# Manager of the tree of Nodes we build from GCC-XML.
|
4
|
+
#
|
5
|
+
# This is a static class that keeps around references to the
|
6
|
+
# entire generated Node tree as well as other structures
|
7
|
+
# designed for quick and easy searching of Nodes
|
8
|
+
class NodeCache
|
9
|
+
class << self
|
10
|
+
|
11
|
+
# Hash of id => node for all nodes
|
12
|
+
attr_reader :index_list
|
13
|
+
|
14
|
+
# Hash of Type => [node list] for easy
|
15
|
+
# searching of all nodes of a given type
|
16
|
+
attr_reader :types_list
|
17
|
+
|
18
|
+
# Add a new node to the index list
|
19
|
+
def <<(node)
|
20
|
+
@index_list ||= {}
|
21
|
+
@types_list ||= {}
|
22
|
+
|
23
|
+
@index_list[node.id] = node
|
24
|
+
|
25
|
+
class_name = node.class.name.split("::")[-1]
|
26
|
+
@types_list[class_name] ||= []
|
27
|
+
@types_list[class_name] << node
|
28
|
+
end
|
29
|
+
|
30
|
+
def clear
|
31
|
+
@index_list = {}
|
32
|
+
@types_list = {}
|
33
|
+
end
|
34
|
+
|
35
|
+
# Get the root node of the parse
|
36
|
+
def root
|
37
|
+
# This is simply a way to hide GCC_XML specifics,
|
38
|
+
# the :: Namespace node is always id _1
|
39
|
+
@index_list["_1"]
|
40
|
+
end
|
41
|
+
|
42
|
+
# Given an id, find the node
|
43
|
+
def find(id)
|
44
|
+
@index_list[id]
|
45
|
+
end
|
46
|
+
|
47
|
+
# Get the list of all nodes of a given type
|
48
|
+
def all(type)
|
49
|
+
@types_list[type] || []
|
50
|
+
end
|
51
|
+
|
52
|
+
# Given an array of ids return an array of nodes that match
|
53
|
+
def find_by_ids(ids)
|
54
|
+
QueryResult.new(ids.map {|id| @index_list[id] })
|
55
|
+
end
|
56
|
+
|
57
|
+
# Look through the DOM under +node+ for +type+ nodes.
|
58
|
+
# +type+ must be the string name of an existing Node subclass.
|
59
|
+
#
|
60
|
+
# Returns a QueryResult with the findings.
|
61
|
+
def find_children_of_type(node, type, matcher = nil)
|
62
|
+
results = QueryResult.new(self.select_nodes_of_type(node.children, type))
|
63
|
+
results = results.find(:name => matcher) if matcher
|
64
|
+
results
|
65
|
+
end
|
66
|
+
|
67
|
+
# Once all parsing is done and all nodes are in memory
|
68
|
+
# we need to actually build up the parent / child relationships
|
69
|
+
# of the nodes. We can't do this during parsing because there
|
70
|
+
# is no guarentee the nodes will come in the right order
|
71
|
+
def process_tree
|
72
|
+
@index_list.each do |id, node|
|
73
|
+
|
74
|
+
# If this node has a context, link to that context as a parent
|
75
|
+
# and then put ourselves as that parent's child
|
76
|
+
if node["context"]
|
77
|
+
node.parent = @index_list[node["context"]]
|
78
|
+
node.parent.children << node
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
protected
|
85
|
+
|
86
|
+
def select_nodes_of_type(nodes, type)
|
87
|
+
nodes.select {|node| node.class.to_s == "RbGCCXML::#{type}" }
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
@@ -5,7 +5,9 @@ module RbGCCXML
|
|
5
5
|
|
6
6
|
# Get the Node for this argument's type
|
7
7
|
def cpp_type
|
8
|
-
|
8
|
+
type = NodeCache.find(attributes["type"])
|
9
|
+
type.container = self
|
10
|
+
type
|
9
11
|
end
|
10
12
|
|
11
13
|
# Get any default value for this argument
|
@@ -17,6 +19,7 @@ module RbGCCXML
|
|
17
19
|
def to_cpp(qualified = true)
|
18
20
|
"#{self.cpp_type.to_cpp(qualified)} #{self.name}"
|
19
21
|
end
|
22
|
+
once :to_cpp
|
20
23
|
|
21
24
|
end
|
22
25
|
end
|
data/lib/rbgccxml/nodes/base.rb
CHANGED
data/lib/rbgccxml/nodes/class.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module RbGCCXML
|
2
2
|
# Represents a <Class> node.
|
3
3
|
class Class < Node
|
4
|
-
|
4
|
+
|
5
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")
|
@@ -9,30 +9,32 @@ module RbGCCXML
|
|
9
9
|
|
10
10
|
# Is this class pure virtual?
|
11
11
|
def pure_virtual?
|
12
|
-
|
12
|
+
attributes["abstract"] ? attributes["abstract"] == "1" : false
|
13
13
|
end
|
14
14
|
|
15
|
-
# Find all the constructors for this class.
|
15
|
+
# Find all the constructors for this class.
|
16
16
|
def constructors
|
17
|
-
|
17
|
+
NodeCache.find_children_of_type(self, "Constructor")
|
18
18
|
end
|
19
19
|
|
20
20
|
# Find the destructor for this class.
|
21
21
|
# To tell if a destructor is gcc-generated or not, check the
|
22
22
|
# 'artificial' attribute:
|
23
23
|
#
|
24
|
-
# class_node.destructor.
|
24
|
+
# class_node.destructor.artificial?
|
25
25
|
#
|
26
26
|
def destructor
|
27
|
-
|
27
|
+
NodeCache.find_children_of_type(self, "Destructor")[0]
|
28
28
|
end
|
29
29
|
|
30
|
-
# Find the superclass for this class.
|
30
|
+
# Find the superclass for this class.
|
31
31
|
# By default, this will find the superclass of any access type, pass in
|
32
|
-
# the type of access you're looking for if you want specific types
|
32
|
+
# the type of access you're looking for if you want specific types
|
33
|
+
# (e.g. public, private, protected).
|
33
34
|
#
|
34
|
-
# If there is more than one superclass to this class, this method will only return
|
35
|
-
# If you know or expect there to be multiple superclasses,
|
35
|
+
# If there is more than one superclass to this class, this method will only return
|
36
|
+
# the first superclass. # If you know or expect there to be multiple superclasses,
|
37
|
+
# use #superclasses instead
|
36
38
|
def superclass(access_type = nil)
|
37
39
|
found = superclasses(access_type)
|
38
40
|
found.empty? ? nil : found[0]
|
@@ -41,22 +43,27 @@ module RbGCCXML
|
|
41
43
|
# Like #superclass above, this will find all superclasses for this class.
|
42
44
|
# Functions the same as #superclass except this method always returns a QueryResult
|
43
45
|
def superclasses(access_type = nil)
|
44
|
-
|
46
|
+
[
|
47
|
+
NodeCache.find_children_of_type(self, "Base").select do |base|
|
48
|
+
access_type.nil? ? true : base.send("#{access_type}?")
|
49
|
+
end
|
50
|
+
].flatten.map {|base| base.cpp_type }
|
45
51
|
end
|
46
52
|
|
47
53
|
# Find all methods for this class. See Node#namespaces
|
48
|
-
def methods(name = nil
|
49
|
-
|
54
|
+
def methods(name = nil)
|
55
|
+
NodeCache.find_children_of_type(self, "Method", name)
|
50
56
|
end
|
51
57
|
|
52
58
|
# Find all instance variables for this class. See Node#namespaces
|
53
59
|
def variables(name = nil, &block)
|
54
|
-
|
60
|
+
NodeCache.find_children_of_type(self, "Field", name)
|
55
61
|
end
|
56
62
|
|
57
63
|
# Find all constants under this class. See Node#namespaces
|
58
64
|
def constants(name = nil, &block)
|
59
|
-
|
65
|
+
NodeCache.find_children_of_type(self, "Variable", name)
|
60
66
|
end
|
67
|
+
|
61
68
|
end
|
62
69
|
end
|
@@ -3,12 +3,9 @@ module RbGCCXML
|
|
3
3
|
# Represents an <EnumValue> node, which is an entry in an <Enumeration>
|
4
4
|
class EnumValue < Node
|
5
5
|
|
6
|
-
# Link to the Enumeration that holds this EnumValue
|
7
|
-
attr_accessor :parent
|
8
|
-
|
9
6
|
# Get the defined value of this EnumValue
|
10
7
|
def value
|
11
|
-
|
8
|
+
attributes["init"].to_i
|
12
9
|
end
|
13
10
|
|
14
11
|
# The qualified name of an EnumValue doesn't
|
@@ -16,6 +13,7 @@ module RbGCCXML
|
|
16
13
|
def qualified_name #:nodoc:
|
17
14
|
"#{self.parent.parent.qualified_name}::#{self.name}"
|
18
15
|
end
|
16
|
+
once :qualified_name
|
19
17
|
|
20
18
|
end
|
21
19
|
|
data/lib/rbgccxml/nodes/field.rb
CHANGED
@@ -5,13 +5,15 @@ module RbGCCXML
|
|
5
5
|
|
6
6
|
# Get the Node representing this field's type
|
7
7
|
def cpp_type
|
8
|
-
|
8
|
+
NodeCache.find(attributes["type"])
|
9
9
|
end
|
10
|
+
once :cpp_type
|
10
11
|
|
11
12
|
# See Node#to_cpp
|
12
13
|
def to_cpp(qualified = false)
|
13
14
|
"#{self.cpp_type.to_cpp(qualified)} #{self.name}"
|
14
15
|
end
|
16
|
+
once :to_cpp
|
15
17
|
|
16
18
|
end
|
17
19
|
|
@@ -13,12 +13,12 @@ module RbGCCXML
|
|
13
13
|
|
14
14
|
# Get the list of Arguments for this Function.
|
15
15
|
def arguments
|
16
|
-
|
16
|
+
children
|
17
17
|
end
|
18
18
|
|
19
19
|
# Get the Node representing this Function's return type
|
20
20
|
def return_type
|
21
|
-
|
21
|
+
NodeCache.find(attributes["returns"])
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -5,17 +5,17 @@ module RbGCCXML
|
|
5
5
|
|
6
6
|
# Is this method static?
|
7
7
|
def static?
|
8
|
-
|
8
|
+
attributes["static"] == "1"
|
9
9
|
end
|
10
10
|
|
11
11
|
# Is this a virtual method?
|
12
12
|
def virtual?
|
13
|
-
|
13
|
+
attributes["virtual"] == "1"
|
14
14
|
end
|
15
15
|
|
16
16
|
# Is this a pure virtual method? A purely virtual method has no body.
|
17
17
|
def purely_virtual?
|
18
|
-
|
18
|
+
attributes["pure_virtual"] == "1"
|
19
19
|
end
|
20
20
|
|
21
21
|
end
|
@@ -2,5 +2,19 @@ module RbGCCXML
|
|
2
2
|
# Represents the <Namespace> node. Namespaces can have in it
|
3
3
|
# more namespaces, methods, classes, structs, attributes, ... everything.
|
4
4
|
class Namespace < Node
|
5
|
+
|
6
|
+
# Special case for the top-level namespace, ignore :: or
|
7
|
+
# we get elements that print out as ::::type
|
8
|
+
def qualified_name #:nodoc:
|
9
|
+
if @name == "::"
|
10
|
+
""
|
11
|
+
else
|
12
|
+
super
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_cpp
|
17
|
+
self.qualified_name
|
18
|
+
end
|
5
19
|
end
|
6
20
|
end
|
data/lib/rbgccxml/nodes/type.rb
CHANGED
@@ -12,7 +12,7 @@ module RbGCCXML
|
|
12
12
|
def check_sub_type_without(val, delim)
|
13
13
|
return false unless val =~ delim
|
14
14
|
new_val = val.gsub(delim, "").strip
|
15
|
-
|
15
|
+
NodeCache.find(attributes["type"]) == new_valu
|
16
16
|
end
|
17
17
|
|
18
18
|
# Get the base type without any qualifiers. E.g, if you've
|
@@ -21,13 +21,14 @@ module RbGCCXML
|
|
21
21
|
#
|
22
22
|
# returns: Node related to the base C++ construct of this type
|
23
23
|
def base_type
|
24
|
-
n =
|
24
|
+
n = NodeCache.find(attributes["type"])
|
25
25
|
n.is_a?(Type) ? n.base_type : n
|
26
26
|
end
|
27
|
+
once :base_type
|
27
28
|
|
28
29
|
# Is this type const qualified?
|
29
30
|
def const?
|
30
|
-
found =
|
31
|
+
found = NodeCache.find(attributes["type"])
|
31
32
|
found ? found.const? : false
|
32
33
|
end
|
33
34
|
|
@@ -20,9 +20,10 @@ module RbGCCXML
|
|
20
20
|
|
21
21
|
# See Node#to_cpp
|
22
22
|
def to_cpp(qualified = true)
|
23
|
-
type =
|
24
|
-
"#{type.to_cpp(qualified)}[#{
|
23
|
+
type = NodeCache.find(attributes["type"])
|
24
|
+
"#{type.to_cpp(qualified)}[#{attributes["max"].gsub(/[^\d]/, '').to_i + 1}]"
|
25
25
|
end
|
26
|
+
once :to_cpp
|
26
27
|
|
27
28
|
end
|
28
29
|
|
@@ -3,20 +3,26 @@ module RbGCCXML
|
|
3
3
|
# Represents a <CvQualifiedType> node. This node keeps track of
|
4
4
|
# the const nature of a Node.
|
5
5
|
class CvQualifiedType < Type
|
6
|
-
|
6
|
+
|
7
7
|
def ==(val)
|
8
8
|
check_sub_type_without(val, /const/)
|
9
9
|
end
|
10
10
|
|
11
11
|
# See Node#to_cpp
|
12
12
|
def to_cpp(qualified = true)
|
13
|
-
type =
|
14
|
-
|
13
|
+
type = NodeCache.find(attributes["type"])
|
14
|
+
|
15
|
+
post_const = container ? " const" : ""
|
16
|
+
pre_const = container ? "" : "const "
|
17
|
+
|
18
|
+
"#{pre_const}#{type.to_cpp(qualified)}#{post_const}"
|
15
19
|
end
|
20
|
+
once :to_cpp
|
16
21
|
|
17
|
-
#
|
18
|
-
|
19
|
-
|
22
|
+
# Have to redefine this as Type#const? looks up the
|
23
|
+
# tree for const, and in our case we are the const knower
|
24
|
+
def const? #:nodoc:
|
25
|
+
attributes["const"] == "1"
|
20
26
|
end
|
21
27
|
|
22
28
|
end
|