[READY] Prioritize errors over warnings on the same line
When multiple diagnostics are on the same line, warnings may have higher priority than errors. See #2141 for an example. This happens for several reasons:
- we sort diagnostics by column and then by kind. We should do the opposite;
- we place all signs; each sign overriding the previous one. Since only one sign is visible by line, we should just insert the first one (which has the highest priority);
- we draw highlighting matches (squiggles) in the same order as diagnostics; each match being drawn over the previous ones. We should draw them in reverse order (from lowest to highest priority).
Fixes#2141.
<!-- 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/2592)
<!-- Reviewable:end -->
[READY] Merge back OnBufferRead and OnBufferEnter into OnBufferVisit
PR #2312 introduced an issue where the `completeopt`, `completefunc`, and `omnifunc` options are not set for buffers opened before the plugin is loaded. The `OnBufferVisit` function was split into `OnBufferRead` and `OnBufferEnter` but `SetUpCompleteopt`, `SetCompleteFunc`, and `SetOmnicompleteFunc` were not copied to `OnBufferEnter`.
Since the result of `VisitedBufferRequiresReparse` is identical to `AllowedToCompleteInCurrentBuffer` for a new buffer (its buffer number is necessarily new), we merge back the two functions into `OnBufferVisit` to fix the issue. Also, we change the `DisableOnLargeFile` function to include it in `AllowedToCompleteInCurrentBuffer`. This reduces duplication of 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/2589)
<!-- Reviewable:end -->
[READY] Accept capitalized name for Python executable
I was looking at `PathToPythonInterpreter` coverage and was surprised to see [that line](
01570aac03/python/ycm/paths.py (L84)) covered. This shouldn't be the case since we are supposed to use the Python from `PYTHON_USED_DURING_BUILDING`. This happens because the Python executable used in our Travis builds on macOS is named `Python` (with a capital letter) and so we don't accept it.
<!-- 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/2590)
<!-- Reviewable:end -->
[READY] Remove Python version check
Even with the `-S` option (see PR https://github.com/Valloric/YouCompleteMe/pull/2502), starting the Python interpreter to check its version can be slow. For instance, on my machine (in PowerShell):
```ps
> Measure-Command -Expression {python -S -c "pass"}
...
TotalMilliseconds : 25,4387
```
It's also not particularly useful because, in the typical case, the Python used to start ycmd will be the one from `PYTHON_USED_DURING_BUILDING` which is necessarily a supported version. In the cases where the `g:ycm_server_python_interpreter` option is specified or a Python is found in the PATH, it's up to the user to provide a supported version. If they don't, the ycmd server will probably fail to start and the following error will be displayed to them:
```
The ycmd server SHUT DOWN (restart with ':YcmRestartServer'). Unexpected exit code 1. Use the ':YcmToggleLogs' command to check the logs.
```
They can then look at the logs to understand what went wrong.
Finally, the last case is when the Python is the one used by YCM itself. In that case, if the Python version is not supported, it will fail before doing the check so it doesn't matter.
As always, here are the improvements on startup time:
<table>
<tr>
<th rowspan="2">Platform</th>
<th colspan="2">First run (ms)</th>
<th colspan="2">Subsequent runs (ms)</th>
</tr>
<tr>
<td>Before</td>
<td>After</td>
<td>Before</td>
<td>After</td>
</tr>
<tr>
<td>Ubuntu 16.04 64-bit</td>
<td>147</td>
<td>134</td>
<td>74</td>
<td>65</td>
</tr>
<tr>
<td>macOS 10.12</td>
<td>189</td>
<td>165</td>
<td>127</td>
<td>107</td>
</tr>
<tr>
<td>Windows 10 64-bit</td>
<td>242</td>
<td>200</td>
<td>147</td>
<td>115</td>
</tr>
</table>
*Results obtained by running the `prof.py` script from [this branch](https://github.com/micbou/YouCompleteMe/tree/profiling-startup) on Python 3.6.*
<!-- 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/2585)
<!-- Reviewable:end -->
Typescript diagnostics
# PR Prelude
Thank you for working on YCM! :)
**Please complete these steps and check these boxes (by putting an `x` inside
the brackets) _before_ filing your PR:**
- [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
This just makes use of [these changes](https://github.com/Valloric/ycmd/pull/718) to ycmd.
It adds TypeScript to the list of filetypes that diagnostics are supported for and reflects that in the README. (And updates ycmd.)
No tests are included, since the only code that changed is the hard-coded list of filetypes. The new ycmd functionality is tested in that project.
<!-- 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/2584)
<!-- Reviewable:end -->
Indents added in Ubuntu and Fedora sections
# PR Prelude
Thank you for working on YCM! :)
**Please complete these steps and check these boxes (by putting an `x` inside
the brackets) _before_ filing your PR:**
- [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
Indents added in Ubuntu section (for easier copy&pasting).
PS. Tests are not included - minor documentation change.
[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/2565)
<!-- Reviewable:end -->
[READY] Prefer Python 3 over Python 2
When both versions are available, we should use Python 3 over Python 2 for the following reasons:
- faster startup:
<table>
<tr>
<th rowspan="2">Platform</th>
<th colspan="2">First run (ms)</th>
<th colspan="2">Subsequent runs (ms)</th>
</tr>
<tr>
<td>Python 2</td>
<td>Python 3</td>
<td>Python 2</td>
<td>Python 3</td>
</tr>
<tr>
<td>Ubuntu 16.04 64-bit</td>
<td>197</td>
<td>110</td>
<td>117</td>
<td>84</td>
</tr>
<tr>
<td>macOS 10.12</td>
<td>322</td>
<td>186</td>
<td>210</td>
<td>124</td>
</tr>
<tr>
<td>Windows 10 64-bit</td>
<td>601</td>
<td>295</td>
<td>251</td>
<td>144</td>
</tr>
</table>
*Results obtained by running the `prof.py` script from [this branch](https://github.com/micbou/YouCompleteMe/tree/profiling-startup). The difference between first run and subsequent runs is Python bytecode generation (`*.pyc` files).*
These differences are due to `python-future` monkey-patching a lot of stuff on Python 2 but not on Python 3;
- better Windows support. For instance, [the `tempfile` module returns temporary paths in all lowercase on Python 2](https://bugs.python.org/issue14255) (we use it to create our logfiles). This is fixed on Python 3.
- [Python 2 support will be dropped in 2020](https://docs.python.org/devguide/index.html#branchstatus).
<!-- 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/2566)
<!-- Reviewable:end -->
When both versions are available, we prefer Python 3 over Python 2:
- faster startup (no monkey-patching from python-future);
- better Windows support (e.g. temporary paths are not returned in all
lowercase);
- Python 2 support will eventually be dropped.
[READY] Always defer loading at VimEnter
YCM should start the same whether Vim is running in GUI or not. Otherwise, this makes it difficult for other plugins to interact with YCM at startup because they can't predict how YCM will start unless they also check if Vim is running in GUI which is unreasonable. Since we can't load it at Vim startup because of [a deadlock issue](https://github.com/Valloric/YouCompleteMe/pull/2473#issuecomment-267716136), we should always defer it at the VimEnter event.
See discussion in 39659caf34 for more details.
<!-- 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/2561)
<!-- Reviewable:end -->
[READY] Import the requests module lazily
The requests module is slow to import. See https://github.com/kennethreitz/requests/issues/3213. We should lazy load it to improve startup time. We do that by adding two methods to the `BaseRequest` class: one that returns the requests module and another the session object since it depends on the `request-futures` module and `requests-futures` imports `requests`. In addition, we make sure that no requests are sent at startup otherwise there would be no point to lazy load these. These requests would fail anyway since the server can't be ready yet.
Here are the improvements on startup time:
<table>
<tr>
<th rowspan="2">Platform</th>
<th colspan="2">First run (ms)</th>
<th colspan="2">Subsequent runs (ms)</th>
</tr>
<tr>
<td>Before</td>
<td>After</td>
<td>Before</td>
<td>After</td>
</tr>
<tr>
<td>Ubuntu 16.04 64-bit</td>
<td>240</td>
<td>131</td>
<td>173</td>
<td>74</td>
</tr>
<tr>
<td>macOS 10.12</td>
<td>435</td>
<td>315</td>
<td>261</td>
<td>208</td>
</tr>
<tr>
<td>Windows 10 64-bit</td>
<td>894</td>
<td>594</td>
<td>359</td>
<td>247</td>
</tr>
</table>
*Results obtained by running the `prof.py` script from [this branch](https://github.com/micbou/YouCompleteMe/tree/profiling-startup). The difference between first run and subsequent runs is Python bytecode generation (`*.pyc` files).*
<!-- 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/2563)
<!-- Reviewable:end -->
YCM should start the same whether Vim is running in GUI or not. Otherwise, this
makes it difficult for other plugins to interact with YCM at startup because
they can't predict how YCM will start unless they also check if Vim is running
in GUI which is unreasonable. Since we can't load it at Vim startup because of
a deadlock issue, we should always defer it at the VimEnter event.
[READY] Refactor diagnostic commands
This PR moves the logic of the `YcmDiags` and `YcmForceCompileAndDiagnostics` commands to the Python layer. It replaces the `echo` calls by `PostVimMessage` ones to display message on the status line and it always prints `Diagnostics refreshed` once compilation is done. This has the benefit of clearing the message `Forcing compilation, this will block Vim until done.` and avoiding the `Press Enter or type command to continue` prompt.
This also adds the `YcmLocationOpened` autocommand which is the same as `YcmQuickFixOpened` but for the location list window.
Fixes#2543.
<!-- 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/2548)
<!-- Reviewable:end -->
[RFC] Send requests again when server becomes ready
Since PR #2517, the `BufferVisit` and `FileReadyToParse` requests are ignored until the server is ready. We need to send them again when it becomes ready so that identifiers and snippets for the current buffer are properly parsed. This is done in the `s:OnFileReadyToParse` function since this function is regularly called. We also try to set the omnifunc since it depends on a response from the server and is only set when entering a buffer or changing its filetype. This replaces the code that consisted of setting the omnifunc when entering insert mode for the first time.
A cleaner solution would be to do that asynchronously but we can't with our Vim version requirement.
Fixes#2541.
<!-- 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/2547)
<!-- Reviewable:end -->
Don't use VimEnter initialization except when stating gui
# 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
This is another attempt at:
https://github.com/Valloric/YouCompleteMe/pull/2473
Which removed the apparently flawed attempt at "lazy" loading of YCM. While it fails to get the load out of the critical startup path, it *does* serve the useful purpose when starting up gvim of avoiding a deadlock situation in gvim.
So, this time, we keep VimEnter, but only for the gui-starting case. We update the comment to explain what is actually happening. And we can keep the docs about how to defer loading.
[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/2475)
<!-- Reviewable:end -->
Updated ycmd to ec7a154 to fix racerd build issues
- [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
Building racerd fails with the current submodule version of ycmd. This updates ycmd to the latest commit (ec7a154 at the time of writing) and fixes racerd failing to build. No additional tests were included because this is an update a library with its own tests.
Closes#2480.
[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/2531)
<!-- Reviewable:end -->
Use bang version of `normal`
Fixes#2519
# PR Prelude
Thank you for working on YCM! :)
**Please complete these steps and check these boxes (by putting an `x` inside
the brackets) _before_ filing your PR:**
- [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
[Please explain **in detail** why the changes in this PR are needed.]
[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/2520)
<!-- Reviewable:end -->
[READY] Remove healthy check
This PR removes the code that, if the server is not yet healthy, tries in a separate thread to send the same request at different intervals until it gets a response or reaches 5 failed attempts.
Main issue with that code is that it blocks Vim if a synchronous request (`semantic_completion_available`, `run_completer_command`, etc.) is sent while the server is not up. See issue #2071.
Other issues are that it's hard to understand how this code behaves (it combines threads and retries), it becomes useless once the server is healthy (because `SERVER_HEALTHY` is cached and never reset), it depends on arbitrary parameters (why 5 retries with a delay of 0.5s multiplied by 1.5 at each attempt?), and it has a package dependency `retries`.
Now that we catch all server exceptions (PR #2453) and define a very short connection timeout (PR #2514), we can just drop this code.
This change gives a huge improvement in startup time on Windows (don't worry, more improvements are coming for all platforms). The reason is that `requests` (probably `urllib3`) tries for ~1s to check if the server is healthy on Windows while it's almost instantaneous on other platforms.
<table>
<tr>
<th rowspan="2">Platform</th>
<th colspan="2">First run (ms)</th>
<th colspan="2">Subsequent runs (ms)</th>
</tr>
<tr>
<td>Before</td>
<td>After</td>
<td>Before</td>
<td>After</td>
</tr>
<tr>
<td>Ubuntu 16.04 64-bit</td>
<td>228</td>
<td>248</td>
<td>176</td>
<td>151</td>
</tr>
<tr>
<td>macOS 10.12</td>
<td>433</td>
<td>417</td>
<td>263</td>
<td>263</td>
</tr>
<tr>
<td>Windows 10 64-bit</td>
<td>1861</td>
<td>844</td>
<td>814</td>
<td>292</td>
</tr>
</table>
These results were obtained by running the `prof.py` script from [this branch](https://github.com/micbou/YouCompleteMe/tree/profiling-startup). The difference between first run and subsequent runs is Python bytecode generation (`*.pyc` files).
Fixes#2071.
<!-- 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/2517)
<!-- Reviewable:end -->
On non-Windows platforms, a ConnectionError exception is raised instead
of a ConnectTimeout one when the connection cannot be established (e.g.
the server crashed). Since the latter is a subclass of the former, we
only need to catch ConnectionError.