Index: clang-tools-extra/clang-doc/BitcodeReader.cpp =================================================================== --- clang-tools-extra/clang-doc/BitcodeReader.cpp +++ clang-tools-extra/clang-doc/BitcodeReader.cpp @@ -292,6 +292,8 @@ return decodeRecord(R, I->RefType, Blob); case REFERENCE_PATH: return decodeRecord(R, I->Path, Blob); + case REFERENCE_IS_PATH_VALID: + return decodeRecord(R, I->IsPathValid, Blob); case REFERENCE_FIELD: return decodeRecord(R, F, Blob); default: Index: clang-tools-extra/clang-doc/BitcodeWriter.h =================================================================== --- clang-tools-extra/clang-doc/BitcodeWriter.h +++ clang-tools-extra/clang-doc/BitcodeWriter.h @@ -109,6 +109,7 @@ REFERENCE_NAME, REFERENCE_TYPE, REFERENCE_PATH, + REFERENCE_IS_PATH_VALID, REFERENCE_FIELD, RI_LAST, RI_FIRST = VERSION Index: clang-tools-extra/clang-doc/BitcodeWriter.cpp =================================================================== --- clang-tools-extra/clang-doc/BitcodeWriter.cpp +++ clang-tools-extra/clang-doc/BitcodeWriter.cpp @@ -172,6 +172,7 @@ {REFERENCE_NAME, {"Name", &StringAbbrev}}, {REFERENCE_TYPE, {"RefType", &IntAbbrev}}, {REFERENCE_PATH, {"Path", &StringAbbrev}}, + {REFERENCE_IS_PATH_VALID, {"IsPathValid", &BoolAbbrev}}, {REFERENCE_FIELD, {"Field", &IntAbbrev}}}; assert(Inits.size() == RecordIdCount); for (const auto &Init : Inits) { @@ -215,7 +216,7 @@ // Reference Block {BI_REFERENCE_BLOCK_ID, {REFERENCE_USR, REFERENCE_NAME, REFERENCE_TYPE, REFERENCE_PATH, - REFERENCE_FIELD}}}; + REFERENCE_IS_PATH_VALID, REFERENCE_FIELD}}}; // AbbreviationMap @@ -387,6 +388,7 @@ emitRecord(R.Name, REFERENCE_NAME); emitRecord((unsigned)R.RefType, REFERENCE_TYPE); emitRecord(R.Path, REFERENCE_PATH); + emitRecord(R.IsPathValid, REFERENCE_IS_PATH_VALID); emitRecord((unsigned)Field, REFERENCE_FIELD); } Index: clang-tools-extra/clang-doc/HTMLGenerator.cpp =================================================================== --- clang-tools-extra/clang-doc/HTMLGenerator.cpp +++ clang-tools-extra/clang-doc/HTMLGenerator.cpp @@ -249,7 +249,7 @@ static std::unique_ptr genTypeReference(const Reference &Type, StringRef CurrentDirectory) { - if (Type.Path.empty()) + if (!Type.IsPathValid) return llvm::make_unique(Type.Name); llvm::SmallString<128> Path = computeRelativePath(Type.Path, CurrentDirectory); Index: clang-tools-extra/clang-doc/Representation.h =================================================================== --- clang-tools-extra/clang-doc/Representation.h +++ clang-tools-extra/clang-doc/Representation.h @@ -114,11 +114,12 @@ struct Reference { Reference() = default; Reference(llvm::StringRef Name) : Name(Name) {} - Reference(llvm::StringRef Name, StringRef Path) : Name(Name), Path(Path) {} + Reference(llvm::StringRef Name, StringRef Path) + : Name(Name), Path(Path), IsPathValid(true) {} Reference(SymbolID USR, StringRef Name, InfoType IT) : USR(USR), Name(Name), RefType(IT) {} Reference(SymbolID USR, StringRef Name, InfoType IT, StringRef Path) - : USR(USR), Name(Name), RefType(IT), Path(Path) {} + : USR(USR), Name(Name), RefType(IT), Path(Path), IsPathValid(true) {} bool operator==(const Reference &Other) const { return std::tie(USR, Name, RefType) == @@ -130,8 +131,11 @@ InfoType RefType = InfoType::IT_default; // Indicates the type of this // Reference (namespace, record, // function, enum, default). - llvm::SmallString<128> Path; // Path of directory where the clang-doc - // generated file will be saved + llvm::SmallString<128> + Path; // Path of directory where the clang-doc generated file will be + // saved (possibly unresolved) + bool IsPathValid = false; // Indicates if a value has been assigned to Path, + // it could be an empty string }; // A base struct for TypeInfos Index: clang-tools-extra/clang-doc/YAMLGenerator.cpp =================================================================== --- clang-tools-extra/clang-doc/YAMLGenerator.cpp +++ clang-tools-extra/clang-doc/YAMLGenerator.cpp @@ -156,6 +156,7 @@ IO.mapOptional("Name", Ref.Name, SmallString<16>()); IO.mapOptional("USR", Ref.USR, SymbolID()); IO.mapOptional("Path", Ref.Path, SmallString<128>()); + IO.mapOptional("IsPathValid", Ref.IsPathValid, false); } }; Index: clang-tools-extra/unittests/clang-doc/YAMLGeneratorTest.cpp =================================================================== --- clang-tools-extra/unittests/clang-doc/YAMLGeneratorTest.cpp +++ clang-tools-extra/unittests/clang-doc/YAMLGeneratorTest.cpp @@ -115,16 +115,19 @@ - Type: Name: 'int' Path: 'path/to/int' + IsPathValid: true Name: 'X' Access: Private Parents: - Type: Record Name: 'F' Path: 'path/to/F' + IsPathValid: true VirtualParents: - Type: Record Name: 'G' Path: 'path/to/G' + IsPathValid: true ChildRecords: - Type: Record Name: 'ChildStruct' @@ -181,11 +184,13 @@ - Type: Name: 'int' Path: 'path/to/int' + IsPathValid: true Name: 'P' ReturnType: Type: Name: 'void' Path: 'path/to/void' + IsPathValid: true ... )raw"; EXPECT_EQ(Expected, Actual.str());