Skip to content

[ASTGen] Generate MacroDecl #77412

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Nov 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions include/swift/AST/ASTBridging.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ class DiagnosticEngine;
class Identifier;
class IfConfigClauseRangeInfo;
struct LabeledStmtInfo;
enum class MacroRole : uint32_t;
class MacroIntroducedDeclName;
enum class MacroIntroducedDeclNameKind;
enum class ParamSpecifier : uint8_t;
class ProtocolConformanceRef;
class RegexLiteralPatternFeature;
Expand All @@ -60,6 +63,7 @@ struct BridgedASTType;
class BridgedCanType;
class BridgedASTContext;
struct BridgedSubstitutionMap;
class BridgedParameterList;

//===----------------------------------------------------------------------===//
// MARK: Identifier
Expand Down Expand Up @@ -119,6 +123,8 @@ class BridgedDeclNameRef {
void *_Nonnull opaque;

public:
BRIDGED_INLINE BridgedDeclNameRef();

BRIDGED_INLINE BridgedDeclNameRef(swift::DeclNameRef name);

BRIDGED_INLINE swift::DeclNameRef unbridged() const;
Expand Down Expand Up @@ -599,6 +605,13 @@ BridgedCDeclAttr BridgedCDeclAttr_createParsed(BridgedASTContext cContext,
BridgedSourceRange cRange,
BridgedStringRef cName);

SWIFT_NAME(
"BridgedCustomAttr.createParsed(_:atLoc:type:initContext:argumentList:)")
BridgedCustomAttr BridgedCustomAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedTypeRepr cType,
BridgedNullablePatternBindingInitializer cInitContext,
BridgedNullableArgumentList cArgumentList);

SWIFT_NAME(
"BridgedDynamicReplacementAttr.createParsed(_:atLoc:attrNameLoc:lParenLoc:"
"replacedFunction:rParenLoc:)")
Expand Down Expand Up @@ -686,6 +699,51 @@ BridgedMainTypeAttr BridgedMainTypeAttr_createParsed(BridgedASTContext cContext,
BridgedSourceLoc cAtLoc,
BridgedSourceLoc cNameLoc);

enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedMacroSyntax {
BridgedMacroSyntaxFreestanding,
BridgedMacroSyntaxAttached,
};

enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedMacroIntroducedDeclNameKind {
BridgedMacroIntroducedDeclNameKindNamed,
BridgedMacroIntroducedDeclNameKindOverloaded,
BridgedMacroIntroducedDeclNameKindPrefixed,
BridgedMacroIntroducedDeclNameKindSuffixed,
BridgedMacroIntroducedDeclNameKindArbitrary,
};

BRIDGED_INLINE swift::MacroIntroducedDeclNameKind
unbridge(BridgedMacroIntroducedDeclNameKind kind);

struct BridgedMacroIntroducedDeclName {
BridgedMacroIntroducedDeclNameKind kind;
BridgedDeclNameRef name;

BRIDGED_INLINE swift::MacroIntroducedDeclName unbridged() const;
};

enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedMacroRole {
#define MACRO_ROLE(Name, Description) BridgedMacroRole##Name,
#include "swift/Basic/MacroRoles.def"
BridgedMacroRoleNone,
};

BRIDGED_INLINE swift::MacroRole unbridge(BridgedMacroRole cRole);

SWIFT_NAME("BridgedMacroRole.init(from:)")
BridgedMacroRole BridgedMacroRole_fromString(BridgedStringRef str);

SWIFT_NAME("getter:BridgedMacroRole.isAttached(self:)")
BRIDGED_INLINE bool BridgedMacroRole_isAttached(BridgedMacroRole role);

SWIFT_NAME("BridgedMacroRoleAttr.createParsed(_:atLoc:range:syntax:lParenLoc:"
"role:names:conformances:rParenLoc:)")
BridgedMacroRoleAttr BridgedMacroRoleAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceRange cRange, BridgedMacroSyntax cSyntax,
BridgedSourceLoc cLParenLoc, BridgedMacroRole cRole, BridgedArrayRef cNames,
BridgedArrayRef cConformances, BridgedSourceLoc cRParenLoc);

SWIFT_NAME(
"BridgedSwiftNativeObjCRuntimeBaseAttr.createParsed(_:atLoc:range:name:)")
BridgedSwiftNativeObjCRuntimeBaseAttr
Expand Down Expand Up @@ -1003,6 +1061,16 @@ BridgedAssociatedTypeDecl BridgedAssociatedTypeDecl_createParsed(
BridgedNullableTypeRepr opaqueDefaultType,
BridgedNullableTrailingWhereClause genericWhereClause);

