yvvan added inline comments.

================
Comment at: lib/Sema/SemaCodeComplete.cpp:4118
+              : diag::err_typecheck_member_reference_suggestion;
+      Diag(OpLoc, DiagID) << ConvertedBaseType << IsArrow
+                          << Base->getSourceRange() << FixIt;
----------------
ilya-biryukov wrote:
> Why do we need to report an extra diagnostic here in completion?
> Our completion items contain all the relevant information for actually doing 
> the change, and having different diagnostics in completion vs non-completion 
> modes does not seem like the right way to do things.
In current version of this patch it's not needed anymore. Removed.


================
Comment at: tools/libclang/CIndexCodeCompletion.cpp:309
+  /// before that result for the corresponding completion item.
+  std::vector<std::vector<FixItHint>> FixItsVector;
 };
----------------
ilya-biryukov wrote:
> yvvan wrote:
> > ilya-biryukov wrote:
> > > Storing `vector<vector<>>` here makes looks like a hack. Even though it 
> > > might seem more tricky, I suggest storing an opaque pointer to 
> > > `vector<FixItHint>` in each `CXCompletionResult`.  Managing the lifetime 
> > > of vectors in the `AllocatedCXCodeCompleteResults` seems totally fine, 
> > > but there should be a way to get to the fixits in a similar way we can 
> > > get to the completion string.
> > > More concretely, I suggest the following API:
> > > ```
> > > // === Index.h
> > > typedef void* CXCompletionFixIts;
> > > typedef struct {
> > >    // ...
> > >    CXCompletionFixIts FixIts;
> > > };
> > > 
> > > // Get the number of fix-its.
> > > unsigned clang_getCompletionNumFixIts(CXCompletionResult *Result);
> > > // ... Similar to getDiagnosticFixIt
> > > CXString clang_getCompletionFixIt((CXCompletionResult *Result, unsigned 
> > > fixit_index, CXSourceRange *replacement_range);
> > > 
> > > 
> > > 
> > > // === Impl.cpp
> > > struct AllocatedCXCodeCompleteResults : public CXCodeCompleteResults {
> > > // .....
> > > // Pool for allocating non-empty fixit vectors in the CXCompletionResult.
> > > std::vector<std::vector<FixItHint>> FixItsVector
> > > };
> > > 
> > > unsigned clang_getCompletionNumFixIts(CXCompletionResult *Result) {
> > >   auto* FixIts = static_cast<std::vector<FixItHint>*>(Result->FixIts);
> > >   if (!FixIts)
> > >     return 0;
> > >   return FixIts->size();
> > > }
> > > ```
> > unsigned clang_getCompletionNumFixIts(CXCompletionResult *Result);
> > 
> > Do you mean appending CXCompletionResult struct with the 
> > "CXCompletionFixIts FixIts" member? Doesn't it break binary compatibility 
> > (changing the struct size)?
> Ah, you're right. If libclang promises binary compatibility with binaries 
> compiled from headers with previous versions, we're not allowed to do this 
> change.
> I'm not sure what's the best way to do that, probably the interface you 
> propose does what we want with the least amount of friction.
> I'd be fine with leaving as is, but given that `libclang` has a stable 
> interface, I'd get more opinions from someone who owns the code before adding 
> this. (Another reason to split this change into two?)
> 
> A possible alternative that won't break binary compatibility would be to 
> change the opaque `CXCompletionString` to point into a struct that has both 
> `CodeCompletionString` and the fixits vector, but that means finding all 
> use-sites of `CXCompletionString` and that might be tricky.
I already tried to have it in CXCompletionString. And I've even found and 
replaced all usages. But there's a bigger issue: CXCompletionString does not 
have dispose method and it exists not only in context of CXCompletionChunkKind 
(for example as a return value of clang_getCompletionChunkCompletionString). 
It's easy to add such dispose method but it will introduce leaks in already 
existing code bases.

By all that I mean that "the interface you propose does what we want with the 
least amount of friction".


https://reviews.llvm.org/D41537



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

Reply via email to