diff options
| author | realtradam <[email protected]> | 2022-09-11 16:22:47 -0400 |
|---|---|---|
| committer | realtradam <[email protected]> | 2022-09-11 16:22:47 -0400 |
| commit | 9f43631fa25346db798ebe3c3358ff4ae4377601 (patch) | |
| tree | 44fbe9da33351ee5b8f04f4afb72e1ab19b19b72 | |
| parent | c51ded6c4efef4e0ef5a157a72ae79c402b7964b (diff) | |
| download | FelBind-9f43631fa25346db798ebe3c3358ff4ae4377601.tar.gz FelBind-9f43631fa25346db798ebe3c3358ff4ae4377601.zip | |
basic parser backend workingrewrite
| -rw-r--r-- | planning/structure.puml | 19 | ||||
| -rw-r--r-- | src/backend/test.rb | 4 | ||||
| -rw-r--r-- | src/backend/uctags.rb | 106 |
3 files changed, 45 insertions, 84 deletions
diff --git a/planning/structure.puml b/planning/structure.puml index 817a3bd..47bf52b 100644 --- a/planning/structure.puml +++ b/planning/structure.puml @@ -111,6 +111,12 @@ state Build_State as "Build State Hash" { state BS_Cfun_RClass as "Ruby Class" #darkorange : string or array(string) state BS_Cfun_Name as "Ruby Name" : string state BS_Cfun_Selfparam as "Param as Self" : string + state BS_Cfun_Params as "Params" { + state BS_Cfun_CParamName as "CParam Name" { + state BS_Cfun_RubyParamName as "Ruby Param Name" : string + state BS_Cfun_ParamType as "Param Type" : string + } + } } state BS_C_Struct_Name as "C Struct Name" #red { state BS_C_Deinit as "Deinitialize Object" #chocolate : string(C code) @@ -122,16 +128,11 @@ state Build_State as "Build State Hash" { state BS_Cstc_I_skip as "Skip" : boolean } state BS_Cstc_Accessors as "Accessors" #hotpink { - state BS_Cstc_Getters as "Getters" #lawngreen { - state BS_Cstc_G_Name as "Ruby Name" : string - state BS_Cstc_G_Skip as "Skip" : boolean - } - state BS_Cstc_Setters as "Setters" #darkorchid { - state BS_Cstc_S_Name as "Ruby Name" : string - state BS_Cstc_S_Skip as "Skip" : boolean - } + state BS_Cstc_G_Name as "Ruby Name" : string + state BS_Cstc_G_Type as "Type" : string + state BS_Cstc_G_Skip as "Skip Getter" #lawngreen : boolean + state BS_Cstc_S_Skip as "Skip Setter" #darkorchid : boolean } - BS_Cstc_Getters -d[hidden]-> BS_Cstc_Setters } BS_C_Function_Name -d[hidden]-> BS_C_Struct_Name 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 |
