Skip to content

Commit a2e40d6

Browse files
committed
[ASTGen] Generate @_typeEraser attribute
1 parent 6525d64 commit a2e40d6

File tree

4 files changed

+47
-1
lines changed

4 files changed

+47
-1
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1375,6 +1375,11 @@ BridgedTransposeAttr BridgedTransposeAttr_createParsed(
13751375
BridgedDeclNameRef cOriginalName, BridgedDeclNameLoc cOriginalNameLoc,
13761376
BridgedArrayRef cParams);
13771377

1378+
SWIFT_NAME("BridgedTypeEraserAttr.createParsed(_:atLoc:range:typeExpr:)")
1379+
BridgedTypeEraserAttr BridgedTypeEraserAttr_createParsed(
1380+
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
1381+
BridgedSourceRange cRange, BridgedTypeExpr cTypeExpr);
1382+
13781383
SWIFT_NAME(
13791384
"BridgedUnavailableFromAsyncAttr.createParsed(_:atLoc:range:message:)")
13801385
BridgedUnavailableFromAsyncAttr BridgedUnavailableFromAsyncAttr_createParsed(

lib/AST/Bridging/DeclAttributeBridging.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -867,6 +867,15 @@ BridgedTransposeAttr BridgedTransposeAttr_createParsed(
867867
params);
868868
}
869869

870+
BridgedTypeEraserAttr BridgedTypeEraserAttr_createParsed(
871+
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
872+
BridgedSourceRange cRange, BridgedTypeExpr cTypeExpr
873+
874+
) {
875+
return TypeEraserAttr::create(cContext.unbridged(), cAtLoc.unbridged(),
876+
cRange.unbridged(), cTypeExpr.unbridged());
877+
}
878+
870879
BridgedUnavailableFromAsyncAttr BridgedUnavailableFromAsyncAttr_createParsed(
871880
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
872881
BridgedSourceRange cRange, BridgedStringRef cMessage) {

lib/ASTGen/Sources/ASTGen/DeclAttrs.swift

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ extension ASTGenVisitor {
190190
case .transpose:
191191
return handle(self.generateTransposeAttr(attribute: node)?.asDeclAttribute)
192192
case .typeEraser:
193-
fatalError("unimplemented")
193+
return handle(self.generateTypeEraserAttr(attribute: node)?.asDeclAttribute)
194194
case .unavailableFromAsync:
195195
return handle(self.generateUnavailableFromAsyncAttr(attribute: node)?.asDeclAttribute)
196196
case .reasync:
@@ -2124,6 +2124,33 @@ extension ASTGenVisitor {
21242124
)
21252125
}
21262126

2127+
/// E.g.:
2128+
/// ```
2129+
/// @_typeEraser(MyProtocol)
2130+
/// ```
2131+
func generateTypeEraserAttr(attribute node: AttributeSyntax) -> BridgedTypeEraserAttr? {
2132+
// FIXME: Should be normal LabeledExprListSyntax arguments.
2133+
// FIXME: Error handling
2134+
let type: BridgedTypeRepr? = self.generateSingleAttrOption(attribute: node, { token in
2135+
let nameLoc = self.generateIdentifierAndSourceLoc(token)
2136+
return BridgedUnqualifiedIdentTypeRepr.createParsed(
2137+
self.ctx,
2138+
loc: nameLoc.sourceLoc,
2139+
name: nameLoc.identifier
2140+
).asTypeRepr
2141+
})
2142+
guard let type else {
2143+
return nil
2144+
}
2145+
2146+
return .createParsed(
2147+
self.ctx,
2148+
atLoc: self.generateSourceLoc(node.atSign),
2149+
range: self.generateAttrSourceRange(node),
2150+
typeExpr: .createParsed(self.ctx, type: type)
2151+
)
2152+
}
2153+
21272154
/// E.g.:
21282155
/// ```
21292156
/// @_unavailableFromAsync

test/ASTGen/attrs.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,3 +259,8 @@ struct LayoutOuter {
259259
@rethrows protocol RethrowingProtocol {
260260
func source() throws
261261
}
262+
263+
@_typeEraser(AnyEraser) protocol EraserProto {}
264+
struct AnyEraser: EraserProto {
265+
init<T: EraserProto>(erasing: T) {}
266+
}

0 commit comments

Comments
 (0)