Skip to content

Commit 3a4549b

Browse files
authored
Merge pull request #79967 from rintaro/astgen-builtin-pound
[ASTGen] Generate miscellaneous builtin pound
2 parents 57288d1 + ac80775 commit 3a4549b

14 files changed

+500
-147
lines changed

include/swift/AST/ASTBridging.h

+22-1
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ struct BridgedDeclObj {
388388
BRIDGED_INLINE bool Destructor_isIsolated() const;
389389
};
390390

391-
enum ENUM_EXTENSIBILITY_ATTR(open) BridgedASTNodeKind : uint8_t {
391+
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedASTNodeKind : uint8_t {
392392
BridgedASTNodeKindExpr,
393393
BridgedASTNodeKindStmt,
394394
BridgedASTNodeKindDecl
@@ -2323,6 +2323,13 @@ BridgedPoundAvailableInfo BridgedPoundAvailableInfo_createParsed(
23232323
BridgedSourceLoc cLParenLoc, BridgedArrayRef cSpecs,
23242324
BridgedSourceLoc cRParenLoc, bool isUnavailability);
23252325

2326+
SWIFT_NAME("BridgedStmtConditionElement.createHasSymbol(_:poundLoc:lParenLoc:"
2327+
"symbol:rParenLoc:)")
2328+
BridgedStmtConditionElement BridgedStmtConditionElement_createHasSymbol(
2329+
BridgedASTContext cContext, BridgedSourceLoc cPoundLoc,
2330+
BridgedSourceLoc cLParenLoc, BridgedNullableExpr cSymbolExpr,
2331+
BridgedSourceLoc cRParenLoc);
2332+
23262333
struct BridgedCaseLabelItemInfo {
23272334
SWIFT_NAME("isDefault")
23282335
bool IsDefault;
@@ -2425,6 +2432,11 @@ BridgedIfStmt BridgedIfStmt_createParsed(
24252432
BridgedSourceLoc cIfLoc, BridgedArrayRef cConds, BridgedBraceStmt cThen,
24262433
BridgedSourceLoc cElseLoc, BridgedNullableStmt cElse);
24272434

2435+
SWIFT_NAME("BridgedPoundAssertStmt.createParsed(_:range:condition:message:)")
2436+
BridgedPoundAssertStmt BridgedPoundAssertStmt_createParsed(
2437+
BridgedASTContext cContext, BridgedSourceRange cRange,
2438+
BridgedExpr cConditionExpr, BridgedStringRef cMessage);
2439+
24282440
SWIFT_NAME("BridgedRepeatWhileStmt.createParsed(_:labelInfo:repeatLoc:cond:"
24292441
"whileLoc:body:)")
24302442
BridgedRepeatWhileStmt BridgedRepeatWhileStmt_createParsed(
@@ -3110,6 +3122,15 @@ struct BridgedFingerprint {
31103122
BRIDGED_INLINE swift::Fingerprint unbridged() const;
31113123
};
31123124

3125+
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedPoundKeyword : uint8_t {
3126+
#define POUND_KEYWORD(NAME) BridgedPoundKeyword_##NAME,
3127+
#include "swift/AST/TokenKinds.def"
3128+
BridgedPoundKeyword_None,
3129+
};
3130+
3131+
SWIFT_NAME("BridgedPoundKeyword.init(from:)")
3132+
BridgedPoundKeyword BridgedPoundKeyword_fromString(BridgedStringRef cStr);
3133+
31133134
//===----------------------------------------------------------------------===//
31143135
// MARK: #if handling
31153136
//===----------------------------------------------------------------------===//

lib/AST/Bridging/MiscBridging.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -149,3 +149,14 @@ BridgedOwnedString BridgedGenericSignature::getDebugDescription() const {
149149
unbridged().print(os);
150150
return BridgedOwnedString(str);
151151
}
152+
153+
//===----------------------------------------------------------------------===//
154+
// MARK: BridgedPoundKeyword
155+
//===----------------------------------------------------------------------===//
156+
157+
BridgedPoundKeyword BridgedPoundKeyword_fromString(BridgedStringRef cStr) {
158+
return llvm::StringSwitch<BridgedPoundKeyword>(cStr.unbridged())
159+
#define POUND_KEYWORD(NAME) .Case(#NAME, BridgedPoundKeyword_##NAME)
160+
#include "swift/AST/TokenKinds.def"
161+
.Default(BridgedPoundKeyword_None);
162+
}

lib/AST/Bridging/StmtBridging.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,15 @@ BridgedPoundAvailableInfo BridgedPoundAvailableInfo_createParsed(
6969
cRParenLoc.unbridged(), isUnavailability);
7070
}
7171

72+
BridgedStmtConditionElement BridgedStmtConditionElement_createHasSymbol(
73+
BridgedASTContext cContext, BridgedSourceLoc cPoundLoc,
74+
BridgedSourceLoc cLParenLoc, BridgedNullableExpr cSymbolExpr,
75+
BridgedSourceLoc cRParenLoc) {
76+
return StmtConditionElement(PoundHasSymbolInfo::create(
77+
cContext.unbridged(), cPoundLoc.unbridged(), cLParenLoc.unbridged(),
78+
cSymbolExpr.unbridged(), cRParenLoc.unbridged()));
79+
}
80+
7281
BridgedBraceStmt BridgedBraceStmt_createParsed(BridgedASTContext cContext,
7382
BridgedSourceLoc cLBLoc,
7483
BridgedArrayRef elements,
@@ -229,6 +238,13 @@ BridgedIfStmt BridgedIfStmt_createParsed(
229238
cThen.unbridged(), cElseLoc.unbridged(), cElse.unbridged());
230239
}
231240

241+
BridgedPoundAssertStmt BridgedPoundAssertStmt_createParsed(
242+
BridgedASTContext cContext, BridgedSourceRange cRange,
243+
BridgedExpr cConditionExpr, BridgedStringRef cMessage) {
244+
return new (cContext.unbridged()) PoundAssertStmt(
245+
cRange.unbridged(), cConditionExpr.unbridged(), cMessage.unbridged());
246+
}
247+
232248
BridgedRepeatWhileStmt BridgedRepeatWhileStmt_createParsed(
233249
BridgedASTContext cContext, BridgedLabeledStmtInfo cLabelInfo,
234250
BridgedSourceLoc cRepeatLoc, BridgedExpr cCond, BridgedSourceLoc cWhileLoc,

lib/ASTGen/Sources/ASTGen/ASTGen.swift

+92-53
Original file line numberDiff line numberDiff line change
@@ -58,73 +58,112 @@ struct ASTGenVisitor {
5858
}
5959

6060
func generate(sourceFile node: SourceFileSyntax) -> [BridgedASTNode] {
61-
var out = [BridgedASTNode]()
62-
let isTopLevel = self.declContext.isModuleScopeContext
61+
// If not top-level, no need for 'TopLevelCodeDecl' treatment.
62+
if !self.declContext.isModuleScopeContext {
63+
return self.generate(codeBlockItemList: node.statements)
64+
} else {
65+
return self.generateTopLevel(codeBlockItemList: node.statements)
66+
}
67+
}
6368

64-
visitIfConfigElements(
65-
node.statements,
66-
of: CodeBlockItemSyntax.self,
67-
split: Self.splitCodeBlockItemIfConfig
68-
) { element in
69+
func generateTopLevel(codeBlockItem node: CodeBlockItemSyntax) -> BridgedASTNode? {
70+
let parentDC = self.declContext
6971

70-
func generateStmtOrExpr(_ body: () -> BridgedASTNode) -> BridgedASTNode {
71-
if !isTopLevel {
72-
return body()
73-
}
72+
func maybeTopLevelCodeDecl(body: () -> BridgedASTNode?) -> BridgedASTNode? {
73+
let topLevelDecl: BridgedTopLevelCodeDecl = BridgedTopLevelCodeDecl.create(self.ctx, declContext: self.declContext)
74+
guard let astNode = withDeclContext(topLevelDecl.asDeclContext, body) else {
75+
return nil
76+
}
77+
78+
if astNode.kind == .decl {
79+
// If a decl is generated, discard the TopLevelCodeDecl.
80+
return astNode
81+
}
7482

75-
let topLevelDecl = BridgedTopLevelCodeDecl.create(self.ctx, declContext: self.declContext)
76-
let astNode = withDeclContext(topLevelDecl.asDeclContext) {
77-
body()
83+
// Diagnose top-level code in non-script files.
84+
if !declContext.parentSourceFile.isScriptMode {
85+
switch astNode.kind {
86+
case .stmt:
87+
self.diagnose(.illegalTopLevelStmt(node))
88+
case .expr:
89+
self.diagnose(.illegalTopLevelExpr(node))
90+
case .decl:
91+
fatalError("unreachable")
7892
}
93+
}
94+
95+
let bodyRange = self.generateImplicitBraceRange(node)
96+
let body = BridgedBraceStmt.createImplicit(
97+
self.ctx,
98+
lBraceLoc: bodyRange.start,
99+
element: astNode,
100+
rBraceLoc: bodyRange.end
101+
)
102+
topLevelDecl.setBody(body: body)
103+
return .decl(topLevelDecl.asDecl)
104+
}
79105

80-
// Diagnose top level code in non-script file.
81-
if (!declContext.parentSourceFile.isScriptMode) {
82-
switch element.item {
83-
case .stmt:
84-
self.diagnose(.illegalTopLevelStmt(element))
85-
case .expr:
86-
self.diagnose(.illegalTopLevelExpr(element))
87-
case .decl:
88-
fatalError("unreachable")
106+
switch node.item {
107+
case .decl(let node):
108+
if let node = node.as(MacroExpansionDeclSyntax.self) {
109+
return maybeTopLevelCodeDecl {
110+
switch self.maybeGenerateBuiltinPound(freestandingMacroExpansion: node) {
111+
case .generated(let generated):
112+
return generated
113+
case .ignored:
114+
/// If it is actually a macro expansion decl, it should use the parent DC.
115+
return self.withDeclContext(parentDC) {
116+
return .decl(self.generate(macroExpansionDecl: node).asDecl)
117+
}
89118
}
90119
}
120+
}
121+
// Regular 'decl' nodes never be a stmt or expr. No top-level code treatment.
122+
return self.generate(decl: node).map { .decl($0) }
123+
124+
case .expr(let node):
125+
return maybeTopLevelCodeDecl {
126+
if let node = node.as(MacroExpansionExprSyntax.self) {
127+
switch self.maybeGenerateBuiltinPound(freestandingMacroExpansion: node) {
128+
case .generated(let generated):
129+
return generated
130+
case .ignored:
131+
// Let regular 'self.generate(expr:)' generate the macro expansions.
132+
break
133+
}
134+
}
135+
return .expr(self.generate(expr: node))
136+
}
91137

92-
let bodyRange = self.generateImplicitBraceRange(element)
93-
let body = BridgedBraceStmt.createImplicit(
94-
self.ctx,
95-
lBraceLoc: bodyRange.start,
96-
element: astNode,
97-
rBraceLoc: bodyRange.end
98-
)
99-
topLevelDecl.setBody(body: body)
100-
return .decl(topLevelDecl.asDecl)
138+
case .stmt(let node):
139+
return maybeTopLevelCodeDecl {
140+
return .stmt(self.generate(stmt: node))
101141
}
142+
}
143+
}
102144

103-
// TODO: Set semicolon loc.
104-
switch element.item {
105-
case .decl(let node):
106-
if let d = self.generate(decl: node) {
107-
out.append(.decl(d))
145+
func generateTopLevel(codeBlockItemList node: CodeBlockItemListSyntax) -> [BridgedASTNode] {
146+
var out = [BridgedASTNode]()
147+
visitIfConfigElements(
148+
node,
149+
of: CodeBlockItemSyntax.self,
150+
split: Self.splitCodeBlockItemIfConfig
151+
) { element in
152+
guard let item = self.generateTopLevel(codeBlockItem: element) else {
153+
return
154+
}
155+
out.append(item)
108156

109-
// Hoist 'VarDecl' to the top-level.
110-
withBridgedSwiftClosure { ptr in
111-
let hoisted = ptr!.load(as: BridgedDecl.self)
112-
out.append(.decl(hoisted))
113-
} call: { handle in
114-
d.forEachDeclToHoist(handle)
115-
}
157+
// Hoist 'VarDecl' to the block.
158+
if item.kind == .decl {
159+
withBridgedSwiftClosure { ptr in
160+
let d = ptr!.load(as: BridgedDecl.self)
161+
out.append(.decl(d))
162+
} call: { handle in
163+
item.castToDecl().forEachDeclToHoist(handle)
116164
}
117-
case .stmt(let node):
118-
out.append(generateStmtOrExpr {
119-
.stmt(self.generate(stmt: node))
120-
})
121-
case .expr(let node):
122-
out.append(generateStmtOrExpr {
123-
.expr(self.generate(expr: node))
124-
})
125165
}
126166
}
127-
128167
return out
129168
}
130169
}

0 commit comments

Comments
 (0)