@@ -166,7 +166,7 @@ extension ASTGenVisitor {
166166 case . projectedValueProperty:
167167 return handle ( self . generateProjectedValuePropertyAttr ( attribute: node) ? . asDeclAttribute)
168168 case . rawLayout:
169- fatalError ( " unimplemented " )
169+ return handle ( self . generateRawLayoutAttr ( attribute : node ) ? . asDeclAttribute )
170170 case . section:
171171 return handle ( self . generateSectionAttr ( attribute: node) ? . asDeclAttribute)
172172 case . semantics:
@@ -1445,6 +1445,142 @@ extension ASTGenVisitor {
14451445 )
14461446 }
14471447
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+
14481584 // FIXME: This is a decl modifier
14491585 func generateReferenceOwnershipAttr( attribute node: AttributeSyntax , attrName: SyntaxText )
14501586 -> BridgedReferenceOwnershipAttr ?
0 commit comments