doxyparser 1.3 → 1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ddb97c91354a56d85495ca4dd7fdda3be9d02806
4
+ data.tar.gz: 78a25a5f867401e60d7212433cdb8a9d36debf74
5
+ SHA512:
6
+ metadata.gz: db5492d5aef0f23620ea7cd3af58726feae425fa83389195eb25f6dca1ff498bef49e1f591b4ad26ee4d5148d7f42b5920f7f4df629a702a368a8da646c50600
7
+ data.tar.gz: 8f26ecc142d43c7f71d3de4df6970d3b260aff6ffe626d7761749946996f2bc78da3a184d479458fc4b12f3f700446cc09228e0380b61f77fdc7024bda14b107
@@ -13,10 +13,10 @@ require_relative 'nodes/typedef'
13
13
  require_relative 'nodes/friend'
14
14
  require_relative 'nodes/struct'
15
15
  require_relative 'nodes/class'
16
+ require_relative 'nodes/enum_value'
16
17
  require_relative 'nodes/enum'
17
18
  require_relative 'nodes/hfile'
18
19
  require_relative 'nodes/function'
19
- require_relative 'nodes/group'
20
20
  require_relative 'nodes/namespace'
21
21
  require_relative 'nodes/variable'
22
22
 
@@ -24,27 +24,47 @@ require_relative 'nodes/variable'
24
24
  module Doxyparser
25
25
 
26
26
  class << self
27
+
28
+ # Retrieves metadata for a given Namespace
29
+ # @param basename [String] Name of the namespace to parse (for instance: NamespaceA::NamespaceB)
30
+ # @param xml_dir [String] Path to the directory with the generated intermediate XML representation
31
+ # @return [Namespace] A tree of objects representing the namespace and its members (classes, structs, enums, etc)
27
32
  def parse_namespace basename, xml_dir
28
33
  Doxyparser::Namespace.new :name => basename, :dir => xml_dir
29
34
  end
30
35
 
31
- def parse_group basename, xml_dir
32
- Doxyparser::Group.new :name => basename, :dir => xml_dir
33
- end
34
-
36
+ # Retrieves metadata for a given Class
37
+ # @param basename [String] Name of the class to parse (for instance: MyNamespace::MyClass)
38
+ # @param xml_dir [String] Path to the directory with the generated intermediate XML representation
39
+ # @return [Class] A tree of objects representing the class and its members (attributes, methods, innerclasses, etc)
35
40
  def parse_class basename, xml_dir
36
41
  Doxyparser::Class.new :name => basename, :dir => xml_dir
37
42
  end
38
43
 
39
- def parse_struct basename, xml_dir
44
+ # Retrieves metadata for a given Struct
45
+ # @param basename [String] Name of the struct to parse (for instance: MyNamespace::MyStruct)
46
+ # @param xml_dir [String] Path to the directory with the generated intermediate XML representation
47
+ # @return [Struct] A tree of objects representing the struct and its members (attributes, methods, enums, etc)
48
+ def parse_struct(basename, xml_dir)
40
49
  Doxyparser::Struct.new :name => basename, :dir => xml_dir
41
50
  end
42
-
43
- def parse_file basename, xml_dir
51
+
52
+ # Retrieves metadata for a given header file
53
+ # @param basename [String] Name of the header file to parse (for instance: myheader.h)
54
+ # @param xml_dir [String] Path to the directory with the generated intermediate XML representation
55
+ # @return [HFile] A tree of objects representing the header file and its contents (classes, functions, enums, etc)
56
+ def parse_file(basename, xml_dir)
44
57
  Doxyparser::HFile.new :name => basename, :dir => xml_dir
45
58
  end
46
59
 
47
- def gen_xml_docs source_dirs, xml_dir, recursive = nil, include_dirs = nil, generate_html = nil
60
+ # Generates intermediate XML representation for a group of header files
61
+ # @param source_dirs [Array<String>, String] Input source directory (or directories)
62
+ # @param xml_dir [String] Output Directory for the generated XML documents
63
+ # @param recursive if present (and not nil) sets the RECURSIVE FLAG in Doxygen. Subdirectories will also be searched
64
+ # @param include_dirs [Array<String>, String] Adds given directories to Doxygen's INCLUDE_PATH (Doxyfile variable)
65
+ # @param generate_html if present (and not nil) HTML documentation will also be generated
66
+ # @param stl_support if present (and not nil) sets the BUILTIN_STL_SUPPORT flag in Doxygen. Special support for STL Libraries
67
+ def gen_xml_docs(source_dirs, xml_dir, recursive = nil, include_dirs = nil, generate_html = nil, stl_support = 1)
48
68
 
49
69
  if include_dirs.nil? || include_dirs.empty?
50
70
  inc_dirs = ''
@@ -66,10 +86,11 @@ module Doxyparser
66
86
  recursive = recursive ? 'YES' : 'NO'
67
87
  home_dir = Doxyparser::Util.home_dir
68
88
  gen_html = generate_html ? 'YES' : 'NO'
89
+ stl_support = stl_support ? 'YES' : 'NO'
69
90
  doxyfile = "# Doxyfile 1.7.6.1\n\n"
70
91
  doxyfile << "# Project related configuration options\n\n"
