mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
[AST] Avoid walking macro expanded bodies in non-expanded mode
Make sure we don't walk into the expansion of a body macro if the AST walker is configured not to walk macro expansions.
This commit is contained in:
@@ -8065,6 +8065,11 @@ public:
|
||||
/// type-checked.
|
||||
BraceStmt *getMacroExpandedBody() const;
|
||||
|
||||
/// Whether the body of the function has been expanded from a body macro.
|
||||
bool isBodyMacroExpanded() const {
|
||||
return getBodyExpandedStatus() == BodyExpandedStatus::Expanded;
|
||||
}
|
||||
|
||||
/// Retrieve the type-checked body of the given function, or \c nullptr if
|
||||
/// there's no body available.
|
||||
BraceStmt *getTypecheckedBody() const;
|
||||
|
||||
@@ -558,7 +558,12 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
|
||||
if (WalkGenerics && visitTrailingRequirements(AFD))
|
||||
return true;
|
||||
|
||||
if (AFD->getBody(/*canSynthesize=*/false)) {
|
||||
// If we're not walking macro expansions, avoid walking into a body if it
|
||||
// was expanded from a macro.
|
||||
auto SkipBody = !Walker.shouldWalkMacroArgumentsAndExpansion().second &&
|
||||
AFD->isBodyMacroExpanded();
|
||||
|
||||
if (!SkipBody && AFD->getBody(/*canSynthesize=*/false)) {
|
||||
AbstractFunctionDecl::BodyKind PreservedKind = AFD->getBodyKind();
|
||||
if (BraceStmt *S = cast_or_null<BraceStmt>(doIt(AFD->getBody())))
|
||||
AFD->setBody(S, PreservedKind);
|
||||
|
||||
Reference in New Issue
Block a user