rbgccxml 0.8 → 0.9

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.
Files changed (43) hide show
  1. data/Rakefile +5 -5
  2. data/lib/rbgccxml/node.rb +75 -73
  3. data/lib/rbgccxml/nodes/argument.rb +13 -2
  4. data/lib/rbgccxml/nodes/base.rb +14 -0
  5. data/lib/rbgccxml/nodes/class.rb +46 -8
  6. data/lib/rbgccxml/nodes/constructor.rb +8 -1
  7. data/lib/rbgccxml/nodes/destructor.rb +7 -0
  8. data/lib/rbgccxml/nodes/enum_value.rb +6 -4
  9. data/lib/rbgccxml/nodes/enumeration.rb +21 -2
  10. data/lib/rbgccxml/nodes/field.rb +18 -0
  11. data/lib/rbgccxml/nodes/file.rb +4 -1
  12. data/lib/rbgccxml/nodes/function.rb +6 -4
  13. data/lib/rbgccxml/nodes/function_type.rb +7 -0
  14. data/lib/rbgccxml/nodes/method.rb +6 -4
  15. data/lib/rbgccxml/nodes/struct.rb +3 -2
  16. data/lib/rbgccxml/nodes/type.rb +5 -3
  17. data/lib/rbgccxml/nodes/types/array_type.rb +29 -0
  18. data/lib/rbgccxml/nodes/types/cv_qualified_type.rb +9 -5
  19. data/lib/rbgccxml/nodes/types/fundamental_type.rb +3 -2
  20. data/lib/rbgccxml/nodes/types/pointer_type.rb +6 -3
  21. data/lib/rbgccxml/nodes/types/reference_type.rb +6 -3
  22. data/lib/rbgccxml/nodes/types/typedef.rb +2 -2
  23. data/lib/rbgccxml/nodes/variable.rb +7 -0
  24. data/lib/rbgccxml/parser.rb +47 -32
  25. data/lib/rbgccxml/query_result.rb +62 -25
  26. data/lib/rbgccxml/rbgccxml.rb +13 -16
  27. data/lib/rbgccxml/xml_parsing.rb +65 -97
  28. data/lib/rbgccxml.rb +26 -22
  29. data/test/arguments_test.rb +29 -0
  30. data/test/classes_test.rb +164 -26
  31. data/test/enumerations_test.rb +27 -19
  32. data/test/function_pointers_test.rb +18 -0
  33. data/test/functions_test.rb +7 -2
  34. data/test/methods_test.rb +3 -3
  35. data/test/namespaces_test.rb +1 -1
  36. data/test/node_test.rb +11 -31
  37. data/test/parser_test.rb +1 -1
  38. data/test/query_results_test.rb +15 -14
  39. data/test/structs_test.rb +10 -12
  40. data/test/test_helper.rb +10 -2
  41. data/test/types_test.rb +63 -38
  42. data/test/variables_test.rb +26 -0
  43. metadata +46 -31
data/Rakefile CHANGED
@@ -4,12 +4,12 @@ require 'rake/contrib/sshpublisher'
4
4
  require 'rake/gempackagetask'
5
5
 
6
6
  PROJECT_NAME = "rbgccxml"
7
- RBGCCXML_VERSION = "0.8"
7
+ RBGCCXML_VERSION = "0.9"
8
8
 
9
9
  task :default => :test
10
10
 
11
11
  Rake::TestTask.new do |t|
12
- t.libs << "lib"
12
+ t.libs = ["lib", "test"]
13
13
  t.test_files = FileList["test/*_test.rb"]
14
14
  t.verbose = true
15
15
  end
@@ -41,7 +41,7 @@ namespace :web do
41
41
  end
42
42
 
43
43
  desc "Clean up generated web files"
44
- task :clean do
44
+ task :clean => ["clobber_rdoc"] do
45
45
  rm_rf "publish"
46
46
  end
47
47
  end
@@ -55,8 +55,8 @@ spec = Gem::Specification.new do |s|
55
55
  s.author = 'Jason Roelofs'
56
56
  s.email = 'jameskilton@gmail.com'
57
57
 
