mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
[CodeCompletion] Handle ExprPattern in context type analysis
This improves type inference for code completion in argument position of EnumElementPattern.
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user