71
92
  doxyfile << %Q{PROJECT_NAME\t\t= "#{proj_name}"\nINPUT\t\t\t\t= #{src_dirs}\nGENERATE_HTML\t\t= #{gen_html}\n}
72
- doxyfile << %Q{RECURSIVE\t\t\t= #{recursive}\nINCLUDE_PATH\t\t= #{inc_dirs}\n\n}
93
+ doxyfile << %Q{RECURSIVE\t\t\t= #{recursive}\nINCLUDE_PATH\t\t= #{inc_dirs}\nBUILTIN_STL_SUPPORT\t= #{stl_support}\n}
73
94
  doxyfile << "# Default doxygen configuration options\n\n"
74
95
  doxyfile << Doxyparser::Util.read_file(home_dir+'/resources/Doxyfile')
75
96
  doxyfile_path = xml_dir+'/Doxyfile'
@@ -1,5 +1,6 @@
1
1
  module Doxyparser
2
2
 
3
+ # Just like an {Struct} but with different naming conventions
3
4
  class Class < Struct
4
5
 
5
6
  private
@@ -1,13 +1,10 @@
1
1
  module Doxyparser
2
2
 
3
+ # Representation of a 'high level' {Node} which is represented in its own XML file such as namespaces, classes, etc
3
4
  class Compound < Node
4
5
 
5
6
  attr_reader :xml_path
6
7
 
7
- def new_unnamed
8
- @unnamed += 1
9
- end
10
-
11
8
  private
12
9
 
13
10
  def init_attributes
@@ -1,20 +1,33 @@
1
1
  module Doxyparser
2
2
 
3
+ # A C/C++ Enumeration
3
4
  class Enum < Member
4
5
 
5
- def values
6
- ret=[]
7
- xpath("enumvalue/name").each { |v| ret << v.child.content }
8
- ret
9
- end
6
+ # [Array<EnumValue>] List of values
7
+ attr_reader :values
10
8
 
11
9
  private
12
10
 
11
+ def init_attributes
12
+ super
13
+ @values= []
14
+ all_values = self.xpath("enumvalue")
15
+ return if all_values.nil? || all_values.empty?
16
+ all_values.each { |enumvalue|
17
+ @values << Doxyparser::EnumValue.new(node: enumvalue, parent: self)
18
+ }
19
+ end
20
+
13
21
  def find_name
14
22
  super.gsub(/@\d*/) {
15
- num = parent.new_unnamed
16
- '_Enum' + (num == 1 ? '' : num.to_s)
23
+ prefix = (parent.class == Doxyparser::Namespace) ? 'ns_' : ''
24
+ if (parent.class == Doxyparser::HFile)
25
+ enum_name = 'file_' + escape_file_name(parent.basename.gsub(/\.\w+$/, ''))
26
+ else
27
+ enum_name = parent.basename
28
+ end
29
+ "#{prefix}#{enum_name}_Enum"
17
30
  }
18
31
  end
19
32
  end
20
- end
33
+ end
@@ -0,0 +1,20 @@
1
+ module Doxyparser
2
+
3
+ # Every one of the members of an {Enum}
4
+ class EnumValue < Node
5
+
6
+ attr_reader :initializer
7
+
8
+ private
9
+
10
+ def find_name
11
+ @parent.name + '::' + @node.xpath("name")[0].child.content
12
+ end
13
+
14
+ def init_attributes
15
+ super
16
+ aux_initializer = @node.xpath("initializer")
17
+ @initializer = aux_initializer[0].child.content.strip unless (aux_initializer.nil? || aux_initializer.empty?)
18
+ end
19
+ end
20
+ end
@@ -1,11 +1,14 @@
1
1
  module Doxyparser
2
2
 
3
+ # A friend member declared inside a C++ {Class}. Can itself refer to an external {Function} or {Class}
3
4
  class Friend < Member
4
5
 
6
+ # @return true if the friend declaration refers to a {Class} false if refers to a {Function}
5
7
  def is_class?
6
8
  args.nil? || args == ""
7
9
  end
8
10
 
11
+ # @return true if the name used in the declaration is fully qualified (using the '::' operator) false otherwise
9
12
  def is_qualified?
10
13
  basename.include? '::'
11
14
  end
@@ -1,35 +1,27 @@
1
1
  module Doxyparser
2
2
 
3
+ # A C/C++ function with its parameters und return type
3
4
  class Function < Member
4
5
 
5
- def == another
6
- super
7
- self.args == another.args
8
- end
9
-
10
- def eql?(another)
11
- super
12
- self.args == another.args
13
- end
14
-
15
- def to_str
16
- super + @args
17
- end
18
-
19
- def to_s
20
- super + @args
21
- end
22
-
6
+ # @return true if the function is a constructor of a {Struct} or {Class}
23
7
  def constructor?
24
8
  @basename == parent.basename
25
9
  end
26
10
 
11
+ # @return true if the function is a destructor of a {Struct} or {Class}
27
12
  def destructor?
28
13
  @basename.start_with? %Q{~}
29
14
  end
30
15
 
31
- def getter_for
32
- if @params.empty? || (@params.size == 1 && @params[0].type.name =~ /\s*void\s*/)
16
+ # Finds the name of the -hypothetical- property this method refers to in case this {Function} complies
17
+ # with the 'getter' naming convention and has no parameters.
18
+ # Getter examples for 'myProperty' are: getMyProperty, get_myProperty, GetMyProperty, Get_MyProperty, etc
19
+ # Getter examples for 'booleanProp' are: isBooleanProp, is_booleanProp, get_booleanProp, etc
20
+ # @return [String] name of the property
21
+ def getter_for
22
+ return nil if @type.name == 'void'
23
+
24
+ if @params.empty? || (@params.size == 1 && @params[0].type.name.strip == 'void')
33
25
  if @basename.start_with?('get') || @basename.start_with?('Get')
34
26
  ret = @basename.gsub(/^get[_]?(\w)/i) { |match| $1.downcase }
35
27
  ret.prepend('_') if ret =~ %r{^\d}
@@ -46,8 +38,12 @@ module Doxyparser
46
38
  return nil
47
39
  end
48
40
 
41
+ # Finds the name of the -hypothetical- property this method refers to in case this {Function} complies
42
+ # with the 'setter' naming convention and has no return value (void).
43
+ # Setter examples for 'myProperty' are: setMyProperty, set_myProperty, SetMyProperty, Set_MyProperty, etc
44
+ # @return [String] name of the property
49
45
  def setter_for
50
- if (@type.name == 'void') && (@params.size == 1)
46
+ if (@type.name == 'void') && (@params.size == 1 && @params[0].type.name.strip != 'void')
51
47
  if @basename.start_with?('set') || @basename.start_with?('Set')
52
48
  ret = @basename.gsub(/^set[_]?(\w)/i) { |match| $1.downcase }
53
49
  ret.prepend('_') if ret =~ %r{^\d}
@@ -56,5 +52,23 @@ module Doxyparser
56
52
  end
57
53
  return nil
58
54
  end
55
+
56
+ def == another
57
+ super
58
+ self.args == another.args
59
+ end
60
+
61
+ def eql?(another)
62
+ super
63
+ self.args == another.args
64
+ end
65
+
66
+ def to_str
67
+ super + @args
68
+ end
69
+
70
+ def to_s
71
+ super + @args
72
+ end
59
73
  end
60
74
  end
@@ -1,64 +1,61 @@
1
1
  module Doxyparser
2
2
 
3
+ # Representation of a C/C++ header file
3
4
  class HFile < Compound
4
5
 
6
+ # @return [Array<String>] names for all header files which are listed as include statements in this header file
5
7
  def list_included
6
- lst=doc.xpath(%Q{/doxygen/compounddef/includes})
7
- lst.map { |f| f.child.content }
8
+ @list_included ||= doc.xpath(%Q{/doxygen/compounddef/includes}).map { |f| f.child.content }
8
9
  end
9
-
10
- def list_including
11
- lst=doc.xpath(%Q{/doxygen/compounddef/includedby})
12
- lst.map { |f| f[:refid].nil? ? f.child.content : escape_file_name(f[:refid]) }
10
+
11
+ # @return [Array<HFile>] local header files which are listed as include statements in this header file
12
+ def files_included
13
+ @files_included ||= doc.xpath(%Q{/doxygen/compounddef/includes[@local="yes"]}).map { |f| Doxyparser::HFile.new(dir: @dir, node: f) }
13
14
  end
14
15
 
15
- def files_included
16
- lst=doc.xpath(%Q{/doxygen/compounddef/includes[@local="yes"]})
17
- lst.map { |f|
18
- Doxyparser::HFile.new(dir: @dir, node: f)
19
- }
16
+ # @return [Array<String>] names for all header files which refer to this one in their include statements
17
+ def list_including
18
+ @list_including ||= doc.xpath(%Q{/doxygen/compounddef/includedby}).map { |f| f[:refid].nil? ? f.child.content : escape_file_name(f[:refid]) }
20
19
  end
21
20
 
21
+ # @return [Array<HFile>] local header files which refer to this one in their include statements
22
22
  def files_including
23
- lst=doc.xpath(%Q{/doxygen/compounddef/includedby[@local="yes"]})
24
- lst.map { |f| Doxyparser::HFile.new(dir: @dir, node: f) }
23
+ @files_including ||= doc.xpath(%Q{/doxygen/compounddef/includedby[@local="yes"]}).map { |f| Doxyparser::HFile.new(dir: @dir, node: f) }
25
24
  end
26
-
25
+
26
+ # @return [Array<Struct>] structs declared inside this header file
27
27
  def structs
28
- lst=doc.xpath(%Q{/doxygen/compounddef/innerclass})
29
- lst = lst.select { |c| c["refid"].start_with?("struct") }
30
- lst.map { |node| Doxyparser::Struct.new(dir: @dir, node: node) }
28
+ @structs ||= doc.xpath(%Q{/doxygen/compounddef/innerclass}).select { |c| c["refid"].start_with?("struct") }.map { |node| Doxyparser::Struct.new(dir: @dir, node: node) }
31
29
  end
32
30
 
31
+ # @return [Array<Class>] classes declared inside this header file
33
32
  def classes
34
- lst=doc.xpath(%Q{/doxygen/compounddef/innerclass})
35
- lst = lst.select { |c| c["refid"].start_with?("class") }
36
- lst.map { |node| Doxyparser::Class.new(dir: @dir, node: node) }
33
+ @classes ||= doc.xpath(%Q{/doxygen/compounddef/innerclass}).select { |c| c["refid"].start_with?("class") }.map { |node| Doxyparser::Class.new(dir: @dir, node: node) }
37
34
  end
38
-
35
+
36
+ # @return [Array<Namespace>] namespaces declared inside this header file
39
37
  def namespaces
40
- lst=doc.xpath(%Q{/doxygen/compounddef/innernamespace})
41
- lst.map { |node| Doxyparser::Namespace.new(dir: @dir, node: node) }
38
+ @namespaces ||= doc.xpath(%Q{/doxygen/compounddef/innernamespace}).map { |node| Doxyparser::Namespace.new(dir: @dir, node: node) }
42
39
  end
43
-
40
+
41
+ # @return [Array<Function>] functions declared inside this header file
44
42
  def functions
45
- lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="func"]/memberdef[@kind="function"]})
46
- lst.map { |node| Doxyparser::Function.new(parent: self, node: node) }
43
+ @functions ||= doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="func"]/memberdef[@kind="function"]}).map { |node| Doxyparser::Function.new(parent: self, node: node) }
47
44
  end
