Skip to content

Commit 2f81b70

Browse files
authored
Merge pull request #77311 from rintaro/astgen-macroexpr
[ASTGen] Generate standalone macro expansions
2 parents f73c2e5 + 1094ae0 commit 2f81b70

File tree

9 files changed

+183
-8
lines changed

9 files changed

+183
-8
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,14 @@ BridgedAssociatedTypeDecl BridgedAssociatedTypeDecl_createParsed(
966966
BridgedNullableTypeRepr opaqueDefaultType,
967967
BridgedNullableTrailingWhereClause genericWhereClause);
968968

969+
SWIFT_NAME("BridgedMacroExpansionDecl.createParsed(_:poundLoc:macroNameRef:"
970+
"macroNameLoc:leftAngleLoc:genericArgs:rightAngleLoc:args:)")
971+
BridgedMacroExpansionDecl BridgedMacroExpansionDecl_createParsed(
972+
BridgedDeclContext cDeclContext, BridgedSourceLoc cPoundLoc,
973+
BridgedDeclNameRef cMacroNameRef, BridgedDeclNameLoc cMacroNameLoc,
974+
BridgedSourceLoc cLeftAngleLoc, BridgedArrayRef cGenericArgs,
975+
BridgedSourceLoc cRightAngleLoc, BridgedNullableArgumentList cArgList);
976+
969977
SWIFT_NAME(
970978
"BridgedExtensionDecl.createParsed(_:declContext:extensionKeywordLoc:"
971979
"extendedType:inheritedTypes:genericWhereClause:braceRange:)")
@@ -1325,6 +1333,14 @@ BridgedIsExpr BridgedIsExpr_createParsed(BridgedASTContext cContext,
13251333
BridgedSourceLoc cIsLoc,
13261334
BridgedTypeRepr cType);
13271335

