@@ -259,7 +259,7 @@ class CodeCompletionCallbacksImpl : public CodeCompletionCallbacks,
259
259
void completePostfixExprBeginning (CodeCompletionExpr *E) override ;
260
260
void completeForEachSequenceBeginning (CodeCompletionExpr *E) override ;
261
261
void completeForEachInKeyword () override ;
262
- void completePostfixExpr (Expr *E, bool hasSpace) override ;
262
+ void completePostfixExpr (CodeCompletionExpr *E, bool hasSpace) override ;
263
263
void completePostfixExprParen (Expr *E, Expr *CodeCompletionE) override ;
264
264
void completeExprKeyPath (KeyPathExpr *KPE, SourceLoc DotLoc) override ;
265
265
@@ -391,7 +391,8 @@ void CodeCompletionCallbacksImpl::completeForEachInKeyword() {
391
391
CurDeclContext = P.CurDeclContext ;
392
392
}
393
393
394
- void CodeCompletionCallbacksImpl::completePostfixExpr (Expr *E, bool hasSpace) {
394
+ void CodeCompletionCallbacksImpl::completePostfixExpr (CodeCompletionExpr *E,
395
+ bool hasSpace) {
395
396
assert (P.Tok .is (tok::code_complete));
396
397
397
398
// Don't produce any results in an enum element.
@@ -405,7 +406,8 @@ void CodeCompletionCallbacksImpl::completePostfixExpr(Expr *E, bool hasSpace) {
405
406
CompleteExprSelectorContext = ParseExprSelectorContext;
406
407
}
407
408
408
- ParsedExpr = E;
409
+ ParsedExpr = E->getBase ();
410
+ CodeCompleteTokenExpr = E;
409
411
CurDeclContext = P.CurDeclContext ;
410
412
}
411
413
@@ -1469,6 +1471,7 @@ bool CodeCompletionCallbacksImpl::trySolverCompletion(bool MaybeFuncBody) {
1469
1471
};
1470
1472
1471
1473
switch (Kind) {
1474
+ case CompletionKind::PostfixExpr:
1472
1475
case CompletionKind::DotExpr: {
1473
1476
assert (CodeCompleteTokenExpr);
1474
1477
assert (CurDeclContext);
@@ -1478,9 +1481,10 @@ bool CodeCompletionCallbacksImpl::trySolverCompletion(bool MaybeFuncBody) {
1478
1481
1479
1482
addKeywords (CompletionContext.getResultSink (), MaybeFuncBody);
1480
1483
1481
- Expr *CheckedBase = CodeCompleteTokenExpr->getBase ();
1482
- Lookup.deliverResults (CheckedBase, CurDeclContext, DotLoc,
1483
- isInsideObjCSelector (), CompletionContext, Consumer);
1484
+ bool IncludeOperators = (Kind == CompletionKind::PostfixExpr);
1485
+
1486
+ Lookup.deliverResults (DotLoc, isInsideObjCSelector (), IncludeOperators,
1487
+ HasSpace, CompletionContext, Consumer);
1484
1488
return true ;
1485
1489
}
1486
1490
case CompletionKind::UnresolvedMember: {
@@ -1694,26 +1698,10 @@ void CodeCompletionCallbacksImpl::doneParsing(SourceFile *SrcFile) {
1694
1698
case CompletionKind::AccessorBeginning:
1695
1699
case CompletionKind::CaseStmtBeginning:
1696
1700
case CompletionKind::PostfixExprParen:
1701
+ case CompletionKind::PostfixExpr:
1697
1702
llvm_unreachable (" should be already handled" );
1698
1703
return ;
1699
1704
1700
- case CompletionKind::PostfixExpr: {
1701
- Lookup.setHaveLeadingSpace (HasSpace);
1702
- if (isDynamicLookup (*ExprType))
1703
- Lookup.setIsDynamicLookup ();
1704
- Lookup.getValueExprCompletions (*ExprType, ReferencedDecl.getDecl ());
1705
- // / We set the type of ParsedExpr explicitly above. But we don't want an
1706
- // / unresolved type in our AST when we type check again for operator
1707
- // / completions. Remove the type of the ParsedExpr and see if we can come up
1708
- // / with something more useful based on the the full sequence expression.
1709
- if (ParsedExpr->getType ()->is <UnresolvedType>()) {
1710
- ParsedExpr->setType (nullptr );
1711
- }
1712
- Lookup.getOperatorCompletions (ParsedExpr, leadingSequenceExprs);
1713
- Lookup.getPostfixKeywordCompletions (*ExprType, ParsedExpr);
1714
- break ;
1715
- }
1716
-
1717
1705
case CompletionKind::KeyPathExprObjC: {
1718
1706
if (DotLoc.isValid ())
1719
1707
Lookup.setHaveDot (DotLoc);
@@ -1724,7 +1712,8 @@ void CodeCompletionCallbacksImpl::doneParsing(SourceFile *SrcFile) {
1724
1712
if (isDynamicLookup (*ExprType))
1725
1713
Lookup.setIsDynamicLookup ();
1726
1714
1727
- Lookup.getValueExprCompletions (*ExprType, ReferencedDecl.getDecl ());
1715
+ Lookup.getValueExprCompletions (*ExprType, ReferencedDecl.getDecl (),
1716
+ /* IncludeFunctionCallCompletions=*/ true );
1728
1717
} else {
1729
1718
SourceLoc Loc = P.Context .SourceMgr .getIDEInspectionTargetLoc ();
1730
1719
Lookup.getValueCompletionsInDeclContext (Loc, KeyPathFilter,
@@ -1949,7 +1938,8 @@ void CodeCompletionCallbacksImpl::doneParsing(SourceFile *SrcFile) {
1949
1938
1950
1939
if (isDynamicLookup (resultTy))
1951
1940
Lookup.setIsDynamicLookup ();
1952
- Lookup.getValueExprCompletions (resultTy, /* VD=*/ nullptr );
1941
+ Lookup.getValueExprCompletions (resultTy, /* VD=*/ nullptr ,
1942
+ /* IncludeFunctionCallCompletions=*/ true );
1953
1943
Lookup.getOperatorCompletions (analyzedExpr, leadingSequenceExprs);
1954
1944
Lookup.getPostfixKeywordCompletions (resultTy, analyzedExpr);
1955
1945
}
0 commit comments