48
-
45
+
46
+ # @return [Array<Variable>] variables declared inside this header file
49
47
  def variables
50
- lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="var"]/memberdef[@kind="variable"]})
51
- lst.map { |node| Doxyparser::Variable.new(parent: self, node: node) }
48
+ @variables ||= doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="var"]/memberdef[@kind="variable"]}).map { |node| Doxyparser::Variable.new(parent: self, node: node) }
52
49
  end
53
-
50
+
51
+ # @return [Array<Enum>] enums declared inside this header file
54
52
  def enums
55
- lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="enum"]/memberdef[@kind="enum"]})
56
- lst.map { |node| Doxyparser::Enum.new(parent: self, node: node) }
53
+ @enums ||= doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="enum"]/memberdef[@kind="enum"]}).map { |node| Doxyparser::Enum.new(parent: self, node: node) }
57
54
  end
58
55
 
56
+ # @return [Array<Typedef>] typedefs declared inside this header file
59
57
  def typedefs
60
- lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="typedef"]/memberdef[@kind="typedef"]})
61
- lst.map { |node| Doxyparser::Typedef.new(parent: self, node: node) }
58
+ @typedefs ||= doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="typedef"]/memberdef[@kind="typedef"]}).map { |node| Doxyparser::Typedef.new(parent: self, node: node) }
62
59
  end
63
60
 
64
61
  private
@@ -9,6 +9,7 @@ module Doxyparser
9
9
  attr_reader :static
10
10
  attr_reader :params
11
11
 
12
+ # @return [HFile] header file where the declaration of this member was done
12
13
  def file
13
14
  Doxyparser::HFile.new(:name => @filename, :dir => @dir)
14
15
  end
@@ -1,59 +1,75 @@
1
1
  module Doxyparser
2
2
 
3
+ # A C/C++ Namespace
3
4
  class Namespace < Compound
4
5
 
6
+ # @return [Array<Function>] list of functions defined inside this namespace but outside any {Class} or {Struct}
5
7
  def functions(filter=nil)
8
+ return @functions if @functions
6
9
  lst = doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="func"]/memberdef[@kind="function"]})
7
- do_filter(filter, lst, Doxyparser::Function) { |node|
10
+ @functions = do_filter(filter, lst, Doxyparser::Function) { |node|
8
11
  node.xpath("name")[0].child.content.strip
9
12
  }
10
13
  end
11
14
 
15
+ # @return [Array<Enum>] list of enums defined inside this namespace but outside any {Class} or {Struct}
12
16
  def enums(filter=nil)
17
+ return @enums if @enums
13
18
  lst = doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="enum"]/memberdef[@kind="enum"]})
14
- filter.map! { |exp| exp =~ /^_Enum/ ? /@\d*/ : exp } unless filter.nil?
15
- do_filter(filter, lst, Doxyparser::Enum) { |node|
19
+ filter.map! { |exp| exp =~ /^#{@basename}_Enum/ ? /@\d*/ : exp } unless filter.nil?
20
+ @enums = do_filter(filter, lst, Doxyparser::Enum) { |node|
16
21
  node.xpath("name")[0].child.content.strip
17
22
  }
18
23
  end
19
24
 
20
- def variables(filter=nil)
25
+ # @return [Array<Variable>] list of variables defined inside this namespace but are not attributes of any {Class} or {Struct}
26
+ def variables(filter=nil)
27
+ return @variables if @variables
21
28
  lst = doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="var"]/memberdef[@kind="variable"]})
22
- do_filter(filter, lst, Doxyparser::Variable) { |node|
29
+ @variables = do_filter(filter, lst, Doxyparser::Variable) { |node|
23
30
  node.xpath("name")[0].child.content.strip
24
31
  }
25
32
  end
26
33
 
34
+ # @return [Array<Typedef>] list of typedefs defined inside this namespace but outside any {Class} or {Struct}
27
35
  def typedefs(filter=nil)
36
+ return @typedefs if @typedefs
28
37
  lst = doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="typedef"]/memberdef[@kind="typedef"]})
