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.
|
/// type-checked.
|
||||||
BraceStmt *getMacroExpandedBody() const;
|
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
|
/// Retrieve the type-checked body of the given function, or \c nullptr if
|
||||||
/// there's no body available.
|
/// there's no body available.
|
||||||
BraceStmt *getTypecheckedBody() const;
|
BraceStmt *getTypecheckedBody() const;
|
||||||
|
|||||||
@@ -558,7 +558,12 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
|
|||||||
if (WalkGenerics && visitTrailingRequirements(AFD))
|
if (WalkGenerics && visitTrailingRequirements(AFD))
|
||||||
return true;
|
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();
|
AbstractFunctionDecl::BodyKind PreservedKind = AFD->getBodyKind();
|
||||||
if (BraceStmt *S = cast_or_null<BraceStmt>(doIt(AFD->getBody())))
|
if (BraceStmt *S = cast_or_null<BraceStmt>(doIt(AFD->getBody())))
|
||||||
AFD->setBody(S, PreservedKind);
|
AFD->setBody(S, PreservedKind);
|
||||||
|
|||||||
Reference in New Issue
Block a user