[CodeCompletion][NFC] Use ASTWalker::ParentTy instead of ASTNode

in 'ExprParentFinder'. There's no reason to re-pack into ASTNode.
This commit is contained in:
Rintaro Ishizaki
2018-08-07 20:25:38 +09:00
parent d898f6d664
commit c01eb93e9a

View File

@@ -4917,7 +4917,7 @@ namespace {
class ExprParentFinder : public ASTWalker { class ExprParentFinder : public ASTWalker {
friend class CodeCompletionTypeContextAnalyzer; friend class CodeCompletionTypeContextAnalyzer;
Expr *ChildExpr; Expr *ChildExpr;
llvm::function_ref<bool(ASTNode)> Predicate; llvm::function_ref<bool(ParentTy)> Predicate;
bool arePositionsSame(Expr *E1, Expr *E2) { bool arePositionsSame(Expr *E1, Expr *E2) {
return E1->getSourceRange().Start == E2->getSourceRange().Start && return E1->getSourceRange().Start == E2->getSourceRange().Start &&
@@ -4925,11 +4925,11 @@ namespace {
} }
public: public:
llvm::SmallVector<ASTNode, 5> Ancestors; llvm::SmallVector<ParentTy, 5> Ancestors;
ASTNode ParentClosest; ParentTy ParentClosest;
ASTNode ParentFarthest; ParentTy ParentFarthest;
ExprParentFinder(Expr* ChildExpr, ExprParentFinder(Expr* ChildExpr,
llvm::function_ref<bool(ASTNode)> Predicate) : llvm::function_ref<bool(ParentTy)> Predicate) :
ChildExpr(ChildExpr), Predicate(Predicate) {} ChildExpr(ChildExpr), Predicate(Predicate) {}
std::pair<bool, Expr *> walkToExprPre(Expr *E) override { std::pair<bool, Expr *> walkToExprPre(Expr *E) override {
@@ -4989,8 +4989,9 @@ class CodeCompletionTypeContextAnalyzer {
public: public:
CodeCompletionTypeContextAnalyzer(DeclContext *DC, Expr *ParsedExpr) : DC(DC), CodeCompletionTypeContextAnalyzer(DeclContext *DC, Expr *ParsedExpr) : DC(DC),
ParsedExpr(ParsedExpr), SM(DC->getASTContext().SourceMgr), ParsedExpr(ParsedExpr), SM(DC->getASTContext().SourceMgr),
Context(DC->getASTContext()), Finder(ParsedExpr, [](ASTNode Node) { Context(DC->getASTContext()),
if (auto E = Node.dyn_cast<Expr *>()) { Finder(ParsedExpr, [](ASTWalker::ParentTy Node) {
if (auto E = Node.getAsExpr()) {
switch(E->getKind()) { switch(E->getKind()) {
case ExprKind::Call: case ExprKind::Call:
case ExprKind::Binary: case ExprKind::Binary:
@@ -5000,7 +5001,7 @@ public:
default: default:
return false; return false;
} }
} else if (auto S = Node.dyn_cast<Stmt *>()) { } else if (auto S = Node.getAsStmt()) {
switch (S->getKind()) { switch (S->getKind()) {
case StmtKind::Return: case StmtKind::Return:
case StmtKind::ForEach: case StmtKind::ForEach:
@@ -5012,7 +5013,7 @@ public:
default: default:
return false; return false;
} }
} else if (auto D = Node.dyn_cast<Decl *>()) { } else if (auto D = Node.getAsDecl()) {
switch (D->getKind()) { switch (D->getKind()) {
case DeclKind::PatternBinding: case DeclKind::PatternBinding:
return true; return true;
@@ -5148,11 +5149,11 @@ public:
for (auto It = Finder.Ancestors.rbegin(); It != Finder.Ancestors.rend(); for (auto It = Finder.Ancestors.rbegin(); It != Finder.Ancestors.rend();
++ It) { ++ It) {
if (auto Parent = It->dyn_cast<Expr *>()) { if (auto Parent = It->getAsExpr()) {
analyzeExpr(Parent, Callback, PossibleNames); analyzeExpr(Parent, Callback, PossibleNames);
} else if (auto Parent = It->dyn_cast<Stmt *>()) { } else if (auto Parent = It->getAsStmt()) {
analyzeStmt(Parent, Callback); analyzeStmt(Parent, Callback);
} else if (auto Parent = It->dyn_cast<Decl *>()) { } else if (auto Parent = It->getAsDecl()) {
analyzeDecl(Parent, Callback); analyzeDecl(Parent, Callback);
} }
if (!PossibleTypes.empty() || !PossibleNames.empty()) if (!PossibleTypes.empty() || !PossibleNames.empty())
@@ -5429,12 +5430,12 @@ void CodeCompletionCallbacksImpl::doneParsing() {
case CompletionKind::UnresolvedMember : { case CompletionKind::UnresolvedMember : {
Lookup.setHaveDot(SourceLoc()); Lookup.setHaveDot(SourceLoc());
SmallVector<Type, 1> PossibleTypes; SmallVector<Type, 1> PossibleTypes;
ExprParentFinder Walker(UnresolvedExpr, [&](ASTNode Node) { ExprParentFinder Walker(UnresolvedExpr, [&](ASTWalker::ParentTy Node) {
return Node.is<Expr *>(); return Node.getAsExpr();
}); });
CurDeclContext->walkContext(Walker); CurDeclContext->walkContext(Walker);
bool Success = false; bool Success = false;
if (auto PE = Walker.ParentFarthest.get<Expr *>()) { if (auto PE = Walker.ParentFarthest.getAsExpr()) {
prepareForRetypechecking(PE); prepareForRetypechecking(PE);
Success = typeCheckUnresolvedExpr(*CurDeclContext, UnresolvedExpr, PE, Success = typeCheckUnresolvedExpr(*CurDeclContext, UnresolvedExpr, PE,
PossibleTypes); PossibleTypes);