@@ -1358,6 +1358,45 @@ static void VisitNodeFunction(
1358
1358
}
1359
1359
}
1360
1360
1361
+ static void CreateFunctionType (ASTContext *ast,
1362
+ const VisitNodeResult &arg_type_result,
1363
+ const VisitNodeResult &return_type_result,
1364
+ bool throws,
1365
+ VisitNodeResult &result) {
1366
+ Type arg_clang_type;
1367
+ Type return_clang_type;
1368
+
1369
+ switch (arg_type_result._types .size ()) {
1370
+ case 0 :
1371
+ arg_clang_type = TupleType::getEmpty (*ast);
1372
+ break ;
1373
+ case 1 :
1374
+ arg_clang_type = arg_type_result._types .front ().getPointer ();
1375
+ break ;
1376
+ default :
1377
+ result._error = " too many argument types for a function type" ;
1378
+ break ;
1379
+ }
1380
+
1381
+ switch (return_type_result._types .size ()) {
1382
+ case 0 :
1383
+ return_clang_type = TupleType::getEmpty (*ast);
1384
+ break ;
1385
+ case 1 :
1386
+ return_clang_type = return_type_result._types .front ().getPointer ();
1387
+ break ;
1388
+ default :
1389
+ result._error = " too many return types for a function type" ;
1390
+ break ;
1391
+ }
1392
+
1393
+ if (arg_clang_type && return_clang_type) {
1394
+ result._types .push_back (
1395
+ FunctionType::get (arg_clang_type, return_clang_type,
1396
+ FunctionType::ExtInfo ().withThrows (throws)));
1397
+ }
1398
+ }
1399
+
1361
1400
static void VisitNodeFunctionType (
1362
1401
ASTContext *ast, std::vector<Demangle::NodePointer> &nodes,
1363
1402
Demangle::NodePointer &cur_node, VisitNodeResult &result,
@@ -1395,40 +1434,52 @@ static void VisitNodeFunctionType(
1395
1434
break ;
1396
1435
}
1397
1436
}
1398
- Type arg_clang_type;
1399
- Type return_clang_type;
1400
-
1401
- switch (arg_type_result._types .size ()) {
1402
- case 0 :
1403
- arg_clang_type = TupleType::getEmpty (*ast);
1404
- break ;
1405
- case 1 :
1406
- arg_clang_type = arg_type_result._types .front ().getPointer ();
1407
- break ;
1408
- default :
1409
- result._error = " too many argument types for a function type" ;
1410
- break ;
1411
- }
1412
-
1413
- switch (return_type_result._types .size ()) {
1414
- case 0 :
1415
- return_clang_type = TupleType::getEmpty (*ast);
1416
- break ;
1417
- case 1 :
1418
- return_clang_type = return_type_result._types .front ().getPointer ();
1419
- break ;
1420
- default :
1421
- result._error = " too many return types for a function type" ;
1422
- break ;
1423
- }
1437
+ CreateFunctionType (ast, arg_type_result, return_type_result, throws, result);
1438
+ }
1424
1439
1425
- if (arg_clang_type && return_clang_type) {
1426
- result._types .push_back (
1427
- FunctionType::get (arg_clang_type, return_clang_type,
1428
- FunctionType::ExtInfo ().withThrows (throws)));
1440
+ static void VisitNodeImplFunctionType (
1441
+ ASTContext *ast, std::vector<Demangle::NodePointer> &nodes,
1442
+ Demangle::NodePointer &cur_node, VisitNodeResult &result,
1443
+ const VisitNodeResult &generic_context) { // set by GenericType case
1444
+ VisitNodeResult arg_type_result;
1445
+ VisitNodeResult return_type_result;
1446
+ Demangle::Node::iterator end = cur_node->end ();
1447
+ bool throws = false ;
1448
+ for (Demangle::Node::iterator pos = cur_node->begin (); pos != end; ++pos) {
1449
+ const Demangle::Node::Kind child_node_kind = (*pos)->getKind ();
1450
+ switch (child_node_kind) {
1451
+ case Demangle::Node::Kind::Class: {
1452
+ VisitNodeResult class_type_result;
1453
+ nodes.push_back (*pos);
1454
+ VisitNode (ast, nodes, class_type_result, generic_context);
1455
+ } break ;
1456
+ case Demangle::Node::Kind::Structure: {
1457
+ VisitNodeResult class_type_result;
1458
+ nodes.push_back (*pos);
1459
+ VisitNode (ast, nodes, class_type_result, generic_context);
1460
+ } break ;
1461
+ case Demangle::Node::Kind::ImplConvention:
1462
+ // Ignore the ImplConvention it is only a hint for the SIL ARC optimizer.
1463
+ break ;
1464
+ case Demangle::Node::Kind::ImplParameter:
1465
+ nodes.push_back (*pos);
1466
+ VisitNode (ast, nodes, arg_type_result, generic_context);
1467
+ break ;
1468
+ case Demangle::Node::Kind::ThrowsAnnotation:
1469
+ throws = true ;
1470
+ break ;
1471
+ case Demangle::Node::Kind::ImplResult:
1472
+ nodes.push_back (*pos);
1473
+ VisitNode (ast, nodes, return_type_result, generic_context);
1474
+ break ;
1475
+ default :
1476
+ break ;
1477
+ }
1429
1478
}
1479
+ CreateFunctionType (ast, arg_type_result, return_type_result, throws, result);
1430
1480
}
1431
1481
1482
+
1432
1483
static void VisitNodeSetterGetter (
1433
1484
ASTContext *ast, std::vector<Demangle::NodePointer> &nodes,
1434
1485
Demangle::NodePointer &cur_node, VisitNodeResult &result,
@@ -2072,6 +2123,10 @@ static void visitNodeImpl(
2072
2123
VisitNodeFunctionType (ast, nodes, node, result, genericContext);
2073
2124
break ;
2074
2125
2126
+ case Demangle::Node::Kind::ImplFunctionType:
2127
+ VisitNodeImplFunctionType (ast, nodes, node, result, genericContext);
2128
+ break ;
2129
+
2075
2130
case Demangle::Node::Kind::DidSet:
2076
2131
case Demangle::Node::Kind::Getter:
2077
2132
case Demangle::Node::Kind::Setter:
0 commit comments