diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/backend/test.rb | 4 | ||||
| -rw-r--r-- | src/backend/uctags.rb | 106 |
2 files changed, 35 insertions, 75 deletions
diff --git a/src/backend/test.rb b/src/backend/test.rb new file mode 100644 index 0000000..956ccca --- /dev/null +++ b/src/backend/test.rb @@ -0,0 +1,4 @@ +require_relative './uctags.rb' + +pp FelBind::Backends::UCTags.parse('test.h') +#pp FelBind::Backends::UCTags.parse('raylib.h') diff --git a/src/backend/uctags.rb b/src/backend/uctags.rb index 0cfa3ee..010773e 100644 --- a/src/backend/uctags.rb +++ b/src/backend/uctags.rb @@ -11,20 +11,37 @@ module FelBind self[:CStructs] = {} end - def add_function(name:, ruby_name: , ruby_class:, param_as_self: '') - #TODO + def add_function(name:, params:) + func = {} + self[:CFunctions][name] = func + func[:RubyName] = name + func[:Params] = {} + params.each do |param| + temp = param.rpartition(' ') + func[:Params][temp.last] = [temp.last, temp.first] + end end - def add_struct - #TODO + def add_struct(name:) + self[:CStructs][name] = {} end - def add_typedef - #TODO + def add_struct_param(struct_name:, param_name:, type:) + struct = self[:CStructs][struct_name] + struct[:Accessors] = [] + struct[:Accessors].push [ + param_name, + { + RubyName: param_name, + Type: type, + GetterSkip: false, + SetterSkip: false, + }, + ] end - def add_struct_param - #TODO + def add_typedef(typedef:, c_type:) + self[:Typedefs][typedef] = c_type end end @@ -55,91 +72,30 @@ module FelBind if tag["kind"] == "prototype" # its a function puts 'its a function' #TODO remove + intermediate.add_function(name: tag["name"], params: tag["signature"][1...-1].split(',')) elsif tag["kind"] == "typedef" if tag["typeref"].split(':').first == "typename" # is a typedef puts 'its an alias(typedef)' #TODO remove + intermediate.add_typedef(typedef: tag["name"], c_type: tag["typeref"].split(':').last) elsif tag["typeref"].split(':').first == "struct" # is a struct puts 'its a struct' #TODO remove + intermediate.add_struct(name: tag["name"]) else puts "warning: no match" #TODO better errors end elsif tag['kind'] == 'member' # is struct param - puts 'its a param' #TODO remove + puts 'its a struct param' #TODO remove + intermediate.add_struct_param(struct_name: tag["scope"], param_name: tag["name"], type: tag["typeref"].split(":").last) else puts "warning: no match" #TODO better errors end end + return intermediate end - -=begin -def param_strip(signature) - signature[1...-1].split(',') - end - - def parse_header(path) - parse = `ctags --output-format=json --c-kinds=pm --fields=+S --language-force=c #{path}` - structs = {} - functions = {} - failed = [] - parse.each_line do |line| - json_line = JSON.parse line - if json_line['kind'] == 'prototype' - functions["#{json_line['typeref'].sub(/^[^ ][^ ]* /,'')} #{json_line['name']}"] = param_strip(json_line['signature']) - elsif json_line['kind'] == 'member' - if json_line['scopeKind'] == 'struct' - structs[json_line['scope']] ||= [] - structs[json_line['scope']].push "#{json_line['typeref'].delete_prefix('typename:')} #{json_line['name']}" - else - failed.push json_line - end - elsif json_line['kind'] == 'struct' - structs[json_line['name']] = json_line - else - failed.push json_line - end - end - [functions, structs, failed] - end - - - def debug_show(type, hash) - puts "#{type.upcase}:" - puts '---' - hash.each do |key, params| - puts "#{type.capitalize}: #{key}" - params.each do |param| - puts param - end - puts '---' - end - puts - end - - def scan(file, destination) - functions, structs, failed = parse_header(file) - debug_show('functions', functions) - debug_show('structs', structs) - - if !failed.empty? - puts "-- Failed: --" - pp failed - puts - end - - puts "Functions: #{functions.size}" - puts "Structs: #{structs.size}" - puts "Failed: #{failed.size}" - puts - - result = [functions, structs] - - File.write(destination, JSON.generate(result)) - end -=end end end end |
