Skip to content

Commit 584299d

Browse files
committed
[ASTGen] Handle simple type attributes.
Bridge the simple type attributes like `@autoclosure` into an `AttributedTypeRepr`. We don't validate the arguments, and we don't handle more complicated attributes like `@convention(c)` just yet.
1 parent e121a63 commit 584299d

File tree

4 files changed

+168
-1
lines changed

4 files changed

+168
-1
lines changed

include/swift/AST/CASTBridging.h

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,59 @@ typedef enum ENUM_EXTENSIBILITY_ATTR(open) BridgedAttributedTypeSpecifier : long
123123
BridgedAttributedTypeSpecifierIsolated,
124124
} BridgedAttributedTypeSpecifier;
125125

126+
127+
// Bridged type attribute kinds, which mirror TypeAttrKind exactly.
128+
typedef enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedTypeAttrKind : long {
129+
BridgedTypeAttrKind_autoclosure,
130+
BridgedTypeAttrKind_convention,
131+
BridgedTypeAttrKind_noescape,
132+
BridgedTypeAttrKind_escaping,
133+
BridgedTypeAttrKind_differentiable,
134+
BridgedTypeAttrKind_noDerivative,
135+
BridgedTypeAttrKind_async,
136+
BridgedTypeAttrKind_Sendable,
137+
BridgedTypeAttrKind_unchecked,
138+
BridgedTypeAttrKind__local,
139+
BridgedTypeAttrKind__noMetadata,
140+
BridgedTypeAttrKind__opaqueReturnTypeOf,
141+
BridgedTypeAttrKind_block_storage,
142+
BridgedTypeAttrKind_box,
143+
BridgedTypeAttrKind_dynamic_self,
144+
BridgedTypeAttrKind_sil_weak,
145+
BridgedTypeAttrKind_sil_unowned,
146+
BridgedTypeAttrKind_sil_unmanaged,
147+
BridgedTypeAttrKind_error,
148+
BridgedTypeAttrKind_out,
149+
BridgedTypeAttrKind_direct,
150+
BridgedTypeAttrKind_in,
151+
BridgedTypeAttrKind_inout,
152+
BridgedTypeAttrKind_inout_aliasable,
153+
BridgedTypeAttrKind_in_guaranteed,
154+
BridgedTypeAttrKind_in_constant,
155+
BridgedTypeAttrKind_pack_owned,
156+
BridgedTypeAttrKind_pack_guaranteed,
157+
BridgedTypeAttrKind_pack_inout,
158+
BridgedTypeAttrKind_pack_out,
159+
BridgedTypeAttrKind_owned,
160+
BridgedTypeAttrKind_unowned_inner_pointer,
161+
BridgedTypeAttrKind_guaranteed,
162+
BridgedTypeAttrKind_autoreleased,
163+
BridgedTypeAttrKind_callee_owned,
164+
BridgedTypeAttrKind_callee_guaranteed,
165+
BridgedTypeAttrKind_objc_metatype,
166+
BridgedTypeAttrKind_opened,
167+
BridgedTypeAttrKind_pack_element,
168+
BridgedTypeAttrKind_pseudogeneric,
169+
BridgedTypeAttrKind_yields,
170+
BridgedTypeAttrKind_yield_once,
171+
BridgedTypeAttrKind_yield_many,
172+
BridgedTypeAttrKind_captures_generics,
173+
BridgedTypeAttrKind_moveOnly,
174+
BridgedTypeAttrKind_thin,
175+
BridgedTypeAttrKind_thick,
176+
BridgedTypeAttrKind_Count
177+
} BridgedTypeAttrKind;
178+
126179
#ifdef __cplusplus
127180
extern "C" {
128181

@@ -272,6 +325,16 @@ void *ImplicitlyUnwrappedOptionalTypeRepr_create(void *ctx, void *base,
272325
void *exclamationLoc);
273326
void *MetatypeTypeRepr_create(void *ctx, void *baseType, void *typeLoc);
274327
void *ProtocolTypeRepr_create(void *ctx, void *baseType, void *protoLoc);
328+
329+
BridgedTypeAttrKind getBridgedTypeAttrKindFromString(
330+
const unsigned char * _Nullable str, long len);
331+
332+
typedef void *BridgedTypeAttributes;
333+
BridgedTypeAttributes BridgedTypeAttributes_create(void);
334+
void BridgedTypeAttributes_addSimpleAttr(
335+
BridgedTypeAttributes typeAttributes, BridgedTypeAttrKind kind, void *atLoc, void *attrLoc);
336+
void *AttributedTypeRepr_create(void *ctx, void *base, BridgedTypeAttributes typeAttributes);
337+
275338
void *AttributedTypeSpecifierRepr_create(
276339
void *ctx, void *base, BridgedAttributedTypeSpecifier specifier, void *specifierLoc);
277340
void *VarargTypeRepr_create(void *ctx, void *base, void *ellipsisLocPtr);

lib/AST/CASTBridging.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,56 @@ void *PackExpansionTypeRepr_create(void *ctx, void *base, void *repeatLoc) {
490490
getSourceLocFromPointer(repeatLoc), (TypeRepr *)base);
491491
}
492492