29
- do_filter(filter, lst, Doxyparser::Typedef) { |node|
38
+ @typedefs = do_filter(filter, lst, Doxyparser::Typedef) { |node|
30
39
  del_spaces(node.xpath("name")[0].child.content)
31
40
  }
32
41
  end
33
-
42
+
43
+ # @return [Array<Namespace>] list of namespaces defined inside this one
34
44
  def innernamespaces(filter=nil)
45
+ return @innernamespaces if @innernamespaces
35
46
  lst = doc.xpath(%Q{/doxygen/compounddef/innernamespace})
36
- do_filter(filter, lst, Doxyparser::Namespace) { |node|
47
+ @innernamespaces = do_filter(filter, lst, Doxyparser::Namespace) { |node|
37
48
  del_spaces del_prefix_class(node.child.content)
38
49
  }
39
50
  end
40
51
 
52
+ # @return [Array<Struct>] list of structs defined in this namespace
41
53
  def structs(filter=nil)
54
+ return @structs if @structs
42
55
  lst = doc.xpath(%Q{/doxygen/compounddef/innerclass})
43
56
  lst = lst.select { |c| c["refid"].start_with?("struct") }
44
- do_filter(filter, lst, Doxyparser::Struct) { |node|
57
+ @structs = do_filter(filter, lst, Doxyparser::Struct) { |node|
45
58
  del_spaces del_prefix_class(node.child.content)
46
59
  }
47
60
  end
48
61
 
62
+ # @return [Array<Class>] list of classes defined in this namespace
49
63
  def classes(filter=nil)
64
+ return @classes if @classes
50
65
  lst = doc.xpath(%Q{/doxygen/compounddef/innerclass})
51
66
  lst = lst.select { |c| c["refid"].start_with?("class") }
52
- do_filter(filter, lst, Doxyparser::Class) { |node|
67
+ @classes = do_filter(filter, lst, Doxyparser::Class) { |node|
53
68
  del_spaces del_prefix_class(node.child.content)
54
69
  }
55
70
  end
56
71
 
72
+ # @return nil always
57
73
  def file
58
74
  nil
59
75
  end
@@ -1,14 +1,16 @@
1
1
  module Doxyparser
2
2
 
3
+ # A Node can be any member of the tree-like structure of a C/C++ header file.
4
+ # examples are namespaces, classes, methods, params, etc
3
5
  class Node
4
6
  include Doxyparser::Util
5
-
7
+
6
8
  attr_reader :dir
7
9
  attr_reader :name
8
10
  attr_reader :basename
9
11
  attr_reader :node
10
12
  attr_reader :doc
11
- attr_reader :parent
13
+ attr_accessor :parent
12
14
 
13
15
  def == another
14
16
  self.name == another.name
@@ -31,24 +33,30 @@ module Doxyparser
31
33
  @dir = hash[:dir]
32
34
  @name = hash[:name]
33
35
  if hash[:node] # If a reference to an xml declaration (node) is given
34
- # then...
35
36
  @node = hash[:node]
36
37
  @parent = hash[:parent]
37
38
  @name = find_name
39
+ if @name =~ /PxVec3.h/
40
+ @name = find_name
41
+ end
38
42
  @dir ||= @parent.dir unless @parent.nil?
39
43
  end
40
44
  raise "No name given for node: #{self.class.name}" unless @name
41
45
  raise "No xml directory given for node: #{self.class.name}" unless @dir
42
46
  init_attributes
43
47
  end
48
+
49
+ def escaped_name
50
+ name
51
+ end
44
52
 
45
53
  private
46
54
 
47
55
  def method_missing(sym, *args)
48
56
  if @node.respond_to?(sym)
49
- @node.send(sym, *args)
57
+ @node.send(sym, *args)
50
58
  else
51
- @node[sym.to_s] || super
59
+ @node[sym.to_s] || super
52
60
  end
53
61
  end
54
62
 
@@ -1,9 +1,13 @@
1
1
  module Doxyparser
2
2
 
3
+ # Each of the input parameters of a {Function}
3
4
  class Param < Node
4
5
 
6
+ # Type of parameter
5
7
  attr_reader :type
8
+ # Declared name of parameter
6
9
  attr_reader :declname
10
+ # Default value of parameter
7
11
  attr_reader :value
8
12
 
9
13
  private
@@ -1,60 +1,105 @@
1
1
  module Doxyparser
2
2
 
3
+ # A plain old OOP Class
3
4
  class Struct < Compound
4
-
5
- def file
6
- n=doc.xpath("/doxygen/compounddef/includes")[0]
7
- raise "#{self.name} #{self.class.name} does not have correctly generated documentation. Use 'EXTRACT_ALL' Doxygen flag" unless n
8
- HFile.new(dir: @dir, node: n)
5
+
6
+ # @return [bool] true if any of its methods is 'pure virtual'
7
+ def abstract?
8
+ @is_abstract ||= methods(:all).any? { |m| m.virt == 'pure-virtual'}
9
9
  end
10
-
11
- def friends
12
- lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="friend"]/memberdef[@kind="friend"]})
13
- lst.map { |node|
14
- Doxyparser::Friend.new(parent: self, node: node)
15
- }
10
+
11
+ # @param access [Symbol] access modifier (:public, :protected, :private, :all)
12
+ # @return [Array<Function>] declared constructors
13
+ def constructors(access = :public)
14
+ return case access
15
+ when :public
16
+ @public_constructors ||= methods(:public, nil, [@basename])
17
+ when :protected
18
+ @protected_constructors ||= methods(:protected, nil, [@basename])
19
+ when :private
20
+ @private_constructors ||= methods(:private, nil, [@basename])
21
+ when :all
22
+ constructors(:public) + constructors(:protected) + constructors(:private)
23
+ end
16
24
  end
17
-
18
- def template_params
19
- params=doc.xpath(%Q{/doxygen/compounddef/templateparamlist/param})
20
- params.map { |param|
21
- Doxyparser::Param.new(parent: self, node: param)
22
- }
25
+
26
+ # @param access [Symbol] access modifier (:public, :protected, :private, :all)
27
+ # @return [Array<Function>] declared destructors
28
+ def destructors(access = :public)
29
+ return case access
30
+ when :public
31
+ @public_destructors ||= methods(:public, nil, [/^~/])
32
+ when :protected
33
+ @protected_destructors ||= methods(:protected, nil, [/^~/])
34
+ when :private
35
+ @private_destructors ||= methods(:private, nil, [/^~/])
36
+ when :all
37
+ destructors(:public) + destructors(:protected) + destructors(:private)
38
+ end
23
39
  end
24
-
40
+
41
+ # @param access [Symbol] access modifier (:public, :protected, :private, :all)
42
+ # @param static If nil are static members excluded. If not nil only static members are returned
43
+ # @param filter [Array<String>] list of Regex. Members whose name does not match any of the regexes will be excluded
44
+ # @return [Array<Function>] declared methods
25
45
  def methods(access = :public, static = nil, filter = nil)
26
46
  if access == :all
27
47
  return methods(:public, static, filter) + methods(:protected, static, filter) + methods(:private, static, filter)
28
48
  end
29
- if static.nil?
30
- static = "-"
31
- else
32
- static = "-static-"
33
- end
34
- sectiondef = %Q{#{access}#{static}func}
35
- lst = doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="#{sectiondef}"]/memberdef[@kind="function"][@prot="#{access}"]})
36
- do_filter(filter, lst, Doxyparser::Function) { |node|
37
- node.xpath("name")[0].child.content
38
- }
49
+ if access == :public && filter.nil? # Caches public methods
50
+ if static.nil?
51
+ @public_methods ||= _methods(:public, nil, nil)
52
+ return @public_methods
53
+ end
54
+ @public_static_methods ||= _methods(:public, true, nil)
55
+ return @public_static_methods
56
+ end
57
+ _methods(access, static, filter)
39
58
  end
