[include-fixer] Don't add missing header if the unindentified symbol isn't from the main file.

Summary:
The further solution is to add the missing header to the file where the
symbol comes from.

Reviewers: bkramer

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D20950

llvm-svn: 271660
This commit is contained in:
Haojian Wu 2016-06-03 11:26:02 +00:00
parent a6022c9a63
commit 9c6cb035f3
2 changed files with 30 additions and 0 deletions

View File

@ -86,6 +86,29 @@ public:
if (getCompilerInstance().getSema().isSFINAEContext())
return clang::TypoCorrection();
// We currently ignore the unidentified symbol which is not from the
// main file.
//
// However, this is not always true due to templates in a non-self contained
// header, consider the case:
//
// // header.h
// template <typename T>
// class Foo {
// T t;
// };
//
// // test.cc
// // We need to add <bar.h> in test.cc instead of header.h.
// class Bar;
// Foo<Bar> foo;
//
// FIXME: Add the missing header to the header file where the symbol comes
// from.
if (!getCompilerInstance().getSourceManager().isWrittenInMainFile(
Typo.getLoc()))
return clang::TypoCorrection();
std::string TypoScopeString;
if (S) {
// FIXME: Currently we only use namespace contexts. Use other context

View File

@ -44,6 +44,8 @@ static bool runOnCode(tooling::ToolAction *ToolAction, StringRef Code,
llvm::MemoryBuffer::getMemBuffer("\n"));
InMemoryFileSystem->addFile("dir/otherdir/qux.h", 0,
llvm::MemoryBuffer::getMemBuffer("\n"));
InMemoryFileSystem->addFile("header.h", 0,
llvm::MemoryBuffer::getMemBuffer("bar b;"));
return Invocation.run();
}
@ -186,6 +188,11 @@ TEST(IncludeFixer, EnumConstantSymbols) {
runIncludeFixer("int test = a::b::Green;\n"));
}
TEST(IncludeFixer, IgnoreSymbolFromHeader) {
std::string Code = "#include \"header.h\"";
EXPECT_EQ(Code, runIncludeFixer(Code));
}
// FIXME: add test cases for inserting and sorting multiple headers when
// include-fixer supports multiple headers insertion.
TEST(IncludeFixer, InsertAndSortSingleHeader) {