@@ -988,46 +988,51 @@ void DotExprLookup::sawSolution(const constraints::Solution &S) {
988
988
auto *ParsedExpr = CompletionExpr->getBase ();
989
989
auto *SemanticExpr = ParsedExpr->getSemanticsProvidingExpr ();
990
990
991
- if (Type BaseTy = GetType (ParsedExpr)) {
992
- auto *Locator = CS.getConstraintLocator (SemanticExpr);
993
- Type ExpectedTy = GetType (CompletionExpr);
994
- Expr *ParentExpr = CS.getParentExpr (CompletionExpr);
995
- if (!ParentExpr)
996
- ExpectedTy = CS.getContextualType (CompletionExpr);
997
-
998
- auto *CalleeLocator = S.getCalleeLocator (Locator);
999
- ValueDecl *ReferencedDecl = nullptr ;
1000
- if (auto SelectedOverload = S.getOverloadChoiceIfAvailable (CalleeLocator))
1001
- ReferencedDecl = SelectedOverload->choice .getDeclOrNull ();
1002
-
1003
- auto Key = std::make_pair (BaseTy, ReferencedDecl);
1004
- auto Ret = ResultToIndex.insert ({Key, Solutions.size ()});
1005
- if (!Ret.second && ExpectedTy) {
1006
- Solutions[Ret.first ->getSecond ()].ExpectedTypes .push_back (ExpectedTy);
1007
- } else {
1008
- bool ISDMT = S.isStaticallyDerivedMetatype (ParsedExpr);
1009
- bool ISEC = false ;
1010
- bool DisallowVoid = ExpectedTy
1011
- ? !ExpectedTy->isVoid ()
1012
- : !ParentExpr && CS.getContextualTypePurpose (CompletionExpr) != CTP_Unused;
1013
-
1014
- if (!ParentExpr) {
1015
- if (CS.getContextualTypePurpose (CompletionExpr) == CTP_ReturnSingleExpr)
991
+ auto BaseTy = GetType (ParsedExpr);
992
+ // If base type couldn't be determined (e.g. because base expression
993
+ // is an invalid reference), let's not attempt to do a lookup since
994
+ // it wouldn't produce any useful results anyway.
995
+ if (!BaseTy || BaseTy->is <UnresolvedType>())
996
+ return ;
997
+
998
+ auto *Locator = CS.getConstraintLocator (SemanticExpr);
999
+ Type ExpectedTy = GetType (CompletionExpr);
1000
+ Expr *ParentExpr = CS.getParentExpr (CompletionExpr);
1001
+ if (!ParentExpr)
1002
+ ExpectedTy = CS.getContextualType (CompletionExpr);
1003
+
1004
+ auto *CalleeLocator = S.getCalleeLocator (Locator);
1005
+ ValueDecl *ReferencedDecl = nullptr ;
1006
+ if (auto SelectedOverload = S.getOverloadChoiceIfAvailable (CalleeLocator))
1007
+ ReferencedDecl = SelectedOverload->choice .getDeclOrNull ();
1008
+
1009
+ auto Key = std::make_pair (BaseTy, ReferencedDecl);
1010
+ auto Ret = ResultToIndex.insert ({Key, Solutions.size ()});
1011
+ if (!Ret.second && ExpectedTy) {
1012
+ Solutions[Ret.first ->getSecond ()].ExpectedTypes .push_back (ExpectedTy);
1013
+ } else {
1014
+ bool ISDMT = S.isStaticallyDerivedMetatype (ParsedExpr);
1015
+ bool ISEC = false ;
1016
+ bool DisallowVoid = ExpectedTy
1017
+ ? !ExpectedTy->isVoid ()
1018
+ : !ParentExpr && CS.getContextualTypePurpose (
1019
+ CompletionExpr) != CTP_Unused;
1020
+
1021
+ if (!ParentExpr) {
1022
+ if (CS.getContextualTypePurpose (CompletionExpr) == CTP_ReturnSingleExpr)
1023
+ ISEC = true ;
1024
+ } else if (auto *ParentCE = dyn_cast<ClosureExpr>(ParentExpr)) {
1025
+ if (ParentCE->hasSingleExpressionBody () &&
1026
+ ParentCE->getSingleExpressionBody () == CompletionExpr) {
1027
+ ASTNode Last = ParentCE->getBody ()->getLastElement ();
1028
+ if (!Last.isStmt (StmtKind::Return) || Last.isImplicit ())
1016
1029
ISEC = true ;
1017
- } else if (auto *ParentCE = dyn_cast<ClosureExpr>(ParentExpr)) {
1018
- if (ParentCE->hasSingleExpressionBody () &&
1019
- ParentCE->getSingleExpressionBody () == CompletionExpr) {
1020
- ASTNode Last = ParentCE->getBody ()->getLastElement ();
1021
- if (!Last.isStmt (StmtKind::Return) || Last.isImplicit ())
1022
- ISEC = true ;
1023
- }
1024
1030
}
1025
-
1026
- Solutions.push_back ({
1027
- BaseTy, ReferencedDecl, {}, DisallowVoid, ISDMT, ISEC
1028
- });
1029
- if (ExpectedTy)
1030
- Solutions.back ().ExpectedTypes .push_back (ExpectedTy);
1031
1031
}
1032
+
1033
+ Solutions.push_back (
1034
+ {BaseTy, ReferencedDecl, {}, DisallowVoid, ISDMT, ISEC});
1035
+ if (ExpectedTy)
1036
+ Solutions.back ().ExpectedTypes .push_back (ExpectedTy);
1032
1037
}
1033
1038
}
0 commit comments