Mercurial > projects > dstep
comparison scripts/dstepgen.rb @ 2:9fd439a28ce3
Adapted the scripts for the new bridge + a lot more
author | Jacob Carlborg <doob@me.com> |
---|---|
date | Sun, 05 Jul 2009 17:16:19 +0200 |
parents | 033d260cfc9b |
children | d0162d8ca0f2 |
comparison
equal
deleted
inserted
replaced
1:033d260cfc9b | 2:9fd439a28ce3 |
---|---|
119 self.structs = [] | 119 self.structs = [] |
120 self.typedefs = [] | 120 self.typedefs = [] |
121 end | 121 end |
122 end | 122 end |
123 | 123 |
124 Category = Struct.new(:name, :class) do | |
125 def initialize | |
126 self.name = "" | |
127 self.class = "" | |
128 end | |
129 end | |
130 | |
124 # This class scans the headers | 131 # This class scans the headers |
125 class HeaderScaner | 132 class HeaderScaner |
126 CPP = ['/usr/bin/cpp-4.0', '/usr/bin/cpp-3.3', '/usr/bin/cpp3'].find { |x| File.exist?(x) } | 133 CPP = ['/usr/bin/cpp-4.0', '/usr/bin/cpp-3.3', '/usr/bin/cpp3'].find { |x| File.exist?(x) } |
127 raise "cpp not found" if CPP.nil? | 134 raise "cpp not found" if CPP.nil? |
128 CPPFLAGS = "-D__APPLE_CPP__ -include /usr/include/AvailabilityMacros.h" | 135 CPPFLAGS = "-D__APPLE_CPP__ -include /usr/include/AvailabilityMacros.h" |
134 @extern_name = 'extern' | 141 @extern_name = 'extern' |
135 @frameworks = [] | 142 @frameworks = [] |
136 @file_content = nil | 143 @file_content = nil |
137 @headers = [] | 144 @headers = [] |
138 @classes = {} | 145 @classes = {} |
139 @informal_protocols = {} | 146 @protocols = {} |
147 @categories = {} | |
148 #@informal_protocols = {} | |
140 @function_pointer_types = {} | 149 @function_pointer_types = {} |
141 @do_64bit = false | 150 @do_64bit = false |
142 end | 151 end |
143 | 152 |
144 def classes | 153 def get_classes |
145 @classes | 154 @classes |
146 end | 155 end |
147 | 156 |
148 def protocols | 157 def get_protocols |
149 @informal_protocols | 158 @protocols |
150 end | 159 end |
160 | |
161 def get_categories | |
162 @categories | |
163 end | |
164 | |
165 # def get_informal_protocols | |
166 # @informal_protocols | |
167 # end | |
151 | 168 |
152 def cftypes (header) | 169 def cftypes (header) |
153 re = /typedef\s+(const\s+)?(struct\s*\w+\s*\*\s*)([^\s]+Ref)\s*;/ | 170 re = /typedef\s+(const\s+)?(struct\s*\w+\s*\*\s*)([^\s]+Ref)\s*;/ |
154 @cpp_result.scan(re).each do |m| | 171 @cpp_result.scan(re).each do |m| |
155 header.cftypes << { :name => m[2], :type => m[1], :const => m[0] =~ /const/ ? true : false} | 172 header.cftypes << { :name => m[2], :type => m[1], :const => m[0] =~ /const/ ? true : false} |
260 end | 277 end |
261 | 278 |
262 header.imports = tmp.compact.uniq | 279 header.imports = tmp.compact.uniq |
263 end | 280 end |
264 | 281 |
265 def informal_protocols (header) | 282 # def informal_protocols (header) |
266 self.methods(header) | 283 # methods(header, /^@(interface)\s+(\w+)\s*:?\s*(\w*)\s*(\([^)]+\))?/, @protocols, false) |
284 # end | |
285 | |
286 def classes (header) | |
287 methods(header, /^@(interface)\s+(\w+)\s*:?\s*(\w*)\s*(\<([\w,\s]+)>)?$/, @classes, false) | |
267 end | 288 end |
268 | 289 |
269 def methods (header) | 290 def protocols (header) |
270 interface_re = /^@(interface|protocol)\s+(\w+)\s*:?\s*(\w*)\s*(\([^)]+\))?/ | 291 methods(header, /^@(protocol)\s+(\w+)\s*:?\s*(\w*)\s*(\<([\w,\s]+)>)?(\([^)]+\))?/, @protocols, true) |
292 end | |
293 | |
294 def categories (header) | |
295 methods(header, /^@(interface)\s+(\w+)\s*:?\s*(\w*)\s*(\<([\w,\s]+)>)?(\([^)]+\))/, @categories, false, true) | |
296 end | |
297 | |
298 def methods (header, regex, array, protocol, category = false) | |
299 interface_re = regex | |
271 | 300 |
272 end_re = /^@end/ | 301 end_re = /^@end/ |
273 body_re = /^[-+]\s*(\([^)]+\))?\s*([^:\s;]+)/ | 302 body_re = /^[-+]\s*(\([^)]+\))?\s*([^:\s;]+)/ |
274 args_re = /\w+\s*:/ | 303 args_re = /\w+\s*:/ |
275 prop_re = /^@property\s*(\([^)]+\))?\s*([^;]+);$/ | 304 prop_re = /^@property\s*(\([^)]+\))?\s*([^;]+);$/ |
276 current_interface = current_category = nil | 305 current_interface = current_category = nil |
277 i = 0 | 306 i = 0 |
278 parent = nil | 307 parent = nil |
279 | 308 protocols = nil |
280 @cpp_result.each_line do |line| | 309 cat = nil |
310 | |
311 @cpp_result.each_line do |line| | |
281 size = line.size | 312 size = line.size |
282 line.strip! | 313 line.strip! |
283 | 314 |
284 if md = interface_re.match(line) | 315 if md = interface_re.match(line) |
285 parent = nil | 316 parent = nil |
286 current_interface = md[1] == "protocol" ? "NSObject" : md[2] | 317 protocols = nil |
287 current_category = md[4].delete("()").strip if md[4] | 318 current_category = md[6].delete("()").strip if md[6] |
319 current_interface = md[2] unless category | |
320 current_interface = current_category if category | |
288 parent = md[3] unless md[3] == "" | 321 parent = md[3] unless md[3] == "" |
322 protocols = md[5] if md[5] | |
323 | |
324 if category | |
325 cat = Category.new if category | |
326 cat.name = current_category | |
327 cat.class = md[2] | |
328 end | |
289 | 329 |
290 elsif end_re.match(line) | 330 elsif end_re.match(line) |
291 current_interface = current_category = nil | 331 current_interface = current_category = nil |
292 | 332 |
293 elsif current_interface && md = prop_re.match(line) | 333 elsif current_interface && md = prop_re.match(line) |
308 readonly = true if attributes.index("readonly") | 348 readonly = true if attributes.index("readonly") |
309 end | 349 end |
310 | 350 |
311 typeinfo = VarInfo.new(type, "", "") | 351 typeinfo = VarInfo.new(type, "", "") |
312 | 352 |
313 @classes[current_interface] ||= {} | 353 array[current_interface] ||= {} unless category |
314 methods = (@classes[current_interface].methods ||= []) | 354 array[cat] ||= {} if category |
355 methods = (array[current_interface].methods ||= []) unless category | |
356 methods = (array[cat].methods ||= []) if category | |
315 methods << MethodInfo.new(typeinfo, getter, false, [], line) | 357 methods << MethodInfo.new(typeinfo, getter, false, [], line) |
316 | 358 |
317 unless readonly | 359 unless readonly |
318 methods << MethodInfo.new(VarInfo.new("void", "", ""), setter + ":", false, [typeinfo], line) | 360 methods << MethodInfo.new(VarInfo.new("void", "", ""), setter + ":", false, [typeinfo], line) |
319 end | 361 end |
375 | 417 |
376 selector = body_md[2] if selector.empty? | 418 selector = body_md[2] if selector.empty? |
377 args << VarInfo.new("...", "vararg", "") if variadic | 419 args << VarInfo.new("...", "vararg", "") if variadic |
378 method = MethodInfo.new(retval, selector, line[0] == ?+, args, data) | 420 method = MethodInfo.new(retval, selector, line[0] == ?+, args, data) |
379 | 421 |
380 if current_category && current_interface == "NSObject" | 422 # if protocol && current_category && current_interface == "NSObject" |
381 (@informal_protocols[current_category] ||= []) << method | 423 # (@informal_protocols[current_category] ||= []) << method |
382 end | 424 # end |
383 | 425 |
384 @classes[current_interface] ||= {} | 426 array[current_interface] ||= {} unless category |
427 array[cat] ||= {} if category | |
385 | 428 |
386 if header.name == current_interface | 429 if header.name == current_interface |
387 @classes[current_interface].file = header.name | 430 array[current_interface].file = header.name unless category |
431 array[cat].file = header.name if category | |
388 else | 432 else |
389 @classes[current_interface].file ||= header.name | 433 array[current_interface].file ||= header.name unless category |
434 array[cat].file ||= header.name if category | |
390 end | 435 end |
391 | 436 |
392 unless parent == current_interface || parent =~ /\s+/ || parent.nil? | 437 unless parent == current_interface || parent =~ /\s+/ || parent.nil? |
393 @classes[current_interface].parent = parent | 438 array[current_interface].parent = parent unless category |
394 end | 439 array[cat].parent = parent if category |
395 | 440 end |
396 (@classes[current_interface].methods ||= []) << method | 441 |
442 unless protocols.nil? | |
443 protocols.gsub!(/ /, "") | |
444 array[current_interface].protocols = protocols unless category | |
445 array[cat].protocols = protocols if category | |
446 end | |
447 | |
448 (array[current_interface].methods ||= []) << method unless category | |
449 (array[cat].methods ||= []) << method if category | |
397 end | 450 end |
398 i += size | 451 i += size |
399 end | 452 end |
400 end | 453 end |
401 | 454 |
491 else | 544 else |
492 header.functions = funcs | 545 header.functions = funcs |
493 end | 546 end |
494 end | 547 end |
495 | 548 |
496 def prepare (path) | 549 def prepare (path) |
497 @file_content = File.read(path) | 550 @file_content = File.read(path) |
498 @file_content.gsub!(%r{(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)}, ""); | 551 @file_content.gsub!(%r{(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)}, ""); |
499 @complete_cpp_result, @cpp_result = do_cpp(path, false, true, "") | 552 @complete_cpp_result, @cpp_result = do_cpp(path, false, true, "") |
500 end | 553 end |
501 | 554 |
515 structs(header) | 568 structs(header) |
516 typedefs(header) | 569 typedefs(header) |
517 functions(header) | 570 functions(header) |
518 functions(header, true) | 571 functions(header, true) |
519 defines(header) | 572 defines(header) |
520 methods(header) | 573 classes(header) |
574 protocols(header) | |
575 #informal_protocols(header) | |
576 categories(header) | |
521 function_pointer_types(header) | 577 function_pointer_types(header) |
522 end | 578 end |
523 end | 579 end |
524 | 580 |
525 @headers.each do |header| | 581 @headers.each do |header| |
533 structs(header) | 589 structs(header) |
534 typedefs(header) | 590 typedefs(header) |
535 functions(header) | 591 functions(header) |
536 functions(header, true) | 592 functions(header, true) |
537 defines(header) | 593 defines(header) |
538 methods(header) | 594 classes(header) |
595 protocols(header) | |
596 #informal_protocols(header) | |
597 categories(header) | |
539 function_pointer_types(header) | 598 function_pointer_types(header) |
540 end | 599 end |
541 end | 600 end |
542 | 601 |
543 def get_var_info (str, multi = false) | 602 def get_var_info (str, multi = false) |
813 | 872 |
814 class DStepGenerator | 873 class DStepGenerator |
815 | 874 |
816 VERSION = 1.0 | 875 VERSION = 1.0 |
817 | 876 |
818 attr_accessor :out_file, :scaner, :code_to_inject | 877 attr_accessor :out_file, :scaner, :code_to_inject, :dependencies_switch |
819 | 878 |
820 def initialize | 879 def initialize |
821 @do_64bit = false | 880 @do_64bit = false |
822 @frameworks = [] | 881 @frameworks = [] |
823 @framework_paths = [] | 882 @framework_paths = [] |
824 @headers = [] | 883 @headers = [] |
825 @import_directives = "#import <Foundation/Foundation.h>\n" | 884 @import_directives = "#import <Foundation/Foundation.h>\n" |
826 @informal_protocols = [] | 885 #@informal_protocols = [] |
827 @classes = [] | 886 @classes = [] |
887 @protocols = [] | |
888 @categories = [] | |
828 @scaner = HeaderScaner.new | 889 @scaner = HeaderScaner.new |
829 @scaner.do_64bit = @do_64bit | 890 @scaner.do_64bit = @do_64bit |
830 @umbrella_framework = nil | 891 @umbrella_framework = nil |
831 @handled_dependencies = [] | 892 @handled_dependencies = [] |
893 @dependencies_switch = false | |
832 | 894 |
833 # link to foundation framework by default | 895 # link to foundation framework by default |
834 @compiler_flags = "-framework Foundation" | 896 @compiler_flags = "-framework Foundation" |
835 end | 897 end |
836 | 898 |
839 end | 901 end |
840 | 902 |
841 def do_64bit= (do_64bit) | 903 def do_64bit= (do_64bit) |
842 @do_64bit = do_64bit | 904 @do_64bit = do_64bit |
843 @scaner.do_64bit = do_64bit | 905 @scaner.do_64bit = do_64bit |
844 end | 906 end |
845 | 907 |
846 def collect | 908 def collect |
847 scaner.scan(@frameworks, @headers) | 909 scaner.scan(@frameworks, @headers) |
848 @classes = scaner.classes | 910 @classes = scaner.get_classes |
849 @informal_protocols = scaner.protocols | 911 @protocols = scaner.get_protocols |
912 @categories = scaner.get_categories | |
913 #@informal_protocols = scaner.get_informal_protocols | |
850 end | 914 end |
851 | 915 |
852 def handle_framework (framework, sub_framework = false, parent_framework = nil) | 916 def handle_framework (framework, sub_framework = false, parent_framework = nil) |
853 val = framework.name | 917 val = framework.name |
854 path = framework_path(val) | 918 path = framework_path(val) |
979 return deps | 1043 return deps |
980 end | 1044 end |
981 | 1045 |
982 def compile_and_execute (code, enable_64bit = false, clean_when_fail = false) | 1046 def compile_and_execute (code, enable_64bit = false, clean_when_fail = false) |
983 compiler_line = "gcc " | 1047 compiler_line = "gcc " |
984 src = File.new(unique_tmp_path("src", ".m", "/Users/doob/development/eclipse_workspace/dstep/bindings"), "w") | 1048 src = File.new(unique_tmp_path("src", ".m"), "w") |
985 src << code | 1049 src << code |
986 src.close | 1050 src.close |
987 | 1051 |
988 arch_flag = if enable_64bit | 1052 arch_flag = if enable_64bit |
989 "-arch x86_64 -arch ppc64" | 1053 "-arch x86_64 -arch ppc64" |
991 "-arch i386 -arch ppc" | 1055 "-arch i386 -arch ppc" |
992 end | 1056 end |
993 | 1057 |
994 compiler_line << arch_flag | 1058 compiler_line << arch_flag |
995 | 1059 |
996 bin = unique_tmp_path "bin", "", "/Users/doob/development/eclipse_workspace/dstep/bindings" | 1060 bin = unique_tmp_path "bin", "" |
997 log = unique_tmp_path "log", ".txt", "/Users/doob/development/eclipse_workspace/dstep/bindings" | 1061 log = unique_tmp_path "log", ".txt" |
998 | 1062 |
999 line = "#{compiler_line} -o #{bin} #{src.path} #{@compiler_flags} 2>#{log}" | 1063 line = "#{compiler_line} -o #{bin} #{src.path} #{@compiler_flags} 2>#{log}" |
1000 | 1064 |
1001 unless system(line) | 1065 unless system(line) |
1002 msg = "Cannot compile Objective-C code ...aborting\nCommand was: #{line}\n\nLog:\n#{File.read(log)}\n\n" | 1066 msg = "Cannot compile Objective-C code ...aborting\nCommand was: #{line}\n\nLog:\n#{File.read(log)}\n\n" |
1091 end | 1155 end |
1092 | 1156 |
1093 types | 1157 types |
1094 end | 1158 end |
1095 | 1159 |
1096 def collect_informal_protocols_types (enable_64bit) | 1160 def collect_protocols_types (enable_64bit) |
1097 types = [] | 1161 types = [] |
1098 | 1162 |
1099 @informal_protocols.each do |name, methods| | 1163 @protocols.each do |protocol, value| |
1100 methods.each do |method| | 1164 value.methods.each do |method| |
1165 types << method.stripped_return_type | |
1166 | |
1167 method.args.each do |arg| | |
1168 types << arg.stripped_return_type | |
1169 end | |
1170 end | |
1171 end | |
1172 | |
1173 types | |
1174 end | |
1175 | |
1176 # def collect_informal_protocols_types (enable_64bit) | |
1177 # types = [] | |
1178 # | |
1179 # @informal_protocols.each do |name, methods| | |
1180 # methods.each do |method| | |
1181 # types << method.stripped_return_type | |
1182 # | |
1183 # method.args.each do |arg| | |
1184 # types << arg.stripped_return_type | |
1185 # end | |
1186 # end | |
1187 # end | |
1188 # | |
1189 # types | |
1190 # end | |
1191 | |
1192 def collect_categories_types (enable_64bit) | |
1193 types = [] | |
1194 | |
1195 @categories.each do |category, value| | |
1196 value.methods.each do |method| | |
1101 types << method.stripped_return_type | 1197 types << method.stripped_return_type |
1102 | 1198 |
1103 method.args.each do |arg| | 1199 method.args.each do |arg| |
1104 types << arg.stripped_return_type | 1200 types << arg.stripped_return_type |
1105 end | 1201 end |
1152 end | 1248 end |
1153 | 1249 |
1154 i | 1250 i |
1155 end | 1251 end |
1156 | 1252 |
1157 def resolve_methods_types (enable_64bit, resolved_types, x) | 1253 def resolve_classes_types (enable_64bit, resolved_types, x) |
1158 i = x | 1254 i = x |
1159 | 1255 |
1160 @classes.each do |clazz, value| | 1256 @classes.each do |clazz, value| |
1161 value.methods.each do |method| | 1257 value.methods.each do |method| |
1162 method.resolved_type = resolved_types[i] unless enable_64bit | 1258 method.resolved_type = resolved_types[i] unless enable_64bit |
1172 end | 1268 end |
1173 | 1269 |
1174 i | 1270 i |
1175 end | 1271 end |
1176 | 1272 |
1177 def resolve_informal_protocols_types (enable_64bit, resolved_types, x) | 1273 def resolve_protocols_types (enable_64bit, resolved_types, x) |
1178 i = x | 1274 i = x |
1179 | 1275 |
1180 @informal_protocols.each do |name, methods| | 1276 @protocols.each do |protocol, value| |
1181 methods.each do |method| | 1277 value.methods.each do |method| |
1278 method.resolved_type = resolved_types[i] unless enable_64bit | |
1279 method.resolved_type64 = resolved_types[i] if enable_64bit | |
1280 i += 1 | |
1281 | |
1282 method.args.each do |arg| | |
1283 arg.resolved_type = resolved_types[i] unless enable_64bit | |
1284 arg.resolved_type64 = resolved_types[i] if enable_64bit | |
1285 i += 1 | |
1286 end | |
1287 end | |
1288 end | |
1289 | |
1290 i | |
1291 end | |
1292 | |
1293 # def resolve_informal_protocols_types (enable_64bit, resolved_types, x) | |
1294 # i = x | |
1295 # | |
1296 # @informal_protocols.each do |name, methods| | |
1297 # methods.each do |method| | |
1298 # method.resolved_type = resolved_types[i] unless enable_64bit | |
1299 # method.resolved_type64 = resolved_types[i] if enable_64bit | |
1300 # i += 1 | |
1301 # | |
1302 # method.args.each do |arg| | |
1303 # arg.resolved_type = resolved_types[i] unless enable_64bit | |
1304 # arg.resolved_type64 = resolved_types[i] if enable_64bit | |
1305 # i += 1 | |
1306 # end | |
1307 # end | |
1308 # end | |
1309 # | |
1310 # i | |
1311 # end | |
1312 | |
1313 def resolve_categories_types (enable_64bit, resolved_types, x) | |
1314 i = x | |
1315 | |
1316 @categories.each do |category, value| | |
1317 value.methods.each do |method| | |
1182 method.resolved_type = resolved_types[i] unless enable_64bit | 1318 method.resolved_type = resolved_types[i] unless enable_64bit |
1183 method.resolved_type64 = resolved_types[i] if enable_64bit | 1319 method.resolved_type64 = resolved_types[i] if enable_64bit |
1184 i += 1 | 1320 i += 1 |
1185 | 1321 |
1186 method.args.each do |arg| | 1322 method.args.each do |arg| |
1209 # end | 1345 # end |
1210 | 1346 |
1211 code << @import_directives | 1347 code << @import_directives |
1212 types = [] | 1348 types = [] |
1213 | 1349 |
1214 code << @code_to_inject + ";\n" unless @code_to_inject.nil? | 1350 code << @code_to_inject + "\n" unless @code_to_inject.nil? |
1215 | 1351 |
1216 @frameworks.each do |framework| | 1352 @frameworks.each do |framework| |
1217 framework.headers.each do |header| | 1353 framework.headers.each do |header| |
1218 | 1354 |
1219 header.imports do |import| | 1355 header.imports do |import| |
1227 @headers.each do |header| | 1363 @headers.each do |header| |
1228 types << collect_header_types(header, enable_64bit) | 1364 types << collect_header_types(header, enable_64bit) |
1229 end | 1365 end |
1230 | 1366 |
1231 types << collect_classes_types(enable_64bit) | 1367 types << collect_classes_types(enable_64bit) |
1232 types << collect_informal_protocols_types(enable_64bit) | 1368 types << collect_protocols_types(enable_64bit) |
1369 #types << collect_informal_protocols_types(enable_64bit) | |
1370 types << collect_categories_types(enable_64bit) | |
1233 | 1371 |
1234 code << "int main ()\n{\n" | 1372 code << "int main ()\n{\n" |
1235 types.flatten! | 1373 types.flatten! |
1236 | 1374 |
1237 types.each do |type| | 1375 types.each do |type| |
1255 end | 1393 end |
1256 | 1394 |
1257 @headers.each do |header| | 1395 @headers.each do |header| |
1258 i = resolve_header_types(header, enable_64bit, resolved_types, i) | 1396 i = resolve_header_types(header, enable_64bit, resolved_types, i) |
1259 end | 1397 end |
1260 | 1398 |
1261 i = resolve_methods_types(enable_64bit, resolved_types, i) | 1399 i = resolve_classes_types(enable_64bit, resolved_types, i) |
1262 i = resolve_informal_protocols_types(enable_64bit, resolved_types, i) | 1400 i = resolve_protocols_types(enable_64bit, resolved_types, i) |
1401 #i = resolve_informal_protocols_types(enable_64bit, resolved_types, i) | |
1402 i = resolve_categories_types(enable_64bit, resolved_types, i) | |
1263 end | 1403 end |
1264 | 1404 |
1265 def generate_header (xml, header) | 1405 def generate_header (xml, header) |
1266 xml.file :name => header.name do | 1406 xml.file :name => header.name do |
1267 header.imports.each do |import| | 1407 header.imports.each do |import| |
1312 end | 1452 end |
1313 end | 1453 end |
1314 | 1454 |
1315 def generate_classes (xml) | 1455 def generate_classes (xml) |
1316 @classes.each do |clazz, value| | 1456 @classes.each do |clazz, value| |
1317 xml.class :name => clazz, :parent => value.parent, :file => value.file do | 1457 xml.class :name => clazz, :parent => value.parent, :protocols => value.protocols, :file => value.file do |
1318 value.methods.each do |method| | 1458 value.methods.each do |method| |
1319 xml.method :selector => method.selector, :classMethod => method.class_method?, :variadic => method.variadic? do | 1459 xml.method :selector => method.selector, :classMethod => method.class_method?, :variadic => method.variadic? do |
1320 method.args.each do |arg| | 1460 method.args.each do |arg| |
1321 xml.arg :name => arg.name, :declaredType => arg.return_type, :type => arg.resolved_type, :type64 => arg.resolved_type64, :const => arg.const, :typeModifier => arg.type_modifier | 1461 xml.arg :name => arg.name, :declaredType => arg.return_type, :type => arg.resolved_type, :type64 => arg.resolved_type64, :const => arg.const, :typeModifier => arg.type_modifier |
1322 end | 1462 end |
1326 end | 1466 end |
1327 end | 1467 end |
1328 end | 1468 end |
1329 end | 1469 end |
1330 | 1470 |
1331 def generate_informal_protocols (xml) | 1471 def generate_protocols (xml) |
1332 @informal_protocols.each do |name, methods| | 1472 @protocols.each do |protocol, value| |
1333 xml.informalProtocol :name => name do | 1473 xml.protocol :name => protocol, :parent => value.parent, :protocols => value.protocols, :file => value.file do |
1334 methods.each do |method| | 1474 value.methods.each do |method| |
1475 xml.method :selector => method.selector, :classMethod => method.class_method?, :variadic => method.variadic? do | |
1476 method.args.each do |arg| | |
1477 xml.arg :name => arg.name, :declaredType => arg.return_type, :type => arg.resolved_type, :type64 => arg.resolved_type64, :const => arg.const, :typeModifier => arg.type_modifier | |
1478 end | |
1479 | |
1480 xml.returnValue :declaredType => method.return_type, :type => method.resolved_type, :type64 => method.resolved_type64, :const => method.const, :typeModifier => method.type_modifier | |
1481 end | |
1482 end | |
1483 end | |
1484 end | |
1485 end | |
1486 | |
1487 # def generate_informal_protocols (xml) | |
1488 # @informal_protocols.each do |name, methods| | |
1489 # xml.informalProtocol :name => name do | |
1490 # methods.each do |method| | |
1491 # xml.method :selector => method.selector, :classMethod => method.class_method?, :variadic => method.variadic? do | |
1492 # method.args.each do |arg| | |
1493 # xml.arg :name => arg.name, :declaredType => arg.return_type, :type => arg.resolved_type, :type64 => arg.resolved_type64, :const => arg.const, :typeModifier => arg.type_modifier | |
1494 # end | |
1495 # | |
1496 # xml.returnValue :declaredType => method.return_type, :type => method.resolved_type, :type64 => method.resolved_type64, :const => method.const, :typeModifier => method.type_modifier | |
1497 # end | |
1498 # end | |
1499 # end | |
1500 # end | |
1501 # end | |
1502 | |
1503 def generate_categories (xml) | |
1504 @categories.each do |category, value| | |
1505 xml.category :name => category.name, :class => category.class, :parent => value.parent, :protocols => value.protocols, :file => value.file do | |
1506 value.methods.each do |method| | |
1335 xml.method :selector => method.selector, :classMethod => method.class_method?, :variadic => method.variadic? do | 1507 xml.method :selector => method.selector, :classMethod => method.class_method?, :variadic => method.variadic? do |
1336 method.args.each do |arg| | 1508 method.args.each do |arg| |
1337 xml.arg :name => arg.name, :declaredType => arg.return_type, :type => arg.resolved_type, :type64 => arg.resolved_type64, :const => arg.const, :typeModifier => arg.type_modifier | 1509 xml.arg :name => arg.name, :declaredType => arg.return_type, :type => arg.resolved_type, :type64 => arg.resolved_type64, :const => arg.const, :typeModifier => arg.type_modifier |
1338 end | 1510 end |
1339 | 1511 |
1366 @headers.each do |header| | 1538 @headers.each do |header| |
1367 generate_header(xml, header) | 1539 generate_header(xml, header) |
1368 end | 1540 end |
1369 | 1541 |
1370 generate_classes(xml) | 1542 generate_classes(xml) |
1371 generate_informal_protocols(xml) | 1543 generate_protocols(xml) |
1544 #generate_informal_protocols(xml) | |
1545 generate_categories(xml) | |
1372 end | 1546 end |
1373 | 1547 |
1374 file.close unless file == STDOUT | 1548 file.close unless file == STDOUT |
1549 end | |
1550 | |
1551 def write_dependencies | |
1552 file = STDOUT if @out_file == nil | |
1553 file = File.open @out_file, "w" unless @out_file == nil | |
1554 | |
1555 @dependencies.each do |dep| | |
1556 file << dep + "\n" | |
1557 end | |
1558 | |
1559 file.close unless file == STDOUT | |
1560 | |
1561 exit 0 | |
1375 end | 1562 end |
1376 end | 1563 end |
1377 | 1564 |
1378 def die (*msg) | 1565 def die (*msg) |
1379 $stderr.puts msg | 1566 $stderr.puts msg |
1408 # opts.on("-d", "--output-dir PATH", "Write ouptut to the given paht, use this with the --framework option") do |opt| | 1595 # opts.on("-d", "--output-dir PATH", "Write ouptut to the given paht, use this with the --framework option") do |opt| |
1409 # die "Output directory can't be specified more than once" if dstep_gen.out_dir | 1596 # die "Output directory can't be specified more than once" if dstep_gen.out_dir |
1410 # dstep_gen.out_dir = opt | 1597 # dstep_gen.out_dir = opt |
1411 # end | 1598 # end |
1412 | 1599 |
1413 opts.on("-C", "--code CODE", "Add code") do |opt| | 1600 opts.on("-c", "--code CODE", "Add code") do |opt| |
1414 dstep_gen.code_to_inject = opt | 1601 dstep_gen.code_to_inject = opt |
1602 end | |
1603 | |
1604 opts.on("-d", "--dependencies", "Write framework dependencies and exit") do |opt| | |
1605 dstep_gen.dependencies_switch = true | |
1415 end | 1606 end |
1416 | 1607 |
1417 help_msg = "Use the `-h' flag or for help." | 1608 help_msg = "Use the `-h' flag or for help." |
1418 | 1609 |
1419 opts.on("-h", "--help", "Show this message.") do | 1610 opts.on("-h", "--help", "Show this message.") do |
1431 if ARGV.empty? | 1622 if ARGV.empty? |
1432 die opts.banner | 1623 die opts.banner |
1433 else | 1624 else |
1434 #begin | 1625 #begin |
1435 opts.parse!(ARGV) | 1626 opts.parse!(ARGV) |
1627 | |
1628 dstep_gen.write_dependencies if dstep_gen.dependencies_switch | |
1436 | 1629 |
1437 ARGV.each do |header| | 1630 ARGV.each do |header| |
1438 dstep_gen.add_header(header) | 1631 dstep_gen.add_header(header) |
1439 end | 1632 end |
1440 | 1633 |