@@ -21,20 +21,23 @@ class << self
2121 # attempts to find the relevant module files and their function
2222 # signatures.
2323 def parse_cpp_modules ( entry_point )
24+ # TODO: Of course we cannot do this forever!
2425 ignored_modules = %w[ console ]
2526
2627 file = File . read ( entry_point )
2728 directory = File . dirname ( entry_point )
2829
29- file . scan ( /^static.*module\[ \] [\s \S ]+?};/ ) do |cpp_module |
30- module_name = cpp_module [ /\S +(?=_module\[ \] )/ ] . gsub ( 'dfhack_' , '' )
31-
32- next if ignored_modules . include? module_name
30+ modules = file . scan ( /^static.*dfhack_(.*)(?:_funcs|_module)\[ \] [\s \S ]+?};/ ) . flatten . uniq . reject do |name |
31+ ignored_modules . include? name
32+ end
3333
34- module_file = if %w[ dfhack internal ] . include? module_name
35- file
34+ modules . each do |module_name |
35+ module_path = "#{ directory } /modules/#{ module_name . capitalize } .cpp"
36+ is_module = file =~ /^static.*#{ module_name } _module\[ \] /
37+ module_file = if File . exist? module_path
38+ File . read ( module_path )
3639 else
37- File . read ( " #{ directory } /modules/ #{ module_name . capitalize } .cpp" )
40+ file
3841 end
3942
4043 File . open ( "dist/library/modules/#{ module_name } .lua" , 'w' ) do |output |
@@ -44,36 +47,59 @@ def parse_cpp_modules(entry_point)
4447
4548 output << "---@class #{ module_name } _module\n "
4649
50+ prefix = module_name == 'dfhack' ? '' : 'dfhack.'
51+ namespace = is_module ? "#{ module_name . capitalize } ::" : ''
52+
53+ functions = [ ]
54+
55+ module_declaration = file [ /^static.*#{ module_name } _module\[ \] [\s \S ]+?};/ ]
56+ function_declaration = file [ /^static.*#{ module_name } _funcs\[ \] [\s \S ]+?};/ ]
57+
4758 # Functions with signatures that are unlikely to be easily parsed.
48- cpp_module . scan ( /(?:WRAP_VERSION_FUNC|WRAPN)\( ([^)]+)\) / ) do |match |
59+ module_declaration & .scan ( /(?:WRAP_VERSION_FUNC|WRAPN)\( ([^)]+)\) / ) do |match |
4960 function_name = match [ 0 ] . split ( ', ' ) [ 0 ]
5061 output << "---@field #{ function_name } function\n "
5162 end
5263
53- prefix = module_name == 'dfhack' ? '' : 'dfhack.'
54- namespace = module_name == 'dfhack' ? '' : "#{ module_name . capitalize } ::"
55- output << "#{ prefix } #{ module_name } = {}\n \n "
56-
57- functions = [ ]
64+ # Functions that manipulate lua_state (usually?)
65+ unless is_module
66+ function_declaration &.scan ( /^\s *{\s *([^,]+),\s *([^}]+)\s *}/ ) do |name , signature |
67+ next if name =~ /NULL/
5868
59- # Guessing here a little bit.
60- file . scan ( /^static.*#{ module_name } _funcs\[ \] [\s \S ]+?};/ ) do |funcs |
61- funcs . scan ( /{([^}\n ]+)}/ ) do
62- match = Regexp . last_match ( 1 )
63- next if match =~ /NULL/
69+ function_name = name . gsub ( /"/ , '' ) . strip
70+ signature_name = signature . gsub ( /"/ , '' ) . strip
6471
65- function_name = match . split ( ',' ) [ 0 ] . strip . gsub ( /"/ , '' )
66- signature_name = match . split ( ',' ) [ 1 ] . strip . gsub ( '"' , '' ) . gsub ( "#{ module_name } _" , '' )
72+ module_file [ /^(?:static\s )?(?:DFHACK_EXPORT\s )?(\S +).*?#{ namespace } #{ signature_name . gsub (
73+ /#{ module_name } _/ , ''
74+ ) } \s ?\( ([^)]+)?\) /]
75+ next if Regexp . last_match
6776
68- module_file [ /^(?:static\s )?(?:DFHACK_EXPORT\s )?(\S +).*?#{ namespace } #{ signature_name } \s ?\( ([^)]+)?\) / ]
77+ file [ /^(?:static\s )?(?:DFHACK_EXPORT\s )?(\S +).*?#{ signature_name } \s ?\( ([^)]+)?\) / ] unless is_module
6978 next unless Regexp . last_match
7079
71- functions << DFHackLuaDefinitions ::CPP . parse_function ( Regexp . last_match , module_name :, prefix :,
72- function_name :)
80+ output << "---@field #{ function_name } function\n "
7381 end
7482 end
7583
76- cpp_module . scan ( /(?:WRAP|WRAPM)\( (.+)?\) ,?/ ) do |function_name , |
84+ output << "#{ prefix } #{ module_name } = {}\n \n "
85+
86+ # Guessing here a little bit.
87+ function_declaration &.scan ( /^\s *{\s *([^,]+),\s *([^}]+)\s *}/ ) do |name , signature |
88+ next if name =~ /NULL/
89+
90+ function_name = name . gsub ( /"/ , '' ) . strip
91+ signature_name = signature . gsub ( /"/ , '' ) . strip
92+
93+ module_file [ /^(?:static\s )?(?:DFHACK_EXPORT\s )?(\S +).*?#{ namespace } #{ signature_name . gsub (
94+ /#{ module_name } _/ , ''
95+ ) } \s ?\( ([^)]+)?\) /]
96+ next unless Regexp . last_match
97+
98+ functions << DFHackLuaDefinitions ::CPP . parse_function ( Regexp . last_match , module_name :, prefix :,
99+ function_name :)
100+ end
101+
102+ module_declaration &.scan ( /(?:WRAP|WRAPM)\( (.+)?\) ,?/ ) do |function_name , |
77103 function_name = Regexp . last_match ( 1 ) if function_name =~ /,\s ?(\S +)/
78104 signature = "#{ namespace } #{ function_name } "
79105
@@ -84,7 +110,6 @@ def parse_cpp_modules(entry_point)
84110 functions << DFHackLuaDefinitions ::CPP . parse_function ( Regexp . last_match , module_name :, prefix :,
85111 function_name :)
86112 end
87-
88113 output << functions . join
89114 end
90115 end
0 commit comments