Skip to content

Commit cd7a31c

Browse files
committed
[ASTGen] Cleanup type attribute generation
Use similar scheme as DeclAttribute. * Create `BridgedTypeAttribute.createSimple()` and `BridgedTypeAttributes.add()`, instead of `BridgedTypeAttributes.addSimple()` * Create `DeclAttributes::createSimple()` to align with `TypeAttribute`
1 parent bd3c15e commit cd7a31c

File tree

10 files changed

+271
-190
lines changed

10 files changed

+271
-190
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 25 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -283,10 +283,10 @@ namespace swift {
283283
// Declare `.asDeclAttribute` on each BridgedXXXAttr type, which upcasts a
284284
// wrapper for a DeclAttribute subclass to a BridgedDeclAttribute.
285285
#define SIMPLE_DECL_ATTR(...)
286-
#define DECL_ATTR(_, Id, ...) \
287-
SWIFT_NAME("getter:Bridged" #Id "Attr.asDeclAttribute(self:)") \
288-
BridgedDeclAttribute Bridged##Id##Attr_asDeclAttribute( \
289-
Bridged##Id##Attr attr);
286+
#define DECL_ATTR(_, CLASS, ...) \
287+
SWIFT_NAME("getter:Bridged" #CLASS "Attr.asDeclAttribute(self:)") \
288+
BridgedDeclAttribute Bridged##CLASS##Attr_asDeclAttribute( \
289+
Bridged##CLASS##Attr attr);
290290
#include "swift/AST/Attr.def"
291291

292292
struct BridgedPatternBindingEntry {
@@ -422,7 +422,7 @@ BridgedDeclContext BridgedPatternBindingInitializer_asDeclContext(
422422
//===----------------------------------------------------------------------===//
423423

424424
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedDeclAttrKind {
425-
#define DECL_ATTR(_, Id, ...) BridgedDeclAttrKind##Id,
425+
#define DECL_ATTR(_, CLASS, ...) BridgedDeclAttrKind##CLASS,
426426
#include "swift/AST/Attr.def"
427427
BridgedDeclAttrKindNone,
428428
};
@@ -1439,78 +1439,33 @@ void BridgedStmt_dump(BridgedStmt statement);
14391439
//===----------------------------------------------------------------------===//
14401440

14411441
// Bridged type attribute kinds, which mirror TypeAttrKind exactly.
1442-
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedTypeAttrKind : size_t {
1443-
BridgedTypeAttrKind_autoclosure,
1444-
BridgedTypeAttrKind_convention,
1445-
BridgedTypeAttrKind_noescape,
1446-
BridgedTypeAttrKind_escaping,
1447-
BridgedTypeAttrKind_differentiable,
1448-
BridgedTypeAttrKind_noDerivative,
1449-
BridgedTypeAttrKind_async,
1450-
BridgedTypeAttrKind_Sendable,
1451-
BridgedTypeAttrKind_retroactive,
1452-
BridgedTypeAttrKind_unchecked,
1453-
BridgedTypeAttrKind_preconcurrency,
1454-
BridgedTypeAttrKind__local,
1455-
BridgedTypeAttrKind__noMetadata,
1456-
BridgedTypeAttrKind__opaqueReturnTypeOf,
1457-
BridgedTypeAttrKind_block_storage,
1458-
BridgedTypeAttrKind_box,
1459-
BridgedTypeAttrKind_dynamic_self,
1460-
BridgedTypeAttrKind_sil_weak,
1461-
BridgedTypeAttrKind_sil_unowned,
1462-
BridgedTypeAttrKind_sil_unmanaged,
1463-
BridgedTypeAttrKind_error,
1464-
BridgedTypeAttrKind_error_indirect,
1465-
BridgedTypeAttrKind_error_unowned,
1466-
BridgedTypeAttrKind_out,
1467-
BridgedTypeAttrKind_direct,
1468-
BridgedTypeAttrKind_in,
1469-
BridgedTypeAttrKind_inout,
1470-
BridgedTypeAttrKind_inout_aliasable,
1471-
BridgedTypeAttrKind_in_guaranteed,
1472-
BridgedTypeAttrKind_in_constant,
1473-
BridgedTypeAttrKind_pack_owned,
1474-
BridgedTypeAttrKind_pack_guaranteed,
1475-
BridgedTypeAttrKind_pack_inout,
1476-
BridgedTypeAttrKind_pack_out,
1477-
BridgedTypeAttrKind_owned,
1478-
BridgedTypeAttrKind_unowned_inner_pointer,
1479-
BridgedTypeAttrKind_guaranteed,
1480-
BridgedTypeAttrKind_autoreleased,
1481-
BridgedTypeAttrKind_callee_owned,
1482-
BridgedTypeAttrKind_callee_guaranteed,
1483-
BridgedTypeAttrKind_objc_metatype,
1484-
BridgedTypeAttrKind_opened,
1485-
BridgedTypeAttrKind_pack_element,
1486-
BridgedTypeAttrKind_pseudogeneric,
1487-
BridgedTypeAttrKind_unimplementable,
1488-
BridgedTypeAttrKind_yields,
1489-
BridgedTypeAttrKind_yield_once,
1490-
BridgedTypeAttrKind_yield_many,
1491-
BridgedTypeAttrKind_captures_generics,
1492-
BridgedTypeAttrKind_moveOnly,
1493-
BridgedTypeAttrKind_thin,
1494-
BridgedTypeAttrKind_thick,
1495-
BridgedTypeAttrKind_Count,
1496-
BridgedTypeAttrKind_isolated,
1442+
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedTypeAttrKind {
1443+
#define TYPE_ATTR(SPELLING, _) BridgedTypeAttrKind_##SPELLING,
1444+
#include "swift/AST/Attr.def"
1445+
BridgedTypeAttrKind_None,
14971446
};
14981447

14991448
SWIFT_NAME("BridgedTypeAttrKind.init(from:)")
15001449
BridgedTypeAttrKind BridgedTypeAttrKind_fromString(BridgedStringRef cStr);
15011450

1502-
SWIFT_NAME("BridgedTypeAttributes.init(context:)")
1503-
BridgedTypeAttributes BridgedTypeAttributes_create(BridgedASTContext cContext);
1451+
SWIFT_NAME("BridgedTypeAttributes.new()")
1452+
BridgedTypeAttributes BridgedTypeAttributes_create();
1453+
1454+
SWIFT_NAME("BridgedTypeAttributes.delete(self:)")
1455+
void BridgedTypeAttributes_delete(BridgedTypeAttributes cAttributes);
15041456

1505-
SWIFT_NAME("BridgedTypeAttributes.addSimpleAttr(self:kind:atLoc:attrLoc:)")
1506-
void BridgedTypeAttributes_addSimpleAttr(BridgedTypeAttributes cAttributes,
1507-
BridgedTypeAttrKind kind,
1508-
BridgedSourceLoc cAtLoc,
1509-
BridgedSourceLoc cAttrLoc);
1457+
SWIFT_NAME("BridgedTypeAttributes.add(self:_:)")
1458+
void BridgedTypeAttributes_add(BridgedTypeAttributes cAttributes,
1459+
BridgedTypeAttribute cAttribute);
15101460

15111461
SWIFT_NAME("getter:BridgedTypeAttributes.isEmpty(self:)")
15121462
bool BridgedTypeAttributes_isEmpty(BridgedTypeAttributes cAttributes);
15131463

1464+
SWIFT_NAME("BridgedTypeAttribute.createSimple(_:kind:atLoc:nameLoc:)")
1465+
BridgedTypeAttribute BridgedTypeAttribute_createSimple(
1466+
BridgedASTContext cContext, BridgedTypeAttrKind cKind,
1467+
BridgedSourceLoc cAtLoc, BridgedSourceLoc cNameLoc);
1468+
15141469
//===----------------------------------------------------------------------===//
15151470
// MARK: TypeReprs
15161471
//===----------------------------------------------------------------------===//
@@ -1545,9 +1500,10 @@ BridgedArrayTypeRepr BridgedArrayTypeRepr_createParsed(
15451500
BridgedSourceLoc cLSquareLoc, BridgedSourceLoc cRSquareLoc);
15461501

15471502
SWIFT_NAME(
1548-
"BridgedAttributedTypeRepr.createParsed(base:consumingAttributes:)")
1503+
"BridgedAttributedTypeRepr.createParsed(_:base:consumingAttributes:)")
15491504
BridgedAttributedTypeRepr
1550-
BridgedAttributedTypeRepr_createParsed(BridgedTypeRepr base,
1505+
BridgedAttributedTypeRepr_createParsed(BridgedASTContext cContext,
1506+
BridgedTypeRepr base,
15511507
BridgedTypeAttributes cAttributes);
15521508

15531509
SWIFT_NAME("BridgedCompositionTypeRepr.createEmpty(_:anyKeywordLoc:)")

include/swift/AST/ASTBridgingWrappers.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ AST_BRIDGING_WRAPPER_NULLABLE(Expr)
7676
AST_BRIDGING_WRAPPER_NULLABLE(Pattern)
7777
AST_BRIDGING_WRAPPER_NULLABLE(TypeRepr)
7878
AST_BRIDGING_WRAPPER_NULLABLE(DeclAttribute)
79+
AST_BRIDGING_WRAPPER_NULLABLE(TypeAttribute)
7980

8081
// Misc AST types to generate wrappers for.
8182
AST_BRIDGING_WRAPPER_NULLABLE(GenericParamList)

include/swift/AST/Attr.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,10 @@ class DeclAttribute : public AttributeBase {
473473
/// and decl modifiers like 'final'. This returns DAK_Count on failure.
474474
///
475475
static DeclAttrKind getAttrKindFromString(StringRef Str);
476+
477+
static DeclAttribute *createSimple(const ASTContext &context,
478+
DeclAttrKind kind, SourceLoc atLoc,
479+
SourceLoc attrLoc);
476480
};
477481

478482
/// Describes a "simple" declaration attribute that carries no data.

lib/AST/ASTBridging.cpp

Lines changed: 69 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,6 @@
3737

3838
using namespace swift;
3939

40-
static llvm::Optional<TypeAttrKind> unbridged(BridgedTypeAttrKind kind) {
41-
switch (kind) {
42-
#define TYPE_ATTR(X, C) \
43-
case BridgedTypeAttrKind_##X: \
44-
return TAK_##X;
45-
#include "swift/AST/Attr.def"
46-
case BridgedTypeAttrKind_Count:
47-
return {};
48-
}
49-
}
50-
5140
static StaticSpellingKind unbridged(BridgedStaticSpelling kind) {
5241
return static_cast<StaticSpellingKind>(kind);
5342
}
@@ -183,9 +172,9 @@ bool BridgedASTContext_langOptsHasFeature(BridgedASTContext cContext,
183172
#include "swift/AST/PatternNodes.def"
184173

185174
#define SIMPLE_DECL_ATTR(...)
186-
#define DECL_ATTR(_, Id, ...) \
187-
BridgedDeclAttribute Bridged##Id##Attr_asDeclAttribute( \
188-
Bridged##Id##Attr attr) { \
175+
#define DECL_ATTR(_, CLASS, ...) \
176+
BridgedDeclAttribute Bridged##CLASS##Attr_asDeclAttribute( \
177+
Bridged##CLASS##Attr attr) { \
189178
return static_cast<DeclAttribute *>(attr.unbridged()); \
190179
}
191180
#include "swift/AST/Attr.def"
@@ -363,29 +352,36 @@ BridgedDeclContext BridgedPatternBindingInitializer_asDeclContext(
363352
//===----------------------------------------------------------------------===//
364353

365354
BridgedDeclAttrKind BridgedDeclAttrKind_fromString(BridgedStringRef cStr) {
366-
return llvm::StringSwitch<BridgedDeclAttrKind>(cStr.unbridged())
367-
#define DECL_ATTR(Name, Id, ...) .Case(#Name, BridgedDeclAttrKind##Id)
355+
auto kind = DeclAttribute::getAttrKindFromString(cStr.unbridged());
356+
switch (kind) {
357+
#define DECL_ATTR(_, CLASS, ...) \
358+
case DAK_##CLASS: \
359+
return BridgedDeclAttrKind##CLASS;
368360
#include "swift/AST/Attr.def"
369-
.Default(BridgedDeclAttrKindNone);
361+
case DAK_Count:
362+
return BridgedDeclAttrKindNone;
363+
}
370364
}
371365

372-
BridgedDeclAttribute BridgedDeclAttribute_createSimple(
373-
BridgedASTContext cContext, BridgedDeclAttrKind cKind,
374-
BridgedSourceLoc cAtLoc, BridgedSourceLoc cNameLoc) {
375-
auto &ctx = cContext.unbridged();
376-
switch (cKind) {
377-
#define SIMPLE_DECL_ATTR(Name, Id, ...) \
378-
case BridgedDeclAttrKind##Id: \
379-
return new (ctx) Id##Attr(cAtLoc.unbridged(), cNameLoc.unbridged());
380-
#define DECL_ATTR(Name, Id, ...) \
381-
case BridgedDeclAttrKind##Id: \
382-
llvm_unreachable("'" #Name "' is not a simple decl attribute");
366+
DeclAttrKind unbridged(BridgedDeclAttrKind kind) {
367+
switch (kind) {
368+
#define DECL_ATTR(_, CLASS, ...) \
369+
case BridgedDeclAttrKind##CLASS: \
370+
return DAK_##CLASS;
383371
#include "swift/AST/Attr.def"
384372
case BridgedDeclAttrKindNone:
385-
llvm_unreachable("not a decl attribute");
373+
return DAK_Count;
386374
}
387375
}
388376

377+
BridgedDeclAttribute BridgedDeclAttribute_createSimple(
378+
BridgedASTContext cContext, BridgedDeclAttrKind cKind,
379+
BridgedSourceLoc cAtLoc, BridgedSourceLoc cAttrLoc) {
380+
auto kind = unbridged(cKind);
381+
return DeclAttribute::createSimple(cContext.unbridged(), kind,
382+
cAtLoc.unbridged(), cAttrLoc.unbridged());
383+
}
384+
389385
void BridgedDeclAttributes_add(BridgedDeclAttributes *cAttrs,
390386
BridgedDeclAttribute cAdd) {
391387
auto attrs = cAttrs->unbridged();
@@ -1945,53 +1941,65 @@ BridgedYieldStmt BridgedYieldStmt_createParsed(BridgedASTContext cContext,
19451941
// MARK: TypeAttributes
19461942
//===----------------------------------------------------------------------===//
19471943

1948-
namespace swift {
1949-
class TypeAttributes {
1950-
public:
1951-
ASTContext &ctx;
1952-
SmallVector<TypeOrCustomAttr> attrs;
1953-
1954-
TypeAttributes(ASTContext &ctx) : ctx(ctx) {}
1955-
};
1956-
}
1957-
19581944
BridgedTypeAttrKind BridgedTypeAttrKind_fromString(BridgedStringRef cStr) {
19591945
auto optKind = TypeAttribute::getAttrKindFromString(cStr.unbridged());
1960-
if (!optKind) return BridgedTypeAttrKind_Count;
1946+
if (!optKind)
1947+
return BridgedTypeAttrKind_None;
19611948
switch (*optKind) {
1962-
#define TYPE_ATTR(X, C) \
1963-
case TAK_##X: \
1964-
return BridgedTypeAttrKind_##X;
1949+
#define TYPE_ATTR(SPELLING, _) \
1950+
case TAK_##SPELLING: \
1951+
return BridgedTypeAttrKind_##SPELLING;
19651952
#include "swift/AST/Attr.def"
19661953
}
19671954
}
19681955

1969-
BridgedTypeAttributes BridgedTypeAttributes_create(BridgedASTContext cContext) {
1970-
return {new TypeAttributes(cContext.unbridged())};
1956+
static llvm::Optional<TypeAttrKind> unbridged(BridgedTypeAttrKind kind) {
1957+
switch (kind) {
1958+
#define TYPE_ATTR(SPELLING, _) \
1959+
case BridgedTypeAttrKind_##SPELLING: \
1960+
return TAK_##SPELLING;
1961+
#include "swift/AST/Attr.def"
1962+
case BridgedTypeAttrKind_None:
1963+
return llvm::None;
1964+
}
1965+
llvm_unreachable("unhandled enum value");
19711966
}
19721967

1973-
void BridgedTypeAttributes_addSimpleAttr(BridgedTypeAttributes cAttributes,
1974-
BridgedTypeAttrKind cKind,
1975-
BridgedSourceLoc cAtLoc,
1976-
BridgedSourceLoc cAttrLoc) {
1977-
TypeAttributes *typeAttributes = cAttributes.unbridged();
1968+
namespace swift {
1969+
class TypeAttributes {
1970+
public:
1971+
SmallVector<TypeOrCustomAttr> attrs;
1972+
TypeAttributes() {}
1973+
};
1974+
} // namespace swift
19781975

1979-
auto atLoc = cAtLoc.unbridged();
1980-
auto attrLoc = cAttrLoc.unbridged();
1976+
BridgedTypeAttributes BridgedTypeAttributes_create() {
1977+
return new TypeAttributes();
1978+
}
19811979

1982-
auto optKind = unbridged(cKind);
1983-
assert(optKind && "creating attribute of invalid kind?");
1980+
void BridgedTypeAttributes_delete(BridgedTypeAttributes cAttributes) {
1981+
delete cAttributes.unbridged();
1982+
}
19841983

1985-
auto attr = TypeAttribute::createSimple(typeAttributes->ctx,
1986-
*optKind, atLoc, attrLoc);
1987-
typeAttributes->attrs.push_back(attr);
1984+
void BridgedTypeAttributes_add(BridgedTypeAttributes cAttributes,
1985+
BridgedTypeAttribute cAttribute) {
1986+
cAttributes.unbridged()->attrs.push_back(cAttribute.unbridged());
19881987
}
19891988

19901989
bool BridgedTypeAttributes_isEmpty(BridgedTypeAttributes cAttributes) {
19911990
TypeAttributes *typeAttributes = cAttributes.unbridged();
19921991
return typeAttributes->attrs.empty();
19931992
}
19941993

1994+
BridgedTypeAttribute BridgedTypeAttribute_createSimple(
1995+
BridgedASTContext cContext, BridgedTypeAttrKind cKind,
1996+
BridgedSourceLoc cAtLoc, BridgedSourceLoc cNameLoc) {
1997+
auto optKind = unbridged(cKind);
1998+
assert(optKind && "creating attribute of invalid kind?");
1999+
return TypeAttribute::createSimple(cContext.unbridged(), *optKind,
2000+
cAtLoc.unbridged(), cNameLoc.unbridged());
2001+
}
2002+
19952003
//===----------------------------------------------------------------------===//
19962004
// MARK: TypeReprs
19972005
//===----------------------------------------------------------------------===//
@@ -2104,14 +2112,14 @@ BridgedPackExpansionTypeRepr_createParsed(BridgedASTContext cContext,
21042112
}
21052113

21062114
BridgedAttributedTypeRepr
2107-
BridgedAttributedTypeRepr_createParsed(BridgedTypeRepr base,
2115+
BridgedAttributedTypeRepr_createParsed(BridgedASTContext cContext,
2116+
BridgedTypeRepr base,
21082117
BridgedTypeAttributes cAttributes) {
21092118
TypeAttributes *typeAttributes = cAttributes.unbridged();
21102119
assert(!typeAttributes->attrs.empty());
21112120

2112-
ASTContext &ctx = typeAttributes->ctx;
2113-
auto attributedType =
2114-
AttributedTypeRepr::create(ctx, typeAttributes->attrs, base.unbridged());
2121+
auto attributedType = AttributedTypeRepr::create(
2122+
cContext.unbridged(), typeAttributes->attrs, base.unbridged());
21152123
delete typeAttributes;
21162124
return attributedType;
21172125
}

lib/AST/Attr.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,26 @@ DeclAttrKind DeclAttribute::getAttrKindFromString(StringRef Str) {
261261
.Default(DAK_Count);
262262
}
263263

264+
DeclAttribute *DeclAttribute::createSimple(const ASTContext &context,
265+
DeclAttrKind kind, SourceLoc atLoc,
266+
SourceLoc attrLoc) {
267+
switch (kind) {
268+
// The simple cases should all be doing the exact same thing, and we
269+
// can reasonably hope that the optimizer will unify them so that this
270+
// function doesn't actually need a switch.
271+
#define DECL_ATTR(SPELLING, CLASS, ...) \
272+
case DAK_##CLASS: \
273+
llvm_unreachable("not a simple attribute");
274+
#define SIMPLE_DECL_ATTR(SPELLING, CLASS, ...) \
275+
case DAK_##CLASS: \
276+
return new (context) CLASS##Attr(atLoc, attrLoc);
277+
#include "swift/AST/Attr.def"
278+
case DAK_Count:
279+
llvm_unreachable("bad decl attribute kind");
280+
}
281+
llvm_unreachable("bad decl attribute kind");
282+
}
283+
264284
/// Returns true if this attribute can appear on the specified decl.
265285
bool DeclAttribute::canAttributeAppearOnDecl(DeclAttrKind DK, const Decl *D) {
266286
if ((getOptions(DK) & OnAnyClangDecl) && D->hasClangNode())

lib/ASTGen/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ endif()
2727

2828
add_pure_swift_host_library(swiftASTGen STATIC
2929
Sources/ASTGen/ASTGen.swift
30-
Sources/ASTGen/Attrs.swift
3130
Sources/ASTGen/Bridge.swift
31+
Sources/ASTGen/DeclAttrs.swift
3232
Sources/ASTGen/Decls.swift
3333
Sources/ASTGen/Diagnostics.swift
3434
Sources/ASTGen/DiagnosticsBridge.swift
@@ -45,6 +45,7 @@ add_pure_swift_host_library(swiftASTGen STATIC
4545
Sources/ASTGen/SourceManager.swift
4646
Sources/ASTGen/SourceManager+MacroExpansionContext.swift
4747
Sources/ASTGen/Stmts.swift
48+
Sources/ASTGen/TypeAttrs.swift
4849
Sources/ASTGen/Types.swift
4950

5051
DEPENDENCIES

0 commit comments

Comments
 (0)