Skip to content

Commit 132a67d

Browse files
committed
Implement ASTGen changes for integer generics from Swift Syntax
Support negatives
1 parent c76f894 commit 132a67d

File tree

7 files changed

+153
-10
lines changed

7 files changed

+153
-10
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1908,6 +1908,12 @@ BridgedVarargTypeRepr_createParsed(BridgedASTContext cContext,
19081908
BridgedTypeRepr base,
19091909
BridgedSourceLoc cEllipsisLoc);
19101910

1911+
SWIFT_NAME(
1912+
"BridgedIntegerTypeRepr.createParsed(_:string:loc:minusLoc:)")
1913+
BridgedIntegerTypeRepr BridgedIntegerTypeRepr_createParsed(
1914+
BridgedASTContext cContext, BridgedStringRef cString, BridgedSourceLoc cLoc,
1915+
BridgedSourceLoc cMinusLoc);
1916+
19111917
SWIFT_NAME("BridgedTypeRepr.dump(self:)")
19121918
void BridgedTypeRepr_dump(BridgedTypeRepr type);
19131919

lib/AST/Bridging/TypeReprBridging.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,3 +298,13 @@ BridgedExistentialTypeRepr_createParsed(BridgedASTContext cContext,
298298
return new (context)
299299
ExistentialTypeRepr(cAnyLoc.unbridged(), baseTy.unbridged());
300300
}
301+
302+
BridgedIntegerTypeRepr
303+
BridgedIntegerTypeRepr_createParsed(BridgedASTContext cContext,
304+
BridgedStringRef cString,
305+
BridgedSourceLoc cLoc,
306+
BridgedSourceLoc cMinusLoc) {
307+
ASTContext &context = cContext.unbridged();
308+
return new (context) IntegerTypeRepr(cString.unbridged(), cLoc.unbridged(),
309+
cMinusLoc.unbridged());
310+
}

lib/ASTGen/Sources/ASTGen/Exprs.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,7 @@ extension ASTGenVisitor {
535535
let generics = node.genericArgumentClause
536536
let lAngleLoc = self.generateSourceLoc(generics.leftAngle)
537537
let genericArguments = generics.arguments.lazy.map {
538-
self.generate(type: $0.argument)
538+
self.generate(genericArgument: $0.argument)
539539
}
540540
let rAngleLoc = self.generateSourceLoc(generics.rightAngle)
541541
return .createParsed(

lib/ASTGen/Sources/ASTGen/Generics.swift

Lines changed: 117 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
import ASTBridging
14+
15+
@_spi(ExperimentalLanguageFeatures)
1416
import SwiftSyntax
1517

1618
extension 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
}

lib/ASTGen/Sources/ASTGen/Types.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ extension ASTGenVisitor {
120120
}
121121

122122
let genericArguments = generics.arguments.lazy.map {
123-
self.generate(type: $0.argument)
123+
self.generate(genericArgument: $0.argument)
124124
}
125125

126126
return BridgedUnqualifiedIdentTypeRepr.createParsed(
@@ -140,7 +140,7 @@ extension ASTGenVisitor {
140140
let angleRange: BridgedSourceRange
141141
if let generics = node.genericArgumentClause {
142142
genericArguments = generics.arguments.lazy.map {
143-
self.generate(type: $0.argument)
143+
self.generate(genericArgument: $0.argument)
144144
}.bridgedArray(in: self)
145145

146146
angleRange = self.generateSourceRange(start: generics.leftAngle, end: generics.rightAngle)

lib/Macros/Sources/SwiftMacros/DistributedResolvableMacro.swift

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
//
1010
//===----------------------------------------------------------------------===//
1111

12+
@_spi(ExperimentalLanguageFeatures)
1213
import SwiftSyntax
1314
import SwiftSyntaxMacros
1415
import SwiftDiagnostics
@@ -141,10 +142,21 @@ extension DistributedResolvableMacro {
141142
specificActorSystemRequirement = conformanceReq.rightType.trimmed
142143
isGenericStub = true
143144

144-
case .sameTypeRequirement(let sameTypeReq)
145-
where sameTypeReq.leftType.isActorSystem:
146-
specificActorSystemRequirement = sameTypeReq.rightType.trimmed
147-
isGenericStub = false
145+
case .sameTypeRequirement(let sameTypeReq):
146+
switch sameTypeReq.leftType {
147+
case .type(let type) where type.isActorSystem:
148+
switch sameTypeReq.rightType.trimmed {
149+
case .type(let rightType):
150+
specificActorSystemRequirement = rightType
151+
isGenericStub = false
152+
153+
case .expr:
154+
fatalError("Expression type not supported for distributed actor")
155+
}
156+
157+
default:
158+
continue
159+
}
148160

149161
default:
150162
continue

lib/Macros/Sources/SwiftMacros/OptionSetMacro.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public struct OptionSetMacro {
7272
of attribute: AttributeSyntax,
7373
attachedTo decl: Decl,
7474
in context: Context
75-
) -> (StructDeclSyntax, EnumDeclSyntax, TypeSyntax)? {
75+
) -> (StructDeclSyntax, EnumDeclSyntax, GenericArgumentSyntax.Argument)? {
7676
// Determine the name of the options enum.
7777
let optionsEnumName: String
7878
if case let .argumentList(arguments) = attribute.arguments,

0 commit comments

Comments
 (0)