58
- s.add_dependency "hpricot", "0.6"
59
- s.add_dependency "gccxml_gem", "0.9.1"
58
+ s.add_dependency "libxml-ruby", "~>1.1"
59
+ s.add_dependency "gccxml_gem", "~>0.9"
60
60
 
61
61
  s.description = <<-END
62
62
  Rbgccxml is a library that parses out GCCXML (http://www.gccxml.org) output
data/lib/rbgccxml/node.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  module RbGCCXML
2
2
 
3
3
  class NotQueryableException < RuntimeError; end
4
+ class UnsupportedMatcherException < RuntimeError; end
4
5
 
5
6
  # A Node is part of the C++ code as dictated by GCC-XML. This class
6
7
  # defines all of the starting points into the querying system, along
@@ -8,12 +9,16 @@ module RbGCCXML
8
9
  #
9
10
  # Any Node further down the heirarchy chain can and should define which
10
11
  # finder methods are and are not avaiable at that level. For example, the
11
- # Class node cannot search for other Namespaces within that class.
12
+ # Class node cannot search for other Namespaces within that class, and any
13
+ # attempt to will throw a NotQueryableException.
12
14
  class Node
15
+
16
+ # The underlying libxml node for this Node.
13
17
  attr_reader :node
14
18
 
15
19
  # Initialize this node according to the XML element passed in
16
- # Only to be used internally.
20
+ # Only to be used internally. Use query methods on the object
21
+ # returned by RbGCCXML::parse
17
22
  def initialize(node)
18
23
  @node = node
19
24
  end
@@ -55,18 +60,27 @@ module RbGCCXML
55
60
  @node.attributes["access"] ? @node.attributes["access"] == "private" : false
56
61
  end
57
62
 
58
- # Forward up attribute array for easy access to the
59
- # underlying XML node
63
+ # Access to the underlying libxml node's attributes
60
64
  def attributes
61
65
  @node.attributes
62
66
  end
63
67
 
64
- # Returns the full file name of the file this node is found in.
65
- def file_name(basename = true)
68
+ # Some C++ nodes are actually wrappers around other nodes. For example,
69
+ #
70
+ # typedef int ThisType;
71
+ #
72
+ # You'll get the TypeDef node "ThisType". Use this method if you want the base type for this
73
+ # typedef, e.g. the "int".
74
+ def base_type
75
+ self
76
+ end
77
+
78
+ # Returns the full path to the file this node is found in.
79
+ # Returns nil if no File node is found for this node
80
+ def file
66
81
  file_id = @node.attributes["file"]
67
- file_node = XMLParsing.find(:type => "File", :id => file_id)
68
- name = file_node.attributes["name"]
69
- basename ? ::File.basename(name) : name
82
+ file_node = XMLParsing.find(:node_type => "File", :id => file_id) if file_id
83
+ file_node ? file_node.attributes["name"] : nil
70
84
  end
71
85
 
72
86
  # Returns the parent node of this node. e.g. function.parent will get the class
@@ -76,97 +90,85 @@ module RbGCCXML
76
90
  XMLParsing.find(:id => @node.attributes["context"])
77
91
  end
78
92
 
93
+ # This is a unified search routine for finding nested nodes. It
94
+ # simplifies the search routines below significantly.
95
+ def find_nested_nodes_of_type(type, matcher = nil, &block)
96
+ res = XMLParsing.find_nested_nodes_of_type(@node, type)
97
+
98
+ case matcher
99
+ when String
100
+ res = res.find(:name => matcher)
101
+ when Regexp
102
+ res = res.find_all { |t| t.name =~ matcher }
103
+ when nil
104
+ # Do nothing, since not specifying a matcher is okay.
105
+ else
106
+ message = "Can't handle a match condition of type #{matcher.class}."
107
+ raise UnsupportedMatcherException.new(message)
108
+ end
109
+
110
+ res = res.find_all(&block) if block
111
+
112
+ res
113
+ end
114
+ private :find_nested_nodes_of_type
115
+
79
116
  # Find all namespaces. There are two ways of calling this method:
80
117
  # #namespaces => Get all namespaces in this scope
81
118
  # #namespaces(name) => Shortcut for namespaces.find(:name => name)
82
119
  #
83
120
  # Returns a QueryResult unless only one node was found
84
- def namespaces(name = nil)
85
- if name
86
- namespaces.find(:name => name)
87
- else
88
- XMLParsing.find_nested_nodes_of_type(@node, "Namespace")
89
- end
121
+ def namespaces(name = nil, &block)
122
+ find_nested_nodes_of_type("Namespace", name, &block)
90
123
  end
91
124
 
92
125
  # Find all classes in this scope.
126
+ #
93
127
  # See Node.namespaces
94
- def classes(name = nil)
95
- if name
96
- classes.find(:name => name)
97
- else
98
- XMLParsing.find_nested_nodes_of_type(@node, "Class")
99
- end
128
+ def classes(name = nil, &block)
129
+ find_nested_nodes_of_type("Class", name, &block)
100
130
  end
101
131
 
102
132
  # Find all structs in this scope.
133
+ #
103
134
  # See Node.namespaces
104
- def structs(name = nil)
105
- if name
106
- structs.find(:name => name)
107
- else
108
- XMLParsing.find_nested_nodes_of_type(@node, "Struct")
109
- end
135
+ def structs(name = nil, &block)
136
+ find_nested_nodes_of_type("Struct", name, &block)
110
137
  end
111
138
 
112
- # Find all functions in this scope. Functions are free non-class
113
- # functions. To search for class methods, use #methods.
139
+ # Find all functions in this scope.
114
140
  #
115
141
  # See Node.namespaces
116
- def functions(name = nil)
117
- if name
118
- functions.find(:name => name)
119
- else
120
- XMLParsing.find_nested_nodes_of_type(@node, "Function")
121
- end
142
+ def functions(name = nil, &block)
143
+ find_nested_nodes_of_type("Function", name, &block)
122
144
  end
123
145
 
124
146
  # Find all enumerations in this scope.
147
+ #
125
148
  # 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")
131
- end
149
+ def enumerations(name = nil, &block)
150
+ find_nested_nodes_of_type("Enumeration", name, &block)
132
151
  end
133
-
134
- # Special equality testing. A given node can be tested against
135
- # a String to test against the name of the node. For example
136
- #
137
- # source.classes("MyClass") == "MyClass" #=> true
138
- # source.classes("MyClass") == source.classes.find(:name => "MyClass") #=> true
152
+
153
+ # Find all variables in this scope
139
154
  #
140
- def ==(val)
141
- if val.is_a?(String)
142
- return true if self.name == val
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
-
149
- false
150
- elsif val.is_a?(Regexp)
151
- self =~ val
152
- else
153
- super
154
- end
155
+ # See Node.namespaces
156
+ def variables(name = nil, &block)
157
+ find_nested_nodes_of_type("Variable", name, &block)
155
158
  end
156
159
 
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
160
+ # Find all typedefs in this scope
161
+ #
162
+ # See Node.namespaces
163
+ def typedefs(name = nil, &block)
164
+ find_nested_nodes_of_type("Typedef", name, &block)
164
165
  end
165
166
 
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
167
+ # Print out the full C++ valid code for this node.
168
+ # By default, it will print out the fully qualified name of this node.
169
+ # See various Type classes to see how else this method is used.
170
+ def to_cpp(qualified = true)
171
+ qualified ? self.qualified_name : self.name
170
172
  end
171
173
  end
172
174
 
@@ -1,11 +1,22 @@
1
1
  module RbGCCXML
2
- # Class representing a single <Argument> node.
2
+ # Represents a single <Argument> node.
3
+ # Can be an argument for a Method, Function, or Constructor
3
4
  class Argument < Node
4
5
 
5
- # Get the C++ type of this argument.
6
+ # Get the Node for this argument's type
6
7
  def cpp_type
7
8
  XMLParsing.find_type_of(node, "type")
8
9
  end
9
10
 
11
+ # Get any default value for this argument
12
+ def value
13
+ attributes["default"]
14
+ end
15
+
16
+ # See Node#to_cpp, prints out C++ code for this argument
17
+ def to_cpp(qualified = true)
18
+ "#{self.cpp_type.to_cpp(qualified)} #{self.name}"
19
+ end
20
+
10
21
  end
11
22
  end
@@ -0,0 +1,14 @@
1
+ module RbGCCXML
2
+
3
+ # Node type represending <Base> nodes.
4
+ # These nodes are children to <Class> nodes and define superclass
5
+ # definitions
6
+ class Base < Node
7
+
8
+ # Get the Class node representing the type of this Base
9
+ def cpp_type
10
+ XMLParsing.find_type_of(node, "type")
11
+ end
12
+
13
+ end
14
+ end
@@ -1,5 +1,5 @@
1
1
  module RbGCCXML
2
- # Node type represending <Class> nodes.
2
+ # Represents a <Class> node.
3
3
  class Class < Node
4
4
 
5
5
  # Disabled: Classes cannot have nested namespaces
@@ -7,18 +7,56 @@ module RbGCCXML
7
7
  raise NotQueryableException.new("Cannot query for Namespaces while in a Class")
8
8
  end
9
9
 
10
+ # Is this class pure virtual?
11
+ def pure_virtual?
12
+ @node.attributes["abstract"] ? @node.attributes["abstract"] == "1" : false
13
+ end
14
+
10
15
  # Find all the constructors for this class.
11
16
  def constructors
12
17
  XMLParsing::find_nested_nodes_of_type(@node, "Constructor")
13
18
  end
14
19
 
15
- # Find all methods for this class. See Node.namespaces
16
- def methods(name = nil)
17
- if name
18
- methods.find(:name => name)
19
- else
20
- XMLParsing::find_nested_nodes_of_type(@node, "Method")
21
- end
20
+ # Find the destructor for this class.
21
+ # To tell if a destructor is gcc-generated or not, check the
22
+ # 'artificial' attribute:
23
+ #
24
+ # class_node.destructor.attributes[:artificial]
25
+ #
26
+ def destructor
27
+ XMLParsing::find_nested_nodes_of_type(@node, "Destructor")[0]
28
+ end
29
+
30
+ # Find the superclass for this class.
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 (e.g. public, private, protected).
33
+ #
34
+ # If there is more than one superclass to this class, this method will only return the first superclass.
35
+ # If you know or expect there to be multiple superclasses, use #superclasses instead
36
+ def superclass(access_type = nil)
37
+ found = superclasses(access_type)
38
+ found.empty? ? nil : found[0]
39
+ end
40
+
41
+ # Like #superclass above, this will find all superclasses for this class.
42
+ # Functions the same as #superclass except this method always returns a QueryResult
43
+ def superclasses(access_type = nil)
44
+ XMLParsing::find_bases_for(@node, access_type)
45
+ end
46
+
47
+ # Find all methods for this class. See Node#namespaces
48
+ def methods(name = nil, &block)
49
+ find_nested_nodes_of_type("Method", name, &block)
50
+ end
51
+
52
+ # Find all instance variables for this class. See Node#namespaces
53
+ def variables(name = nil, &block)
54
+ find_nested_nodes_of_type("Field", name, &block)
55
+ end
56
+
57
+ # Find all constants under this class. See Node#namespaces
58
+ def constants(name = nil, &block)
59
+ find_nested_nodes_of_type("Variable", name, &block)
22
60
  end
23
61
  end
24
62
  end
@@ -1,9 +1,16 @@
1
1
  module RbGCCXML
2
- # Class representing <Constructor> nodes.
2
+
3
+ # Represents a <Constructor> node.
4
+ #
5
+ # Constructors act like functions except they don't have
6
+ # a return value
3
7
  class Constructor < Function
8
+
4
9
  # Disabled: Constructors do not have a return_type.
5
10
  def return_type
6
11
  raise "There is no return_type of a constructor"
7
12
  end
13
+
8
14
  end
15
+
9
16
  end
@@ -0,0 +1,7 @@
1
+ module RbGCCXML
2
+
3
+ # Represents a <Destructor> node.
4
+ class Destructor < Node
5
+ end
6
+
7
+ end
@@ -1,20 +1,22 @@
1
1
  module RbGCCXML
2
- # A specific value entry of an enumeration <EnumValue>
2
+
3
+ # Represents an <EnumValue> node, which is an entry in an <Enumeration>
3
4
  class EnumValue < Node
4
5
 
5
- # Link to the Enumeration Node that holds this EnumValue
6
+ # Link to the Enumeration that holds this EnumValue
6
7
  attr_accessor :parent
7
8
 
8
- # Get the C++ value of the EnumValue
9
+ # Get the defined value of this EnumValue
9
10
  def value
10
11
  node.attributes["init"].to_i
11
12
  end
12
13
 
13
- # The qualified name of an Enum Value doesn't
14
+ # The qualified name of an EnumValue doesn't
14
15
  # include the name of the enum itself
15
16
  def qualified_name #:nodoc:
16
17
  "#{self.parent.parent.qualified_name}::#{self.name}"
17
18
  end
18
19
 
19
20
  end
21
+
20
22
  end
@@ -1,10 +1,29 @@
1
1
  module RbGCCXML
2
- # Representation of the <Enumeration> node
2
+
3
+ # Represents an <Enumeration> node.
4
+ # Has many <EnumValue> nodes.
3
5
  class Enumeration < Node
4
- # Get the list of Values for this enumeration
6
+
7
+ # Get the list of EnumValues for this enumeration
5
8
  def values
6
9
  XMLParsing.get_values_of(self).each {|v| v.parent = self }
7
10
  end
8
11
 
12
+ # Is this enumeration anonymous? As in, does it have a name or is
13
+ # it just a pretty wrapper around constant values, ala:
14
+ #
15
+ # enum {
16
+ # VALUE1,
17
+ # VALUE2,
18
+ # ...
19
+ # };
20
+ #
21
+ def anonymous?
22
+ # The given GCC-XML name of an anon Enum is _[number]. We don't care what
23
+ # that number is, only that the name matches this format
24
+ self.name =~ /_\d+/
25
+ end
26
+
9
27
  end
28
+
10
29
  end
@@ -0,0 +1,18 @@
1
+ module RbGCCXML
2
+
3
+ # Represents a <Field> node, which is a Class's instance variable
4
+ class Field < Node
5
+
6
+ # Get the Node representing this field's type
7
+ def cpp_type
8
+ XMLParsing.find_type_of(node, "type")
9
+ end
10
+
11
+ # See Node#to_cpp
12
+ def to_cpp(qualified = false)
13
+ "#{self.cpp_type.to_cpp(qualified)} #{self.name}"
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -1,5 +1,8 @@
1
1
  module RbGCCXML
2
- # Handles the <File> node.
2
+
3
+ # Represents a <File> node, which defines where a given Node is found
4
+ # in the parsed header files.
3
5
  class File < Node
4
6
  end
7
+
5
8
  end
@@ -1,6 +1,7 @@
1
1
  module RbGCCXML
2
- # Represents the <Function> node. Functions are the end point of the tree.
3
- # They have arguments and return types.
2
+
3
+ # Represents a <Function> node, a global or namespaced function
4
+ # or static class functions.
4
5
  class Function < Node
5
6
 
6
7
  # First of all, no more querying once you're this far in
@@ -10,14 +11,15 @@ module RbGCCXML
10
11
  end
11
12
  end
12
13
 
13
- # Get the list of arguments for this Function.
14
+ # Get the list of Arguments for this Function.
14
15
  def arguments
15
16
  XMLParsing.find_arguments_for(node)
16
17
  end
17
18
 
18
- # Find the return type of this function
19
+ # Get the Node representing this Function's return type
19
20
  def return_type
20
21
  XMLParsing.find_type_of(node, "returns")
21
22
  end
22
23
  end
24
+
23
25
  end
@@ -0,0 +1,7 @@
1
+ module RbGCCXML
2
+
3
+ # Represents a <FunctionType>, also known as a function pointer.
4
+ class FunctionType < Function
5
+ end
6
+
7
+ end
@@ -1,21 +1,23 @@
1
1
  module RbGCCXML
2
- # Node type representing <Method> nodes, which are representation
3
- # of class methods.
2
+
3
+ # Represents a <Method>, which are class instance methods.
4
4
  class Method < Function
5
5
 
6
6
  # Is this method static?
7
7
  def static?
8
8
  @node.attributes["static"] == "1"
9
9
  end
10
-
10
+
11
11
  # Is this a virtual method?
12
12
  def virtual?
13
13
  @node.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
  @node.attributes["pure_virtual"] == "1"
19
19
  end
20
+
20
21
  end
22
+
21
23
  end
@@ -1,6 +1,7 @@
1
1
  module RbGCCXML
2
- # Node type represending <Struct> nodes.
3
- # It's really just a class with default of public instead of private
2
+
3
+ # Represents a <Struct> node, which is effectively a Class
4
4
  class Struct < ::RbGCCXML::Class
5
5
  end
6
+
6
7
  end
@@ -1,4 +1,5 @@
1
1
  module RbGCCXML
2
+
2
3
  # The base class for all type management classes.
3
4
  # RbGCCXML has a pretty extensive type querying sub-system that
4
5
  # allows type matching by names, types, base types, etc
@@ -15,8 +16,8 @@ module RbGCCXML
15
16
  end
16
17
 
17
18
  # 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"
19
+ # got the CvQualifiedType "const my_space::MyClass&, this
20
+ # will return the Node for "my_space::MyClass"
20
21
  #
21
22
  # returns: Node related to the base C++ construct of this type
22
23
  def base_type
@@ -24,11 +25,12 @@ module RbGCCXML
24
25
  n.is_a?(Type) ? n.base_type : n
25
26
  end
26
27
 
27
- # Is this type a const?
28
+ # Is this type const qualified?
28
29
  def const?
29
30
  found = XMLParsing.find_type_of(self.node, "type")
30
31
  found ? found.const? : false
31
32
  end
33
+
32
34
  end
33
35
 
34
36
  end
@@ -0,0 +1,29 @@
1
+ module RbGCCXML
2
+
3
+ # Node that represents <ArrayType>, which is any static array
4
+ # declaration.
5
+ # One oddity on how GCC-XML parses certain array designations:
6
+ #
7
+ # void func(int in[4][3]);
8
+ #
9
+ # will be parsed out as
10
+ #
11
+ # void func(int* in[3]);
12
+ #
13
+ # aka, a pointer to a 3-element array, so keep this in mind when doing
14
+ # comparisons or wondering why the to_cpp output is so odd
15
+ class ArrayType < Type
16
+
17
+ def ==(val)
18
+ check_sub_type_without(val, /\[\d\]/)
19
+ end
20
+
21
+ # See Node#to_cpp
22
+ def to_cpp(qualified = true)
23
+ type = XMLParsing.find_type_of(self.node, "type")
24
+ "#{type.to_cpp(qualified)}[#{self.node.attributes["max"].gsub(/[^\d]/, '').to_i + 1}]"
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -1,20 +1,24 @@
1
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.
2
+
3
+ # Represents a <CvQualifiedType> node. This node keeps track of
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
- def to_s(full = false)
11
+ # See Node#to_cpp
12
+ def to_cpp(qualified = true)
12
13
  type = XMLParsing.find_type_of(self.node, "type")
13
- "const #{type.to_s(full)}"
14
+ "const #{type.to_cpp(qualified)}"
14
15
  end
15
16
 
17
+ # Is this node const?
16
18
  def const?
17
19
  self.node.attributes["const"].to_i == 1
18
20
  end
21
+
19
22
  end
23
+
20
24
  end
@@ -1,11 +1,12 @@
1
1
  module RbGCCXML
2
- # The <FundamentalType>. This represents all the built-in types
2
+
3
+ # Represents a <FundamentalType>. This represents all the built-in types
3
4
  # of C++ like int, double, char, etc.
4
5
  class FundamentalType < Type
5
6
 
6
7
  # We are base types. There's nothing
7
8
  # more to find once we've gotten to this type.
8
- def base_type
9
+ def base_type #:nodoc:
9
10
  self
10
11
  end
11
12