40
59
 
60
+ # @param access [Symbol] access modifier (:public, :protected, :private, :all)
61
+ # @param static If nil are static members excluded. If not nil only static members are returned
62
+ # @param filter [Array<String>] list of Regex. Members whose name does not match any of the regexes will be excluded
63
+ # @return [Array<Variable>] declared attributes
41
64
  def attributes(access = :public, static = nil, filter = nil)
42
65
  if access == :all
43
66
  return attributes(:public, static, filter) + attributes(:protected, static, filter) + attributes(:private, static, filter)
44
67
  end
45
- if static.nil?
46
- static = "-"
47
- else
48
- static = "-static-"
49
- end
50
- sectiondef = %Q{#{access}#{static}attrib}
51
- lst = doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="#{sectiondef}"]/memberdef[@kind="variable"][@prot="#{access}"]})
52
- do_filter(filter, lst, Doxyparser::Variable) { |node|
53
- node.xpath("name")[0].child.content
54
- }
68
+ if access == :public && filter.nil? # Caches public attributes
69
+ if static.nil?
70
+ @public_attributes ||= _attributes(:public, nil, nil)
71
+ return @public_attributes
72
+ end
73
+ @public_static_attributes ||= _attributes(:public, true, nil)
74
+ return @public_static_attributes
75
+ end
76
+ _attributes(access, static, filter)
55
77
  end
56
-
78
+
79
+ # @param access [Symbol] access modifier (:public, :protected, :private, :all)
80
+ # @param filter [Array<String>] list of Regex. Members whose name does not match any of the regexes will be excluded
81
+ # @return [Array<Struct>] declared inner-classes and inner-structs
57
82
  def innerclasses(access = :public, filter = nil)
83
+ if filter.nil?
84
+ if access == :all
85
+ @all_innerclasses ||= innerclasses(:public) + innerclasses(:protected) + innerclasses(:private)
86
+ return @all_innerclasses
87
+ end
88
+ if access == :public
89
+ @public_innerclasses ||= only_innerclasses(:public) + only_innerstructs(:public)
90
+ return @public_innerclasses
91
+ end
92
+ end
93
+ if access == :all
94
+ return innerclasses(:public, filter) + innerclasses(:protected, filter) + innerclasses(:private, filter)
95
+ end
96
+ only_innerclasses(access, filter) + only_innerstructs(access, filter)
97
+ end
98
+
99
+ # @param access [Symbol] access modifier (:public, :protected, :private, :all)
100
+ # @param filter [Array<String>] list of Regex. Members whose name does not match any of the regexes will be excluded
101
+ # @return [Array<Struct>] declared inner-classes (inner-structs are excluded)
102
+ def only_innerclasses(access = :public, filter = nil)
58
103
  if access == :all
59
104
  return innerclasses(:public, filter) + innerclasses(:protected, filter) + innerclasses(:private, filter)
60
105
  end
@@ -64,18 +109,11 @@ module Doxyparser
64
109
  del_prefix(node.child.content)
65
110
  }
66
111
  end
67
-
68
- def parent_types(access = :public, filter = nil)
69
- if access == :all
70
- return parent_types(:public, filter) + parent_types(:protected, filter) + parent_types(:private, filter)
71
- end
72
- types = doc.xpath(%Q{/doxygen/compounddef/basecompoundref[@prot="#{access}"]})
73
- types.map { |t|
74
- Doxyparser::Type.new(name: t.child.content, dir: @dir)
75
- }
76
- end
77
112
 
78
- def innerstructs(access = :public, filter = nil)
113
+ # @param access [Symbol] access modifier (:public, :protected, :private, :all)
114
+ # @param filter [Array<String>] list of Regex. Members whose name does not match any of the regexes will be excluded
115
+ # @return [Array<Struct>] declared inner-structs (inner-classes are excluded)
116
+ def only_innerstructs(access = :public, filter = nil)
79
117
  if access == :all
80
118
  return innerstructs(:public, filter) + innerstructs(:protected, filter) + innerstructs(:private, filter)
81
119
  end
@@ -85,35 +123,134 @@ module Doxyparser
85
123
  del_prefix(node.child.content)
86
124
  }
87
125
  end
88
-
89
- def innerenums(access = :public, filter = nil)
126
+
127
+ # @param access [Symbol] access modifier (:public, :protected, :private, :all)
128
+ # @return [Array<Type>] declared super-types for this struct/class
129
+ def parent_types(access = :public)
130
+ if access == :public
131
+ @public_parent_types ||= _parent_types(:public)
132
+ return @public_parent_types
133
+ end
90
134
  if access == :all
91
- return innerenums(:public, filter) + innerenums(:protected, filter) + innerenums(:private, filter)
135
+ @all_parent_types ||= parent_types(:public) + parent_types(:protected) + parent_types(:private)
136
+ return @all_parent_types
92
137
  end
