@@ -166,7 +166,7 @@ extension ASTGenVisitor {
166
166
case . projectedValueProperty:
167
167
return handle ( self . generateProjectedValuePropertyAttr ( attribute: node) ? . asDeclAttribute)
168
168
case . rawLayout:
169
- fatalError ( " unimplemented " )
169
+ return handle ( self . generateRawLayoutAttr ( attribute : node ) ? . asDeclAttribute )
170
170
case . section:
171
171
return handle ( self . generateSectionAttr ( attribute: node) ? . asDeclAttribute)
172
172
case . semantics:
@@ -1445,6 +1445,142 @@ extension ASTGenVisitor {
1445
1445
)
1446
1446
}
1447
1447
1448
+ func generateValueOrType( expr node: ExprSyntax ) -> BridgedTypeRepr ? {
1449
+ var node = node
1450
+
1451
+ // Try value first.
1452
+ let minusLoc : BridgedSourceLoc
1453
+ if let prefixExpr = node. as ( PrefixOperatorExprSyntax . self) ,
1454
+ prefixExpr. operator. rawText == " - " ,
1455
+ prefixExpr. expression. is ( IntegerLiteralExprSyntax . self) {
1456
+ minusLoc = self . generateSourceLoc ( prefixExpr. operator)
1457
+ node = prefixExpr. expression
1458
+ } else {
1459
+ minusLoc = nil
1460
+ }
1461
+ if let integerExpr = node. as ( IntegerLiteralExprSyntax . self) {
1462
+ let value = self . copyAndStripUnderscores ( text: integerExpr. literal. rawText)
1463
+ return BridgedIntegerTypeRepr . createParsed (
1464
+ self . ctx,
1465
+ string: value,
1466
+ loc: self . generateSourceLoc ( node) , minusLoc: minusLoc
1467
+ ) . asTypeRepr
1468
+ }
1469
+
1470
+ assert ( !minusLoc. isValid)
1471
+ return self . generateTypeRepr ( expr: node)
1472
+ }
1473
+
1474
+ func generateRawLayoutAttr( attribute node: AttributeSyntax ) -> BridgedRawLayoutAttr ? {
1475
+ self . generateWithLabeledExprListArguments ( attribute: node) { args in
1476
+ switch args. first? . label? . rawText {
1477
+ case " size " :
1478
+ return generateSizeAlignment ( )
1479
+ case " like " :
1480
+ return generateScalarLike ( )
1481
+ case " likeArrayOf " :
1482
+ return generateArrayLike ( )
1483
+ default :
1484
+ // TODO: Diagnose.
1485
+ fatalError ( " invalid argument for @rawLayout attribute " )
1486
+ }
1487
+
1488
+ func generateSizeAlignment( ) -> BridgedRawLayoutAttr ? {
1489
+ guard let size = generateConsumingIntegerLiteralOption ( label: " size " ) else {
1490
+ // Should already be diagnosed.
1491
+ return nil
1492
+ }
1493
+ guard let alignment = generateConsumingIntegerLiteralOption ( label: " alignment " ) else {
1494
+ // Should already be diagnosed.
1495
+ return nil
1496
+ }
1497
+ return . createParsed(
1498
+ self . ctx,
1499
+ atLoc: self . generateSourceLoc ( node. atSign) ,
1500
+ range: self . generateAttrSourceRange ( node) ,
1501
+ size: size,
1502
+ alignment: alignment
1503
+ )
1504
+ }
1505
+
1506
+ func generateScalarLike( ) -> BridgedRawLayoutAttr ? {
1507
+ let tyR = self . generateConsumingAttrOption ( args: & args, label: " like " ) {
1508
+ self . generateTypeRepr ( expr: $0)
1509
+ }
1510
+ guard let tyR else {
1511
+ return nil
1512
+ }
1513
+
1514
+ guard let moveAsLike = args. isEmpty ? false : generateConsumingMoveAsLike ( ) else {
1515
+ return nil
1516
+ }
1517
+
1518
+ return . createParsed(
1519
+ self . ctx,
1520
+ atLoc: self . generateSourceLoc ( node. atSign) ,
1521
+ range: self . generateAttrSourceRange ( node) ,
1522
+ like: tyR,
1523
+ moveAsLike: moveAsLike
1524
+ )
1525
+ }
1526
+
1527
+ func generateArrayLike( ) -> BridgedRawLayoutAttr ? {
1528
+ let tyR = self . generateConsumingAttrOption ( args: & args, label: " likeArrayOf " ) {
1529
+ self . generateTypeRepr ( expr: $0)
1530
+ }
1531
+ guard let tyR else {
1532
+ return nil
1533
+ }
1534
+
1535
+ // 'count:' can be integer literal or a generic parameter.
1536
+ let count = self . generateConsumingAttrOption ( args: & args, label: " count " ) {
1537
+ self . generateValueOrType ( expr: $0)
1538
+ }
1539
+ guard let count else {
1540
+ return nil
1541
+ }
1542
+
1543
+ guard let moveAsLike = args. isEmpty ? false : generateConsumingMoveAsLike ( ) else {
1544
+ return nil
1545
+ }
1546
+
1547
+ return . createParsed(
1548
+ self . ctx,
1549
+ atLoc: self . generateSourceLoc ( node. atSign) ,
1550
+ range: self . generateAttrSourceRange ( node) ,
1551
+ likeArrayOf: tyR,
1552
+ count: count,
1553
+ moveAsLike: moveAsLike
1554
+ )
1555
+ }
1556
+
1557
+ func generateConsumingIntegerLiteralOption( label: SyntaxText ) -> Int ? {
1558
+ self . generateConsumingAttrOption ( args: & args, label: label) {
1559
+ guard let integerExpr = $0. as ( IntegerLiteralExprSyntax . self) else {
1560
+ // TODO: Diagnose
1561
+ fatalError ( " expected integer literal for ' \( String ( syntaxText: label) ) :' in @_rawLayout " )
1562
+ }
1563
+ guard let count = integerExpr. representedLiteralValue else {
1564
+ fatalError ( " invalid value literal for ' \( String ( syntaxText: label) ) :' in @_rawLayout " )
1565
+ }
1566
+ return count
1567
+ }
1568
+ }
1569
+
1570
+ func generateConsumingMoveAsLike( ) -> Bool ? {
1571
+ self . generateConsumingPlainIdentifierAttrOption ( args: & args) {
1572
+ switch $0. rawText {
1573
+ case " moveAsLike " :
1574
+ return true
1575
+ default :
1576
+ // TODO: Diagnose.
1577
+ fatalError ( " expected 'moveAsLike' in @rawLayout attribute " )
1578
+ }
1579
+ }
1580
+ }
1581
+ }
1582
+ }
1583
+
1448
1584
// FIXME: This is a decl modifier
1449
1585
func generateReferenceOwnershipAttr( attribute node: AttributeSyntax , attrName: SyntaxText )
1450
1586
-> BridgedReferenceOwnershipAttr ?
0 commit comments