493+
static BridgedTypeAttrKind bridgeTypeAttrKind(TypeAttrKind kind) {
494+
switch (kind) {
495+
#define TYPE_ATTR(X) case TAK_##X: return BridgedTypeAttrKind_##X;
496+
#include "swift/AST/Attr.def"
497+
case TAK_Count: return BridgedTypeAttrKind_Count;
498+
}
499+
}
500+
501+
static TypeAttrKind bridgeTypeAttrKind(BridgedTypeAttrKind kind) {
502+
switch (kind) {
503+
#define TYPE_ATTR(X) case BridgedTypeAttrKind_##X: return TAK_##X;
504+
#include "swift/AST/Attr.def"
505+
case BridgedTypeAttrKind_Count: return TAK_Count;
506+
}
507+
}
508+
509+
BridgedTypeAttrKind getBridgedTypeAttrKindFromString(
510+
const unsigned char *str, intptr_t len) {
511+
return bridgeTypeAttrKind(
512+
TypeAttributes::getAttrKindFromString(StringRef((const char *)str, len)));
513+
}
514+
515+
BridgedTypeAttributes BridgedTypeAttributes_create() {
516+
return new TypeAttributes();
517+
}
518+
519+
void BridgedTypeAttributes_addSimpleAttr(
520+
BridgedTypeAttributes typeAttributesPtr, BridgedTypeAttrKind kind,
521+
void *atLoc, void *attrLoc
522+
) {
523+
TypeAttributes *typeAttributes = (TypeAttributes *)typeAttributesPtr;
524+
typeAttributes->setAttr(
525+
bridgeTypeAttrKind(kind), getSourceLocFromPointer(attrLoc));
526+
if (typeAttributes->AtLoc.isInvalid())
527+
typeAttributes->AtLoc = getSourceLocFromPointer(atLoc);
528+
}
529+
530+
void *AttributedTypeRepr_create(
531+
void *ctx, void *base, BridgedTypeAttributes typeAttributesPtr) {
532+
TypeAttributes *typeAttributes = (TypeAttributes *)typeAttributesPtr;
533+
if (typeAttributes->empty())
534+
return base;
535+
536+
ASTContext &Context = *static_cast<ASTContext *>(ctx);
537+
auto attributedType =
538+
new (Context) AttributedTypeRepr(*typeAttributes, (TypeRepr *)base);
539+
delete typeAttributes;
540+
return attributedType;
541+
}
542+
493543
void *AttributedTypeSpecifierRepr_create(
494544
void *ctx, void *base, BridgedAttributedTypeSpecifier specifier, void *specifierLoc
495545
) {

lib/ASTGen/Sources/ASTGen/Types.swift

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,54 @@ extension ASTGenVisitor {
187187
type = .type(AttributedTypeSpecifierRepr_create(self.ctx, type.rawValue, kind, specifierLoc))
188188
}
189189

190-
// FIXME: Respect the attributes
190+
// Handle type attributes.
191+
if let attributes = node.attributes {
192+
let typeAttributes = BridgedTypeAttributes_create()
193+
for attributeElt in attributes {
194+
// FIXME: Ignoring #ifs entirely. We want to provide a filtered view,
195+
// but we don't have that ability right now.
196+
guard case let .attribute(attribute) = attributeElt else {
197+
continue
198+
}
199+
200+
// Only handle simple attribute names right now.
201+
guard let identType = attribute.attributeName.as(SimpleTypeIdentifierSyntax.self) else {
202+
continue
203+
}
204+
205+
let nameSyntax = identType.name
206+
var name = nameSyntax.text
207+
let typeAttrKind = name.withUTF8 { buf in
208+
getBridgedTypeAttrKindFromString(buf.baseAddress, buf.count)
209+
}
210+
let atLoc = self.base.advanced(by: attribute.atSignToken.position.utf8Offset).raw
211+
let attrLoc = self.base.advanced(by: nameSyntax.position.utf8Offset).raw
212+
switch typeAttrKind {
213+
// SIL attributes
214+
// FIXME: Diagnose if not in SIL mode? Or should that move to the
215+
// type checker?
216+
case .out, .in, .owned, .unowned_inner_pointer, .guaranteed,
217+
.autoreleased, .callee_owned, .callee_guaranteed, .objc_metatype,
218+
.sil_weak, .sil_unowned, .inout, .block_storage, .box,
219+
.dynamic_self, .sil_unmanaged, .error, .direct, .inout_aliasable,
220+
.in_guaranteed, .in_constant, .captures_generics, .moveOnly:
221+
fallthrough
222+
223+
case .autoclosure, .escaping, .noescape, .noDerivative, .async,
224+
.sendable, .unchecked, ._local, ._noMetadata, .pack_owned,
225+
.pack_guaranteed, .pack_inout, .pack_out, .pseudogeneric,
226+
.yields, .yield_once, .yield_many, .thin, .thick, .count:
227+
BridgedTypeAttributes_addSimpleAttr(typeAttributes, typeAttrKind, atLoc, attrLoc)
228+
229+
case .opened, .pack_element, .differentiable, .convention,
230+
._opaqueReturnTypeOf:
231+
// FIXME: These require more complicated checks
232+
break
233+
}
234+
}
235+
236+
type = .type(AttributedTypeRepr_create(self.ctx, type.rawValue, typeAttributes))
237+
}
191238

192239
return type
193240
}

test/ASTGen/types.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,10 @@ typealias VAFunc = (Int, Int...) -> Int
2121
func testVAFunc(a: Int, f: VAFunc) {
2222
_ = f(a, a, a, a, a)
2323
}
24+
25+
func test12(_ producer: @escaping @autoclosure () -> Int) {
26+
_ = producer()
27+
}
28+
func test12a(i: Int) {
29+
test12(i)
30+
}

0 commit comments

Comments
 (0)