<div dir="ltr">Hi Michael,<br><div class="gmail_extra"><br><div class="gmail_quote">On 10 January 2017 at 16:00, Michael Kruse via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Hi everyone,<br>
<br>
I am interested in improving clang's autocompletion to also suggest<br>
free functions that can take the expression at the cursor as first<br>
parameter, in addition to the methods its class has. I am interested<br>
in opinions and suggestions on how to implement it.<br>
<br>
Currently, YouCompleteMe and clang-complete, after typing (| = cursor position)<br>
<br>
std::string str;<br>
str.|<br>
<br>
will suggest std::string's methods (std::string::size(),<br>
std::string::push_back(), etc.), but not free functions such as<br>
std::stoi, std::stod, std::hash, etc. These are operations on the<br>
string as well, but for various reason are not members of std::string.<br>
Adding them to the autocompletion would make them more discoverable.<br>
<br>
When selecting a free function, eg. stoi, completion would change the<br>
"str." line to<br>
<br>
std::stoi(str, |<br></blockquote><div><br></div><div>I think this could be an interesting extension to the current code completion engine.</div><div>Although I feel like sometimes it might lead to more annoying clutter that users don't want,</div><div>so it would be a good idea to allow users to control it using some global setting.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<br>
Languages such as C# have extension methods that allow keeping the<br>
class definition smaller and have additional functionalities in<br>
separate compilation units while still being discoverable using<br>
autocompletion. Unfortunately there is nothing equivalent in C or C++.<br>
<br>
This could be even more useful for C-style char*. Typing "str" and<br>
then triggering autocompletion allows to browse a list of<br>
string-related functions, but neither it is complete (eg. atoi won't<br>
appear) nor contains only string-related functions (eg.<br>
std::streambuf). Typing the argument first and then get a list of<br>
operations might be more useful than having to know the operation<br>
first.<br></blockquote><div><br></div><div>I'm not 100% convinced by the use of this feature for char * completions.</div><div>Would you suggest the free functions for char * after "." or "->" or perhaps both?</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<br>
<br>
Implementation<br>
<br>
I think it is not possible to implement this in YouCompleteMe or<br>
clang-complete only, support by clang is needed as it needs to know<br>
the expression's and parameter's types and their conversions. After<br>
looking at clang's C API for autocompletion that is used by<br>
YouCompleteMe and clang-complete (clang_codeCompleteAt), I think<br>
placing something at locations other than the cursor position or<br>
replacing previous characters doesn't seem to be possible. That is,<br>
there are only values in CodeCompletionString::<wbr>ChunkKind that add<br>
text, but nothing to remove, overwrite or change the cursor position.<br></blockquote><div><br></div><div>I think that's right, so this change will require changes to the libclang completion API.</div><div>That said I don't think that API clients will struggle to adapt to the change, as for</div><div>example Xcode can already deal with removal of N characters prior to completion point, so</div><div>it should be straightforward enough to adapt it to the libclang changes provided the API</div><div>isn't changed drastically.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<br>
Eg. Visual Studio can automatically replace "." and "->", depending on<br>
whether the expression under the cursor is a class or<br>
pointer-to-class. This seems to be impossible to implement with the<br>
current interface.<br>
<br>
There is also a concern that enumerating a lot of free functions could<br>
lead to a significant delay.<br></blockquote><div><br></div><div>Right. However, the code completion engine can cache certain global declarations, so we could try</div><div>and utilize that (but I'm not 100% sure if the cache can be used in this case).</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<br>
<br>
Background<br>
<br>
We are discussing a C++ interface for the Integer Set Library [1]<br>
which would make its reference counting automatically handled by RAII<br>
in Polly [2]. One point of discussion was whether to make C functions<br>
members of its classes or free functions in the isl:: namespace.<br>
Essentially, the choice between<br>
<br>
intersect(set1, set2);<br>
<br>
and<br>
<br>
set1.intersect(set2);<br>
<br>
The latter introduces an asymmetry between the arguments and raises<br>
the question whether the method modifies the object and/or returns a<br>
new one. It also does not do implicit conversions of the "this"<br>
argument. On the plus side, it does not pollute the isl:: namespace,<br>
is more object-oriented and allows browsing the interface using<br>
code-completion. The last point would not be an issue anymore if code<br>
completion also suggested functions.<br>
<br>
Regards,<br>
Michael<br>
<br>
<br>
[1] <a href="http://isl.gforge.inria.fr/" rel="noreferrer" target="_blank">http://isl.gforge.inria.fr/</a><br>
[2] <a href="https://docs.google.com/document/d/1h89T_wKRFSimY8bn9estBI4p0pJZkj7Zu5ptSE7nybI/edit#" rel="noreferrer" target="_blank">https://docs.google.com/<wbr>document/d/1h89T_<wbr>wKRFSimY8bn9estBI4p0pJZkj7Zu5p<wbr>tSE7nybI/edit#</a><br>
______________________________<wbr>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</a><br>
</blockquote></div><br></div></div>