diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2021-11-09 18:12:01 +0100 |
---|---|---|
committer | Sam McCall <sam.mccall@gmail.com> | 2021-11-10 08:22:48 +0100 |
commit | f7500a4ef7bd7820b42e1b934392bb2566083b27 (patch) | |
tree | 3775f37749a26347df73f07c5129ba3ebf5d99d4 /clang/lib/Sema/SemaCodeComplete.cpp | |
parent | ef2d0e0f20308aa32426fcf2021d5e4958fa4e1f (diff) | |
download | llvm-f7500a4ef7bd7820b42e1b934392bb2566083b27.zip llvm-f7500a4ef7bd7820b42e1b934392bb2566083b27.tar.gz llvm-f7500a4ef7bd7820b42e1b934392bb2566083b27.tar.bz2 |
[CodeCompletion] Generally consider header files without extension
Real-world use case: The Qt framework's headers have the same name
as the respective class defined in them, and Qt's traditional qmake
build tool uses -I (rather than -isystem) to pull them in.
Reviewed By: sammccall
Differential Revision: https://reviews.llvm.org/D112996
Diffstat (limited to 'clang/lib/Sema/SemaCodeComplete.cpp')
-rw-r--r-- | clang/lib/Sema/SemaCodeComplete.cpp | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index 2186eec..26e9826 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -9613,6 +9613,10 @@ void Sema::CodeCompleteIncludedFile(llvm::StringRef Dir, bool Angled) { } } + const StringRef &Dirname = llvm::sys::path::filename(Dir); + const bool isQt = Dirname.startswith("Qt") || Dirname == "ActiveQt"; + const bool ExtensionlessHeaders = + IsSystem || isQt || Dir.endswith(".framework/Headers"); std::error_code EC; unsigned Count = 0; for (auto It = FS.dir_begin(Dir, EC); @@ -9639,18 +9643,19 @@ void Sema::CodeCompleteIncludedFile(llvm::StringRef Dir, bool Angled) { AddCompletion(Filename, /*IsDirectory=*/true); break; - case llvm::sys::fs::file_type::regular_file: - // Only files that really look like headers. (Except in system dirs). - if (!IsSystem) { - // Header extensions from Types.def, which we can't depend on here. - if (!(Filename.endswith_insensitive(".h") || - Filename.endswith_insensitive(".hh") || - Filename.endswith_insensitive(".hpp") || - Filename.endswith_insensitive(".inc"))) - break; - } + case llvm::sys::fs::file_type::regular_file: { + // Only files that really look like headers. (Except in special dirs). + // Header extensions from Types.def, which we can't depend on here. + const bool IsHeader = Filename.endswith_insensitive(".h") || + Filename.endswith_insensitive(".hh") || + Filename.endswith_insensitive(".hpp") || + Filename.endswith_insensitive(".inc") || + (ExtensionlessHeaders && !Filename.contains('.')); + if (!IsHeader) + break; AddCompletion(Filename, /*IsDirectory=*/false); break; + } default: break; } |