Skip to content

Commit 119ea05

Browse files
authored
Merge pull request swiftlang#63228 from DougGregor/freestanding-macro-attr-cleanup
2 parents 4655604 + dbbf6aa commit 119ea05

30 files changed

+230
-364
lines changed

include/swift/AST/Attr.h

Lines changed: 15 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2307,69 +2307,38 @@ class ObjCImplementationAttr final : public DeclAttribute {
23072307
}
23082308
};
23092309

2310-
class DeclarationAttr final
2310+
/// A macro role attribute, spelled with either @attached or @freestanding,
2311+
/// which declares one of the roles that a given macro can inhabit.
2312+
class MacroRoleAttr final
23112313
: public DeclAttribute,
2312-
private llvm::TrailingObjects<DeclarationAttr, MacroIntroducedDeclName> {
2313-
friend TrailingObjects;
2314-
2315-
MacroRole role;
2316-
unsigned numPeerNames, numMemberNames;
2317-
2318-
DeclarationAttr(SourceLoc atLoc, SourceRange range, MacroRole role,
2319-
ArrayRef<MacroIntroducedDeclName> peerNames,
2320-
ArrayRef<MacroIntroducedDeclName> memberNames,
2321-
bool implicit);
2322-
2323-
public:
2324-
static DeclarationAttr *create(ASTContext &ctx, SourceLoc atLoc,
2325-
SourceRange range, MacroRole role,
2326-
ArrayRef<MacroIntroducedDeclName> peerNames,
2327-
ArrayRef<MacroIntroducedDeclName> memberNames,
2328-
bool implicit);
2329-
2330-
size_t numTrailingObjects(OverloadToken<MacroIntroducedDeclName>) const {
2331-
return numPeerNames + numMemberNames;
2332-
}
2333-
2334-
MacroRole getMacroRole() const { return role; }
2335-
ArrayRef<MacroIntroducedDeclName> getPeerAndMemberNames() const;
2336-
ArrayRef<MacroIntroducedDeclName> getPeerNames() const;
2337-
ArrayRef<MacroIntroducedDeclName> getMemberNames() const;
2338-
2339-
static bool classof(const DeclAttribute *DA) {
2340-
return DA->getKind() == DAK_Declaration;
2341-
}
2342-
};
2343-
2344-
/// The @attached attribute, which declares that a given macro can be
2345-
/// "attached" as an attribute to declarations.
2346-
class AttachedAttr final
2347-
: public DeclAttribute,
2348-
private llvm::TrailingObjects<AttachedAttr, MacroIntroducedDeclName> {
2314+
private llvm::TrailingObjects<MacroRoleAttr, MacroIntroducedDeclName> {
23492315
friend TrailingObjects;
23502316

2317+
MacroSyntax syntax;
23512318
MacroRole role;
23522319
unsigned numNames;
23532320

2354-
AttachedAttr(SourceLoc atLoc, SourceRange range, MacroRole role,
2355-
ArrayRef<MacroIntroducedDeclName> names,
2356-
bool implicit);
2321+
MacroRoleAttr(SourceLoc atLoc, SourceRange range, MacroSyntax syntax,
2322+
MacroRole role, ArrayRef<MacroIntroducedDeclName> names,
2323+
bool implicit);
23572324

23582325
public:
2359-
static AttachedAttr *create(ASTContext &ctx, SourceLoc atLoc,
2360-
SourceRange range, MacroRole role,
2361-
ArrayRef<MacroIntroducedDeclName> names,
2362-
bool implicit);
2326+
static MacroRoleAttr *create(ASTContext &ctx, SourceLoc atLoc,
2327+
SourceRange range, MacroSyntax syntax,
2328+
MacroRole role,
2329+
ArrayRef<MacroIntroducedDeclName> names,
2330+
bool implicit);
23632331

23642332
size_t numTrailingObjects(OverloadToken<MacroIntroducedDeclName>) const {
23652333
return numNames;
23662334
}
23672335

2336+
MacroSyntax getMacroSyntax() const { return syntax; }
23682337
MacroRole getMacroRole() const { return role; }
23692338
ArrayRef<MacroIntroducedDeclName> getNames() const;
23702339

23712340
static bool classof(const DeclAttribute *DA) {
2372-
return DA->getKind() == DAK_Attached;
2341+
return DA->getKind() == DAK_MacroRole;
23732342
}
23742343
};
23752344

include/swift/AST/DiagnosticsParse.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2043,6 +2043,8 @@ ERROR(macro_attribute_introduced_name_requires_argument,PointsToFirstBadToken,
20432043
"introduced name kind %0 requires a single argument '(name)'", (Identifier))
20442044
ERROR(macro_attribute_introduced_name_requires_no_argument,PointsToFirstBadToken,
20452045
"introduced name kind %0 must not have an argument", (Identifier))
2046+
WARNING(macro_expression_attribute_removed,PointsToFirstBadToken,
2047+
"@expression has been removed in favor of @freestanding(expression)", ())
20462048

20472049
ERROR(unexpected_attribute_expansion,PointsToFirstBadToken,
20482050
"unexpected token '%0' in expanded attribute list'",

include/swift/AST/DiagnosticsSema.def

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6860,8 +6860,8 @@ WARNING(macro_type_access_warn,none,
68606860
(bool, AccessLevel, AccessLevel, bool))
68616861
ERROR(macro_in_nested,none,
68626862
"macro %0 can only be declared at file scope", (DeclName))
6863-
ERROR(macro_without_context,none,
6864-
"macro %0 must declare its applicable contexts (e.g., '@expression')",
6863+
ERROR(macro_without_role,none,
6864+
"macro %0 must declare its applicable roles via '@freestanding' or @attached'",
68656865
(DeclName))
68666866
ERROR(macro_expansion_missing_pound,none,
68676867
"expansion of macro %0 requires leading '#'", (DeclName))

include/swift/AST/MacroDeclaration.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,25 @@
2121

2222
namespace swift {
2323

24+
/// Describes the syntax that is used for a macro, which affects its role.
25+
enum class MacroSyntax: uint8_t {
26+
/// Freestanding macro syntax starting with an explicit '#' followed by the
27+
/// macro name and optional arguments.
28+
Freestanding,
29+
30+
/// Attached macro syntax written as an attribute with a leading `@` followed
31+
/// by the macro name an optional arguments.
32+
Attached,
33+
};
34+
2435
/// The context in which a macro can be used, which determines the syntax it
2536
/// uses.
2637
enum class MacroRole: uint32_t {
2738
/// An expression macro, referenced explicitly via "#stringify" or similar
2839
/// in the source code.
2940
Expression = 0x01,
3041
/// A freestanding declaration macro.
31-
FreestandingDeclaration = 0x02,
42+
Declaration = 0x02,
3243
/// An attached macro that declares accessors for a variable or subscript
3344
/// declaration.
3445
Accessor = 0x04,

include/swift/AST/TypeCheckRequests.h

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3783,23 +3783,6 @@ class GetTypeWrapperInitializer
37833783
bool isCached() const { return true; }
37843784
};
37853785

3786-
/// Check whether this is a protocol that has a type wrapper attribute
3787-
/// or one of its dependencies does.
3788-
class UsesTypeWrapperFeature
3789-
: public SimpleRequest<UsesTypeWrapperFeature, bool(NominalTypeDecl *),
3790-
RequestFlags::Cached> {
3791-
public:
3792-
using SimpleRequest::SimpleRequest;
3793-
3794-
private:
3795-
friend SimpleRequest;
3796-
3797-
bool evaluate(Evaluator &evaluator, NominalTypeDecl *) const;
3798-
3799-
public:
3800-
bool isCached() const { return true; }
3801-
};
3802-
38033786
/// Find the definition of a given macro.
38043787
class MacroDefinitionRequest
38053788
: public SimpleRequest<MacroDefinitionRequest,

include/swift/Parse/Parser.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,13 +1101,11 @@ class Parser {
11011101
bool parseDocumentationAttributeArgument(Optional<StringRef> &Metadata,
11021102
Optional<AccessLevel> &Visibility);
11031103

1104-
/// Parse the @declaration attribute.
1105-
ParserResult<DeclarationAttr> parseDeclarationAttribute(SourceLoc AtLoc,
1106-
SourceLoc Loc);
1107-
1108-
/// Parse the @attached attribute.
1109-
ParserResult<AttachedAttr> parseAttachedAttribute(SourceLoc AtLoc,
1110-
SourceLoc Loc);
1104+
/// Parse the @attached or @freestanding attribute that specifies a macro
1105+
/// role.
1106+
ParserResult<MacroRoleAttr> parseMacroRoleAttribute(
1107+
MacroSyntax syntax, SourceLoc AtLoc, SourceLoc Loc
1108+
);
11111109

11121110
/// Parse a specific attribute.
11131111
ParserStatus parseDeclAttribute(DeclAttributes &Attributes, SourceLoc AtLoc,

lib/AST/ASTScopeCreation.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ ASTSourceFileScope::ASTSourceFileScope(SourceFile *SF,
255255
// Determine the parent source location based on the macro role.
256256
switch (*macroRole) {
257257
case MacroRole::Expression:
258-
case MacroRole::FreestandingDeclaration:
258+
case MacroRole::Declaration:
259259
case MacroRole::Accessor:
260260
case MacroRole::MemberAttribute:
261261
parentLoc = expansion.getStartLoc();

lib/AST/Attr.cpp

Lines changed: 32 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1311,19 +1311,18 @@ bool DeclAttribute::printImpl(ASTPrinter &Printer, const PrintOptions &Options,
13111311
break;
13121312
}
13131313

1314-
case DAK_Declaration: {
1315-
Printer.printAttrName("@declaration");
1316-
Printer << "(";
1317-
auto Attr = cast<DeclarationAttr>(this);
1318-
Printer << getMacroRoleString(Attr->getMacroRole());
1319-
Printer << ")";
1320-
break;
1321-
}
1314+
case DAK_MacroRole: {
1315+
auto Attr = cast<MacroRoleAttr>(this);
1316+
switch (Attr->getMacroSyntax()) {
1317+
case MacroSyntax::Freestanding:
1318+
Printer.printAttrName("@freestanding");
1319+
break;
13221320

1323-
case DAK_Attached: {
1324-
Printer.printAttrName("@attached");
1321+
case MacroSyntax::Attached:
1322+
Printer.printAttrName("@attached");
1323+
break;
1324+
}
13251325
Printer << "(";
1326-
auto Attr = cast<AttachedAttr>(this);
13271326
Printer << getMacroRoleString(Attr->getMacroRole());
13281327
if (!Attr->getNames().empty()) {
13291328
Printer << ", names: ";
@@ -1518,10 +1517,14 @@ StringRef DeclAttribute::getAttrName() const {
15181517
return "_expose";
15191518
case DAK_Documentation:
15201519
return "_documentation";
1521-
case DAK_Declaration:
1522-
return "declaration";
1523-
case DAK_Attached:
1524-
return "attached";
1520+
case DAK_MacroRole:
1521+
switch (cast<MacroRoleAttr>(this)->getMacroSyntax()) {
1522+
case MacroSyntax::Freestanding:
1523+
return "freestanding";
1524+
1525+
case MacroSyntax::Attached:
1526+
return "attached";
1527+
}
15251528
}
15261529
llvm_unreachable("bad DeclAttrKind");
15271530
}
@@ -2359,73 +2362,27 @@ bool CustomAttr::isAttachedMacro(const Decl *decl) const {
23592362
return macroDecl != nullptr;
23602363
}
23612364

2362-
DeclarationAttr::DeclarationAttr(SourceLoc atLoc, SourceRange range,
2363-
MacroRole role,
2364-
ArrayRef<MacroIntroducedDeclName> peerNames,
2365-
ArrayRef<MacroIntroducedDeclName> memberNames,
2366-
bool implicit)
2367-
: DeclAttribute(DAK_Declaration, atLoc, range, implicit),
2368-
role(role), numPeerNames(peerNames.size()),
2369-
numMemberNames(memberNames.size()) {
2370-
auto *trailingNamesBuffer = getTrailingObjects<MacroIntroducedDeclName>();
2371-
std::uninitialized_copy(peerNames.begin(), peerNames.end(),
2372-
trailingNamesBuffer);
2373-
std::uninitialized_copy(memberNames.begin(), memberNames.end(),
2374-
trailingNamesBuffer + peerNames.size());
2375-
}
2376-
2377-
DeclarationAttr *
2378-
DeclarationAttr::create(ASTContext &ctx, SourceLoc atLoc, SourceRange range,
2379-
MacroRole role,
2380-
ArrayRef<MacroIntroducedDeclName> peerNames,
2381-
ArrayRef<MacroIntroducedDeclName> memberNames,
2382-
bool implicit) {
2383-
unsigned size = totalSizeToAlloc<MacroIntroducedDeclName>(
2384-
peerNames.size() + memberNames.size());
2385-
auto *mem = ctx.Allocate(size, alignof(DeclarationAttr));
2386-
return new (mem) DeclarationAttr(atLoc, range, role, peerNames,
2387-
memberNames, implicit);
2388-
}
2389-
2390-
ArrayRef<MacroIntroducedDeclName> DeclarationAttr::getPeerAndMemberNames() const {
2391-
return {
2392-
getTrailingObjects<MacroIntroducedDeclName>(),
2393-
numPeerNames + numMemberNames
2394-
};
2395-
}
2396-
2397-
ArrayRef<MacroIntroducedDeclName> DeclarationAttr::getPeerNames() const {
2398-
return {getTrailingObjects<MacroIntroducedDeclName>(), numPeerNames};
2399-
}
2400-
2401-
ArrayRef<MacroIntroducedDeclName> DeclarationAttr::getMemberNames() const {
2402-
return {
2403-
getTrailingObjects<MacroIntroducedDeclName>() + numPeerNames,
2404-
numMemberNames
2405-
};
2406-
}
2407-
2408-
AttachedAttr::AttachedAttr(SourceLoc atLoc, SourceRange range,
2409-
MacroRole role,
2410-
ArrayRef<MacroIntroducedDeclName> names,
2411-
bool implicit)
2412-
: DeclAttribute(DAK_Attached, atLoc, range, implicit),
2413-
role(role), numNames(names.size()) {
2365+
MacroRoleAttr::MacroRoleAttr(SourceLoc atLoc, SourceRange range,
2366+
MacroSyntax syntax, MacroRole role,
2367+
ArrayRef<MacroIntroducedDeclName> names,
2368+
bool implicit)
2369+
: DeclAttribute(DAK_MacroRole, atLoc, range, implicit),
2370+
syntax(syntax), role(role), numNames(names.size()) {
24142371
auto *trailingNamesBuffer = getTrailingObjects<MacroIntroducedDeclName>();
24152372
std::uninitialized_copy(names.begin(), names.end(), trailingNamesBuffer);
24162373
}
24172374

2418-
AttachedAttr *
2419-
AttachedAttr::create(ASTContext &ctx, SourceLoc atLoc, SourceRange range,
2420-
MacroRole role,
2421-
ArrayRef<MacroIntroducedDeclName> names,
2422-
bool implicit) {
2375+
MacroRoleAttr *
2376+
MacroRoleAttr::create(ASTContext &ctx, SourceLoc atLoc, SourceRange range,
2377+
MacroSyntax syntax, MacroRole role,
2378+
ArrayRef<MacroIntroducedDeclName> names,
2379+
bool implicit) {
24232380
unsigned size = totalSizeToAlloc<MacroIntroducedDeclName>(names.size());
2424-
auto *mem = ctx.Allocate(size, alignof(AttachedAttr));
2425-
return new (mem) AttachedAttr(atLoc, range, role, names, implicit);
2381+
auto *mem = ctx.Allocate(size, alignof(MacroRoleAttr));
2382+
return new (mem) MacroRoleAttr(atLoc, range, syntax, role, names, implicit);
24262383
}
24272384

2428-
ArrayRef<MacroIntroducedDeclName> AttachedAttr::getNames() const {
2385+
ArrayRef<MacroIntroducedDeclName> MacroRoleAttr::getNames() const {
24292386
return {
24302387
getTrailingObjects<MacroIntroducedDeclName>(),
24312388
numNames

lib/AST/Decl.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9717,7 +9717,7 @@ StringRef swift::getMacroRoleString(MacroRole role) {
97179717
case MacroRole::Expression:
97189718
return "expression";
97199719

9720-
case MacroRole::FreestandingDeclaration:
9720+
case MacroRole::Declaration:
97219721
return "freestanding";
97229722

97239723
case MacroRole::Accessor:
@@ -9769,7 +9769,7 @@ StringRef swift::getMacroIntroducedDeclNameString(
97699769
static MacroRoles freestandingMacroRoles =
97709770
(MacroRoles() |
97719771
MacroRole::Expression |
9772-
MacroRole::FreestandingDeclaration);
9772+
MacroRole::Declaration);
97739773
static MacroRoles attachedMacroRoles = (MacroRoles() |
97749774
MacroRole::Accessor |
97759775
MacroRole::MemberAttribute |
@@ -9825,11 +9825,7 @@ SourceRange MacroDecl::getSourceRange() const {
98259825

98269826
MacroRoles MacroDecl::getMacroRoles() const {
98279827
MacroRoles contexts = None;
9828-
if (getAttrs().hasAttribute<ExpressionAttr>())
9829-
contexts |= MacroRole::Expression;
9830-
for (auto attr : getAttrs().getAttributes<DeclarationAttr>())
9831-
contexts |= attr->getMacroRole();
9832-
for (auto attr : getAttrs().getAttributes<AttachedAttr>())
9828+
for (auto attr : getAttrs().getAttributes<MacroRoleAttr>())
98339829
contexts |= attr->getMacroRole();
98349830
return contexts;
98359831
}

lib/AST/Module.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -907,7 +907,7 @@ Optional<MacroRole> SourceFile::getFulfilledMacroRole() const {
907907
return MacroRole::Expression;
908908

909909
case GeneratedSourceInfo::FreestandingDeclMacroExpansion:
910-
return MacroRole::FreestandingDeclaration;
910+
return MacroRole::Declaration;
911911

912912
case GeneratedSourceInfo::AccessorMacroExpansion:
913913
return MacroRole::Accessor;

0 commit comments

Comments
 (0)