93
- sectiondef = %Q{#{access}-type}
94
- lst = doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="#{sectiondef}"]/memberdef[@kind="enum"][@prot="#{access}"]})
95
- filter.map!{ |exp| exp =~ /^_Enum/ ? /@\d*/ : exp} unless filter.nil?
96
- do_filter(filter, lst, Doxyparser::Enum) { |node|
138
+ _parent_types(access)
139
+ end
140
+
141
+ # @param access [Symbol] access modifier (:public, :protected, :private, :all)
142
+ # @param filter [Array<String>] list of Regex. Members whose name does not match any of the regexes will be excluded
143
+ # @return [Array<Enum>] declared enums
144
+ def enums(access = :public, filter = nil)
145
+ if access == :public && filter.nil?
146
+ @public_enums ||= _enums(:public)
147
+ return @public_enums
148
+ end
149
+ if access == :all && filter.nil?
150
+ @all_enums ||= enums(:public) + enums(:protected) + enums(:private)
151
+ return @all_enums
152
+ end
153
+ _enums(access, filter)
154
+ end
155
+
156
+ # @param access [Symbol] access modifier (:public, :protected, :private, :all)
157
+ # @param filter [Array<String>] list of Regex. Members whose name does not match any of the regexes will be excluded
158
+ # @return [Array<Typedef>] declared typedefs
159
+ def typedefs(access = :public, filter = nil)
160
+ if access == :public && filter.nil?
161
+ @public_typedefs ||= _typedefs(:public)
162
+ return @public_typedefs
163
+ end
164
+ if access == :all && filter.nil?
165
+ @all_typedefs ||= typedefs(:public) + typedefs(:protected) + typedefs(:private)
166
+ return @all_typedefs
167
+ end
168
+ _typedefs(access, filter)
169
+ end
170
+
171
+ private
172
+
173
+ attr_reader :file
174
+ attr_reader :friends
175
+ attr_reader :template_params
176
+
177
+
178
+ def _methods(access = :public, static = nil, filter = nil)
179
+ if static.nil?
180
+ static = "-"
181
+ else
182
+ static = "-static-"
183
+ end
184
+ sectiondef = %Q{#{access}#{static}func}
185
+ lst = doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="#{sectiondef}"]/memberdef[@kind="function"][@prot="#{access}"]})
186
+ do_filter(filter, lst, Doxyparser::Function) { |node|
187
+ node.xpath("name")[0].child.content
188
+ }
189
+ end
190
+
191
+ def _attributes(access = :public, static = nil, filter = nil)
192
+ if static.nil?
193
+ static = "-"
194
+ else
195
+ static = "-static-"
196
+ end
197
+ sectiondef = %Q{#{access}#{static}attrib}
198
+ lst = doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="#{sectiondef}"]/memberdef[@kind="variable"][@prot="#{access}"]})
199
+ do_filter(filter, lst, Doxyparser::Variable) { |node|
97
200
  node.xpath("name")[0].child.content
98
201
  }
99
202
  end
100
203
 
101
- def typedefs(access = :public, filter = nil)
102
- if access == :all
103
- return typedefs(:public, filter) + typedefs(:protected, filter) + typedefs(:private, filter)
104
- end
105
- sectiondef = %Q{#{access}-type}
204
+ def compute_path
205
+ aux = escape_class_name(@name)
206
+ @xml_path = %Q{#{@dir}/struct#{aux}.xml}
207
+ end
208
+
209
+ def _typedefs(access, filter=nil)
210
+ sectiondef = %Q{#{access}-type}
106
211
  lst = doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="#{sectiondef}"]/memberdef[@kind="typedef"][@prot="#{access}"]})
107
212
  do_filter(filter, lst, Doxyparser::Typedef) { |node|
108
213
  del_spaces node.xpath("name")[0].child.content
109
214
  }
110
215
  end
