1111//===----------------------------------------------------------------------===//
1212
1313import ASTBridging
14+
15+ @_spi ( ExperimentalLanguageFeatures)
16+ @_spi ( RawSyntax)
1417import SwiftSyntax
1518
1619extension ASTGenVisitor {
@@ -72,8 +75,8 @@ extension ASTGenVisitor {
7275 return BridgedRequirementRepr (
7376 SeparatorLoc: self . generateSourceLoc ( sameType. equal) ,
7477 Kind: . sameType,
75- FirstType: self . generate ( type : sameType. leftType) ,
76- SecondType: self . generate ( type : sameType. rightType)
78+ FirstType: self . generate ( sameTypeLeftType : sameType. leftType) ,
79+ SecondType: self . generate ( sameTypeRightType : sameType. rightType)
7780 )
7881 case . layoutRequirement( _) :
7982 // FIXME: Implement layout requirement translation.
@@ -87,4 +90,71 @@ extension ASTGenVisitor {
8790 requirements: requirements. bridgedArray ( in: self )
8891 )
8992 }
93+
94+ func generate( sameTypeLeftType node: SameTypeRequirementSyntax . LeftType ) -> BridgedTypeRepr {
95+ switch node {
96+ case . type( let type) :
97+ return self . generate ( type: type)
98+
99+ case . expr( let expr) :
100+ return self . generateIntegerType ( expr: expr) . asTypeRepr
101+ }
102+ }
103+
104+ func generate( sameTypeRightType node: SameTypeRequirementSyntax . RightType ) -> BridgedTypeRepr {
105+ switch node {
106+ case . type( let type) :
107+ return self . generate ( type: type)
108+
109+ case . expr( let expr) :
110+ return self . generateIntegerType ( expr: expr) . asTypeRepr
111+ }
112+ }
113+
114+ func generate( genericArgument node: GenericArgumentSyntax . Argument ) -> BridgedTypeRepr {
115+ switch node {
116+ case . type( let type) :
117+ return self . generate ( type: type)
118+
119+ case . expr( let expr) :
120+ return self . generateIntegerType ( expr: expr) . asTypeRepr
121+ }
122+ }
123+
124+ func generateIntegerType( expr node: ExprSyntax ) -> BridgedIntegerTypeRepr {
125+ var minusLoc = BridgedSourceLoc ( )
126+ let literalExpr : IntegerLiteralExprSyntax
127+
128+ // The only expressions generic argument types support right now are
129+ // integer literals, '123', and prefix operators for negative integer
130+ // literals, '-123'.
131+ switch node. as ( ExprSyntaxEnum . self) {
132+ case . integerLiteralExpr( let node) :
133+ literalExpr = node
134+
135+ case . prefixOperatorExpr( let node) :
136+ let op = node. operator
137+
138+ guard op. text == " - " else {
139+ fatalError ( " Unknown prefix operator for generic argument type " )
140+ }
141+
142+ guard let node = node. expression. as ( IntegerLiteralExprSyntax . self) else {
143+ fatalError ( " Unknown expression kind for generic argument type " )
144+ }
145+
146+ minusLoc = self . generateSourceLoc ( op)
147+ literalExpr = node
148+
149+ default :
150+ fatalError ( " Unknown expression kind for generic argument type " )
151+ }
152+
153+ return . createParsed(
154+ self . ctx,
155+ string: self . copyAndStripUnderscores ( text: literalExpr. literal. rawText) ,
156+ loc: self . generateSourceLoc ( literalExpr) ,
157+ minusLoc: minusLoc
158+ )
159+ }
90160}
0 commit comments