14
14
#include " llvm/Support/raw_ostream.h"
15
15
#include " gtest/gtest.h"
16
16
#include < fstream>
17
+ #include < functional>
18
+ #include < map>
19
+ #include < memory>
17
20
#include < set>
18
21
#define DEBUG_TYPE " libclang-test"
19
22
@@ -349,21 +352,25 @@ TEST(libclang, ModuleMapDescriptor) {
349
352
clang_ModuleMapDescriptor_dispose (MMD);
350
353
}
351
354
352
- class LibclangReparseTest : public ::testing::Test {
355
+ class LibclangParseTest : public ::testing::Test {
353
356
std::set<std::string> Files;
357
+ typedef std::unique_ptr<std::string> fixed_addr_string;
358
+ std::map<fixed_addr_string, fixed_addr_string> UnsavedFileContents;
354
359
public:
355
360
std::string TestDir;
356
361
CXIndex Index;
357
362
CXTranslationUnit ClangTU;
358
363
unsigned TUFlags;
364
+ std::vector<CXUnsavedFile> UnsavedFiles;
359
365
360
366
void SetUp () override {
361
367
llvm::SmallString<256 > Dir;
362
368
ASSERT_FALSE (llvm::sys::fs::createUniqueDirectory (" libclang-test" , Dir));
363
369
TestDir = Dir.str ();
364
370
TUFlags = CXTranslationUnit_DetailedPreprocessingRecord |
365
- clang_defaultEditingTranslationUnitOptions ();
371
+ clang_defaultEditingTranslationUnitOptions ();
366
372
Index = clang_createIndex (0 , 0 );
373
+ ClangTU = nullptr ;
367
374
}
368
375
void TearDown () override {
369
376
clang_disposeTranslationUnit (ClangTU);
@@ -384,6 +391,77 @@ class LibclangReparseTest : public ::testing::Test {
384
391
OS << Contents;
385
392
assert (OS.good ());
386
393
}
394
+ void MapUnsavedFile (std::string Filename, const std::string &Contents) {
395
+ if (!llvm::sys::path::is_absolute (Filename)) {
396
+ llvm::SmallString<256 > Path (TestDir);
397
+ llvm::sys::path::append (Path, Filename);
398
+ Filename = Path.str ();
399
+ }
400
+ auto it = UnsavedFileContents.emplace (
401
+ fixed_addr_string (new std::string (Filename)),
402
+ fixed_addr_string (new std::string (Contents)));
403
+ UnsavedFiles.push_back ({
404
+ it.first ->first ->c_str (), // filename
405
+ it.first ->second ->c_str (), // contents
406
+ it.first ->second ->size () // length
407
+ });
408
+ }
409
+ template <typename F>
410
+ void Traverse (const F &TraversalFunctor) {
411
+ CXCursor TuCursor = clang_getTranslationUnitCursor (ClangTU);
412
+ std::reference_wrapper<const F> FunctorRef = std::cref (TraversalFunctor);
413
+ clang_visitChildren (TuCursor,
414
+ &TraverseStateless<std::reference_wrapper<const F>>,
415
+ &FunctorRef);
416
+ }
417
+ private:
418
+ template <typename TState>
419
+ static CXChildVisitResult TraverseStateless (CXCursor cx, CXCursor parent,
420
+ CXClientData data) {
421
+ TState *State = static_cast <TState*>(data);
422
+ return State->get ()(cx, parent);
423
+ }
424
+ };
425
+
426
+ TEST_F (LibclangParseTest, AllSkippedRanges) {
427
+ std::string Header = " header.h" , Main = " main.cpp" ;
428
+ WriteFile (Header,
429
+ " #ifdef MANGOS\n "
430
+ " printf(\" mmm\" );\n "
431
+ " #endif" );
432
+ WriteFile (Main,
433
+ " #include \" header.h\"\n "
434
+ " #ifdef KIWIS\n "
435
+ " printf(\" mmm!!\" );\n "
436
+ " #endif" );
437
+
438
+ ClangTU = clang_parseTranslationUnit (Index, Main.c_str (), nullptr , 0 ,
439
+ nullptr , 0 , TUFlags);
440
+
441
+ CXSourceRangeList *Ranges = clang_getAllSkippedRanges (ClangTU);
442
+ EXPECT_EQ (2 , Ranges->count );
443
+
444
+ CXSourceLocation cxl;
445
+ unsigned line;
446
+ cxl = clang_getRangeStart (Ranges->ranges [0 ]);
447
+ clang_getSpellingLocation (cxl, nullptr , &line, nullptr , nullptr );
448
+ EXPECT_EQ (1 , line);
449
+ cxl = clang_getRangeEnd (Ranges->ranges [0 ]);
450
+ clang_getSpellingLocation (cxl, nullptr , &line, nullptr , nullptr );
451
+ EXPECT_EQ (3 , line);
452
+
453
+ cxl = clang_getRangeStart (Ranges->ranges [1 ]);
454
+ clang_getSpellingLocation (cxl, nullptr , &line, nullptr , nullptr );
455
+ EXPECT_EQ (2 , line);
456
+ cxl = clang_getRangeEnd (Ranges->ranges [1 ]);
457
+ clang_getSpellingLocation (cxl, nullptr , &line, nullptr , nullptr );
458
+ EXPECT_EQ (4 , line);
459
+
460
+ clang_disposeSourceRangeList (Ranges);
461
+ }
462
+
463
+ class LibclangReparseTest : public LibclangParseTest {
464
+ public:
387
465
void DisplayDiagnostics () {
388
466
unsigned NumDiagnostics = clang_getNumDiagnostics (ClangTU);
389
467
for (unsigned i = 0 ; i < NumDiagnostics; ++i) {
0 commit comments