216
+
217
+ def _enums(access, filter=nil)
218
+ sectiondef = %Q{#{access}-type}
219
+ lst = doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="#{sectiondef}"]/memberdef[@kind="enum"][@prot="#{access}"]})
220
+ filter.map!{ |exp| exp =~ /^#{@basename}_Enum/ ? /@\d*/ : exp} unless filter.nil?
221
+ do_filter(filter, lst, Doxyparser::Enum) { |node|
222
+ node.xpath("name")[0].child.content
223
+ }
224
+ end
225
+
226
+ def _parent_types(access)
227
+ doc.xpath(%Q{/doxygen/compounddef/basecompoundref[@prot="#{access}"]}).map { |t| Doxyparser::Type.new(name: t.child.content, dir: @dir) }
228
+ end
229
+
230
+ def init_attributes
231
+ super
232
+ @file = init_file
233
+ @friends = init_friends
234
+ @template_params = init_template_params
235
+ end
111
236
 
112
- private
237
+ def init_file
238
+ n = doc.xpath("/doxygen/compounddef/includes")[0]
239
+ return n ? HFile.new(dir: @dir, node: n) : nil
240
+ end
113
241
 
114
- def compute_path
115
- aux = escape_class_name(@name)
116
- @xml_path = %Q{#{@dir}/struct#{aux}.xml}
242
+ def init_friends
243
+ lst=doc.xpath(%Q{/doxygen/compounddef/sectiondef[@kind="friend"]/memberdef[@kind="friend"]})
244
+ lst.map { |node|
245
+ Doxyparser::Friend.new(parent: self, node: node)
246
+ }
247
+ end
248
+
249
+ def init_template_params
250
+ params=doc.xpath(%Q{/doxygen/compounddef/templateparamlist/param})
251
+ params.map { |param|
252
+ Doxyparser::Param.new(parent: self, node: param)
253
+ }
117
254
  end
118
255
  end
119
- end
256
+ end
@@ -1,7 +1,17 @@
1
1
  module Doxyparser
2
2
 
3
+ # Type of the parameters and return value of a {Function}. Parent Type of a {Class} or {Struct}.
4
+ # Supports type parameters (aka. generics)
3
5
  class Type < Node
6
+
7
+ # Name of this {Type} without any reference/pointer symbols '* &' or 'const' modifiers
8
+ attr_reader :escaped_name
4
9
 
10
+ # If this {Type} has type parameters (aka. template params) finds nested {Type}s
11
+ # for other {Classes} or {Structs} parsed by Doxyparser.
12
+ # The 'main' type is always included, so for templates two or more types will be returned.
13
+ # Example: for MyNamespace::map<std::string, MyClass> the result is: [MyNamespace::map, MyNamespace::MyClass]
14
+ # @return [Array<Type>] Nested types
5
15
  def nested_local_types
6
16
  return [] if @node.nil?
7
17
  refs = @node.xpath("ref")
@@ -9,35 +19,57 @@ module Doxyparser
9
19
  refs.map { |r| Type.new(node: r, dir: @dir) }
10
20
  end
11
21
 
22
+ # If this {Type} has type parameters (aka. template params), returns the names for
23
+ # types nested in this type's name
24
+ # The 'main' type is always included, so for templates two or more names will be returned.
25
+ # Example: for MyNamespace::map<std::string, MyClass, 4> the result is: [MyNamespace::map, std::string, MyClass]
26
+ # @return [Array<String>] Names of nested types
12
27
  def nested_typenames
13
- Type.nested_typenames(@name)
28
+ Type.nested_typenames(@escaped_name)
14
29
  end
15
30
 
31
+ # Returns the names for types nested in the parameter.
32
+ # The 'main' type is always included, so for templates two or more names will be returned.
33
+ # Example: for mymap<std::string, MyClass, 4> the result is: [mymap, std::string, MyClass]
34
+ # @param typename [String] Type name
35
+ # @return [Array<String>] Names of nested types
16
36
  def self.nested_typenames(typename)
17
- typename.split(%r{[<,>]}).map{ |s|
18
- s.gsub(/^ *const /,'').gsub(/ +(const)* *[&*] *(const)* *$/,'').strip
37
+ escaped_typename = Doxyparser::Util.escape_const_ref_ptr(typename)
38
+ escaped_typename.split(%r{[<,>]}).map{ |s|
39
+ Doxyparser::Util.escape_const_ref_ptr(s)
19
40
  }.reject { |s|
20
41
  s.nil? || !valid_type?(s)
21
- }
42
+ }
22
43
  end
23
44
 
45
+ # @return true if this type has type parameters, false otherwise
24
46
  def template?
25
- Type.template?(@name)
47
+ Type.template?(@escaped_name)
26
48
  end
27
49
 
50
+ # @param typename [String] Type name
51
+ # @return true if the given type name has type parameters, false otherwise
28
52
  def self.template?(typename)
29
53
  typename.include? '<'
30
54
  end
55
+
56
+ # Setter for the name of this {Type}. Use at your own risk!
57
+ def name=(new_name)
58
+ @name = new_name
59
+ @escaped_name = escape_const_ref_ptr(@name)
60
+ @basename = del_prefix_class(escape_template(@escaped_name))
61
+ end
31
62
 
32
63
  private
33
64
 
34
65
  def init_attributes
35
- @basename = @name
66
+ @escaped_name = escape_const_ref_ptr(@name)
67
+ @basename = del_prefix_class(escape_template(@escaped_name))
36
68
  end
37
69
 
38
70
  def find_name
39
71
  return '' if @node.nil?
40
- @node.content
72
+ @node.content.gsub('friend', '').strip
41
73
  end
42
74
 
43
75
  def self.valid_type?(str)
@@ -1,5 +1,6 @@
1
1
  module Doxyparser
2
2
 
3
+ # A C/C++ type definition (aka. alias)
3
4
  class Typedef < Member
4
5
 
5
6
  end
@@ -1,5 +1,6 @@
1
1
  module Doxyparser
2
2
 
3
+ # A plain old variable
3
4
  class Variable < Member
4
5
 
5
6
  end
@@ -9,8 +9,24 @@ module Doxyparser
9
9
  def del_spaces(n)
10
10
  n.gsub(/\s+/, "")
11
11
  end
12
-
13
- def del_prefix_class(n)
12
+
13
+ def escape_all(typename)
14
+ return del_prefix_class(escape_template(escape_const_ref_ptr(typename)))
15
+ end
16
+
17
+ def escape_template(typename)
18
+ typename.gsub(/<.+$/,'').strip
19
+ end
20
+
21
+ def escape_const_ref_ptr(typename)
22
+ typename.gsub(/^ *const /,'').gsub(/ +(const)* *[&*]* *(const)* *$/,'').strip
23
+ end
24
+
25
+ def self.escape_const_ref_ptr(typename)
26
+ typename.gsub(/^ *const /,'').gsub(/ +(const)* *[&*]* *(const)* *$/,'').strip
27
+ end
28
+
29
+ def del_prefix_class(n) # Previuously escaped for const
14
30
  n.gsub(%r{^[^<]*[:]}, "")
15
31
  end
16
32
 
@@ -54,8 +70,10 @@ module Doxyparser
54
70
  filtered_lst = []
55
71
  filter.each { |val|
56
72
  found = lst.select { |node| match(val, yield(node)) }
57
- raise "The object: #{val} #{clazz} could not be found while parsing" if found.nil? || found.empty?
58
- filtered_lst.push(*found)
73
+ unless found.nil? || found.empty?
74
+ filtered_lst.push(*found)
75
+ end
76
+ #puts "The object: #{val} #{clazz} could not be found while parsing" # TODO Log this?
59
77
  }
60
78
  else
61
79
  filtered_lst=lst
@@ -1,6 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'rspec'
3
- require 'doxyparser'
3
+ require_relative '../lib/doxyparser'
4
4
 
5
5
  require_relative 'custom_spec_helper'
6
6
 
@@ -77,8 +77,8 @@ describe "Doxyparser::Class" do
77
77
  end
78
78
 
79
79
  it "should correctly create inner classes and structs" do
80
- innerstruct = @class.innerstructs
81
- innerclass = @class.innerclasses
80
+ innerstruct = @class.only_innerstructs
81
+ innerclass = @class.only_innerclasses
82
82
  innerstruct.size.should eql 1
83
83
  innerclass.size.should eql 1
84
84
  innerstruct= innerstruct[0]
@@ -97,6 +97,28 @@ describe "Doxyparser::Class" do
97
97
  compare_members methods, expected_methods
98
98
  end
99
99
 
100
+ it "should correctly create destructors" do
101
+ @class.destructors(:protected).should be_empty
102
+ expected_methods=['~MyClass']
103
+ methods = @class.destructors(:all)
104
+ methods.size.should eql 1
105
+ compare_members methods, expected_methods
106
+ methods = @class.destructors(:public)
107
+ methods.size.should eql 1
108
+ compare_members methods, expected_methods
109
+ end
110
+
111
+ it "should correctly create constructors" do
112
+ @class.constructors(:protected).should be_empty
113
+ expected_methods=['MyClass']
114
+ methods = @class.constructors(:all)
115
+ methods.size.should eql 2
116
+ compare_members methods, expected_methods
117
+ methods = @class.constructors(:public)
118
+ methods.size.should eql 2
119
+ compare_members methods, expected_methods
120
+ end
121
+
100
122
  it "should correctly create static methods " do
101
123
  expected_methods=['publicStaticMethod', 'getStaticProp', 'setStaticProp']
102
124
  methods = @class.methods(:public, :static)
@@ -134,8 +156,8 @@ describe "Doxyparser::Class" do
134
156
  end
135
157
 
136
158
  it "should correctly create public enums " do
137
- expected_enums=['_Enum', 'InnerEnum']
138
- enums = @class.innerenums
159
+ expected_enums=["MyClass_Enum", 'InnerEnum']
160
+ enums = @class.enums
139
161
  compare_members enums, expected_enums, Doxyparser::Enum
140
162
  end
141
163
 
@@ -1,6 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'rspec'
3
- require 'doxyparser'
3
+ require_relative '../lib/doxyparser'
4
4
 
5
5
  require_relative 'custom_spec_helper'
6
6
 
@@ -13,7 +13,6 @@ describe "Doxyparser" do
13
13
  hfile=Doxyparser::parse_file("test.h", xml_dir)
14
14
  output = Doxyparser::gen_xml_docs(home_dir + '/spec/headers', home_dir + '/spec/test_gen', true, ['usr/local/include', 'usr/gato'])
15
15
  output.should_not be_empty
16
- FileUtils.rm_r(home_dir + '/spec/test_gen')
17
16
  clazz.name.should_not be_empty
18
17
  namespace.name.should_not be_empty
19
18
  struct.name.should_not be_empty
@@ -1,18 +1,18 @@
1
1
  require 'rubygems'
2
2
  require 'rspec'
3
- require 'doxyparser'
3
+ require_relative '../lib/doxyparser'
4
4
 
5
5
  require_relative 'custom_spec_helper'
6
6
 
7
7
  describe "Doxyparser::Enum" do
8
8
 
9
9
  it "should create consistently enums" do
10
-
11
10
  clazz = Doxyparser::parse_class('MyNamespace::MyClass', xml_dir)
12
- enum = clazz.innerenums(:public, ['_Enum'])
11
+ enum = clazz.enums(:public, ["MyClass_Enum"])
13
12
  enum.size.should eql 1
14
- enum[0].values.should eql ['value1', 'value2','value3']
15
- enum = clazz.innerenums(:public, ['InnerEnum'])
16
- enum[0].values.should eql ['A', 'B','C']
13
+ enum[0].values.map{ |v| v.basename}.should eql ['value1', 'value2','value3']
14
+ enum = clazz.enums(:public, ['InnerEnum'])
15
+ enum[0].values.map{ |v| v.basename}.should eql ['A', 'B','C']
16
+ enum[0].values.map{ |v| v.initializer}.should eql ['23', 'A + 1','A + B']
17
17
  end
18
18
  end
@@ -1,6 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'rspec'
3
- require 'doxyparser'
3
+ require_relative '../lib/doxyparser'
4
4
 
5
5
  require_relative 'custom_spec_helper'
6
6
 
@@ -1,6 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'rspec'
3
- require 'doxyparser'
3
+ require_relative '../lib/doxyparser'
4
4
 
5
5
  require_relative 'custom_spec_helper'
6
6
 
@@ -45,6 +45,10 @@ describe "Doxyparser::Method" do
45
45
  setter.setter_for.should eql 'prop2set_2'
46
46
  setter.getter_for.should be_nil
47
47
  setter.static.should be_nil
48
+
49
+ getter = @class.methods(:private, nil, ['getIndeedAProp'])[0]
50
+ getter.getter_for.should eql 'indeedAProp'
51
+ getter.setter_for.should be_nil
48
52
  end
49
53
 
50
54
  it "should create standard Uppercase getters and setters" do
@@ -64,6 +68,18 @@ describe "Doxyparser::Method" do
64
68
  setter = @class.methods(:private, nil, ['setNotAProp'])[0]
65
69
  setter.setter_for.should be_nil
66
70
  setter.getter_for.should be_nil
71
+
72
+ end
73
+
74
+ it "should ignore malformed getters and setters Pt. 3" do
75
+
76
+ getter = @class.methods(:private, nil, ['getAgainNotAProp'])[0]
77
+ getter.getter_for.should be_nil
78
+ getter.setter_for.should be_nil
79
+ setter = @class.methods(:private, nil, ['setAgainNotAProp'])[0]
80
+ setter.setter_for.should be_nil
81
+ setter.getter_for.should be_nil
82
+
67
83
  end
68
84
 
69
85
  it "should ignore malformed getters and setters Pt. 2" do
@@ -1,6 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'rspec'
3
- require 'doxyparser'
3
+ require_relative '../lib/doxyparser'
4
4
 
5
5
  require_relative 'custom_spec_helper'
6
6
 
@@ -1,6 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'rspec'
3
- require 'doxyparser'
3
+ require_relative '../lib/doxyparser'
4
4
 
5
5
  require_relative 'custom_spec_helper'
6
6
 
metadata CHANGED
@@ -1,31 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: doxyparser
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.3'
5
- prerelease:
4
+ version: '1.5'
6
5
  platform: ruby
7
6
  authors:
8
7
  - David Fuenmayor
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-07-05 00:00:00.000000000 Z
11
+ date: 2014-04-18 00:00:00.000000000 Z
13
12
  dependencies: []
14
- description: ! 'Ruby Gem for parsing C++ header files.
15
-
16
- This library is based on Nokogiri (http://nokogiri.org) and takes as input the xml
17
- files generated by Doxygen (www.doxygen.org).
18
-
19
- Parsing with Doxygen allows us to parse even a set of non-compilable include files.
20
- This is very useful in case you need to parse only a subset of a big library which
21
- won''t normally compile because of being incomplete or needing further build configuration
22
- (e.g Makefiles, VS, SCons, etc).
23
-
24
- By using other tools which rely on a real C/C++ processor like gccxml or swig, you
25
- would normally get lots of compilation-related errors (which is undesired because
26
- we don''t want to compile anything!!). Doxyparser is, in such cases, the lean alternative.
27
-
28
- '
13
+ description: |
14
+ Ruby Gem for parsing C++ header files.
15
+ This library is based on Nokogiri (http://nokogiri.org) and takes as input the xml files generated by Doxygen (www.doxygen.org).
16
+ Parsing with Doxygen allows us to parse even a set of non-compilable include files. This is very useful in case you need to extract metadata for a big library which won't normally compile because of being incomplete or needing further build configuration (think of Makefiles, Visual Studio and similar).
17
+ By using other tools which rely on a real C/C++ processor like gccxml or swig, you would normally get lots of compilation-related errors (which is undesired because we don't want to compile anything!). Doxyparser is, in such cases, the lean alternative.
29
18
  email:
30
19
  - davfuenmayor@gmail.com
31
20
  executables: []
@@ -39,8 +28,8 @@ files:
39
28
  - lib/nodes/function.rb
40
29
  - lib/nodes/variable.rb
41
30
  - lib/nodes/type.rb
31
+ - lib/nodes/enum_value.rb
42
32
  - lib/nodes/class.rb
43
- - lib/nodes/group.rb
44
33
  - lib/nodes/friend.rb
45
34
  - lib/nodes/struct.rb
46
35
  - lib/nodes/compound.rb
@@ -62,27 +51,26 @@ files:
62
51
  homepage: https://github.com/davfuenmayor/ruby-doxygen-parser
63
52
  licenses:
64
53
  - MIT
54
+ metadata: {}
65
55
  post_install_message:
66
56
  rdoc_options: []
67
57
  require_paths:
68
58
  - lib
69
59
  required_ruby_version: !ruby/object:Gem::Requirement
70
- none: false
71
60
  requirements:
72
- - - ! '>='
61
+ - - ">="
73
62
  - !ruby/object:Gem::Version
74
63
  version: '0'
75
64
  required_rubygems_version: !ruby/object:Gem::Requirement
76
- none: false
77
65
  requirements:
78
- - - ! '>='
66
+ - - ">="
79
67
  - !ruby/object:Gem::Version
80
68
  version: '0'
81
69
  requirements: []
82
70
  rubyforge_project:
83
- rubygems_version: 1.8.25
71
+ rubygems_version: 2.1.9
84
72
  signing_key:
85
- specification_version: 3
73
+ specification_version: 4
86
74
  summary: Library for parsing C++ header files
87
75
  test_files:
88
76
  - spec/namespace_spec.rb
@@ -93,3 +81,4 @@ test_files:
93
81
  - spec/doxyparser_spec.rb
94
82
  - spec/class_spec.rb
95
83
  - spec/type_spec.rb
84
+ has_rdoc:
@@ -1,6 +0,0 @@
1
- module Doxyparser
2
-
3
- class Group < Compound
4
-
5
- end
6
- end