ilya-biryukov added a comment.

> Currently the problem is, there are again some tests out there that rely on
>  CodeCompeleteOrdinaryName to be called even when getting overloads at an 
> unknown
>  parameter type

CodeCompleteExpression works just fine there. Unknown parameter type should not 
block code completion.
The idea is that anywhere except the start of the argument expression, we need 
to call **only** signature help. At the start of the argument, we have to call 
both signature help and code completion.
All existing tests pass with the following diff:

  --- a/lib/Parse/ParseExpr.cpp
  +++ b/lib/Parse/ParseExpr.cpp
  @@ -1659,12 +1659,19 @@ Parser::ParsePostfixExpressionSuffix(ExprResult LHS) {
   
         if (OpKind == tok::l_paren || !LHS.isInvalid()) {
           if (Tok.isNot(tok::r_paren)) {
  -          if (ParseExpressionList(ArgExprs, CommaLocs, [&] {
  -                QualType PreferredType = Actions.ProduceCallSignatureHelp(
  -                    getCurScope(), LHS.get(), ArgExprs, 
PT.getOpenLocation());
  -                Actions.CodeCompleteExpression(getCurScope(), PreferredType);
  -              })) {
  +          auto Completer = [&] {
  +            QualType PreferredType = Actions.ProduceCallSignatureHelp(
  +                getCurScope(), LHS.get(), ArgExprs, PT.getOpenLocation());
  +            Actions.CodeCompleteExpression(getCurScope(), PreferredType);
  +            CalledOverloadCompletion = true;
  +          };
  +          if (ParseExpressionList(ArgExprs, CommaLocs, Completer)) {
               (void)Actions.CorrectDelayedTyposInExpr(LHS);
  +            if (PP.isCodeCompletionReached() && !CalledOverloadCompletion) {
  +              CalledOverloadCompletion = true;
  +              Actions.ProduceCallSignatureHelp(
  +                  getCurScope(), LHS.get(), ArgExprs, PT.getOpenLocation());
  +            }
               LHS = ExprError();
             } else if (LHS.isInvalid()) {
               for (auto &E : ArgExprs)

Please note there are other places where signature help methods 
(ProduceCallSignatureHelp and ProduceConstructorSignatureHelp) are called, we 
need to handle all of them. List of files that have those calls:

- lib/Parse/ParseExprCXX.cpp
- lib/Parse/ParseOpenMP.cpp
- lib/Parse/ParseExpr.cpp
- lib/Parse/ParseDecl.cpp



================
Comment at: include/clang/Parse/Parser.h:219
+  /// make sure CodeComleteCall is only called at the deepest level.
+  bool CalledOverloadCompletion = false;
+
----------------
NIT: rename to `CalledSignatureHelp`, this shouldn't affect completion


Repository:
  rC Clang

https://reviews.llvm.org/D51038



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to