This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rGcbcb3eef70de: [Tooling/Inclusion] Handle std::get symbol. (authored by hokein).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D144484/new/ https://reviews.llvm.org/D144484 Files: clang-tools-extra/clangd/index/CanonicalIncludes.cpp clang/include/clang/Tooling/Inclusions/StandardLibrary.h clang/lib/Tooling/Inclusions/Stdlib/StandardLibrary.cpp clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc clang/unittests/Tooling/StandardLibraryTest.cpp Index: clang/unittests/Tooling/StandardLibraryTest.cpp =================================================================== --- clang/unittests/Tooling/StandardLibraryTest.cpp +++ clang/unittests/Tooling/StandardLibraryTest.cpp @@ -58,6 +58,9 @@ EXPECT_EQ(Vector->header(), *VectorH); EXPECT_THAT(Vector->headers(), ElementsAre(*VectorH)); + EXPECT_TRUE(stdlib::Symbol::named("std::", "get")); + EXPECT_FALSE(stdlib::Symbol::named("std::", "get")->header()); + EXPECT_THAT(stdlib::Symbol::named("std::", "basic_iostream")->headers(), ElementsAre(stdlib::Header::named("<istream>"), stdlib::Header::named("<iostream>"), Index: clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc =================================================================== --- clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc +++ clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc @@ -218,3 +218,8 @@ SYMBOL(ssize, std::, <unordered_map>) SYMBOL(ssize, std::, <unordered_set>) SYMBOL(ssize, std::, <vector>) + +// std::get has a few variants for different types (tuple, array, pair etc) +// which is tricky to disambiguate without type information. +// Don't set any header for it, as it comes with the type header. +SYMBOL(get, std::, /*no headers*/) Index: clang/lib/Tooling/Inclusions/Stdlib/StandardLibrary.cpp =================================================================== --- clang/lib/Tooling/Inclusions/Stdlib/StandardLibrary.cpp +++ clang/lib/Tooling/Inclusions/Stdlib/StandardLibrary.cpp @@ -14,6 +14,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Casting.h" +#include <optional> namespace clang { namespace tooling { @@ -120,7 +121,8 @@ } Mapping->SymbolNames[SymIndex] = { QName.data(), NSLen, static_cast<unsigned int>(QName.size() - NSLen)}; - Mapping->SymbolHeaderIDs[SymIndex].push_back(AddHeader(HeaderName)); + if (!HeaderName.empty()) + Mapping->SymbolHeaderIDs[SymIndex].push_back(AddHeader(HeaderName)); NSSymbolMap &NSSymbols = AddNS(QName.take_front(NSLen)); NSSymbols.try_emplace(QName.drop_front(NSLen), SymIndex); @@ -205,8 +207,11 @@ } return std::nullopt; } -Header Symbol::header() const { - return Header(getMappingPerLang(Language)->SymbolHeaderIDs[ID][0], Language); +std::optional<Header> Symbol::header() const { + const auto& Headers = getMappingPerLang(Language)->SymbolHeaderIDs[ID]; + if (Headers.empty()) + return std::nullopt; + return Header(Headers.front(), Language); } llvm::SmallVector<Header> Symbol::headers() const { llvm::SmallVector<Header> Results; Index: clang/include/clang/Tooling/Inclusions/StandardLibrary.h =================================================================== --- clang/include/clang/Tooling/Inclusions/StandardLibrary.h +++ clang/include/clang/Tooling/Inclusions/StandardLibrary.h @@ -81,7 +81,7 @@ llvm::StringRef name() const; llvm::StringRef qualifiedName() const; // The preferred header for this symbol (e.g. the suggested insertion). - Header header() const; + std::optional<Header> header() const; // Some symbols may be provided by multiple headers. llvm::SmallVector<Header> headers() const; Index: clang-tools-extra/clangd/index/CanonicalIncludes.cpp =================================================================== --- clang-tools-extra/clangd/index/CanonicalIncludes.cpp +++ clang-tools-extra/clangd/index/CanonicalIncludes.cpp @@ -717,7 +717,8 @@ if (Scope == "std::" && Name == "move") return "<utility>"; if (auto StdSym = tooling::stdlib::Symbol::named(Scope, Name, Lang)) - return StdSym->header().name(); + if (auto Header = StdSym->header()) + return Header->name(); return ""; }
Index: clang/unittests/Tooling/StandardLibraryTest.cpp =================================================================== --- clang/unittests/Tooling/StandardLibraryTest.cpp +++ clang/unittests/Tooling/StandardLibraryTest.cpp @@ -58,6 +58,9 @@ EXPECT_EQ(Vector->header(), *VectorH); EXPECT_THAT(Vector->headers(), ElementsAre(*VectorH)); + EXPECT_TRUE(stdlib::Symbol::named("std::", "get")); + EXPECT_FALSE(stdlib::Symbol::named("std::", "get")->header()); + EXPECT_THAT(stdlib::Symbol::named("std::", "basic_iostream")->headers(), ElementsAre(stdlib::Header::named("<istream>"), stdlib::Header::named("<iostream>"), Index: clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc =================================================================== --- clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc +++ clang/lib/Tooling/Inclusions/Stdlib/StdSpecialSymbolMap.inc @@ -218,3 +218,8 @@ SYMBOL(ssize, std::, <unordered_map>) SYMBOL(ssize, std::, <unordered_set>) SYMBOL(ssize, std::, <vector>) + +// std::get has a few variants for different types (tuple, array, pair etc) +// which is tricky to disambiguate without type information. +// Don't set any header for it, as it comes with the type header. +SYMBOL(get, std::, /*no headers*/) Index: clang/lib/Tooling/Inclusions/Stdlib/StandardLibrary.cpp =================================================================== --- clang/lib/Tooling/Inclusions/Stdlib/StandardLibrary.cpp +++ clang/lib/Tooling/Inclusions/Stdlib/StandardLibrary.cpp @@ -14,6 +14,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Casting.h" +#include <optional> namespace clang { namespace tooling { @@ -120,7 +121,8 @@ } Mapping->SymbolNames[SymIndex] = { QName.data(), NSLen, static_cast<unsigned int>(QName.size() - NSLen)}; - Mapping->SymbolHeaderIDs[SymIndex].push_back(AddHeader(HeaderName)); + if (!HeaderName.empty()) + Mapping->SymbolHeaderIDs[SymIndex].push_back(AddHeader(HeaderName)); NSSymbolMap &NSSymbols = AddNS(QName.take_front(NSLen)); NSSymbols.try_emplace(QName.drop_front(NSLen), SymIndex); @@ -205,8 +207,11 @@ } return std::nullopt; } -Header Symbol::header() const { - return Header(getMappingPerLang(Language)->SymbolHeaderIDs[ID][0], Language); +std::optional<Header> Symbol::header() const { + const auto& Headers = getMappingPerLang(Language)->SymbolHeaderIDs[ID]; + if (Headers.empty()) + return std::nullopt; + return Header(Headers.front(), Language); } llvm::SmallVector<Header> Symbol::headers() const { llvm::SmallVector<Header> Results; Index: clang/include/clang/Tooling/Inclusions/StandardLibrary.h =================================================================== --- clang/include/clang/Tooling/Inclusions/StandardLibrary.h +++ clang/include/clang/Tooling/Inclusions/StandardLibrary.h @@ -81,7 +81,7 @@ llvm::StringRef name() const; llvm::StringRef qualifiedName() const; // The preferred header for this symbol (e.g. the suggested insertion). - Header header() const; + std::optional<Header> header() const; // Some symbols may be provided by multiple headers. llvm::SmallVector<Header> headers() const; Index: clang-tools-extra/clangd/index/CanonicalIncludes.cpp =================================================================== --- clang-tools-extra/clangd/index/CanonicalIncludes.cpp +++ clang-tools-extra/clangd/index/CanonicalIncludes.cpp @@ -717,7 +717,8 @@ if (Scope == "std::" && Name == "move") return "<utility>"; if (auto StdSym = tooling::stdlib::Symbol::named(Scope, Name, Lang)) - return StdSym->header().name(); + if (auto Header = StdSym->header()) + return Header->name(); return ""; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits