status.rb 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #!/usr/bin/env ruby
  2. #require "rtruckboris"
  3. require "term/ansicolor"
  4. PATH = File.expand_path(File.dirname(__FILE__))
  5. require "#{PATH}/toolbox.rb"
  6. def colorize(color, string)
  7. if color.is_a?(String)
  8. color = color.to_s
  9. elsif !color.is_a?(Symbol)
  10. raise "You should pass a string or a symbol"
  11. exit
  12. end
  13. "#{Term::ANSIColor.send(color.to_sym)}#{string}#{Term::ANSIColor.clear} "
  14. end
  15. def is_object_generator(f, object_name)
  16. if f.name.match(/.*2\z/)
  17. f.parameters.each do |p|
  18. if p.type.name.match(/#{object_name}/)
  19. return true
  20. end
  21. end
  22. false
  23. elsif f.return_type.name.match(/^#{object_name}(\s+\*)*$/)
  24. return true
  25. else
  26. false
  27. end
  28. end
  29. def is_object_method(f, object_name)
  30. f.parameters.each do |p|
  31. if p.type.name.match(/^#{object_name}(\s+\*)*$/)
  32. return true
  33. end
  34. end
  35. false
  36. end
  37. def display_infos(object_name, generators, methods, wrapped_methods = [], versions)
  38. puts "#{colorize(:bold,object_name)} related functions"
  39. puts "\t#{colorize(:underscore,"Generators")}"
  40. generators.each do |g|
  41. gname = g.name
  42. if wrapped_methods.include?(gname)
  43. puts "\t\t#{colorize(:black,gname)} - #{versions[gname].inspect}"
  44. else
  45. puts "\t\t#{gname} - #{versions[gname].inspect}"
  46. end
  47. end
  48. # Sort on arguments number
  49. methods.sort! {|a,b| a.parameters_num <=> b.parameters_num}
  50. puts "\t#{colorize(:underscore,"Methods")} (order based on arguments number)"
  51. output_types = []
  52. input_types = []
  53. methods.each do |m|
  54. m.parameters.each do |p|
  55. input_types << p.type.name unless input_types.include?(p.type.name)
  56. end
  57. mname = m.name
  58. if wrapped_methods.include?(mname)
  59. puts "\t\t#{m.parameters_num} __ #{colorize(:black,mname)} - #{versions[mname].inspect}"
  60. else
  61. puts "\t\t#{m.parameters_num} __ #{mname} - #{versions[mname].inspect}"
  62. end
  63. output_types << m.return_type.name unless output_types.include?(m.return_type.name)
  64. end
  65. end
  66. def sumup_module_functions(functions, wrapped_methods = [], versions)
  67. puts "#{colorize(:bold,"Module")} functions"
  68. functions.each do |f|
  69. if f.parameters.size == 0
  70. fname = f.name
  71. if wrapped_methods.include?(fname)
  72. puts "\t\t#{colorize(:black,fname)} - #{versions[fname].inspect}"
  73. else
  74. puts "\t\t#{fname} - #{versions[fname].inspect}"
  75. end
  76. end
  77. end
  78. end
  79. def sumup_objects(functions, objects, wrapped_methods = [], versions)
  80. objects.each do |obj|
  81. obj_generators = []
  82. obj_methods = []
  83. functions.each do |f|
  84. obj_generators << f if is_object_generator(f, obj)
  85. obj_methods << f if is_object_method(f, obj)
  86. end
  87. display_infos(obj, obj_generators, obj_methods, wrapped_methods, versions)
  88. end
  89. end
  90. def print_global_informations(functions, managed_functions)
  91. count = 0
  92. functions.each do |f|
  93. count += 1 if managed_functions.include?(f.name)
  94. end
  95. color = Term::ANSIColor
  96. print color.green, count.to_s, color.clear, "/", color.black,
  97. functions.size, color.clear, " functions wrapped => ",
  98. color.yellow, (count/(functions.size*1.00)) * 100,
  99. color.clear, "%\n\n"
  100. end
  101. # Get clang functions that are wrapped in the C bindings
  102. SRC_FILES = Dir.glob("#{PATH}/../ext/clangc/*.[c|h]")
  103. MANAGED_FUNCTIONS = []
  104. SRC_FILES.each do |file|
  105. f = File.open(file, 'r')
  106. while !f.eof?
  107. line = f.readline
  108. if /(?<clang_function>clang_\w+)/ =~ line
  109. MANAGED_FUNCTIONS << clang_function
  110. end
  111. end
  112. end
  113. MANAGED_FUNCTIONS.uniq!
  114. # Get Clang versions with function name:
  115. clang_versions = {}
  116. clang_versions[:v35] = Toolbox::SourceParser.new("#{PATH}/clang-3.5/clang-c/Index.h",
  117. "#{PATH}/clang-3.5")
  118. clang_versions[:v36] = Toolbox::SourceParser.new("#{PATH}/clang-3.6/clang-c/Index.h",
  119. "#{PATH}/clang-3.6")
  120. clang_versions[:v37] = Toolbox::SourceParser.new("#{PATH}/clang-3.7/clang-c/Index.h",
  121. "#{PATH}/clang-3.7")
  122. clang_versions[:v38] = Toolbox::SourceParser.new("#{PATH}/clang-3.8/clang-c/Index.h",
  123. "#{PATH}/clang-3.8")
  124. OUT = STDOUT.dup
  125. ERR = STDERR.dup
  126. clang_versions.each do |k,v|
  127. $stdout.reopen("parse_#{k}.log", "w")
  128. $stderr.reopen("parse_#{k}.err", "w")
  129. v.parse(true)
  130. $stdout.flush
  131. $stderr.flush
  132. end
  133. $stdout = OUT
  134. $stderr = ERR
  135. versions = {}
  136. clang_versions.each do |k,v|
  137. fns = v.functions
  138. fns.each do |f|
  139. if versions[f.name] && !versions[f.name].include?(k)
  140. versions[f.name] << k
  141. else
  142. versions[f.name] = [k]
  143. end
  144. end
  145. end
  146. # Get a list of all Clang functions of system headers
  147. libclang_dir = `llvm-config --includedir`.chomp
  148. clang_c = libclang_dir + "/clang-c/Index.h"
  149. parser = Toolbox::SourceParser.new(clang_c, libclang_dir)
  150. unless parser.parse(true)
  151. puts "Can't parse"
  152. exit
  153. end
  154. functions = parser.functions
  155. print_global_informations(functions, MANAGED_FUNCTIONS)
  156. # print specific informations
  157. sumup_module_functions(functions, MANAGED_FUNCTIONS, versions)
  158. sumup_objects(functions, ["CXIndex",
  159. "CXTranslationUnit",
  160. "CXDiagnostic",
  161. "CXFile",
  162. "CXSourceRange",
  163. "CXSourceLocation",
  164. "CXCursor",
  165. "CXType",
  166. "CXCompletionString",
  167. "CXCodeCompleteResults"
  168. # Done "CXCursorSet",
  169. # Done "CXModule"
  170. ],
  171. MANAGED_FUNCTIONS, versions)
  172. print_global_informations(functions, MANAGED_FUNCTIONS)