1111//===----------------------------------------------------------------------===//
1212
1313import ASTBridging
14+
15+ @_spi ( ExperimentalLanguageFeatures)
1416import SwiftSyntax
1517
1618extension ASTGenVisitor {
@@ -72,8 +74,8 @@ extension ASTGenVisitor {
7274 return BridgedRequirementRepr (
7375 SeparatorLoc: self . generateSourceLoc ( sameType. equal) ,
7476 Kind: . sameType,
75- FirstType: self . generate ( type : sameType. leftType) ,
76- SecondType: self . generate ( type : sameType. rightType)
77+ FirstType: self . generate ( sameTypeLeftType : sameType. leftType) ,
78+ SecondType: self . generate ( sameTypeRightType : sameType. rightType)
7779 )
7880 case . layoutRequirement( _) :
7981 // FIXME: Implement layout requirement translation.
@@ -87,4 +89,117 @@ extension ASTGenVisitor {
8789 requirements: requirements. bridgedArray ( in: self )
8890 )
8991 }
92+
93+ func generate( sameTypeLeftType node: SameTypeRequirementSyntax . LeftType ) -> BridgedTypeRepr {
94+ switch node {
95+ case . type( let type) :
96+ return self . generate ( type: type)
97+
98+ // The only expressions same type left types support right now are
99+ // integer literals, '123', and prefix operators for negative integer
100+ // literals, '-123'.
101+ case . expr( let expr) :
102+ switch expr. as ( ExprSyntaxEnum . self) {
103+ case . integerLiteralExpr( let node) :
104+ return self . generate ( integerType: node)
105+
106+ case . prefixOperatorExpr( let node) :
107+ let op = node. operator
108+
109+ guard op. text == " - " else {
110+ fatalError ( " Unknown prefix operator for same type left type " )
111+ }
112+
113+ guard case . integerLiteralExpr( let node) = node. expression. as ( ExprSyntaxEnum . self) else {
114+ fatalError ( " Unknown expression kind for same type left type " )
115+ }
116+
117+ return self . generate ( integerType: node, minusLoc: self . generateSourceLoc ( op) )
118+
119+ default :
120+ fatalError ( " Unknown expression kind for same type left type " )
121+ }
122+ }
123+ }
124+
125+ func generate( sameTypeRightType node: SameTypeRequirementSyntax . RightType ) -> BridgedTypeRepr {
126+ switch node {
127+ case . type( let type) :
128+ return self . generate ( type: type)
129+
130+ // The only expressions same type right types support right now are
131+ // integer literals, '123', and prefix operators for negative integer
132+ // literals, '-123'.
133+ case . expr( let expr) :
134+ switch expr. as ( ExprSyntaxEnum . self) {
135+ case . integerLiteralExpr( let node) :
136+ return self . generate ( integerType: node)
137+
138+ case . prefixOperatorExpr( let node) :
139+ let op = node. operator
140+
141+ guard op. text == " - " else {
142+ fatalError ( " Unknown prefix operator for same type right type " )
143+ }
144+
145+ guard case . integerLiteralExpr( let node) = node. expression. as ( ExprSyntaxEnum . self) else {
146+ fatalError ( " Unknown expression kind for same type right type " )
147+ }
148+
149+ return self . generate ( integerType: node, minusLoc: self . generateSourceLoc ( op) )
150+
151+ default :
152+ fatalError ( " Unknown expression kind for same type right type " )
153+ }
154+ }
155+ }
156+
157+ func generate( genericArgument node: GenericArgumentSyntax . Argument ) -> BridgedTypeRepr {
158+ switch node {
159+ case . type( let type) :
160+ return self . generate ( type: type)
161+
162+ // The only expressions generic argument types support right now are
163+ // integer literals, '123', and prefix operators for negative integer
164+ // literals, '-123'.
165+ case . expr( let expr) :
166+ switch expr. as ( ExprSyntaxEnum . self) {
167+ case . integerLiteralExpr( let node) :
168+ return self . generate ( integerType: node)
169+
170+ case . prefixOperatorExpr( let node) :
171+ let op = node. operator
172+
173+ guard op. text == " - " else {
174+ fatalError ( " Unknown prefix operator for generic argument type " )
175+ }
176+
177+ guard case . integerLiteralExpr( let node) = node. expression. as ( ExprSyntaxEnum . self) else {
178+ fatalError ( " Unknown expression kind for generic argument type " )
179+ }
180+
181+ return self . generate ( integerType: node, minusLoc: self . generateSourceLoc ( op) )
182+
183+ default :
184+ fatalError ( " Unknown expression kind for generic argument type " )
185+ }
186+ }
187+ }
188+
189+ func generate(
190+ integerType node: IntegerLiteralExprSyntax ,
191+ minusLoc: BridgedSourceLoc = BridgedSourceLoc ( )
192+ ) -> BridgedTypeRepr {
193+ var desc = node. trimmedDescription
194+ let str = desc. withBridgedString {
195+ self . ctx. allocateCopy ( string: $0)
196+ }
197+
198+ return BridgedIntegerTypeRepr . createParsed (
199+ self . ctx,
200+ string: str,
201+ loc: self . generateSourceLoc ( node) ,
202+ minusLoc: minusLoc
203+ ) . asTypeRepr
204+ }
90205}
0 commit comments