[READY] Handle null characters in completion response
The `detailed_info` field may contain null characters e.g. `\x00` in Python docstrings (though it doesn't make sense to use such characters in a docstring). Since these characters cannot be evaluated through `pyeval` (and `py3eval`), we replace them with the symbol used by Vim to display them (`^@`).
This PR also rewrites the `_ConvertCompletionDataToVimData` function by relying on two things:
- [the `insertion_text` field is always defined](600f54de20/ycmd/responses.py (L109));
- [Vim ignores fields with an empty string](833e5dab14/src/edit.c (L2748-L2755)).
I did some measurements and the performance hit is negligible.
Fixes#3207.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/valloric/youcompleteme/3208)
<!-- Reviewable:end -->
Include the following changes:
- replace Boost canonical function with our own implementation;
- improve filename completer;
- support completion FixIts for C-family languages;
- update jdt.ls to 0.26.0;
- install fixed version of TypeScript in third-party folder;
- only add the necessary directories to Python path.
The completion info field may contain null characters e.g. \x00 in
Python docstrings. These characters cannot be evaluated so they are
removed.
Rewrite the function that convert ycmd completion to Vim completion.
[READY] Recompute starting column on auto-wrapping
When auto-wrapping is enabled (`t` or `c` are present in `formatoptions`), Vim wraps the current line after the completion request is sent but before calling the completefunc. The column where the completion starts is invalid in that case and must be recomputed.
Fixes#2789.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/valloric/youcompleteme/3192)
<!-- Reviewable:end -->
When auto-wrapping is enabled, Vim wraps the current line after the
completion request is sent but before calling the completefunc. The
starting column returned by the server is invalid in that case and must
be recomputed.
added type check for g:ycm_filetype_blacklist
# PR Prelude
- [x] I have read and understood YCM's [CONTRIBUTING][cont] document.
- [x] I have read and understood YCM's [CODE_OF_CONDUCT][code] document.
- [x] I have included tests for the changes in my PR. If not, I have included a
rationale for why I haven't.
- [x] **I understand my PR may be closed if it becomes obvious I didn't
actually perform all of these steps.**
# Why this change is necessary and useful
I made a mistake while configuring ycm and used a list instead of a ditionary for the blacklist, like so:
```vim
let g:ycm_filetype_blacklist = ['python']
```
If the `CursorMoved` autocmd is installed while the configuration is not a dictionary, an error message is raised after every keystroke, this makes fixing the configuration error a bit painful. Error message:
```
Error detected while processing function <SNR>78_OnCursorMovedNormalMode[1]..<SNR>78_AllowedToCompleteInCurrentBuffer[1]..<SNR>78_AllowedToCompleteInBuffer:
line 15:
E715: Dictionary required
```
This PR just adds a check for the type of the variable `g:ycm_filetype_blacklist`, if it's the wrong type a message is printed and the autocmd is not installed. The check was done inside `Enable` to ensure the init.vim had fully executed.
[cont]: https://github.com/Valloric/YouCompleteMe/blob/master/CONTRIBUTING.md
[code]: https://github.com/Valloric/YouCompleteMe/blob/master/CODE_OF_CONDUCT.md
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/valloric/youcompleteme/3124)
<!-- Reviewable:end -->
Vim allows each item of the list returned by an omnifunc to be either a string
or a dictionary but ycmd only supports lists where items are all strings or all
dictionaries. Convert all strings into dictionaries.
[READY] Update docs about the default version of Python used for completion
The behavior of `get_default_environment` has been changed in the latest version of Jedi. Instead of picking the latest version of Python available on the system, it now uses the one it's running on i.e. the one running ycmd in our case. See https://github.com/davidhalter/jedi/issues/1196. Update the docs accordingly.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/valloric/youcompleteme/3176)
<!-- Reviewable:end -->
[READY] Ignore ft= argument from YcmCompleter command
The `ft=` argument of the `YcmCompleter` command is supposed to allow users to specify a completer when running a command. However, this was broken a long time ago in commit 29bb90a6b4. Only the `ycm:ident` value is still supported but it serves no purpose because the identifier completer doesn't define commands. Ignore completely the `ft=` argument and move the logic to the Python layer. Remove the argument from the documentation.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/valloric/youcompleteme/3161)
<!-- Reviewable:end -->
[READY] Reduce logging verbosity when a connection error occurs
Logging `ConnectionError` as an exception results in writing a Python traceback of 64 lines in the logs. Not only this messes up the logs, this also considerably increases their size for no good reason. Instead, we should log the exception as an error. This gives us something like
```
2018-09-24 11:19:27,487 - ERROR - HTTPConnectionPool(host='127.0.0.1', port=27810): Max retries exceeded with url: /ready (Caused by ConnectTimeoutError(<requests.packages.urllib3.connection.HTTPConnection object at 0x0000000005CC7B70>, 'Connection to 127.0.0.1 timed out. (connect timeout=0.01)'))
```
which is much more reasonable.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/valloric/youcompleteme/3154)
<!-- Reviewable:end -->
Include the following changes:
- remove Node.js workaround for Debian-based distributions;
- update Boost to 1.68;
- add semantic trigger for Julia;
- improve type information on C++ member functions;
- check if Python headers are installed before building;
- raise proper exception for commands when file is still being parsed
in C-family languages;
- update Go completer;
- update regex submodule;
- add Python path to debugging information;
- support framework headers completion and code navigation in C-family
languages;
- update Clang to 7.0.0;
- update jdt.ls to 0.25.0;
- handle null hover response from language servers;
- update list of completion kinds defined by LSP;
- send completion item kinds capability to language servers;
- update Parso to 0.3.1 and Jedi to 0.13.1.
Only the "ycm:ident" value of the ft= argument in the YcmCompleter
command is working. This value forces the use of the identifier
completer which serve no purpose because this completer doesn't define
commands. Ignore completely the ft= argument and move the logic to the
Python layer.
[READY] Update Java links in documentation
The `pom.xml` link is broken (the `java-language-server` branch doesn't exist). Use a specific commit for the Java links so that they can't be affected by a change in ycmd.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/valloric/youcompleteme/3147)
<!-- Reviewable:end -->
[READY] Set window height according to the wrap option
The height of the quickfix and location list windows is set to fit all entries by assuming that the lines of the entries are always wrapped if they are longer than the window width. This assumption is wrong if `nowrap` is set. In that case, the height should be set to the number of entries.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/valloric/youcompleteme/3134)
<!-- Reviewable:end -->
[READY] Fix cursor position when replacing chunk
When replacing an area of the buffer with `ReplaceChunk`, we are replacing the whole last line of that area because the Python interface doesn't allow changing only some part of a line. If the cursor is positioned on that line just after the ending column of the replaced area, we expect the cursor to be moved depending on the amount of text replaced. However, since the whole line is replaced, Vim cannot figure where the cursor should be positioned and so the cursor is not moved. This leads to the cursor ending in an unexpected position after a FixIt is applied. Here's an illustration of the issue in TypeScript where an import statement is automatically inserted after selecting a completion:
![fixit-cursor-position-before](https://user-images.githubusercontent.com/10026824/44363871-be1ec400-a4c5-11e8-949b-14ada91bdc5e.gif)
The solution is to manually move the cursor in that case:
![fixit-cursor-position-after](https://user-images.githubusercontent.com/10026824/44364038-3a190c00-a4c6-11e8-8aca-4bc8ccb98edc.gif)
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/valloric/youcompleteme/3126)
<!-- Reviewable:end -->
Vim doesn't move the cursor accordingly when its position is on the last line
of the replaced area after its ending column because the whole line is
replaced. The cursor must be manually moved in that case.
Contrarily to what the docs say, Vim only stops completion if the value
returned by the omnifunc is -3 or -2. In other cases, if the value is negative
or greater than the current column, the start column is set to the current
column; otherwise, the value is used as the start column.
[READY] Add CUDA to C-family languages in documentation
Add CUDA to the list of C-family languages in the docs and use the "C-family languages" expression when appropriate (instead of enumerating each language).
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/valloric/youcompleteme/3123)
<!-- Reviewable:end -->
[READY] Update Python documentation and add extra conf file
This PR updates the Python docs and adds a `.ycm_extra_conf.py` file to be able to complete third-party packages in YCM code.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/valloric/youcompleteme/3113)
<!-- Reviewable:end -->
[READY] Move cursor to start column before calling again omnifunc
Vim internally moves the cursor to the start column before calling the omnifunc a second time. This can be confirmed by starting Vim with the following vimrc:
```vim
set nocompatible
function! Omnifunc(findstart, base)
echom col('.')
if a:findstart
if getline('.') == 'foo.ba'
return 4
endif
endif
return [ 'bar', 'baz']
endfunction
set omnifunc=Omnifunc
```
typing `foo.ba`, and hitting `<C-X><C-O>`. This outputs `7` and `5` on the command line which means that the cursor at column 7 on the first call of the omnifunc is moved to column 5 on the second call.
Since some omnifuncs depend on this to compute the list of candidates (e.g. the one defined by [the LanguageClient-neovim plugin](https://github.com/autozimu/LanguageClient-neovim)), we should reproduce that behavior in YCM.
Fixes https://github.com/Valloric/YouCompleteMe/issues/3099.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/valloric/youcompleteme/3112)
<!-- Reviewable:end -->