SWIFT_NAME(
"BridgedMacroDecl.createParsed(_:declContext:macroKeywordLoc:name:nameLoc:"
"genericParamList:paramList:arrowLoc:resultType:definition:)")
BridgedMacroDecl BridgedMacroDecl_createParsed(
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
BridgedSourceLoc cMacroLoc, BridgedIdentifier cName,
BridgedSourceLoc cNameLoc, BridgedNullableGenericParamList cGenericParams,
BridgedParameterList cParams, BridgedSourceLoc cArrowLoc,
BridgedNullableTypeRepr cResultType, BridgedNullableExpr cDefinition);

SWIFT_NAME("BridgedMacroExpansionDecl.createParsed(_:poundLoc:macroNameRef:"
"macroNameLoc:leftAngleLoc:genericArgs:rightAngleLoc:args:)")
BridgedMacroExpansionDecl BridgedMacroExpansionDecl_createParsed(
Expand Down
45 changes: 45 additions & 0 deletions include/swift/AST/ASTBridgingImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "swift/AST/Decl.h"
#include "swift/AST/Expr.h"
#include "swift/AST/IfConfigClauseRangeInfo.h"
#include "swift/AST/MacroDeclaration.h"
#include "swift/AST/ProtocolConformance.h"
#include "swift/AST/ProtocolConformanceRef.h"
#include "swift/AST/SourceFile.h"
Expand Down Expand Up @@ -52,6 +53,9 @@ swift::DeclBaseName BridgedDeclBaseName::unbridged() const {
// MARK: BridgedDeclNameRef
//===----------------------------------------------------------------------===//

BridgedDeclNameRef::BridgedDeclNameRef()
: BridgedDeclNameRef(swift::DeclNameRef()) {}

BridgedDeclNameRef::BridgedDeclNameRef(swift::DeclNameRef name)
: opaque(name.getOpaqueValue()) {}

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

//===----------------------------------------------------------------------===//
// MARK: Macros
//===----------------------------------------------------------------------===//

swift::MacroRole unbridge(BridgedMacroRole cRole) {
switch (cRole) {
#define MACRO_ROLE(Name, Description) \
case BridgedMacroRole##Name: \
return swift::MacroRole::Name;
#include "swift/Basic/MacroRoles.def"
case BridgedMacroRoleNone:
break;
}
llvm_unreachable("invalid macro role");
}

swift::MacroIntroducedDeclNameKind
unbridge(BridgedMacroIntroducedDeclNameKind kind) {
switch (kind) {
#define CASE(ID) \
case BridgedMacroIntroducedDeclNameKind##ID: \
return swift::MacroIntroducedDeclNameKind::ID;
CASE(Named)
CASE(Overloaded)
CASE(Prefixed)
CASE(Suffixed)
CASE(Arbitrary)
#undef CASE
}
}

bool BridgedMacroRole_isAttached(BridgedMacroRole role) {
return isAttachedMacro(unbridge(role));
}

swift::MacroIntroducedDeclName
BridgedMacroIntroducedDeclName::unbridged() const {
return swift::MacroIntroducedDeclName(unbridge(kind),
name.unbridged().getFullName());
}

//===----------------------------------------------------------------------===//
// MARK: BridgedSubstitutionMap
//===----------------------------------------------------------------------===//
Expand Down
13 changes: 7 additions & 6 deletions include/swift/AST/Attr.h
Original file line number Diff line number Diff line change
Expand Up @@ -2495,7 +2495,7 @@ class NonisolatedAttr final : public DeclAttribute {
class MacroRoleAttr final
: public DeclAttribute,
private llvm::TrailingObjects<MacroRoleAttr, MacroIntroducedDeclName,
TypeExpr *> {
Expr *> {
friend TrailingObjects;

MacroSyntax syntax;
Expand All @@ -2507,22 +2507,22 @@ class MacroRoleAttr final
MacroRoleAttr(SourceLoc atLoc, SourceRange range, MacroSyntax syntax,
SourceLoc lParenLoc, MacroRole role,
ArrayRef<MacroIntroducedDeclName> names,
ArrayRef<TypeExpr *> conformances,
SourceLoc rParenLoc, bool implicit);
ArrayRef<Expr *> conformances, SourceLoc rParenLoc,
bool implicit);

public:
static MacroRoleAttr *create(ASTContext &ctx, SourceLoc atLoc,
SourceRange range, MacroSyntax syntax,
SourceLoc lParenLoc, MacroRole role,
ArrayRef<MacroIntroducedDeclName> names,
ArrayRef<TypeExpr *> conformances,
ArrayRef<Expr *> conformances,
SourceLoc rParenLoc, bool implicit);

size_t numTrailingObjects(OverloadToken<MacroIntroducedDeclName>) const {
return numNames;
}

size_t numTrailingObjects(OverloadToken<TypeExpr *>) const {
size_t numTrailingObjects(OverloadToken<Expr *>) const {
return numConformances;
}

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

static bool classof(const DeclAttribute *DA) {
Expand Down
34 changes: 17 additions & 17 deletions lib/AST/Attr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2960,29 +2960,28 @@ MacroRoleAttr::MacroRoleAttr(SourceLoc atLoc, SourceRange range,
MacroSyntax syntax, SourceLoc lParenLoc,
MacroRole role,
ArrayRef<MacroIntroducedDeclName> names,
ArrayRef<TypeExpr *> conformances,
SourceLoc rParenLoc, bool implicit)
ArrayRef<Expr *> conformances, SourceLoc rParenLoc,
bool implicit)
: DeclAttribute(DeclAttrKind::MacroRole, atLoc, range, implicit),
syntax(syntax), role(role), numNames(names.size()),
numConformances(conformances.size()), lParenLoc(lParenLoc),
rParenLoc(rParenLoc) {
auto *trailingNamesBuffer = getTrailingObjects<MacroIntroducedDeclName>();
std::uninitialized_copy(names.begin(), names.end(), trailingNamesBuffer);

auto *trailingConformancesBuffer = getTrailingObjects<TypeExpr *>();
auto *trailingConformancesBuffer = getTrailingObjects<Expr *>();
std::uninitialized_copy(conformances.begin(), conformances.end(),
trailingConformancesBuffer);
}

MacroRoleAttr *
MacroRoleAttr::create(ASTContext &ctx, SourceLoc atLoc, SourceRange range,
MacroSyntax syntax, SourceLoc lParenLoc, MacroRole role,
ArrayRef<MacroIntroducedDeclName> names,
ArrayRef<TypeExpr *> conformances,
SourceLoc rParenLoc, bool implicit) {
unsigned size =
totalSizeToAlloc<MacroIntroducedDeclName, TypeExpr *>(
names.size(), conformances.size());
MacroRoleAttr *MacroRoleAttr::create(ASTContext &ctx, SourceLoc atLoc,
SourceRange range, MacroSyntax syntax,
SourceLoc lParenLoc, MacroRole role,
ArrayRef<MacroIntroducedDeclName> names,
ArrayRef<Expr *> conformances,
SourceLoc rParenLoc, bool implicit) {
unsigned size = totalSizeToAlloc<MacroIntroducedDeclName, Expr *>(
names.size(), conformances.size());
auto *mem = ctx.Allocate(size, alignof(MacroRoleAttr));
return new (mem) MacroRoleAttr(atLoc, range, syntax, lParenLoc, role, names,
conformances, rParenLoc, implicit);
Expand All @@ -2995,11 +2994,12 @@ ArrayRef<MacroIntroducedDeclName> MacroRoleAttr::getNames() const {
};
}

ArrayRef<TypeExpr *> MacroRoleAttr::getConformances() const {
return {
getTrailingObjects<TypeExpr *>(),
numConformances
};
ArrayRef<Expr *> MacroRoleAttr::getConformances() const {
return {getTrailingObjects<Expr *>(), numConformances};
}

MutableArrayRef<Expr *> MacroRoleAttr::getConformances() {
return {getTrailingObjects<Expr *>(), numConformances};
}

bool MacroRoleAttr::hasNameKind(MacroIntroducedDeclNameKind kind) const {
Expand Down
49 changes: 49 additions & 0 deletions lib/AST/Bridging/DeclAttributeBridging.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

#include "swift/AST/ASTContext.h"
#include "swift/AST/Attr.h"
#include "swift/AST/Expr.h"
#include "swift/AST/Identifier.h"
#include "swift/Basic/Assertions.h"

Expand Down Expand Up @@ -129,6 +130,16 @@ BridgedCDeclAttr BridgedCDeclAttr_createParsed(BridgedASTContext cContext,
/*Implicit=*/false);
}

BridgedCustomAttr BridgedCustomAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc, BridgedTypeRepr cType,
BridgedNullablePatternBindingInitializer cInitContext,
BridgedNullableArgumentList cArgumentList) {
ASTContext &context = cContext.unbridged();
return CustomAttr::create(
context, cAtLoc.unbridged(), new (context) TypeExpr(cType.unbridged()),
cInitContext.unbridged(), cArgumentList.unbridged());
}

BridgedDynamicReplacementAttr BridgedDynamicReplacementAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceLoc cAttrNameLoc, BridgedSourceLoc cLParenLoc,
Expand Down Expand Up @@ -266,6 +277,44 @@ BridgedInlineAttr BridgedInlineAttr_createParsed(BridgedASTContext cContext,
InlineAttr(cAtLoc.unbridged(), cRange.unbridged(), unbridged(cKind));
}

BridgedMacroRole BridgedMacroRole_fromString(BridgedStringRef str) {
// Match the role string to the known set of roles.
auto role =
llvm::StringSwitch<std::optional<BridgedMacroRole>>(str.unbridged())
#define MACRO_ROLE(Name, Description) .Case(Description, BridgedMacroRole##Name)
#include "swift/Basic/MacroRoles.def"
.Default(std::nullopt);
return role.has_value() ? *role : BridgedMacroRoleNone;
}

MacroSyntax unbridge(BridgedMacroSyntax cSyntax) {
switch (cSyntax) {
case BridgedMacroSyntaxAttached:
return MacroSyntax::Attached;
case BridgedMacroSyntaxFreestanding:
return MacroSyntax::Freestanding;
}
}

BridgedMacroRoleAttr BridgedMacroRoleAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceRange cRange, BridgedMacroSyntax cSyntax,
BridgedSourceLoc cLParenLoc, BridgedMacroRole cRole, BridgedArrayRef cNames,
BridgedArrayRef cConformances, BridgedSourceLoc cRParenLoc) {
SmallVector<MacroIntroducedDeclName, 2> names;
for (auto &n : cNames.unbridged<BridgedMacroIntroducedDeclName>())
names.push_back(n.unbridged());

SmallVector<Expr *, 2> conformances;
for (auto &t : cConformances.unbridged<BridgedExpr>())
conformances.push_back(t.unbridged());

return MacroRoleAttr::create(
cContext.unbridged(), cAtLoc.unbridged(), cRange.unbridged(),
unbridge(cSyntax), cLParenLoc.unbridged(), unbridge(cRole), names,
conformances, cRParenLoc.unbridged(), /*implicit=*/false);
}

BridgedMainTypeAttr
BridgedMainTypeAttr_createParsed(BridgedASTContext cContext,
BridgedSourceLoc cAtLoc,
Expand Down
16 changes: 16 additions & 0 deletions lib/AST/Bridging/DeclBridging.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,22 @@ BridgedDestructorDecl_createParsed(BridgedASTContext cContext,
return decl;
}

BridgedMacroDecl BridgedMacroDecl_createParsed(
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
BridgedSourceLoc cMacroLoc, BridgedIdentifier cName,
BridgedSourceLoc cNameLoc, BridgedNullableGenericParamList cGenericParams,
BridgedParameterList cParams, BridgedSourceLoc cArrowLoc,
BridgedNullableTypeRepr cResultType, BridgedNullableExpr cDefinition) {
ASTContext &context = cContext.unbridged();
auto *params = cParams.unbridged();
DeclName fullName = DeclName(context, cName.unbridged(), params);
return new (context)
MacroDecl(cMacroLoc.unbridged(), fullName, cNameLoc.unbridged(),
cGenericParams.unbridged(), params, cArrowLoc.unbridged(),
cResultType.unbridged(), cDefinition.unbridged(),
cDeclContext.unbridged());
}

BridgedTypeAliasDecl BridgedTypeAliasDecl_createParsed(
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
BridgedSourceLoc cAliasKeywordLoc, BridgedIdentifier cName,
Expand Down
1 change: 1 addition & 0 deletions lib/ASTGen/Sources/ASTGen/ASTGen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ class Boxed<Value> {
}
}

/// Generate AST from ``SwiftSyntax/Syntax``.
struct ASTGenVisitor {
let diagnosticEngine: BridgedDiagnosticEngine

Expand Down
Loading