[clangd] Fix unintentionally loose fuzzy matching, and the tests masking it.
authorSam McCall <sam.mccall@gmail.com>
Mon, 5 Mar 2018 17:34:33 +0000 (17:34 +0000)
committerSam McCall <sam.mccall@gmail.com>
Mon, 5 Mar 2018 17:34:33 +0000 (17:34 +0000)
commit77a719cb9ebc01db7d6936d1b4dd2bfcfa38b39b
tree58c8947de2fffb697be9a5676460eac9c8d9d51f
parent0b7c6422fbd0c837142f347ab92a650706ebcedf
[clangd] Fix unintentionally loose fuzzy matching, and the tests masking it.

Summary:
The intent was that [ar] doesn't match "FooBar"; the first character must match
a Head character (hard requirement, not just a low score).
This matches VSCode, and was "tested" but the tests were defective.

The tests expected matches("FooBar") to fail for lack of a match. But instead
it fails because the string should be annotated - matches("FooB[ar]").
This patch makes matches("FooBar") ignore annotations, as was intended.

Fixing the code to reject weak matches for the first char causes problems:
-  [bre] no longer matches "HTMLBRElement".
   We allow matching against an uppercase char even if we don't think it's head.
   Only do this if there's at least one lowercase, to avoid triggering on MACROS
-  [print] no longer matches "sprintf".
   This is hard to fix without false positives (e.g. [int] vs "sprintf"])
   This patch leaves this case broken. A future patch will add a dictionary
   providing custom segmentation to common names from the standard library.

Fixed a couple of index tests that indirectly relied on broken fuzzy matching.
Added const in a couple of missing places for consistency with new code.

Subscribers: klimek, ilya-biryukov, jkorous-apple, ioeric, cfe-commits

Differential Revision: https://reviews.llvm.org/D44003

llvm-svn: 326721
clang-tools-extra/clangd/FuzzyMatch.cpp
clang-tools-extra/clangd/FuzzyMatch.h
clang-tools-extra/unittests/clangd/FuzzyMatchTests.cpp
clang-tools-extra/unittests/clangd/IndexTests.cpp