kadircet updated this revision to Diff 297528.
kadircet added a comment.
- Only drop STL mapping instead of getting rid of suffix mapping completely.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D88204/new/
https://reviews.llvm.org/D88204
Files:
clang-tools-extra/clangd/index/CanonicalIncludes.cpp
clang-tools-extra/clangd/index/CanonicalIncludes.h
clang-tools-extra/clangd/unittests/CanonicalIncludesTests.cpp
clang-tools-extra/clangd/unittests/FileIndexTests.cpp
Index: clang-tools-extra/clangd/unittests/FileIndexTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/FileIndexTests.cpp
+++ clang-tools-extra/clangd/unittests/FileIndexTests.cpp
@@ -226,10 +226,11 @@
TEST(FileIndexTest, HasSystemHeaderMappingsInPreamble) {
TestTU TU;
- TU.HeaderCode = "class Foo{};";
- TU.HeaderFilename = "algorithm";
+ // std::max is mapped back to <algorithm>
+ TU.HeaderCode = "namespace std { void max(); }";
+ TU.HeaderFilename = "ignored_header_name.h";
- auto Symbols = runFuzzyFind(*TU.index(), "");
+ auto Symbols = runFuzzyFind(*TU.index(), "max");
EXPECT_THAT(Symbols, ElementsAre(_));
EXPECT_THAT(Symbols.begin()->IncludeHeaders.front().IncludeHeader,
"<algorithm>");
Index: clang-tools-extra/clangd/unittests/CanonicalIncludesTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/CanonicalIncludesTests.cpp
+++ clang-tools-extra/clangd/unittests/CanonicalIncludesTests.cpp
@@ -21,10 +21,6 @@
CI.addSystemHeadersMapping(Language);
// Usual standard library symbols are mapped correctly.
EXPECT_EQ("<stdio.h>", CI.mapHeader("path/stdio.h", "printf"));
- // Suffix mapping isn't available for C, instead of mapping to `<cstdio> we
- // just leave the header as-is.
- EXPECT_EQ("include/stdio.h",
- CI.mapHeader("include/stdio.h", "unknown_symbol"));
}
TEST(CanonicalIncludesTest, CXXStandardLibrary) {
@@ -34,17 +30,12 @@
CI.addSystemHeadersMapping(Language);
// Usual standard library symbols are mapped correctly.
- EXPECT_EQ("<vector>", CI.mapHeader("path/vector.h", "std::vector"));
- EXPECT_EQ("<cstdio>", CI.mapHeader("path/stdio.h", "std::printf"));
- // std::move is ambiguous, currently always mapped to <utility>
- EXPECT_EQ("<utility>",
- CI.mapHeader("libstdc++/bits/stl_algo.h", "std::move"));
+ EXPECT_EQ("<vector>", CI.mapHeader("some_lib.h", "std::vector"));
+ EXPECT_EQ("<cstdio>", CI.mapHeader("some_lib.h", "std::printf"));
+ // std::move is ambiguous, always map to <utility>.
+ EXPECT_EQ("<utility>", CI.mapHeader("some_lib.h", "std::move"));
// Unknown std symbols aren't mapped.
EXPECT_EQ("foo/bar.h", CI.mapHeader("foo/bar.h", "std::notathing"));
- // iosfwd declares some symbols it doesn't own.
- EXPECT_EQ("<ostream>", CI.mapHeader("iosfwd", "std::ostream"));
- // And (for now) we assume it owns the others.
- EXPECT_EQ("<iosfwd>", CI.mapHeader("iosfwd", "std::notwathing"));
}
TEST(CanonicalIncludesTest, PathMapping) {
@@ -77,8 +68,6 @@
// We added a mapping from some/path to <path>.
ASSERT_EQ("<path>", CI.mapHeader("some/path", ""));
- // We should have a path from 'bits/stl_vector.h' to '<vector>'.
- ASSERT_EQ("<vector>", CI.mapHeader("bits/stl_vector.h", ""));
// We should also have a symbol mapping from 'std::map' to '<map>'.
ASSERT_EQ("<map>", CI.mapHeader("some/header.h", "std::map"));
Index: clang-tools-extra/clangd/index/CanonicalIncludes.h
===================================================================
--- clang-tools-extra/clangd/index/CanonicalIncludes.h
+++ clang-tools-extra/clangd/index/CanonicalIncludes.h
@@ -44,10 +44,10 @@
llvm::StringRef mapHeader(llvm::StringRef Header,
llvm::StringRef QualifiedName) const;
- /// Adds mapping for system headers and some special symbols (e.g. STL symbols
- /// in <iosfwd> need to be mapped individually). Approximately, the following
- /// system headers are handled:
- /// - C++ standard library e.g. bits/basic_string.h$ -> <string>
+ /// Adds mapping for system headers and some special symbols. Uses a symbol
+ /// based mapping for STL symbols. Handles other libraries by matching on the
+ /// path. Approximately, the following system headers are handled:
+ /// - C++ standard library e.g. std::string -> <string>
/// - Posix library e.g. bits/pthreadtypes.h$ -> <pthread.h>
/// - Compiler extensions, e.g. include/avx512bwintrin.h$ -> <immintrin.h>
/// The mapping is hardcoded and hand-maintained, so it might not cover all
Index: clang-tools-extra/clangd/index/CanonicalIncludes.cpp
===================================================================
--- clang-tools-extra/clangd/index/CanonicalIncludes.cpp
+++ clang-tools-extra/clangd/index/CanonicalIncludes.cpp
@@ -108,7 +108,11 @@
// it serves as a fallback to disambiguate:
// - symbols with multiple headers (e.g. std::move)
static const auto *SystemHeaderMap = new llvm::StringMap<llvm::StringRef>({
+ // Resource lib
{"include/__stddef_max_align_t.h", "<cstddef>"},
+ {"include/_G_config.h", "<cstdio>"},
+ {"include/assert.h", "<cassert>"},
+ // Compiler intrinsics
{"include/__wmmintrin_aes.h", "<wmmintrin.h>"},
{"include/__wmmintrin_pclmul.h", "<wmmintrin.h>"},
{"include/adxintrin.h", "<immintrin.h>"},
@@ -170,281 +174,6 @@
{"include/xsaveoptintrin.h", "<immintrin.h>"},
{"include/xsavesintrin.h", "<immintrin.h>"},
{"include/xtestintrin.h", "<immintrin.h>"},
- {"include/_G_config.h", "<cstdio>"},
- {"include/assert.h", "<cassert>"},
- {"algorithm", "<algorithm>"},
- {"valarray", "<valarray>"},
- {"array", "<array>"},
- {"atomic", "<atomic>"},
- {"backward/auto_ptr.h", "<memory>"},
- {"backward/binders.h", "<string>"},
- {"bits/algorithmfwd.h", "<algorithm>"},
- {"bits/alloc_traits.h", "<memory>"},
- {"bits/allocated_ptr.h", "<memory>"},
- {"bits/allocator.h", "<allocator>"},
- {"bits/atomic_base.h", "<atomic>"},
- {"bits/atomic_lockfree_defines.h", "<exception>"},
- {"bits/atomic_futex.h", "<atomic>"},
- {"bits/basic_ios.h", "<ios>"},
- {"bits/basic_ios.tcc", "<ios>"},
- {"bits/basic_string.h", "<string>"},
- {"bits/basic_string.tcc", "<string>"},
- {"bits/char_traits.h", "<string>"},
- {"bits/codecvt.h", "<locale>"},
- {"bits/concept_check.h", "<numeric>"},
- {"bits/cpp_type_traits.h", "<cmath>"},
- {"bits/cxxabi_forced.h", "<cxxabi.h>"},
- {"bits/deque.tcc", "<deque>"},
- {"bits/exception.h", "<exception>"},
- {"bits/exception_defines.h", "<exception>"},
- {"bits/exception_ptr.h", "<exception>"},
- {"bits/forward_list.h", "<forward_list>"},
- {"bits/forward_list.tcc", "<forward_list>"},
- {"bits/fstream.tcc", "<fstream>"},
- {"bits/functexcept.h", "<list>"},
- {"bits/functional_hash.h", "<functional>"},
- {"bits/gslice.h", "<valarray>"},
- {"bits/gslice_array.h", "<valarray>"},
- {"bits/hash_bytes.h", "<typeinfo>"},
- {"bits/hashtable.h", "<unordered_set>"},
- {"bits/hashtable_policy.h", "<unordered_set>"},
- {"bits/indirect_array.h", "<valarray>"},
- {"bits/invoke.h", "<functional>"},
- {"bits/ios_base.h", "<ios>"},
- {"bits/istream.tcc", "<istream>"},
- {"bits/list.tcc", "<list>"},
- {"bits/locale_classes.h", "<locale>"},
- {"bits/locale_classes.tcc", "<locale>"},
- {"bits/locale_conv.h", "<locale>"},
- {"bits/locale_facets.h", "<locale>"},
- {"bits/locale_facets.tcc", "<locale>"},
- {"bits/locale_facets_nonio.h", "<locale>"},
- {"bits/locale_facets_nonio.tcc", "<locale>"},
- {"bits/localefwd.h", "<locale>"},
- {"bits/mask_array.h", "<valarray>"},
- {"bits/memoryfwd.h", "<memory>"},
- {"bits/move.h", "<utility>"},
- {"bits/nested_exception.h", "<exception>"},
- {"bits/ostream.tcc", "<ostream>"},
- {"bits/ostream_insert.h", "<ostream>"},
- {"bits/parse_numbers.h", "<chrono>"},
- {"bits/postypes.h", "<ios>"},
- {"bits/predefined_ops.h", "<algorithm>"},
- {"bits/ptr_traits.h", "<memory>"},
- {"bits/quoted_string.h", "<iomanip>"},
- {"bits/random.h", "<random>"},
- {"bits/random.tcc", "<random>"},
- {"bits/range_access.h", "<iterator>"},
- {"bits/refwrap.h", "<functional>"},
- {"bits/regex.h", "<regex>"},
- {"bits/regex_automaton.h", "<regex>"},
- {"bits/regex_compiler.h", "<regex>"},
- {"bits/regex_constants.h", "<regex>"},
- {"bits/regex_cursor.h", "<regex>"},
- {"bits/regex_error.h", "<regex>"},
- {"bits/regex_executor.h", "<regex>"},
- {"bits/regex_grep_matcher.h", "<regex>"},
- {"bits/regex_grep_matcher.tcc", "<regex>"},
- {"bits/regex_nfa.h", "<regex>"},
- {"bits/regex_scanner.h", "<regex>"},
- {"bits/shared_ptr.h", "<memory>"},
- {"bits/shared_ptr_base.h", "<memory>"},
- {"bits/shared_ptr_atomic.h", "<atomic>"},
- {"bits/slice_array.h", "<valarray>"},
- {"bits/sstream.tcc", "<sstream>"},
- {"bits/std_abs.h", "<cmath>"},
- {"bits/std_function.h", "<functional>"},
- {"bits/std_mutex.h", "<mutex>"},
- {"bits/stl_algo.h", "<algorithm>"},
- {"bits/stl_algobase.h", "<algorithm>"},
- {"bits/stl_bvector.h", "<vector>"},
- {"bits/stl_construct.h", "<deque>"},
- {"bits/stl_deque.h", "<deque>"},
- {"bits/stl_function.h", "<functional>"},
- {"bits/stl_heap.h", "<heap>"},
- {"bits/stl_iterator.h", "<iterator>"},
- {"bits/stl_iterator_base_funcs.h", "<iterator>"},
- {"bits/stl_iterator_base_types.h", "<iterator>"},
- {"bits/stl_list.h", "<list>"},
- {"bits/stl_map.h", "<map>"},
- {"bits/stl_multimap.h", "<map>"},
- {"bits/stl_multiset.h", "<set>"},
- {"bits/stl_numeric.h", "<numeric>"},
- {"bits/stl_pair.h", "<utility>"},
- {"bits/stl_queue.h", "<queue>"},
- {"bits/stl_raw_storage_iter.h", "<memory>"},
- {"bits/stl_relops.h", "<utility>"},
- {"bits/stl_set.h", "<set>"},
- {"bits/stl_stack.h", "<stack>"},
- {"bits/stl_tempbuf.h", "<memory>"},
- {"bits/stl_tree.h", "<map>"},
- {"bits/stl_uninitialized.h", "<memory>"},
- {"bits/stl_vector.h", "<vector>"},
- {"bits/stream_iterator.h", "<iterator>"},
- {"bits/streambuf.tcc", "<streambuf>"},
- {"bits/streambuf_iterator.h", "<iterator>"},
- {"bits/stringfwd.h", "<string>"},
- {"bits/uniform_int_dist.h", "<random>"},
- {"bits/unique_ptr.h", "<memory>"},
- {"bits/unordered_map.h", "<unordered_map>"},
- {"bits/unordered_set.h", "<unordered_set>"},
- {"bits/uses_allocator.h", "<memory>"},
- {"bits/valarray_after.h", "<valarray>"},
- {"bits/valarray_array.h", "<valarray>"},
- {"bits/valarray_array.tcc", "<valarray>"},
- {"bits/valarray_before.h", "<valarray>"},
- {"bits/vector.tcc", "<vector>"},
- {"bitset", "<bitset>"},
- {"ccomplex", "<ccomplex>"},
- {"cctype", "<cctype>"},
- {"cerrno", "<cerrno>"},
- {"cfenv", "<cfenv>"},
- {"cfloat", "<cfloat>"},
- {"chrono", "<chrono>"},
- {"cinttypes", "<cinttypes>"},
- {"climits", "<climits>"},
- {"clocale", "<clocale>"},
- {"cmath", "<cmath>"},
- {"complex", "<complex>"},
- {"complex.h", "<complex.h>"},
- {"condition_variable", "<condition_variable>"},
- {"csetjmp", "<csetjmp>"},
- {"csignal", "<csignal>"},
- {"cstdalign", "<cstdalign>"},
- {"cstdarg", "<cstdarg>"},
- {"cstdbool", "<cstdbool>"},
- {"cstdint", "<cstdint>"},
- {"cstdio", "<cstdio>"},
- {"cstdlib", "<cstdlib>"},
- {"cstring", "<cstring>"},
- {"ctgmath", "<ctgmath>"},
- {"ctime", "<ctime>"},
- {"cwchar", "<cwchar>"},
- {"cwctype", "<cwctype>"},
- {"cxxabi.h", "<cxxabi.h>"},
- {"debug/debug.h", "<numeric>"},
- {"debug/map.h", "<map>"},
- {"debug/multimap.h", "<multimap>"},
- {"debug/multiset.h", "<multiset>"},
- {"debug/set.h", "<set>"},
- {"deque", "<deque>"},
- {"exception", "<exception>"},
- {"ext/alloc_traits.h", "<deque>"},
- {"ext/atomicity.h", "<memory>"},
- {"ext/concurrence.h", "<memory>"},
- {"ext/new_allocator.h", "<string>"},
- {"ext/numeric_traits.h", "<list>"},
- {"ext/string_conversions.h", "<string>"},
- {"ext/type_traits.h", "<cmath>"},
- {"fenv.h", "<fenv.h>"},
- {"forward_list", "<forward_list>"},
- {"fstream", "<fstream>"},
- {"functional", "<functional>"},
- {"future", "<future>"},
- {"initializer_list", "<initializer_list>"},
- {"iomanip", "<iomanip>"},
- {"ios", "<ios>"},
- {"iosfwd", "<iosfwd>"},
- {"iostream", "<iostream>"},
- {"istream", "<istream>"},
- {"iterator", "<iterator>"},
- {"limits", "<limits>"},
- {"list", "<list>"},
- {"locale", "<locale>"},
- {"map", "<map>"},
- {"memory", "<memory>"},
- {"shared_mutex", "<shared_mutex>"},
- {"mutex", "<mutex>"},
- {"new", "<new>"},
- {"numeric", "<numeric>"},
- {"ostream", "<ostream>"},
- {"queue", "<queue>"},
- {"random", "<random>"},
- {"ratio", "<ratio>"},
- {"regex", "<regex>"},
- {"scoped_allocator", "<scoped_allocator>"},
- {"set", "<set>"},
- {"sstream", "<sstream>"},
- {"stack", "<stack>"},
- {"stdexcept", "<stdexcept>"},
- {"streambuf", "<streambuf>"},
- {"string", "<string>"},
- {"system_error", "<system_error>"},
- {"tgmath.h", "<tgmath.h>"},
- {"thread", "<thread>"},
- {"tuple", "<tuple>"},
- {"type_traits", "<type_traits>"},
- {"typeindex", "<typeindex>"},
- {"typeinfo", "<typeinfo>"},
- {"unordered_map", "<unordered_map>"},
- {"unordered_set", "<unordered_set>"},
- {"utility", "<utility>"},
- {"valarray", "<valarray>"},
- {"vector", "<vector>"},
- {"include/complex.h", "<complex.h>"},
- {"include/ctype.h", "<cctype>"},
- {"include/errno.h", "<cerrno>"},
- {"include/fenv.h", "<fenv.h>"},
- {"include/inttypes.h", "<cinttypes>"},
- {"include/libio.h", "<cstdio>"},
- {"include/limits.h", "<climits>"},
- {"include/locale.h", "<clocale>"},
- {"include/math.h", "<cmath>"},
- {"include/setjmp.h", "<csetjmp>"},
- {"include/signal.h", "<csignal>"},
- {"include/stdint.h", "<cstdint>"},
- {"include/stdio.h", "<cstdio>"},
- {"include/stdlib.h", "<cstdlib>"},
- {"include/string.h", "<cstring>"},
- {"include/time.h", "<ctime>"},
- {"include/wchar.h", "<cwchar>"},
- {"include/wctype.h", "<cwctype>"},
- {"bits/cmathcalls.h", "<complex.h>"},
- {"bits/errno.h", "<cerrno>"},
- {"bits/fenv.h", "<fenv.h>"},
- {"bits/huge_val.h", "<cmath>"},
- {"bits/huge_valf.h", "<cmath>"},
- {"bits/huge_vall.h", "<cmath>"},
- {"bits/inf.h", "<cmath>"},
- {"bits/local_lim.h", "<climits>"},
- {"bits/locale.h", "<clocale>"},
- {"bits/mathcalls.h", "<math.h>"},
- {"bits/mathdef.h", "<cmath>"},
- {"bits/nan.h", "<cmath>"},
- {"bits/posix1_lim.h", "<climits>"},
- {"bits/posix2_lim.h", "<climits>"},
- {"bits/setjmp.h", "<csetjmp>"},
- {"bits/sigaction.h", "<csignal>"},
- {"bits/sigcontext.h", "<csignal>"},
- {"bits/siginfo.h", "<csignal>"},
- {"bits/signum.h", "<csignal>"},
- {"bits/sigset.h", "<csignal>"},
- {"bits/sigstack.h", "<csignal>"},
- {"bits/stdint-intn.h", "<cstdint>"},
- {"bits/stdint-uintn.h", "<cstdint>"},
- {"bits/stdio_lim.h", "<cstdio>"},
- {"bits/sys_errlist.h", "<cstdio>"},
- {"bits/time.h", "<ctime>"},
- {"bits/timex.h", "<ctime>"},
- {"bits/typesizes.h", "<cstdio>"},
- {"bits/wchar.h", "<cwchar>"},
- {"bits/wordsize.h", "<csetjmp>"},
- {"bits/xopen_lim.h", "<climits>"},
- {"include/xlocale.h", "<cstring>"},
- {"bits/atomic_word.h", "<memory>"},
- {"bits/basic_file.h", "<fstream>"},
- {"bits/c\\+\\+allocator.h", "<string>"},
- {"bits/c\\+\\+config.h", "<cstddef>"},
- {"bits/c\\+\\+io.h", "<ios>"},
- {"bits/c\\+\\+locale.h", "<locale>"},
- {"bits/cpu_defines.h", "<iosfwd>"},
- {"bits/ctype_base.h", "<locale>"},
- {"bits/cxxabi_tweaks.h", "<cxxabi.h>"},
- {"bits/error_constants.h", "<system_error>"},
- {"bits/gthr-default.h", "<memory>"},
- {"bits/gthr.h", "<memory>"},
- {"bits/opt_random.h", "<random>"},
- {"bits/os_defines.h", "<iosfwd>"},
// GNU C headers
{"include/aio.h", "<aio.h>"},
{"include/aliases.h", "<aliases.h>"},
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits