Skip to content

Commit f6664f0

Browse files
committed
[IDE] Simplify ModelASTWalker argument walking
Use `walkToArgumentPre` instead of stashing and looking up argument parents.
1 parent d8f2040 commit f6664f0

File tree

1 file changed

+25
-66
lines changed

1 file changed

+25
-66
lines changed

lib/IDE/SyntaxModel.cpp

Lines changed: 25 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -372,13 +372,6 @@ class ModelASTWalker : public ASTWalker {
372372
friend class InactiveClauseRAII;
373373
bool inInactiveClause = false;
374374

375-
struct ParentArgsTy {
376-
Expr *Parent = nullptr;
377-
llvm::DenseMap<Expr *, Argument> Args;
378-
};
379-
/// A mapping of argument expressions to their full argument info.
380-
SmallVector<ParentArgsTy, 4> ParentArgs;
381-
382375
public:
383376
SyntaxModelWalker &Walker;
384377
ArrayRef<SyntaxNode> TokenNodes;
@@ -401,10 +394,7 @@ class ModelASTWalker : public ASTWalker {
401394

402395
void visitSourceFile(SourceFile &SrcFile, ArrayRef<SyntaxNode> Tokens);
403396

404-
PreWalkResult<ArgumentList *>
405-
walkToArgumentListPre(ArgumentList *ArgList) override;
406-
PostWalkResult<ArgumentList *>
407-
walkToArgumentListPost(ArgumentList *ArgList) override;
397+
PreWalkAction walkToArgumentPre(const Argument &Arg) override;
408398

409399
PreWalkResult<Expr *> walkToExprPre(Expr *E) override;
410400
PostWalkResult<Expr *> walkToExprPost(Expr *E) override;
@@ -544,69 +534,38 @@ static bool shouldTreatAsSingleToken(const SyntaxStructureNode &Node,
544534
SM.getLineAndColumnInBuffer(Node.Range.getEnd()).first;
545535
}
546536

547-
ASTWalker::PreWalkResult<ArgumentList *>
548-
ModelASTWalker::walkToArgumentListPre(ArgumentList *ArgList) {
549-
Expr *ParentExpr = Parent.getAsExpr();
550-
if (!ParentExpr)
551-
return Action::Continue(ArgList);
552-
553-
ParentArgsTy Mapping;
554-
Mapping.Parent = ParentExpr;
555-
for (auto Arg : *ArgList) {
556-
auto res = Mapping.Args.try_emplace(Arg.getExpr(), Arg);
557-
assert(res.second && "Duplicate arguments?");
558-
(void)res;
559-
}
560-
ParentArgs.push_back(std::move(Mapping));
561-
return Action::Continue(ArgList);
562-
}
537+
ASTWalker::PreWalkAction
538+
ModelASTWalker::walkToArgumentPre(const Argument &Arg) {
539+
if (isVisitedBefore(Arg.getExpr()))
540+
return Action::SkipChildren();
563541

564-
ASTWalker::PostWalkResult<ArgumentList *>
565-
ModelASTWalker::walkToArgumentListPost(ArgumentList *ArgList) {
566-
if (Expr *ParentExpr = Parent.getAsExpr()) {
567-
assert(ParentExpr == ParentArgs.back().Parent &&
568-
"Unmatched walkToArgumentList(Pre|Post)");
569-
ParentArgs.pop_back();
542+
auto *Elem = Arg.getExpr();
543+
if (isa<DefaultArgumentExpr>(Elem))
544+
return Action::Continue();
545+
546+
auto NL = Arg.getLabelLoc();
547+
auto Name = Arg.getLabel();
548+
549+
SyntaxStructureNode SN;
550+
SN.Kind = SyntaxStructureKind::Argument;
551+
SN.BodyRange = charSourceRangeFromSourceRange(SM, Elem->getSourceRange());
552+
if (NL.isValid() && !Name.empty()) {
553+
SN.NameRange = CharSourceRange(NL, Name.getLength());
554+
SN.Range = charSourceRangeFromSourceRange(
555+
SM, SourceRange(NL, Elem->getEndLoc()));
556+
passTokenNodesUntil(NL, ExcludeNodeAtLocation);
557+
} else {
558+
SN.Range = SN.BodyRange;
570559
}
571-
return Action::Continue(ArgList);
560+
561+
pushStructureNode(SN, Elem);
562+
return Action::Continue();
572563
}
573564

574565
ASTWalker::PreWalkResult<Expr *> ModelASTWalker::walkToExprPre(Expr *E) {
575566
if (isVisitedBefore(E))
576567
return Action::SkipChildren(E);
577568

578-
auto addCallArgExpr = [&](const Argument &Arg) {
579-
auto *Elem = Arg.getExpr();
580-
if (isa<DefaultArgumentExpr>(Elem))
581-
return;
582-
583-
auto NL = Arg.getLabelLoc();
584-
auto Name = Arg.getLabel();
585-
586-
SyntaxStructureNode SN;
587-
SN.Kind = SyntaxStructureKind::Argument;
588-
SN.BodyRange = charSourceRangeFromSourceRange(SM, Elem->getSourceRange());
589-
if (NL.isValid() && !Name.empty()) {
590-
SN.NameRange = CharSourceRange(NL, Name.getLength());
591-
SN.Range = charSourceRangeFromSourceRange(
592-
SM, SourceRange(NL, Elem->getEndLoc()));
593-
passTokenNodesUntil(NL, ExcludeNodeAtLocation);
594-
} else {
595-
SN.Range = SN.BodyRange;
596-
}
597-
598-
pushStructureNode(SN, Elem);
599-
};
600-
601-
if (auto *ParentExpr = Parent.getAsExpr()) {
602-
if (!ParentArgs.empty() && ParentArgs.back().Parent == ParentExpr) {
603-
auto &ArgumentInfo = ParentArgs.back().Args;
604-
auto Arg = ArgumentInfo.find(E);
605-
if (Arg != ArgumentInfo.end())
606-
addCallArgExpr(Arg->second);
607-
}
608-
}
609-
610569
if (E->isImplicit())
611570
return Action::Continue(E);
612571

0 commit comments

Comments
 (0)