1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===- unittests/libclang/LibclangTest.cpp --- libclang tests -------------===// 2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// 3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// The LLVM Compiler Infrastructure 4651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// 5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// This file is distributed under the University of Illinois Open Source 6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// License. See LICENSE.TXT for details. 7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// 8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===----------------------------------------------------------------------===// 9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang-c/Index.h" 11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "gtest/gtest.h" 12ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#include "llvm/Support/Debug.h" 13ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#include "llvm/Support/FileSystem.h" 14ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#include "llvm/Support/Path.h" 15ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#include "llvm/Support/raw_ostream.h" 16ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#include <fstream> 17ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#include <set> 18ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#define DEBUG_TYPE "libclang-test" 19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 20651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTEST(libclang, clang_parseTranslationUnit2_InvalidArgs) { 21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EXPECT_EQ(CXError_InvalidArguments, 22ef8225444452a1486bd721f3285301fe84643b00Stephen Hines clang_parseTranslationUnit2(nullptr, nullptr, nullptr, 0, nullptr, 23ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 0, 0, nullptr)); 24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 26651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTEST(libclang, clang_createTranslationUnit_InvalidArgs) { 27ef8225444452a1486bd721f3285301fe84643b00Stephen Hines EXPECT_EQ(nullptr, clang_createTranslationUnit(nullptr, nullptr)); 28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 30651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTEST(libclang, clang_createTranslationUnit2_InvalidArgs) { 31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EXPECT_EQ(CXError_InvalidArguments, 32ef8225444452a1486bd721f3285301fe84643b00Stephen Hines clang_createTranslationUnit2(nullptr, nullptr, nullptr)); 33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CXTranslationUnit TU = reinterpret_cast<CXTranslationUnit>(1); 35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EXPECT_EQ(CXError_InvalidArguments, 36ef8225444452a1486bd721f3285301fe84643b00Stephen Hines clang_createTranslationUnit2(nullptr, nullptr, &TU)); 37ef8225444452a1486bd721f3285301fe84643b00Stephen Hines EXPECT_EQ(nullptr, TU); 38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace { 41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct TestVFO { 42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const char *Contents; 43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CXVirtualFileOverlay VFO; 44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TestVFO(const char *Contents) : Contents(Contents) { 46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines VFO = clang_VirtualFileOverlay_create(0); 47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void map(const char *VPath, const char *RPath) { 50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CXErrorCode Err = clang_VirtualFileOverlay_addFileMapping(VFO, VPath, RPath); 51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EXPECT_EQ(Err, CXError_Success); 52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void mapError(const char *VPath, const char *RPath, CXErrorCode ExpErr) { 55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CXErrorCode Err = clang_VirtualFileOverlay_addFileMapping(VFO, VPath, RPath); 56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EXPECT_EQ(Err, ExpErr); 57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ~TestVFO() { 606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Contents) { 616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines char *BufPtr; 626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned BufSize; 636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines clang_VirtualFileOverlay_writeToBuffer(VFO, 0, &BufPtr, &BufSize); 646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines std::string BufStr(BufPtr, BufSize); 656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines EXPECT_STREQ(Contents, BufStr.c_str()); 666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines free(BufPtr); 676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines clang_VirtualFileOverlay_dispose(VFO); 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST(libclang, VirtualFileOverlay_Basic) { 746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const char *contents = 756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "{\n" 766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'version': 0,\n" 776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'roots': [\n" 786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'directory',\n" 806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"/path/virtual\",\n" 816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'contents': [\n" 826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'file',\n" 846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"foo.h\",\n" 856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'external-contents': \"/real/foo.h\"\n" 866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "}\n"; 916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TestVFO T(contents); 926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T.map("/path/virtual/foo.h", "/real/foo.h"); 936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST(libclang, VirtualFileOverlay_Unicode) { 966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const char *contents = 976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "{\n" 986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'version': 0,\n" 996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'roots': [\n" 1006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 1016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'directory',\n" 1026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"/path/\\u266B\",\n" 1036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'contents': [\n" 1046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 1056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'file',\n" 1066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"\\u2602.h\",\n" 1076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'external-contents': \"/real/\\u2602.h\"\n" 1086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 1096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 1106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 1116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 1126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "}\n"; 1136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TestVFO T(contents); 1146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T.map("/path/♫/☂.h", "/real/☂.h"); 1156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 1166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST(libclang, VirtualFileOverlay_InvalidArgs) { 118ef8225444452a1486bd721f3285301fe84643b00Stephen Hines TestVFO T(nullptr); 1196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T.mapError("/path/./virtual/../foo.h", "/real/foo.h", 1206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CXError_InvalidArguments); 1216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 1226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST(libclang, VirtualFileOverlay_RemapDirectories) { 1246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const char *contents = 1256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "{\n" 1266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'version': 0,\n" 1276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'roots': [\n" 1286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 1296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'directory',\n" 1306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"/another/dir\",\n" 1316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'contents': [\n" 1326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 1336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'file',\n" 1346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"foo2.h\",\n" 1356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'external-contents': \"/real/foo2.h\"\n" 1366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 1376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 1386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " },\n" 1396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 1406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'directory',\n" 1416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"/path/virtual/dir\",\n" 1426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'contents': [\n" 1436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 1446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'file',\n" 1456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"foo1.h\",\n" 1466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'external-contents': \"/real/foo1.h\"\n" 1476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " },\n" 1486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 1496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'file',\n" 1506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"foo3.h\",\n" 1516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'external-contents': \"/real/foo3.h\"\n" 1526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " },\n" 1536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 1546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'directory',\n" 1556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"in/subdir\",\n" 1566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'contents': [\n" 1576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 1586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'file',\n" 1596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"foo4.h\",\n" 1606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'external-contents': \"/real/foo4.h\"\n" 1616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 1626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 1636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 1646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 1656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 1666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 1676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "}\n"; 1686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TestVFO T(contents); 1696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T.map("/path/virtual/dir/foo1.h", "/real/foo1.h"); 1706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T.map("/another/dir/foo2.h", "/real/foo2.h"); 1716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T.map("/path/virtual/dir/foo3.h", "/real/foo3.h"); 1726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T.map("/path/virtual/dir/in/subdir/foo4.h", "/real/foo4.h"); 1736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 1746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST(libclang, VirtualFileOverlay_CaseInsensitive) { 1766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const char *contents = 1776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "{\n" 1786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'version': 0,\n" 1796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'case-sensitive': 'false',\n" 1806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'roots': [\n" 1816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 1826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'directory',\n" 1836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"/path/virtual\",\n" 1846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'contents': [\n" 1856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 1866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'file',\n" 1876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"foo.h\",\n" 1886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'external-contents': \"/real/foo.h\"\n" 1896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 1906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 1916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 1926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 1936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "}\n"; 1946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TestVFO T(contents); 1956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T.map("/path/virtual/foo.h", "/real/foo.h"); 1966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines clang_VirtualFileOverlay_setCaseSensitivity(T.VFO, false); 1976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 1986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST(libclang, VirtualFileOverlay_SharedPrefix) { 2006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const char *contents = 2016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "{\n" 2026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'version': 0,\n" 2036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'roots': [\n" 2046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 2056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'directory',\n" 2066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"/path/foo\",\n" 2076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'contents': [\n" 2086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 2096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'file',\n" 2106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"bar\",\n" 2116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'external-contents': \"/real/bar\"\n" 2126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " },\n" 2136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 2146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'file',\n" 2156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"bar.h\",\n" 2166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'external-contents': \"/real/bar.h\"\n" 2176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 2186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 2196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " },\n" 2206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 2216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'directory',\n" 2226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"/path/foobar\",\n" 2236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'contents': [\n" 2246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 2256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'file',\n" 2266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"baz.h\",\n" 2276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'external-contents': \"/real/baz.h\"\n" 2286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 2296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 2306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " },\n" 2316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 2326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'directory',\n" 2336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"/path\",\n" 2346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'contents': [\n" 2356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 2366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'file',\n" 2376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"foobarbaz.h\",\n" 2386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'external-contents': \"/real/foobarbaz.h\"\n" 2396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 2406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 2416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 2426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 2436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "}\n"; 2446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TestVFO T(contents); 2456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T.map("/path/foo/bar.h", "/real/bar.h"); 2466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T.map("/path/foo/bar", "/real/bar"); 2476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T.map("/path/foobar/baz.h", "/real/baz.h"); 2486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T.map("/path/foobarbaz.h", "/real/foobarbaz.h"); 2496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 2506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST(libclang, VirtualFileOverlay_AdjacentDirectory) { 2526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const char *contents = 2536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "{\n" 2546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'version': 0,\n" 2556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'roots': [\n" 2566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 2576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'directory',\n" 2586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"/path/dir1\",\n" 2596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'contents': [\n" 2606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 2616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'file',\n" 2626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"foo.h\",\n" 2636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'external-contents': \"/real/foo.h\"\n" 2646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " },\n" 2656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 2666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'directory',\n" 2676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"subdir\",\n" 2686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'contents': [\n" 2696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 2706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'file',\n" 2716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"bar.h\",\n" 2726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'external-contents': \"/real/bar.h\"\n" 2736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 2746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 2756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 2766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 2776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " },\n" 2786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 2796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'directory',\n" 2806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"/path/dir2\",\n" 2816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'contents': [\n" 2826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 2836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'file',\n" 2846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"baz.h\",\n" 2856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'external-contents': \"/real/baz.h\"\n" 2866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 2876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 2886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 2896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 2906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "}\n"; 2916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TestVFO T(contents); 2926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T.map("/path/dir1/foo.h", "/real/foo.h"); 2936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T.map("/path/dir1/subdir/bar.h", "/real/bar.h"); 2946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T.map("/path/dir2/baz.h", "/real/baz.h"); 2956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 2966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesTEST(libclang, VirtualFileOverlay_TopLevel) { 2986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const char *contents = 2996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "{\n" 3006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'version': 0,\n" 3016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'roots': [\n" 3026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 3036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'directory',\n" 3046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"/\",\n" 3056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'contents': [\n" 3066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " {\n" 3076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'type': 'file',\n" 3086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'name': \"foo.h\",\n" 3096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " 'external-contents': \"/real/foo.h\"\n" 3106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 3116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 3126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " }\n" 3136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines " ]\n" 3146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "}\n"; 3156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TestVFO T(contents); 3166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines T.map("/foo.h", "/real/foo.h"); 317651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 318651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 319651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTEST(libclang, ModuleMapDescriptor) { 320651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const char *Contents = 321651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "framework module TestFrame {\n" 322651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines " umbrella header \"TestFrame.h\"\n" 323651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "\n" 324651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines " export *\n" 325651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines " module * { export * }\n" 326651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "}\n"; 327651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 328651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CXModuleMapDescriptor MMD = clang_ModuleMapDescriptor_create(0); 329651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 330651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines clang_ModuleMapDescriptor_setFrameworkModuleName(MMD, "TestFrame"); 331651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines clang_ModuleMapDescriptor_setUmbrellaHeader(MMD, "TestFrame.h"); 332651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 333651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines char *BufPtr; 334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned BufSize; 335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines clang_ModuleMapDescriptor_writeToBuffer(MMD, 0, &BufPtr, &BufSize); 336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::string BufStr(BufPtr, BufSize); 337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EXPECT_STREQ(Contents, BufStr.c_str()); 338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines free(BufPtr); 339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines clang_ModuleMapDescriptor_dispose(MMD); 340651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 341ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 342ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass LibclangReparseTest : public ::testing::Test { 343ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::set<std::string> Files; 344ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic: 345ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::string TestDir; 346ef8225444452a1486bd721f3285301fe84643b00Stephen Hines CXIndex Index; 347ef8225444452a1486bd721f3285301fe84643b00Stephen Hines CXTranslationUnit ClangTU; 348ef8225444452a1486bd721f3285301fe84643b00Stephen Hines unsigned TUFlags; 349ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 350ef8225444452a1486bd721f3285301fe84643b00Stephen Hines void SetUp() { 351ef8225444452a1486bd721f3285301fe84643b00Stephen Hines llvm::SmallString<256> Dir; 352ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ASSERT_FALSE(llvm::sys::fs::createUniqueDirectory("libclang-test", Dir)); 353ef8225444452a1486bd721f3285301fe84643b00Stephen Hines TestDir = Dir.str(); 354ef8225444452a1486bd721f3285301fe84643b00Stephen Hines TUFlags = CXTranslationUnit_DetailedPreprocessingRecord | 355ef8225444452a1486bd721f3285301fe84643b00Stephen Hines clang_defaultEditingTranslationUnitOptions(); 356ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Index = clang_createIndex(0, 0); 357ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 358ef8225444452a1486bd721f3285301fe84643b00Stephen Hines void TearDown() { 359ef8225444452a1486bd721f3285301fe84643b00Stephen Hines clang_disposeTranslationUnit(ClangTU); 360ef8225444452a1486bd721f3285301fe84643b00Stephen Hines clang_disposeIndex(Index); 361ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (const std::string &Path : Files) 362ef8225444452a1486bd721f3285301fe84643b00Stephen Hines llvm::sys::fs::remove(Path); 363ef8225444452a1486bd721f3285301fe84643b00Stephen Hines llvm::sys::fs::remove(TestDir); 364ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 365ef8225444452a1486bd721f3285301fe84643b00Stephen Hines void WriteFile(std::string &Filename, const std::string &Contents) { 366ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (!llvm::sys::path::is_absolute(Filename)) { 367ef8225444452a1486bd721f3285301fe84643b00Stephen Hines llvm::SmallString<256> Path(TestDir); 368ef8225444452a1486bd721f3285301fe84643b00Stephen Hines llvm::sys::path::append(Path, Filename); 369ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Filename = Path.str(); 370ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Files.insert(Filename); 371ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 372ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::ofstream OS(Filename); 373ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << Contents; 374ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 375ef8225444452a1486bd721f3285301fe84643b00Stephen Hines void DisplayDiagnostics() { 376ef8225444452a1486bd721f3285301fe84643b00Stephen Hines unsigned NumDiagnostics = clang_getNumDiagnostics(ClangTU); 377ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (unsigned i = 0; i < NumDiagnostics; ++i) { 378ef8225444452a1486bd721f3285301fe84643b00Stephen Hines auto Diag = clang_getDiagnostic(ClangTU, i); 379ef8225444452a1486bd721f3285301fe84643b00Stephen Hines DEBUG(llvm::dbgs() << clang_getCString(clang_formatDiagnostic( 380ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Diag, clang_defaultDiagnosticDisplayOptions())) << "\n"); 381ef8225444452a1486bd721f3285301fe84643b00Stephen Hines clang_disposeDiagnostic(Diag); 382ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 383ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 384ef8225444452a1486bd721f3285301fe84643b00Stephen Hines bool ReparseTU(unsigned num_unsaved_files, CXUnsavedFile* unsaved_files) { 385ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (clang_reparseTranslationUnit(ClangTU, num_unsaved_files, unsaved_files, 386ef8225444452a1486bd721f3285301fe84643b00Stephen Hines clang_defaultReparseOptions(ClangTU))) { 387ef8225444452a1486bd721f3285301fe84643b00Stephen Hines DEBUG(llvm::dbgs() << "Reparse failed\n"); 388ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return false; 389ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 390ef8225444452a1486bd721f3285301fe84643b00Stephen Hines DisplayDiagnostics(); 391ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return true; 392ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 393ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}; 394ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 395ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 396ef8225444452a1486bd721f3285301fe84643b00Stephen HinesTEST_F(LibclangReparseTest, Reparse) { 397ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const char *HeaderTop = "#ifndef H\n#define H\nstruct Foo { int bar;"; 398ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const char *HeaderBottom = "\n};\n#endif\n"; 399ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const char *CppFile = "#include \"HeaderFile.h\"\nint main() {" 400ef8225444452a1486bd721f3285301fe84643b00Stephen Hines " Foo foo; foo.bar = 7; foo.baz = 8; }\n"; 401ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::string HeaderName = "HeaderFile.h"; 402ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::string CppName = "CppFile.cpp"; 403ef8225444452a1486bd721f3285301fe84643b00Stephen Hines WriteFile(CppName, CppFile); 404ef8225444452a1486bd721f3285301fe84643b00Stephen Hines WriteFile(HeaderName, std::string(HeaderTop) + HeaderBottom); 405ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 406ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ClangTU = clang_parseTranslationUnit(Index, CppName.c_str(), nullptr, 0, 407ef8225444452a1486bd721f3285301fe84643b00Stephen Hines nullptr, 0, TUFlags); 408ef8225444452a1486bd721f3285301fe84643b00Stephen Hines EXPECT_EQ(1U, clang_getNumDiagnostics(ClangTU)); 409ef8225444452a1486bd721f3285301fe84643b00Stephen Hines DisplayDiagnostics(); 410ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 411ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // Immedaitely reparse. 412ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ASSERT_TRUE(ReparseTU(0, nullptr /* No unsaved files. */)); 413ef8225444452a1486bd721f3285301fe84643b00Stephen Hines EXPECT_EQ(1U, clang_getNumDiagnostics(ClangTU)); 414ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 415ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::string NewHeaderContents = 416ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::string(HeaderTop) + "int baz;" + HeaderBottom; 417ef8225444452a1486bd721f3285301fe84643b00Stephen Hines WriteFile(HeaderName, NewHeaderContents); 418ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 419ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // Reparse after fix. 420ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ASSERT_TRUE(ReparseTU(0, nullptr /* No unsaved files. */)); 421ef8225444452a1486bd721f3285301fe84643b00Stephen Hines EXPECT_EQ(0U, clang_getNumDiagnostics(ClangTU)); 422ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 423ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 424ef8225444452a1486bd721f3285301fe84643b00Stephen HinesTEST_F(LibclangReparseTest, ReparseWithModule) { 425ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const char *HeaderTop = "#ifndef H\n#define H\nstruct Foo { int bar;"; 426ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const char *HeaderBottom = "\n};\n#endif\n"; 427ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const char *MFile = "#include \"HeaderFile.h\"\nint main() {" 428ef8225444452a1486bd721f3285301fe84643b00Stephen Hines " struct Foo foo; foo.bar = 7; foo.baz = 8; }\n"; 429ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const char *ModFile = "module A { header \"HeaderFile.h\" }\n"; 430ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::string HeaderName = "HeaderFile.h"; 431ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::string MName = "MFile.m"; 432ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::string ModName = "module.modulemap"; 433ef8225444452a1486bd721f3285301fe84643b00Stephen Hines WriteFile(MName, MFile); 434ef8225444452a1486bd721f3285301fe84643b00Stephen Hines WriteFile(HeaderName, std::string(HeaderTop) + HeaderBottom); 435ef8225444452a1486bd721f3285301fe84643b00Stephen Hines WriteFile(ModName, ModFile); 436ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 437ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::string ModulesCache = std::string("-fmodules-cache-path=") + TestDir; 438ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const char *Args[] = { "-fmodules", ModulesCache.c_str(), 439ef8225444452a1486bd721f3285301fe84643b00Stephen Hines "-I", TestDir.c_str() }; 440ef8225444452a1486bd721f3285301fe84643b00Stephen Hines int NumArgs = sizeof(Args) / sizeof(Args[0]); 441ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ClangTU = clang_parseTranslationUnit(Index, MName.c_str(), Args, NumArgs, 442ef8225444452a1486bd721f3285301fe84643b00Stephen Hines nullptr, 0, TUFlags); 443ef8225444452a1486bd721f3285301fe84643b00Stephen Hines EXPECT_EQ(1U, clang_getNumDiagnostics(ClangTU)); 444ef8225444452a1486bd721f3285301fe84643b00Stephen Hines DisplayDiagnostics(); 445ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 446ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // Immedaitely reparse. 447ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ASSERT_TRUE(ReparseTU(0, nullptr /* No unsaved files. */)); 448ef8225444452a1486bd721f3285301fe84643b00Stephen Hines EXPECT_EQ(1U, clang_getNumDiagnostics(ClangTU)); 449ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 450ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::string NewHeaderContents = 451ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::string(HeaderTop) + "int baz;" + HeaderBottom; 452ef8225444452a1486bd721f3285301fe84643b00Stephen Hines WriteFile(HeaderName, NewHeaderContents); 453ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 454ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // Reparse after fix. 455ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ASSERT_TRUE(ReparseTU(0, nullptr /* No unsaved files. */)); 456ef8225444452a1486bd721f3285301fe84643b00Stephen Hines EXPECT_EQ(0U, clang_getNumDiagnostics(ClangTU)); 457ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 458