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