@@ -19,6 +19,54 @@ using namespace swift;
1919using namespace swift ::ide;
2020using namespace swift ::constraints;
2121
22+ static bool solutionSpecificVarTypesEqual (
23+ const llvm::SmallDenseMap<const VarDecl *, Type> &LHS,
24+ const llvm::SmallDenseMap<const VarDecl *, Type> &RHS) {
25+ if (LHS.size () != RHS.size ()) {
26+ return false ;
27+ }
28+ for (auto LHSEntry : LHS) {
29+ auto RHSEntry = RHS.find (LHSEntry.first );
30+ if (RHSEntry == RHS.end ()) {
31+ // Entry of the LHS doesn't exist in RHS
32+ return false ;
33+ } else if (!nullableTypesEqual (LHSEntry.second , RHSEntry->second )) {
34+ return false ;
35+ }
36+ }
37+ return true ;
38+ }
39+
40+ bool ExprTypeCheckCompletionCallback::Result::operator ==(
41+ const Result &Other) const {
42+ return IsImplicitSingleExpressionReturn ==
43+ Other.IsImplicitSingleExpressionReturn &&
44+ IsInAsyncContext == Other.IsInAsyncContext &&
45+ solutionSpecificVarTypesEqual (SolutionSpecificVarTypes,
46+ Other.SolutionSpecificVarTypes );
47+ }
48+
49+ void ExprTypeCheckCompletionCallback::addExpectedType (Type ExpectedType) {
50+ auto IsEqual = [&ExpectedType](Type Other) {
51+ return nullableTypesEqual (ExpectedType, Other);
52+ };
53+ if (llvm::any_of (ExpectedTypes, IsEqual)) {
54+ return ;
55+ }
56+ ExpectedTypes.push_back (ExpectedType);
57+ }
58+
59+ void ExprTypeCheckCompletionCallback::addResult (
60+ bool IsImplicitSingleExpressionReturn, bool IsInAsyncContext,
61+ llvm::SmallDenseMap<const VarDecl *, Type> SolutionSpecificVarTypes) {
62+ Result NewResult = {IsImplicitSingleExpressionReturn, IsInAsyncContext,
63+ SolutionSpecificVarTypes};
64+ if (llvm::is_contained (Results, NewResult)) {
65+ return ;
66+ }
67+ Results.push_back (NewResult);
68+ }
69+
2270void ExprTypeCheckCompletionCallback::sawSolutionImpl (
2371 const constraints::Solution &S) {
2472 auto &CS = S.getConstraintSystem ();
@@ -36,12 +84,11 @@ void ExprTypeCheckCompletionCallback::sawSolutionImpl(
3684 }
3785 }
3886
39- Results. push_back (
40- { ExpectedTy, ImplicitReturn, IsAsync, SolutionSpecificVarTypes} );
87+ addResult (ImplicitReturn, IsAsync, SolutionSpecificVarTypes);
88+ addExpectedType ( ExpectedTy);
4189
4290 if (auto PatternMatchType = getPatternMatchType (S, CompletionExpr)) {
43- Results.push_back (
44- {PatternMatchType, ImplicitReturn, IsAsync, SolutionSpecificVarTypes});
91+ addExpectedType (PatternMatchType);
4592 }
4693}
4794
@@ -53,10 +100,6 @@ void ExprTypeCheckCompletionCallback::deliverResults(
53100 &CompletionCtx);
54101 Lookup.shouldCheckForDuplicates (Results.size () > 1 );
55102
56- SmallVector<Type, 2 > ExpectedTypes;
57- for (auto &Result : Results) {
58- ExpectedTypes.push_back (Result.ExpectedType );
59- }
60103 for (auto &Result : Results) {
61104 Lookup.setExpectedTypes (ExpectedTypes,
62105 Result.IsImplicitSingleExpressionReturn );
0 commit comments