capfredf added inline comments.

================
Comment at: clang/lib/Interpreter/CodeCompletion.cpp:84
+  std::string AllCodeText =
+      MainInterp.getAllInput() + "\nvoid dummy(){\n" + Buffer.str() + "}";
+  auto Lines = std::count(AllCodeText.begin(), AllCodeText.end(), '\n') + 1;
----------------
v.g.vassilev wrote:
> I am not sure why we need to wrap this code. Can we teach the 
> `TopLevelStmtDecl` to work with the code completion logic?
I think the problem has less to do with the TopLevelStmtDecl. Usually, a 
`TopLevelStmtDecl` instance is a successful result from `ParseXXXXX`,  but when 
`CodeCompletion` is triggered during parsing, nothing meaning comes out from 
`ParseXXXX`.  

We need to wrap our input because we need `Sema::CodeCompleteOrdinaryName` to 
work on code from the REPL in a different completion context than the same code 
from a regular source file.

In a regular C++ file, 

```
int foo = 42;
f_
```

Since top-level expressions are not supported, `foo` should not be an option. 

But in a REPL session,

```
clang-repl> int foo = 42;
clang-repl> f_
```

we are allowed to use `foo` to make a statement like `foo + 84;`.

Since the argument for `CompletionContext` to `CodeCompleteOrdinaryName` is 
controlled by the parsing process, ie. there is no way to configure it from 
outside, I think faking context is a straightforward solution. 

Alternatively, we can check if the compiler is in incremental mode and call 
`CodeCompleteOrdinaryName` with the context we want in parsing. Something like:

```
if (PP.isIncrementalProcessingEnabled() {
  Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Statement);
} else {
  Actions.CodeCompleteOrdinaryName(getCurScope(), Sema::PCC_Namespace);
}
```

I personally think both solutions are extensionally equivalent, but the 
alternative is a bit intrusive. 


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D154382/new/

https://reviews.llvm.org/D154382

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

Reply via email to