[CodeCompletion] Handle ExprPattern in context type analysis

This improves type inference for code completion in argument position of
EnumElementPattern.
This commit is contained in:
Rintaro Ishizaki
2018-08-07 21:10:03 +09:00
parent c01eb93e9a
commit 18582d3406
4 changed files with 66 additions and 9 deletions

View File

@@ -4974,6 +4974,18 @@ namespace {
Ancestors.pop_back();
return true;
}
std::pair<bool, Pattern *> walkToPatternPre(Pattern *P) override {
if (Predicate(P))
Ancestors.push_back(P);
return { true, P };
}
Pattern *walkToPatternPost(Pattern *P) override {
if (Predicate(P))
Ancestors.pop_back();
return P;
}
};
} // end anonymous namespace
@@ -5020,6 +5032,13 @@ public:
default:
return false;
}
} else if (auto P = Node.getAsPattern()) {
switch (P->getKind()) {
case PatternKind::Expr:
return true;
default:
return false;
}
} else
return false;
}) {}
@@ -5060,7 +5079,7 @@ public:
break;
}
default:
llvm_unreachable("Unhandled expression kinds.");
llvm_unreachable("Unhandled expression kind.");
}
}
@@ -5085,7 +5104,7 @@ public:
}
break;
default:
llvm_unreachable("Unhandled statement kinds.");
llvm_unreachable("Unhandled statement kind.");
}
}
@@ -5127,7 +5146,22 @@ public:
break;
}
default:
llvm_unreachable("Unhandled decl kinds.");
llvm_unreachable("Unhandled decl kind.");
}
}
void analyzePattern(Pattern *P, llvm::function_ref<void(Type)> Callback) {
switch (P->getKind()) {
case PatternKind::Expr: {
auto ExprPat = cast<ExprPattern>(P);
if (auto D = ExprPat->getMatchVar()) {
if (D->hasInterfaceType())
Callback(D->getInterfaceType());
}
break;
}
default:
llvm_unreachable("Unhandled pattern kind.");
}
}
@@ -5155,6 +5189,8 @@ public:
analyzeStmt(Parent, Callback);
} else if (auto Parent = It->getAsDecl()) {
analyzeDecl(Parent, Callback);
} else if (auto Parent = It->getAsPattern()) {
analyzePattern(Parent, Callback);
}
if (!PossibleTypes.empty() || !PossibleNames.empty())
return true;