summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorrealtradam <[email protected]>2022-09-11 16:22:47 -0400
committerrealtradam <[email protected]>2022-09-11 16:22:47 -0400
commit9f43631fa25346db798ebe3c3358ff4ae4377601 (patch)
tree44fbe9da33351ee5b8f04f4afb72e1ab19b19b72
parentc51ded6c4efef4e0ef5a157a72ae79c402b7964b (diff)
downloadFelBind-rewrite.tar.gz
FelBind-rewrite.zip
basic parser backend workingrewrite
-rw-r--r--planning/structure.puml19
-rw-r--r--src/backend/test.rb4
-rw-r--r--src/backend/uctags.rb106
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