Skip to content

Commit 03319e5

Browse files
authored
Merge pull request #77412 from rintaro/astgen-macrodecl
[ASTGen] Generate MacroDecl
2 parents 34a2618 + f47c2b3 commit 03319e5

File tree

15 files changed

+532
-60
lines changed

15 files changed

+532
-60
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ class DiagnosticEngine;
4545
class Identifier;
4646
class IfConfigClauseRangeInfo;
4747
struct LabeledStmtInfo;
48+
enum class MacroRole : uint32_t;
49+
class MacroIntroducedDeclName;
50+
enum class MacroIntroducedDeclNameKind;
4851
enum class ParamSpecifier : uint8_t;
4952
class ProtocolConformanceRef;
5053
class RegexLiteralPatternFeature;
@@ -60,6 +63,7 @@ struct BridgedASTType;
6063
class BridgedCanType;
6164
class BridgedASTContext;
6265
struct BridgedSubstitutionMap;
66+
class BridgedParameterList;
6367

6468
//===----------------------------------------------------------------------===//
6569
// MARK: Identifier
@@ -119,6 +123,8 @@ class BridgedDeclNameRef {
119123
void *_Nonnull opaque;
120124

121125
public:
126+
BRIDGED_INLINE BridgedDeclNameRef();
127+
122128
BRIDGED_INLINE BridgedDeclNameRef(swift::DeclNameRef name);
123129

124130
BRIDGED_INLINE swift::DeclNameRef unbridged() const;
@@ -599,6 +605,13 @@ BridgedCDeclAttr BridgedCDeclAttr_createParsed(BridgedASTContext cContext,
599605
BridgedSourceRange cRange,
600606
BridgedStringRef cName);
601607

608+
SWIFT_NAME(
609+
"BridgedCustomAttr.createParsed(_:atLoc:type:initContext:argumentList:)")
610+
BridgedCustomAttr BridgedCustomAttr_createParsed(
611+
BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedTypeRepr cType,
612+
BridgedNullablePatternBindingInitializer cInitContext,
613+
BridgedNullableArgumentList cArgumentList);
614+
602615
SWIFT_NAME(
603616
"BridgedDynamicReplacementAttr.createParsed(_:atLoc:attrNameLoc:lParenLoc:"
604617
"replacedFunction:rParenLoc:)")
@@ -686,6 +699,51 @@ BridgedMainTypeAttr BridgedMainTypeAttr_createParsed(BridgedASTContext cContext,
686699
BridgedSourceLoc cAtLoc,
687700
BridgedSourceLoc cNameLoc);
688701

702+
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedMacroSyntax {
703+
BridgedMacroSyntaxFreestanding,
704+
BridgedMacroSyntaxAttached,
705+
};
706+
707+
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedMacroIntroducedDeclNameKind {
708+
BridgedMacroIntroducedDeclNameKindNamed,
709+
BridgedMacroIntroducedDeclNameKindOverloaded,
710+
BridgedMacroIntroducedDeclNameKindPrefixed,
711+
BridgedMacroIntroducedDeclNameKindSuffixed,
712+
BridgedMacroIntroducedDeclNameKindArbitrary,
713+
};
714+
715+
BRIDGED_INLINE swift::MacroIntroducedDeclNameKind
716+
unbridge(BridgedMacroIntroducedDeclNameKind kind);
717+
718+
struct BridgedMacroIntroducedDeclName {
719+
BridgedMacroIntroducedDeclNameKind kind;
720+
BridgedDeclNameRef name;
721+
722+
BRIDGED_INLINE swift::MacroIntroducedDeclName unbridged() const;
723+
};
724+
725+
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedMacroRole {
726+
#define MACRO_ROLE(Name, Description) BridgedMacroRole##Name,
727+
#include "swift/Basic/MacroRoles.def"
728+
BridgedMacroRoleNone,
729+
};
730+
731+
BRIDGED_INLINE swift::MacroRole unbridge(BridgedMacroRole cRole);
732+
733+
SWIFT_NAME("BridgedMacroRole.init(from:)")
734+
BridgedMacroRole BridgedMacroRole_fromString(BridgedStringRef str);
735+
736+
SWIFT_NAME("getter:BridgedMacroRole.isAttached(self:)")
737+
BRIDGED_INLINE bool BridgedMacroRole_isAttached(BridgedMacroRole role);
738+
739+
SWIFT_NAME("BridgedMacroRoleAttr.createParsed(_:atLoc:range:syntax:lParenLoc:"
740+
"role:names:conformances:rParenLoc:)")
741+
BridgedMacroRoleAttr BridgedMacroRoleAttr_createParsed(
742+
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
743+
BridgedSourceRange cRange, BridgedMacroSyntax cSyntax,
744+
BridgedSourceLoc cLParenLoc, BridgedMacroRole cRole, BridgedArrayRef cNames,
745+
BridgedArrayRef cConformances, BridgedSourceLoc cRParenLoc);
746+
689747
SWIFT_NAME(
690748
"BridgedSwiftNativeObjCRuntimeBaseAttr.createParsed(_:atLoc:range:name:)")
691749
BridgedSwiftNativeObjCRuntimeBaseAttr
@@ -1003,6 +1061,16 @@ BridgedAssociatedTypeDecl BridgedAssociatedTypeDecl_createParsed(
10031061
BridgedNullableTypeRepr opaqueDefaultType,
10041062
BridgedNullableTrailingWhereClause genericWhereClause);
10051063

1064+
SWIFT_NAME(
1065+
"BridgedMacroDecl.createParsed(_:declContext:macroKeywordLoc:name:nameLoc:"
1066+
"genericParamList:paramList:arrowLoc:resultType:definition:)")
1067+
BridgedMacroDecl BridgedMacroDecl_createParsed(
1068+
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
1069+
BridgedSourceLoc cMacroLoc, BridgedIdentifier cName,
1070+
BridgedSourceLoc cNameLoc, BridgedNullableGenericParamList cGenericParams,
1071+
BridgedParameterList cParams, BridgedSourceLoc cArrowLoc,
1072+
BridgedNullableTypeRepr cResultType, BridgedNullableExpr cDefinition);
1073+
10061074
SWIFT_NAME("BridgedMacroExpansionDecl.createParsed(_:poundLoc:macroNameRef:"
10071075
"macroNameLoc:leftAngleLoc:genericArgs:rightAngleLoc:args:)")
10081076
BridgedMacroExpansionDecl BridgedMacroExpansionDecl_createParsed(

include/swift/AST/ASTBridgingImpl.h

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "swift/AST/Decl.h"
1919
#include "swift/AST/Expr.h"
2020
#include "swift/AST/IfConfigClauseRangeInfo.h"
21+
#include "swift/AST/MacroDeclaration.h"
2122
#include "swift/AST/ProtocolConformance.h"
2223
#include "swift/AST/ProtocolConformanceRef.h"
2324
#include "swift/AST/SourceFile.h"
@@ -52,6 +53,9 @@ swift::DeclBaseName BridgedDeclBaseName::unbridged() const {
5253
// MARK: BridgedDeclNameRef
5354
//===----------------------------------------------------------------------===//
5455

56+
BridgedDeclNameRef::BridgedDeclNameRef()
57+
: BridgedDeclNameRef(swift::DeclNameRef()) {}
58+
5559
BridgedDeclNameRef::BridgedDeclNameRef(swift::DeclNameRef name)
5660
: opaque(name.getOpaqueValue()) {}
5761

@@ -380,6 +384,47 @@ BridgedConformance BridgedConformanceArray::getAt(SwiftInt index) const {
380384
return pcArray.unbridged<swift::ProtocolConformanceRef>()[index];
381385
}
382386

387+
//===----------------------------------------------------------------------===//
388+
// MARK: Macros
389+
//===----------------------------------------------------------------------===//
390+
391+
swift::MacroRole unbridge(BridgedMacroRole cRole) {
392+
switch (cRole) {
393+
#define MACRO_ROLE(Name, Description) \
394+
case BridgedMacroRole##Name: \
395+
return swift::MacroRole::Name;
396+
#include "swift/Basic/MacroRoles.def"
397+
case BridgedMacroRoleNone:
398+
break;
399+
}
400+
llvm_unreachable("invalid macro role");
401+
}
402+
403+
swift::MacroIntroducedDeclNameKind
404+
unbridge(BridgedMacroIntroducedDeclNameKind kind) {
405+
switch (kind) {
406+
#define CASE(ID) \
407+
case BridgedMacroIntroducedDeclNameKind##ID: \
408+
return swift::MacroIntroducedDeclNameKind::ID;
409+
CASE(Named)
410+
CASE(Overloaded)
411+
CASE(Prefixed)
412+
CASE(Suffixed)
413+
CASE(Arbitrary)
414+
#undef CASE
415+
}
416+
}
417+
418+
bool BridgedMacroRole_isAttached(BridgedMacroRole role) {
419+
return isAttachedMacro(unbridge(role));
420+
}
421+
422+
swift::MacroIntroducedDeclName
423+
BridgedMacroIntroducedDeclName::unbridged() const {
424+
return swift::MacroIntroducedDeclName(unbridge(kind),
425+
name.unbridged().getFullName());
426+
}
427+
383428
//===----------------------------------------------------------------------===//
384429
// MARK: BridgedSubstitutionMap
385430
//===----------------------------------------------------------------------===//

include/swift/AST/Attr.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2495,7 +2495,7 @@ class NonisolatedAttr final : public DeclAttribute {
24952495
class MacroRoleAttr final
24962496
: public DeclAttribute,
24972497
private llvm::TrailingObjects<MacroRoleAttr, MacroIntroducedDeclName,
2498-
TypeExpr *> {
2498+
Expr *> {
24992499
friend TrailingObjects;
25002500

25012501
MacroSyntax syntax;
@@ -2507,22 +2507,22 @@ class MacroRoleAttr final
25072507
MacroRoleAttr(SourceLoc atLoc, SourceRange range, MacroSyntax syntax,
25082508
SourceLoc lParenLoc, MacroRole role,
25092509
ArrayRef<MacroIntroducedDeclName> names,
2510-
ArrayRef<TypeExpr *> conformances,
2511-
SourceLoc rParenLoc, bool implicit);
2510+
ArrayRef<Expr *> conformances, SourceLoc rParenLoc,
2511+
bool implicit);
25122512

25132513
public:
25142514
static MacroRoleAttr *create(ASTContext &ctx, SourceLoc atLoc,
25152515
SourceRange range, MacroSyntax syntax,
25162516
SourceLoc lParenLoc, MacroRole role,
25172517
ArrayRef<MacroIntroducedDeclName> names,
2518-
ArrayRef<TypeExpr *> conformances,
2518+
ArrayRef<Expr *> conformances,
25192519
SourceLoc rParenLoc, bool implicit);
25202520

25212521
size_t numTrailingObjects(OverloadToken<MacroIntroducedDeclName>) const {
25222522
return numNames;
25232523
}
25242524

2525-
size_t numTrailingObjects(OverloadToken<TypeExpr *>) const {
2525+
size_t numTrailingObjects(OverloadToken<Expr *>) const {
25262526
return numConformances;
25272527
}
25282528

@@ -2532,7 +2532,8 @@ class MacroRoleAttr final
25322532
MacroSyntax getMacroSyntax() const { return syntax; }
25332533
MacroRole getMacroRole() const { return role; }
25342534
ArrayRef<MacroIntroducedDeclName> getNames() const;
2535-
ArrayRef<TypeExpr *> getConformances() const;
2535+
ArrayRef<Expr *> getConformances() const;
2536+
MutableArrayRef<Expr *> getConformances();
25362537
bool hasNameKind(MacroIntroducedDeclNameKind kind) const;
25372538

25382539
static bool classof(const DeclAttribute *DA) {

lib/AST/Attr.cpp

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2960,29 +2960,28 @@ MacroRoleAttr::MacroRoleAttr(SourceLoc atLoc, SourceRange range,
29602960
MacroSyntax syntax, SourceLoc lParenLoc,
29612961
MacroRole role,
29622962
ArrayRef<MacroIntroducedDeclName> names,
2963-
ArrayRef<TypeExpr *> conformances,
2964-
SourceLoc rParenLoc, bool implicit)
2963+
ArrayRef<Expr *> conformances, SourceLoc rParenLoc,
2964+
bool implicit)
29652965
: DeclAttribute(DeclAttrKind::MacroRole, atLoc, range, implicit),
29662966
syntax(syntax), role(role), numNames(names.size()),
29672967
numConformances(conformances.size()), lParenLoc(lParenLoc),
29682968
rParenLoc(rParenLoc) {
29692969
auto *trailingNamesBuffer = getTrailingObjects<MacroIntroducedDeclName>();
29702970
std::uninitialized_copy(names.begin(), names.end(), trailingNamesBuffer);
29712971

2972-
auto *trailingConformancesBuffer = getTrailingObjects<TypeExpr *>();
2972+
auto *trailingConformancesBuffer = getTrailingObjects<Expr *>();
29732973
std::uninitialized_copy(conformances.begin(), conformances.end(),
29742974
trailingConformancesBuffer);
29752975
}
29762976

2977-
MacroRoleAttr *
2978-
MacroRoleAttr::create(ASTContext &ctx, SourceLoc atLoc, SourceRange range,
2979-
MacroSyntax syntax, SourceLoc lParenLoc, MacroRole role,
2980-
ArrayRef<MacroIntroducedDeclName> names,
2981-
ArrayRef<TypeExpr *> conformances,
2982-
SourceLoc rParenLoc, bool implicit) {
2983-
unsigned size =
2984-
totalSizeToAlloc<MacroIntroducedDeclName, TypeExpr *>(
2985-
names.size(), conformances.size());
2977+
MacroRoleAttr *MacroRoleAttr::create(ASTContext &ctx, SourceLoc atLoc,
2978+
SourceRange range, MacroSyntax syntax,
2979+
SourceLoc lParenLoc, MacroRole role,
2980+
ArrayRef<MacroIntroducedDeclName> names,
2981+
ArrayRef<Expr *> conformances,
2982+
SourceLoc rParenLoc, bool implicit) {
2983+
unsigned size = totalSizeToAlloc<MacroIntroducedDeclName, Expr *>(
2984+
names.size(), conformances.size());
29862985
auto *mem = ctx.Allocate(size, alignof(MacroRoleAttr));
29872986
return new (mem) MacroRoleAttr(atLoc, range, syntax, lParenLoc, role, names,
29882987
conformances, rParenLoc, implicit);
@@ -2995,11 +2994,12 @@ ArrayRef<MacroIntroducedDeclName> MacroRoleAttr::getNames() const {
29952994
};
29962995
}
29972996

2998-
ArrayRef<TypeExpr *> MacroRoleAttr::getConformances() const {
2999-
return {
3000-
getTrailingObjects<TypeExpr *>(),
3001-
numConformances
3002-
};
2997+
ArrayRef<Expr *> MacroRoleAttr::getConformances() const {
2998+
return {getTrailingObjects<Expr *>(), numConformances};
2999+
}
3000+
3001+
MutableArrayRef<Expr *> MacroRoleAttr::getConformances() {
3002+
return {getTrailingObjects<Expr *>(), numConformances};
30033003
}
30043004

30053005
bool MacroRoleAttr::hasNameKind(MacroIntroducedDeclNameKind kind) const {

lib/AST/Bridging/DeclAttributeBridging.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include "swift/AST/ASTContext.h"
1616
#include "swift/AST/Attr.h"
17+
#include "swift/AST/Expr.h"
1718
#include "swift/AST/Identifier.h"
1819
#include "swift/Basic/Assertions.h"
1920

@@ -129,6 +130,16 @@ BridgedCDeclAttr BridgedCDeclAttr_createParsed(BridgedASTContext cContext,
129130
/*Implicit=*/false);
130131
}
131132

133+
BridgedCustomAttr BridgedCustomAttr_createParsed(
134+
BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedTypeRepr cType,
135+
BridgedNullablePatternBindingInitializer cInitContext,
136+
BridgedNullableArgumentList cArgumentList) {
137+
ASTContext &context = cContext.unbridged();
138+
return CustomAttr::create(
139+
context, cAtLoc.unbridged(), new (context) TypeExpr(cType.unbridged()),
140+
cInitContext.unbridged(), cArgumentList.unbridged());
141+
}
142+
132143
BridgedDynamicReplacementAttr BridgedDynamicReplacementAttr_createParsed(
133144
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
134145
BridgedSourceLoc cAttrNameLoc, BridgedSourceLoc cLParenLoc,
@@ -266,6 +277,44 @@ BridgedInlineAttr BridgedInlineAttr_createParsed(BridgedASTContext cContext,
266277
InlineAttr(cAtLoc.unbridged(), cRange.unbridged(), unbridged(cKind));
267278
}
268279

280+
BridgedMacroRole BridgedMacroRole_fromString(BridgedStringRef str) {
281+
// Match the role string to the known set of roles.
282+
auto role =
283+
llvm::StringSwitch<std::optional<BridgedMacroRole>>(str.unbridged())
284+
#define MACRO_ROLE(Name, Description) .Case(Description, BridgedMacroRole##Name)
285+
#include "swift/Basic/MacroRoles.def"
286+
.Default(std::nullopt);
287+
return role.has_value() ? *role : BridgedMacroRoleNone;
288+
}
289+
290+
MacroSyntax unbridge(BridgedMacroSyntax cSyntax) {
291+
switch (cSyntax) {
292+
case BridgedMacroSyntaxAttached:
293+
return MacroSyntax::Attached;
294+
case BridgedMacroSyntaxFreestanding:
295+
return MacroSyntax::Freestanding;
296+
}
297+
}
298+
299+
BridgedMacroRoleAttr BridgedMacroRoleAttr_createParsed(
300+
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
301+
BridgedSourceRange cRange, BridgedMacroSyntax cSyntax,
302+
BridgedSourceLoc cLParenLoc, BridgedMacroRole cRole, BridgedArrayRef cNames,
303+
BridgedArrayRef cConformances, BridgedSourceLoc cRParenLoc) {
304+
SmallVector<MacroIntroducedDeclName, 2> names;
305+
for (auto &n : cNames.unbridged<BridgedMacroIntroducedDeclName>())
306+
names.push_back(n.unbridged());
307+
308+
SmallVector<Expr *, 2> conformances;
309+
for (auto &t : cConformances.unbridged<BridgedExpr>())
310+
conformances.push_back(t.unbridged());
311+
312+
return MacroRoleAttr::create(
313+
cContext.unbridged(), cAtLoc.unbridged(), cRange.unbridged(),
314+
unbridge(cSyntax), cLParenLoc.unbridged(), unbridge(cRole), names,
315+
conformances, cRParenLoc.unbridged(), /*implicit=*/false);
316+
}
317+
269318
BridgedMainTypeAttr
270319
BridgedMainTypeAttr_createParsed(BridgedASTContext cContext,
271320
BridgedSourceLoc cAtLoc,

lib/AST/Bridging/DeclBridging.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,22 @@ BridgedDestructorDecl_createParsed(BridgedASTContext cContext,
304304
return decl;
305305
}
306306

307+
BridgedMacroDecl BridgedMacroDecl_createParsed(
308+
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
309+
BridgedSourceLoc cMacroLoc, BridgedIdentifier cName,
310+
BridgedSourceLoc cNameLoc, BridgedNullableGenericParamList cGenericParams,
311+
BridgedParameterList cParams, BridgedSourceLoc cArrowLoc,
312+
BridgedNullableTypeRepr cResultType, BridgedNullableExpr cDefinition) {
313+
ASTContext &context = cContext.unbridged();
314+
auto *params = cParams.unbridged();
315+
DeclName fullName = DeclName(context, cName.unbridged(), params);
316+
return new (context)
317+
MacroDecl(cMacroLoc.unbridged(), fullName, cNameLoc.unbridged(),
318+
cGenericParams.unbridged(), params, cArrowLoc.unbridged(),
319+
cResultType.unbridged(), cDefinition.unbridged(),
320+
cDeclContext.unbridged());
321+
}
322+
307323
BridgedTypeAliasDecl BridgedTypeAliasDecl_createParsed(
308324
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
309325
BridgedSourceLoc cAliasKeywordLoc, BridgedIdentifier cName,

lib/ASTGen/Sources/ASTGen/ASTGen.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class Boxed<Value> {
6868
}
6969
}
7070

71+
/// Generate AST from ``SwiftSyntax/Syntax``.
7172
struct ASTGenVisitor {
7273
let diagnosticEngine: BridgedDiagnosticEngine
7374

0 commit comments

Comments
 (0)