1336+
SWIFT_NAME("BridgedMacroExpansionExpr.createParsed(_:poundLoc:macroNameRef:"
1337+
"macroNameLoc:leftAngleLoc:genericArgs:rightAngleLoc:args:)")
1338+
BridgedMacroExpansionExpr BridgedMacroExpansionExpr_createParsed(
1339+
BridgedDeclContext cDeclContext, BridgedSourceLoc cPoundLoc,
1340+
BridgedDeclNameRef cMacroNameRef, BridgedDeclNameLoc cMacroNameLoc,
1341+
BridgedSourceLoc cLeftAngleLoc, BridgedArrayRef cGenericArgs,
1342+
BridgedSourceLoc cRightAngleLoc, BridgedNullableArgumentList cArgList);
1343+
13281344
SWIFT_NAME("BridgedNilLiteralExpr.createParsed(_:nilKeywordLoc:)")
13291345
BridgedNilLiteralExpr
13301346
BridgedNilLiteralExpr_createParsed(BridgedASTContext cContext,

include/swift/AST/ASTBridgingWrappers.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ AST_BRIDGING_WRAPPER_NULLABLE(ParameterList)
8585
AST_BRIDGING_WRAPPER_NULLABLE(PatternBindingInitializer)
8686
AST_BRIDGING_WRAPPER_NONNULL(TypeAttributes)
8787
AST_BRIDGING_WRAPPER_NONNULL(CustomAttribute)
88-
AST_BRIDGING_WRAPPER_NONNULL(ArgumentList)
88+
AST_BRIDGING_WRAPPER_NULLABLE(ArgumentList)
8989

9090
// Non-AST types to generate wrappers for.
9191
AST_BRIDGING_WRAPPER_NULLABLE(DiagnosticEngine)

lib/AST/Bridging/DeclBridging.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,21 @@ BridgedExtensionDecl BridgedExtensionDecl_createParsed(
517517
return decl;
518518
}
519519

520+
BridgedMacroExpansionDecl BridgedMacroExpansionDecl_createParsed(
521+
BridgedDeclContext cDeclContext, BridgedSourceLoc cPoundLoc,
522+
BridgedDeclNameRef cMacroNameRef, BridgedDeclNameLoc cMacroNameLoc,
523+
BridgedSourceLoc cLeftAngleLoc, BridgedArrayRef cGenericArgs,
524+
BridgedSourceLoc cRightAngleLoc, BridgedNullableArgumentList cArgList) {
525+
auto *DC = cDeclContext.unbridged();
526+
auto &Context = DC->getASTContext();
527+
return MacroExpansionDecl::create(
528+
cDeclContext.unbridged(), cPoundLoc.unbridged(),
529+
cMacroNameRef.unbridged(), cMacroNameLoc.unbridged(),
530+
cLeftAngleLoc.unbridged(),
531+
Context.AllocateCopy(cGenericArgs.unbridged<TypeRepr *>()),
532+
cRightAngleLoc.unbridged(), cArgList.unbridged());
533+
}
534+
520535
BridgedOperatorDecl BridgedOperatorDecl_createParsed(
521536
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
522537
BridgedOperatorFixity cFixity, BridgedSourceLoc cOperatorKeywordLoc,

lib/AST/Bridging/ExprBridging.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,24 @@ BridgedIsExpr BridgedIsExpr_createParsed(BridgedASTContext cContext,
313313
cType.unbridged());
314314
}
315315

316+
BridgedMacroExpansionExpr BridgedMacroExpansionExpr_createParsed(
317+
BridgedDeclContext cDeclContext, BridgedSourceLoc cPoundLoc,
318+
BridgedDeclNameRef cMacroNameRef, BridgedDeclNameLoc cMacroNameLoc,
319+
BridgedSourceLoc cLeftAngleLoc, BridgedArrayRef cGenericArgs,
320+
BridgedSourceLoc cRightAngleLoc, BridgedNullableArgumentList cArgList) {
321+
auto *DC = cDeclContext.unbridged();
322+
auto &Context = DC->getASTContext();
323+
return MacroExpansionExpr::create(
324+
cDeclContext.unbridged(), cPoundLoc.unbridged(),
325+
/*module name=*/DeclNameRef(), /*module name loc=*/DeclNameLoc(),
326+
cMacroNameRef.unbridged(), cMacroNameLoc.unbridged(),
327+
cLeftAngleLoc.unbridged(),
328+
Context.AllocateCopy(cGenericArgs.unbridged<TypeRepr *>()),
329+
cRightAngleLoc.unbridged(), cArgList.unbridged(),
330+
DC->isTypeContext() ? MacroRole::Declaration
331+
: getFreestandingMacroRoles());
332+
}
333+
316334
BridgedNilLiteralExpr
317335
BridgedNilLiteralExpr_createParsed(BridgedASTContext cContext,
318336
BridgedSourceLoc cNilKeywordLoc) {

lib/ASTGen/Sources/ASTGen/Bridge.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ extension BridgedNullableGenericParamList: /*@retroactive*/ swiftASTGen.BridgedN
3434
extension BridgedNullableTrailingWhereClause: /*@retroactive*/ swiftASTGen.BridgedNullable {}
3535
extension BridgedNullableParameterList: /*@retroactive*/ swiftASTGen.BridgedNullable {}
3636
extension BridgedNullablePatternBindingInitializer: /*@retroactive*/ swiftASTGen.BridgedNullable {}
37+
extension BridgedNullableArgumentList: /*@retroactive*/ swiftASTGen.BridgedNullable {}
3738

3839
extension BridgedIdentifier: /*@retroactive*/ Swift.Equatable {
3940
public static func == (lhs: Self, rhs: Self) -> Bool {
@@ -79,6 +80,9 @@ extension BridgedParameterList: BridgedHasNullable {
7980
extension BridgedPatternBindingInitializer: BridgedHasNullable {
8081
typealias Nullable = BridgedNullablePatternBindingInitializer
8182
}
83+
extension BridgedArgumentList: BridgedHasNullable {
84+
typealias Nullable = BridgedNullableArgumentList
85+
}
8286

8387
public extension BridgedSourceLoc {
8488
/// Form a source location at the given absolute position in `buffer`.

lib/ASTGen/Sources/ASTGen/Decls.swift

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ extension ASTGenVisitor {
4848
return self.generate(initializerDecl: node).asDecl
4949
case .macroDecl:
5050
break
51-
case .macroExpansionDecl:
52-
break
51+
case .macroExpansionDecl(let node):
52+
return self.generate(macroExpansionDecl: node).asDecl
5353
case .missingDecl:
5454
break
5555
case .operatorDecl(let node):
@@ -620,6 +620,29 @@ extension ASTGenVisitor {
620620
}
621621
}
622622

623+
// MARK: - MacroExpansionDecl
624+
625+
extension ASTGenVisitor {
626+
func generate(macroExpansionDecl node: MacroExpansionDeclSyntax) -> BridgedMacroExpansionDecl {
627+
let attrs = self.generateDeclAttributes(node, allowStatic: true)
628+
let info = self.generate(freestandingMacroExpansion: node)
629+
630+
let decl = BridgedMacroExpansionDecl.createParsed(
631+
self.declContext,
632+
poundLoc: info.poundLoc,
633+
macroNameRef: info.macroNameRef,
634+
macroNameLoc: info.macroNameLoc,
635+
leftAngleLoc: info.leftAngleLoc,
636+
genericArgs: info.genericArgs,
637+
rightAngleLoc: info.rightAngleLoc,
638+
args: info.arguments
639+
)
640+
decl.asDecl.setAttrs(attrs.attributes)
641+
642+
return decl
643+
}
644+
}
645+
623646
// MARK: - OperatorDecl
624647

625648
extension BridgedOperatorFixity {

lib/ASTGen/Sources/ASTGen/Exprs.swift

Lines changed: 72 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,16 @@ func isExprMigrated(_ node: ExprSyntax) -> Bool {
4646
.discardAssignmentExpr, .declReferenceExpr, .dictionaryExpr, .doExpr,
4747
.editorPlaceholderExpr, .floatLiteralExpr, .forceUnwrapExpr, .functionCallExpr,
4848
.genericSpecializationExpr, .ifExpr, .infixOperatorExpr, .inOutExpr,
49-
.integerLiteralExpr, .isExpr, .memberAccessExpr, .nilLiteralExpr, .optionalChainingExpr,
50-
.packElementExpr, .packExpansionExpr, .patternExpr, .postfixIfConfigExpr,
49+
.integerLiteralExpr, .isExpr, .macroExpansionExpr, .memberAccessExpr, .nilLiteralExpr,
50+
.optionalChainingExpr, .packElementExpr, .packExpansionExpr, .patternExpr, .postfixIfConfigExpr,
5151
.postfixOperatorExpr, .prefixOperatorExpr, .regexLiteralExpr, .sequenceExpr,
5252
.simpleStringLiteralExpr, .subscriptCallExpr, .stringLiteralExpr, .superExpr,
5353
.switchExpr, .tryExpr, .tupleExpr, .typeExpr, .unresolvedAsExpr, .unresolvedIsExpr,
5454
.unresolvedTernaryExpr, .ternaryExpr:
5555
break
5656

5757
// Known unimplemented kinds.
58-
case .keyPathExpr, .macroExpansionExpr:
58+
case .keyPathExpr:
5959
return false
6060

6161
// Unknown expr kinds.
@@ -131,8 +131,8 @@ extension ASTGenVisitor {
131131
preconditionFailure("IsExprSyntax only appear after operator folding")
132132
case .keyPathExpr:
133133
break
134-
case .macroExpansionExpr:
135-
break
134+
case .macroExpansionExpr(let node):
135+
return self.generate(macroExpansionExpr: node).asExpr
136136
case .memberAccessExpr(let node):
137137
return self.generate(memberAccessExpr: node)
138138
case .missingExpr:
@@ -535,6 +535,73 @@ extension ASTGenVisitor {
535535
)
536536
}
537537

538+
struct FreestandingMacroExpansionInfo {
539+
var poundLoc: BridgedSourceLoc
540+
var macroNameRef: BridgedDeclNameRef
541+
var macroNameLoc: BridgedDeclNameLoc
542+
var leftAngleLoc: BridgedSourceLoc
543+
var genericArgs: BridgedArrayRef
544+
var rightAngleLoc: BridgedSourceLoc
545+
var arguments: BridgedNullableArgumentList
546+
}
547+
548+
func generate(freestandingMacroExpansion node: some FreestandingMacroExpansionSyntax) -> FreestandingMacroExpansionInfo {
549+
let poundLoc = self.generateSourceLoc(node.pound)
550+
let nameLoc = self.generateIdentifierAndSourceLoc(node.macroName)
551+
552+
let leftAngleLoc: BridgedSourceLoc
553+
let genericArgs: [BridgedTypeRepr]
554+
let rightAngleLoc: BridgedSourceLoc
555+
if let generics = node.genericArgumentClause {
556+
leftAngleLoc = self.generateSourceLoc(generics.leftAngle)
557+
genericArgs = generics.arguments.map {
558+
self.generate(type: $0.argument)
559+
}
560+
rightAngleLoc = self.generateSourceLoc(generics.rightAngle)
561+
} else {
562+
leftAngleLoc = nil
563+
genericArgs = []
564+
rightAngleLoc = nil
565+
}
566+
567+
let arguments: BridgedArgumentList?
568+
if (node.leftParen != nil || node.trailingClosure != nil) {
569+
arguments = self.generateArgumentList(
570+
leftParen: node.leftParen,
571+
labeledExprList: node.arguments,
572+
rightParen: node.rightParen,
573+
trailingClosure: node.trailingClosure,
574+
additionalTrailingClosures: node.additionalTrailingClosures
575+
)
576+
} else {
577+
arguments = nil
578+
}
579+
580+
return FreestandingMacroExpansionInfo(
581+
poundLoc: poundLoc,
582+
macroNameRef: .createParsed(.createIdentifier(nameLoc.identifier)),
583+
macroNameLoc: .createParsed(nameLoc.sourceLoc),
584+
leftAngleLoc: leftAngleLoc,
585+
genericArgs: genericArgs.lazy.bridgedArray(in: self),
586+
rightAngleLoc: rightAngleLoc,
587+
arguments: arguments.asNullable
588+
)
589+
}
590+
591+
func generate(macroExpansionExpr node: MacroExpansionExprSyntax) -> BridgedMacroExpansionExpr {
592+
let info = self.generate(freestandingMacroExpansion: node)
593+
return .createParsed(
594+
self.declContext,
595+
poundLoc: info.poundLoc,
596+
macroNameRef: info.macroNameRef,
597+
macroNameLoc: info.macroNameLoc,
598+
leftAngleLoc: info.leftAngleLoc,
599+
genericArgs: info.genericArgs,
600+
rightAngleLoc: info.rightAngleLoc,
601+
args: info.arguments
602+
)
603+
}
604+
538605
func generate(memberAccessExpr node: MemberAccessExprSyntax, postfixIfConfigBaseExpr: BridgedExpr? = nil) -> BridgedExpr {
539606
let baseExpr: BridgedExpr?
540607
if let base = node.base {

lib/Parse/ParseDecl.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,20 @@ void Parser::parseSourceFileViaASTGen(
330330
if (!needToParse)
331331
return;
332332

333+
switch (SF.Kind) {
334+
case SourceFileKind::Library:
335+
case SourceFileKind::Main:
336+
case SourceFileKind::Interface:
337+
break;
338+
case SourceFileKind::SIL:
339+
// FIXME: Support SIL.
340+
return;
341+
case SourceFileKind::MacroExpansion:
342+
case SourceFileKind::DefaultArgument:
343+
// FIXME: Support macro expanded sources.
344+
return;
345+
}
346+
333347
auto *exportedSourceFile = SF.getExportedSourceFile();
334348
if (!exportedSourceFile)
335349
return;

test/ASTGen/macros.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// REQUIRES: swift_swift_parser, asserts
2+
3+
// RUN: %empty-directory(%t)
4+
5+
// RUN: %host-build-swift -swift-version 5 -emit-library -o %t/%target-library-name(MacroDefinition) -module-name=MacroDefinition %S/../Macros/Inputs/syntax_macro_definitions.swift
6+
7+
// RUN: %target-typecheck-verify-swift -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) -module-name MacroUser -enable-experimental-feature ParserASTGen
8+
9+
@freestanding(declaration) macro anonymousTypes(_: () -> String) = #externalMacro(module: "MacroDefinition", type: "DefineAnonymousTypesMacro")
10+
@freestanding(expression) macro stringify<T>(_ value: T) -> (T, String) = #externalMacro(module: "MacroDefinition", type: "StringifyMacro")
11+
12+
func foo(a: Int) {
13+
_ = #stringify(a + 1)
14+
}
15+
16+
struct Outer {
17+
#anonymousTypes { "test" }
18+
}

0 commit comments

Comments
 (0)