Mercurial > projects > dstep
comparison scripts/dstepgen.rb @ 7:9e67a1122e85
Fixed a bug that caused some types to be empty
author | Jacob Carlborg <doob@me.com> |
---|---|
date | Thu, 09 Jul 2009 21:17:39 +0200 |
parents | c0cfd40362ee |
children | 07194b026fa4 |
comparison
equal
deleted
inserted
replaced
6:c0cfd40362ee | 7:9e67a1122e85 |
---|---|
317 # def informal_protocols (header) | 317 # def informal_protocols (header) |
318 # methods(header, /^@(interface)\s+(\w+)\s*:?\s*(\w*)\s*(\([^)]+\))?/, @protocols, false) | 318 # methods(header, /^@(interface)\s+(\w+)\s*:?\s*(\w*)\s*(\([^)]+\))?/, @protocols, false) |
319 # end | 319 # end |
320 | 320 |
321 def classes (header) | 321 def classes (header) |
322 methods(header, /^@(interface)\s+(\w+)\s*:?\s*(\w*)\s*(\<([\w,\s]+)>)?$/, @classes, false) | 322 methods(header, /^@(interface)\s+(\w+)\s*:?\s*(\w*)\s*(\<([\w,\s]+)>)?(\s*\{|$)/, @classes, false) |
323 end | 323 end |
324 | 324 |
325 def protocols (header) | 325 def protocols (header) |
326 methods(header, /^@(protocol)\s+(\w+)\s*:?\s*(\w*)\s*(\<([\w,\s]+)>)?(\([^)]+\))?/, @protocols, true) | 326 methods(header, /^@(protocol)\s+(\w+)\s*:?\s*(\w*)\s*(\<([\w,\s]+)>)?(\([^)]+\))?/, @protocols, true) |
327 end | 327 end |
339 prop_re = /^@property\s*(\([^)]+\))?\s*([^;]+);$/ | 339 prop_re = /^@property\s*(\([^)]+\))?\s*([^;]+);$/ |
340 current_interface = current_category = nil | 340 current_interface = current_category = nil |
341 i = 0 | 341 i = 0 |
342 parent = nil | 342 parent = nil |
343 protocols = nil | 343 protocols = nil |
344 cat = nil | 344 cat = nil |
345 | 345 |
346 @cpp_result.each_line do |line| | 346 @cpp_result.each_line do |line| |
347 size = line.size | 347 size = line.size |
348 line.strip! | 348 line.strip! |
349 | 349 |
486 i += size | 486 i += size |
487 end | 487 end |
488 end | 488 end |
489 | 489 |
490 def structs (header) | 490 def structs (header) |
491 re = /typedef\s+struct\s*\w*\s*((\w+)|\{([^{}]*(\{[^}]+\})?)*\}\s*([^\s]+))\s*(__attribute__\(.+\))?\s*,?(.+)?;/ | 491 re = /typedef\s+struct\s*\w*\s*((\w+)|\{([^{}]*(\{[^}]+\})?)*\}\s*([^\s]+))\s*(__attribute__\(.+\))?\s*(;|,(.+)?;)/ |
492 i = 0 | 492 i = 0 |
493 body = nil | 493 body = nil |
494 | 494 |
495 @cpp_result.scan(re).each do |m| | 495 @cpp_result.scan(re).each do |m| |
496 struct = { :name => m[4], :members => [] } | 496 struct = { :name => m[4], :members => [] } |
1173 handle_framework(framework, sub_framework, parent_framework) | 1173 handle_framework(framework, sub_framework, parent_framework) |
1174 #@import_directives << "#import <#{framework.name}/#{framework.name}.h>\n" | 1174 #@import_directives << "#import <#{framework.name}/#{framework.name}.h>\n" |
1175 @frameworks << framework | 1175 @frameworks << framework |
1176 end | 1176 end |
1177 | 1177 |
1178 def collect_header_types (header, enable_64bit) | 1178 def collect_cftypes (header, enable_64bit) |
1179 types = [] | 1179 types = [] |
1180 | 1180 |
1181 header.cftypes.each do |cftype| | 1181 header.cftypes.each do |cftype| |
1182 types << cftype[:type] | 1182 types << cftype[:type] |
1183 end | 1183 end |
1184 | |
1185 resolved_types = resolve_types_helper(types, enable_64bit) if types.length > 0 | |
1186 | |
1187 header.cftypes.each_with_index do |cftype, i| | |
1188 cftype[enable_64bit ? :type64 : :type] = resolved_types[i] | |
1189 end | |
1190 end | |
1191 | |
1192 def collect_constants (header, enable_64bit) | |
1193 types = [] | |
1184 | 1194 |
1185 header.constants.each do |constant| | 1195 header.constants.each do |constant| |
1186 types << constant.stripped_return_type | 1196 types << constant.stripped_return_type |
1187 end | 1197 end |
1188 | 1198 |
1199 resolved_types = resolve_types_helper(types, enable_64bit) if types.length > 0 | |
1200 | |
1201 header.constants.each_with_index do |constant, i| | |
1202 constant.resolved_type = resolved_types[i] unless enable_64bit | |
1203 constant.resolved_type64 = resolved_types[i] if enable_64bit | |
1204 end | |
1205 end | |
1206 | |
1207 def collect_structs (header, enable_64bit) | |
1208 types = [] | |
1209 | |
1189 header.structs.each do |struct| | 1210 header.structs.each do |struct| |
1190 types << struct[:name] | 1211 types << struct[:name] |
1191 | 1212 |
1192 struct[:members].each do |member| | 1213 struct[:members].each do |member| |
1193 types << member[:declaredType] | 1214 types << member[:declaredType] |
1194 end | 1215 end |
1195 end | 1216 end |
1196 | 1217 |
1197 header.typedefs.each do |typedef| | 1218 resolved_types = resolve_types_helper(types, enable_64bit) if types.length > 0 |
1198 types << typedef.stripped_return_type | 1219 |
1199 end | 1220 i = 0 |
1200 | |
1201 header.functions.each do |function| | |
1202 types << function.stripped_return_type | |
1203 | |
1204 function.args.each do |arg| | |
1205 types << arg.stripped_return_type | |
1206 end | |
1207 end | |
1208 | |
1209 header.function_pointers.each do |fp, value| | |
1210 types << value.return_type | |
1211 | |
1212 value.args.each do |arg| | |
1213 types << arg.type | |
1214 end unless value.args.nil? | |
1215 end | |
1216 | |
1217 types | |
1218 end | |
1219 | |
1220 def collect_classes_types (enable_64bit) | |
1221 types = [] | |
1222 | |
1223 @classes.each do |clazz, value| | |
1224 value.methods.each do |method| | |
1225 types << method.stripped_return_type | |
1226 | |
1227 method.args.each do |arg| | |
1228 types << arg.stripped_return_type | |
1229 end | |
1230 end | |
1231 end | |
1232 | |
1233 types | |
1234 end | |
1235 | |
1236 def collect_protocols_types (enable_64bit) | |
1237 types = [] | |
1238 | |
1239 @protocols.each do |protocol, value| | |
1240 value.methods.each do |method| | |
1241 types << method.stripped_return_type | |
1242 | |
1243 method.args.each do |arg| | |
1244 types << arg.stripped_return_type | |
1245 end | |
1246 end | |
1247 end | |
1248 | |
1249 types | |
1250 end | |
1251 | |
1252 # def collect_informal_protocols_types (enable_64bit) | |
1253 # types = [] | |
1254 # | |
1255 # @informal_protocols.each do |name, methods| | |
1256 # methods.each do |method| | |
1257 # types << method.stripped_return_type | |
1258 # | |
1259 # method.args.each do |arg| | |
1260 # types << arg.stripped_return_type | |
1261 # end | |
1262 # end | |
1263 # end | |
1264 # | |
1265 # types | |
1266 # end | |
1267 | |
1268 def collect_categories_types (enable_64bit) | |
1269 types = [] | |
1270 | |
1271 @categories.each do |category, value| | |
1272 value.methods.each do |method| | |
1273 types << method.stripped_return_type | |
1274 | |
1275 method.args.each do |arg| | |
1276 types << arg.stripped_return_type | |
1277 end | |
1278 end | |
1279 end | |
1280 | |
1281 types | |
1282 end | |
1283 | |
1284 def resolve_header_types (header, enable_64bit, resolved_types, x) | |
1285 i = x | |
1286 | |
1287 header.cftypes.each do |cftype| | |
1288 cftype[enable_64bit ? :type64 : :type] = resolved_types[i] | |
1289 i += 1 | |
1290 end | |
1291 | |
1292 header.constants.each do |constant| | |
1293 constant.resolved_type = resolved_types[i] unless enable_64bit | |
1294 constant.resolved_type64 = resolved_types[i] if enable_64bit | |
1295 i += 1 | |
1296 end | |
1297 | 1221 |
1298 header.structs.each do |struct| | 1222 header.structs.each do |struct| |
1299 struct[enable_64bit ? :type64 : :type] = resolved_types[i] | 1223 struct[enable_64bit ? :type64 : :type] = resolved_types[i] |
1300 i += 1 | 1224 i += 1 |
1301 | 1225 |
1302 struct[:members].each do |member| | 1226 struct[:members].each do |member| |
1303 member[enable_64bit ? :type64 : :type] = resolved_types[i] | 1227 member[enable_64bit ? :type64 : :type] = resolved_types[i] |
1304 i += 1 | 1228 i += 1 |
1305 end | 1229 end |
1306 end | 1230 end |
1307 | 1231 end |
1232 | |
1233 def collect_typedefs (header, enable_64bit) | |
1234 types = [] | |
1235 | |
1308 header.typedefs.each do |typedef| | 1236 header.typedefs.each do |typedef| |
1237 types << typedef.stripped_return_type | |
1238 end | |
1239 | |
1240 resolved_types = resolve_types_helper(types, enable_64bit) if types.length > 0 | |
1241 | |
1242 header.typedefs.each_with_index do |typedef, i| | |
1309 typedef.resolved_type = resolved_types[i] unless enable_64bit | 1243 typedef.resolved_type = resolved_types[i] unless enable_64bit |
1310 typedef.resolved_type64 = resolved_types[i] if enable_64bit | 1244 typedef.resolved_type64 = resolved_types[i] if enable_64bit |
1311 i += 1 | 1245 end |
1312 end | 1246 end |
1247 | |
1248 def collect_functions (header, enable_64bit) | |
1249 types = [] | |
1250 | |
1251 header.functions.each do |function| | |
1252 types << function.stripped_return_type | |
1253 | |
1254 function.args.each do |arg| | |
1255 types << arg.stripped_return_type | |
1256 end | |
1257 end | |
1258 | |
1259 resolved_types = resolve_types_helper(types, enable_64bit) if types.length > 0 | |
1260 i = 0 | |
1313 | 1261 |
1314 header.functions.each do |function| | 1262 header.functions.each do |function| |
1315 function.resolved_type = resolved_types[i] unless enable_64bit | 1263 function.resolved_type = resolved_types[i] unless enable_64bit |
1316 function.resolved_type64 = resolved_types[i] if enable_64bit | 1264 function.resolved_type64 = resolved_types[i] if enable_64bit |
1317 i += 1 | 1265 i += 1 |
1320 arg.resolved_type = resolved_types[i] unless enable_64bit | 1268 arg.resolved_type = resolved_types[i] unless enable_64bit |
1321 arg.resolved_type64 = resolved_types[i] if enable_64bit | 1269 arg.resolved_type64 = resolved_types[i] if enable_64bit |
1322 i += 1 | 1270 i += 1 |
1323 end | 1271 end |
1324 end | 1272 end |
1273 end | |
1274 | |
1275 def collect_functions_pointers (header, enable_64bit) | |
1276 types = [] | |
1277 | |
1278 header.function_pointers.each do |fp, value| | |
1279 types << value.return_type | |
1280 | |
1281 value.args.each do |arg| | |
1282 types << arg.type | |
1283 end unless value.args.nil? | |
1284 end | |
1285 | |
1286 resolved_types = resolve_types_helper(types, enable_64bit) if types.length > 0 | |
1287 i = 0 | |
1325 | 1288 |
1326 header.function_pointers.each do |fp, value| | 1289 header.function_pointers.each do |fp, value| |
1327 value.resolved_type = resolved_types[i] unless enable_64bit | 1290 value.resolved_type = resolved_types[i] unless enable_64bit |
1328 value.resolved_type64 = resolved_types[i] if enable_64bit | 1291 value.resolved_type64 = resolved_types[i] if enable_64bit |
1329 i += 1 | 1292 i += 1 |
1332 arg.resolved_type = resolved_types[i] unless enable_64bit | 1295 arg.resolved_type = resolved_types[i] unless enable_64bit |
1333 arg.resolved_type64 = resolved_types[i] if enable_64bit | 1296 arg.resolved_type64 = resolved_types[i] if enable_64bit |
1334 i += 1 | 1297 i += 1 |
1335 end unless value.args.nil? | 1298 end unless value.args.nil? |
1336 end | 1299 end |
1337 | 1300 end |
1338 i | 1301 |
1339 end | 1302 def collect_header_types (header, enable_64bit) |
1340 | 1303 collect_cftypes(header, enable_64bit) |
1341 def resolve_classes_types (enable_64bit, resolved_types, x) | 1304 collect_constants(header, enable_64bit) |
1342 i = x | 1305 collect_structs(header, enable_64bit) |
1306 collect_typedefs(header, enable_64bit) | |
1307 collect_functions(header, enable_64bit) | |
1308 collect_functions_pointers(header, enable_64bit) | |
1309 end | |
1310 | |
1311 def collect_classes_types (enable_64bit) | |
1312 types = [] | |
1343 | 1313 |
1344 @classes.each do |clazz, value| | 1314 @classes.each do |clazz, value| |
1345 value.methods.each do |method| | 1315 value.methods.each do |method| |
1316 types << method.stripped_return_type | |
1317 | |
1318 method.args.each do |arg| | |
1319 types << arg.stripped_return_type | |
1320 end | |
1321 end | |
1322 end | |
1323 | |
1324 resolved_types = resolve_types_helper(types, enable_64bit) if types.length > 0 | |
1325 i = 0 | |
1326 | |
1327 @classes.each do |clazz, value| | |
1328 value.methods.each do |method| | |
1346 method.resolved_type = resolved_types[i] unless enable_64bit | 1329 method.resolved_type = resolved_types[i] unless enable_64bit |
1347 method.resolved_type64 = resolved_types[i] if enable_64bit | 1330 method.resolved_type64 = resolved_types[i] if enable_64bit |
1348 i += 1 | 1331 i += 1 |
1349 | 1332 |
1350 method.args.each do |arg| | 1333 method.args.each do |arg| |
1352 arg.resolved_type64 = resolved_types[i] if enable_64bit | 1335 arg.resolved_type64 = resolved_types[i] if enable_64bit |
1353 i += 1 | 1336 i += 1 |
1354 end | 1337 end |
1355 end | 1338 end |
1356 end | 1339 end |
1357 | 1340 end |
1358 i | 1341 |
1359 end | 1342 def collect_protocols_types (enable_64bit) |
1360 | 1343 types = [] |
1361 def resolve_protocols_types (enable_64bit, resolved_types, x) | 1344 |
1362 i = x | 1345 @protocols.each do |protocol, value| |
1346 value.methods.each do |method| | |
1347 types << method.stripped_return_type | |
1348 | |
1349 method.args.each do |arg| | |
1350 types << arg.stripped_return_type | |
1351 end | |
1352 end | |
1353 end | |
1354 | |
1355 resolved_types = resolve_types_helper(types, enable_64bit) if types.length > 0 | |
1356 i = 0 | |
1363 | 1357 |
1364 @protocols.each do |protocol, value| | 1358 @protocols.each do |protocol, value| |
1365 value.methods.each do |method| | 1359 value.methods.each do |method| |
1366 method.resolved_type = resolved_types[i] unless enable_64bit | 1360 method.resolved_type = resolved_types[i] unless enable_64bit |
1367 method.resolved_type64 = resolved_types[i] if enable_64bit | 1361 method.resolved_type64 = resolved_types[i] if enable_64bit |
1372 arg.resolved_type64 = resolved_types[i] if enable_64bit | 1366 arg.resolved_type64 = resolved_types[i] if enable_64bit |
1373 i += 1 | 1367 i += 1 |
1374 end | 1368 end |
1375 end | 1369 end |
1376 end | 1370 end |
1377 | 1371 end |
1378 i | 1372 |
1379 end | 1373 def collect_categories_types (enable_64bit) |
1380 | 1374 types = [] |
1381 # def resolve_informal_protocols_types (enable_64bit, resolved_types, x) | 1375 |
1382 # i = x | 1376 @categories.each do |category, value| |
1383 # | 1377 value.methods.each do |method| |
1384 # @informal_protocols.each do |name, methods| | 1378 types << method.stripped_return_type |
1385 # methods.each do |method| | 1379 |
1386 # method.resolved_type = resolved_types[i] unless enable_64bit | 1380 method.args.each do |arg| |
1387 # method.resolved_type64 = resolved_types[i] if enable_64bit | 1381 types << arg.stripped_return_type |
1388 # i += 1 | 1382 end |
1389 # | 1383 end |
1390 # method.args.each do |arg| | 1384 end |
1391 # arg.resolved_type = resolved_types[i] unless enable_64bit | 1385 |
1392 # arg.resolved_type64 = resolved_types[i] if enable_64bit | 1386 resolved_types = resolve_types_helper(types, enable_64bit) if types.length > 0 |
1393 # i += 1 | 1387 i = 0 |
1394 # end | |
1395 # end | |
1396 # end | |
1397 # | |
1398 # i | |
1399 # end | |
1400 | |
1401 def resolve_categories_types (enable_64bit, resolved_types, x) | |
1402 i = x | |
1403 | 1388 |
1404 @categories.each do |category, value| | 1389 @categories.each do |category, value| |
1405 value.methods.each do |method| | 1390 value.methods.each do |method| |
1406 method.resolved_type = resolved_types[i] unless enable_64bit | 1391 method.resolved_type = resolved_types[i] unless enable_64bit |
1407 method.resolved_type64 = resolved_types[i] if enable_64bit | 1392 method.resolved_type64 = resolved_types[i] if enable_64bit |
1412 arg.resolved_type64 = resolved_types[i] if enable_64bit | 1397 arg.resolved_type64 = resolved_types[i] if enable_64bit |
1413 i += 1 | 1398 i += 1 |
1414 end | 1399 end |
1415 end | 1400 end |
1416 end | 1401 end |
1417 | |
1418 i | |
1419 end | 1402 end |
1420 | 1403 |
1421 def get_framework_name (framework) | 1404 def get_framework_name (framework) |
1422 i = framework.rindex(".framework") | 1405 i = framework.rindex(".framework") |
1423 return framework if i.nil? | 1406 return framework if i.nil? |
1424 x = framework.rindex("/", i) | 1407 x = framework.rindex("/", i) |
1425 framework[x + 1 ... i] | 1408 framework[x + 1 ... i] |
1426 end | 1409 end |
1427 | 1410 |
1428 def resolve_types (enable_64bit = false) | 1411 def resolve_types (enable_64bit = false) |
1412 | |
1413 @frameworks.each do |framework| | |
1414 framework.headers.each do |header| | |
1415 collect_header_types(header, enable_64bit) | |
1416 end | |
1417 end | |
1418 | |
1419 @headers.each do |header| | |
1420 collect_header_types(header, enable_64bit) | |
1421 end | |
1422 | |
1423 collect_classes_types(enable_64bit) | |
1424 collect_protocols_types(enable_64bit) | |
1425 collect_categories_types(enable_64bit) | |
1426 end | |
1427 | |
1428 def resolve_types_helper (types, enable_64bit) | |
1429 code = "#include <stdio.h>\n" | 1429 code = "#include <stdio.h>\n" |
1430 code << @import_directives | 1430 code << @import_directives |
1431 types = [] | |
1432 | 1431 |
1433 @frameworks.each do |framework| | 1432 @frameworks.each do |framework| |
1434 framework.headers.each do |header| | 1433 framework.headers.each do |header| |
1435 exclude = false | 1434 exclude = false |
1436 | 1435 |
1464 | 1463 |
1465 File.foreach(@inject_path) do |line| | 1464 File.foreach(@inject_path) do |line| |
1466 code << line | 1465 code << line |
1467 end if !@inject_path.nil? && File.exist?(@inject_path) | 1466 end if !@inject_path.nil? && File.exist?(@inject_path) |
1468 | 1467 |
1469 code << "\n\n" | 1468 code << "\n\n" |
1470 | |
1471 @headers.each do |header| | |
1472 types << collect_header_types(header, enable_64bit) | |
1473 end | |
1474 | |
1475 types << collect_classes_types(enable_64bit) | |
1476 types << collect_protocols_types(enable_64bit) | |
1477 #types << collect_informal_protocols_types(enable_64bit) | |
1478 types << collect_categories_types(enable_64bit) | |
1479 | |
1480 code << "int main ()\n{\n" | 1469 code << "int main ()\n{\n" |
1481 types.flatten! | 1470 types.flatten! |
1482 | 1471 |
1483 types.each do |type| | 1472 types.each do |type| |
1484 code << ' printf("%s\n", ' + "@encode(__typeof__(#{type})));\n" unless type.nil? || type.length == 0 | 1473 code << ' printf("%s\n", ' + "@encode(__typeof__(#{type})));\n" unless type.nil? || type.length == 0 |
1490 | 1479 |
1491 compile_and_execute(code, enable_64bit).split("\n").each do |line| | 1480 compile_and_execute(code, enable_64bit).split("\n").each do |line| |
1492 resolved_types << line | 1481 resolved_types << line |
1493 end | 1482 end |
1494 | 1483 |
1495 i = 0 | 1484 resolved_types |
1496 | 1485 |
1497 @frameworks.each do |framework| | 1486 # i = 0 |
1498 framework.headers.each do |header| | 1487 # |
1499 i = resolve_header_types(header, enable_64bit, resolved_types, i) | 1488 # @frameworks.each do |framework| |
1500 end | 1489 # framework.headers.each do |header| |
1501 end | 1490 # i = resolve_header_types(header, enable_64bit, resolved_types, i) |
1502 | 1491 # end |
1503 @headers.each do |header| | 1492 # end |
1504 i = resolve_header_types(header, enable_64bit, resolved_types, i) | 1493 # |
1505 end | 1494 # @headers.each do |header| |
1506 | 1495 # i = resolve_header_types(header, enable_64bit, resolved_types, i) |
1507 i = resolve_classes_types(enable_64bit, resolved_types, i) | 1496 # end |
1508 i = resolve_protocols_types(enable_64bit, resolved_types, i) | 1497 # |
1509 #i = resolve_informal_protocols_types(enable_64bit, resolved_types, i) | 1498 # i = resolve_classes_types(enable_64bit, resolved_types, i) |
1510 i = resolve_categories_types(enable_64bit, resolved_types, i) | 1499 # i = resolve_protocols_types(enable_64bit, resolved_types, i) |
1500 # #i = resolve_informal_protocols_types(enable_64bit, resolved_types, i) | |
1501 # i = resolve_categories_types(enable_64bit, resolved_types, i) | |
1511 end | 1502 end |
1512 | 1503 |
1513 def generate_header (xml, header) | 1504 def generate_header (xml, header) |
1514 xml.file :name => header.name do | 1505 xml.file :name => header.name do |
1515 header.imports.each do |import| | 1506 header.imports.each do |import| |