[clang-tools-extra] 91b38c6 - Revert "[clang-doc] Add template support."
Brett Wilson via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 7 10:23:09 PST 2022
Author: Brett Wilson
Date: 2022-12-07T10:22:51-08:00
New Revision: 91b38c6aaddefabad2a4c959ea3865e356761ed5
URL: https://github.com/llvm/llvm-project/commit/91b38c6aaddefabad2a4c959ea3865e356761ed5
DIFF: https://github.com/llvm/llvm-project/commit/91b38c6aaddefabad2a4c959ea3865e356761ed5.diff
LOG: Revert "[clang-doc] Add template support."
Causes a build failure in YAML specializations.
This reverts commit 0f6dbb5f164662c3e6a167a89e7a89f07c60e32b.
Added:
Modified:
clang-tools-extra/clang-doc/BitcodeReader.cpp
clang-tools-extra/clang-doc/BitcodeWriter.cpp
clang-tools-extra/clang-doc/BitcodeWriter.h
clang-tools-extra/clang-doc/Representation.cpp
clang-tools-extra/clang-doc/Representation.h
clang-tools-extra/clang-doc/Serialize.cpp
clang-tools-extra/clang-doc/YAMLGenerator.cpp
clang-tools-extra/test/clang-doc/single-file-public.cpp
clang-tools-extra/test/clang-doc/single-file.cpp
clang-tools-extra/unittests/clang-doc/HTMLGeneratorTest.cpp
clang-tools-extra/unittests/clang-doc/SerializeTest.cpp
clang-tools-extra/unittests/clang-doc/YAMLGeneratorTest.cpp
Removed:
clang-tools-extra/test/clang-doc/templates.cpp
################################################################################
diff --git a/clang-tools-extra/clang-doc/BitcodeReader.cpp b/clang-tools-extra/clang-doc/BitcodeReader.cpp
index 3fb85056cee8f..072011448330e 100644
--- a/clang-tools-extra/clang-doc/BitcodeReader.cpp
+++ b/clang-tools-extra/clang-doc/BitcodeReader.cpp
@@ -351,8 +351,6 @@ llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
return decodeRecord(R, I->USR, Blob);
case REFERENCE_NAME:
return decodeRecord(R, I->Name, Blob);
- case REFERENCE_QUAL_NAME:
- return decodeRecord(R, I->QualName, Blob);
case REFERENCE_TYPE:
return decodeRecord(R, I->RefType, Blob);
case REFERENCE_PATH:
@@ -365,29 +363,6 @@ llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
}
}
-llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
- TemplateInfo *I) {
- // Currently there are no child records of TemplateInfo (only child blocks).
- return llvm::createStringError(llvm::inconvertibleErrorCode(),
- "invalid field for TemplateParamInfo");
-}
-
-llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
- TemplateSpecializationInfo *I) {
- if (ID == TEMPLATE_SPECIALIZATION_OF)
- return decodeRecord(R, I->SpecializationOf, Blob);
- return llvm::createStringError(llvm::inconvertibleErrorCode(),
- "invalid field for TemplateParamInfo");
-}
-
-llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
- TemplateParamInfo *I) {
- if (ID == TEMPLATE_PARAM_CONTENTS)
- return decodeRecord(R, I->Contents, Blob);
- return llvm::createStringError(llvm::inconvertibleErrorCode(),
- "invalid field for TemplateParamInfo");
-}
-
template <typename T> llvm::Expected<CommentInfo *> getCommentInfo(T I) {
return llvm::createStringError(llvm::inconvertibleErrorCode(),
"invalid type cannot contain CommentInfo");
@@ -620,45 +595,6 @@ template <> void addChild(BaseRecordInfo *I, FunctionInfo &&R) {
I->Children.Functions.emplace_back(std::move(R));
}
-// TemplateParam children. These go into either a TemplateInfo (for template
-// parameters) or TemplateSpecializationInfo (for the specialization's
-// parameters).
-template <typename T> void addTemplateParam(T I, TemplateParamInfo &&P) {
- llvm::errs() << "invalid container for template parameter";
- exit(1);
-}
-template <> void addTemplateParam(TemplateInfo *I, TemplateParamInfo &&P) {
- I->Params.emplace_back(std::move(P));
-}
-template <>
-void addTemplateParam(TemplateSpecializationInfo *I, TemplateParamInfo &&P) {
- I->Params.emplace_back(std::move(P));
-}
-
-// Template info. These apply to either records or functions.
-template <typename T> void addTemplate(T I, TemplateInfo &&P) {
- llvm::errs() << "invalid container for template info";
- exit(1);
-}
-template <> void addTemplate(RecordInfo *I, TemplateInfo &&P) {
- I->Template.emplace(std::move(P));
-}
-template <> void addTemplate(FunctionInfo *I, TemplateInfo &&P) {
- I->Template.emplace(std::move(P));
-}
-
-// Template specializations go only into template records.
-template <typename T>
-void addTemplateSpecialization(T I, TemplateSpecializationInfo &&TSI) {
- llvm::errs() << "invalid container for template specialization info";
- exit(1);
-}
-template <>
-void addTemplateSpecialization(TemplateInfo *I,
- TemplateSpecializationInfo &&TSI) {
- I->Specialization.emplace(std::move(TSI));
-}
-
// Read records from bitcode into a given info.
template <typename T>
llvm::Error ClangDocBitcodeReader::readRecord(unsigned ID, T I) {
@@ -783,27 +719,6 @@ llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) {
addChild(I, std::move(EV));
return llvm::Error::success();
}
- case BI_TEMPLATE_BLOCK_ID: {
- TemplateInfo TI;
- if (auto Err = readBlock(ID, &TI))
- return Err;
- addTemplate(I, std::move(TI));
- return llvm::Error::success();
- }
- case BI_TEMPLATE_SPECIALIZATION_BLOCK_ID: {
- TemplateSpecializationInfo TSI;
- if (auto Err = readBlock(ID, &TSI))
- return Err;
- addTemplateSpecialization(I, std::move(TSI));
- return llvm::Error::success();
- }
- case BI_TEMPLATE_PARAM_BLOCK_ID: {
- TemplateParamInfo TPI;
- if (auto Err = readBlock(ID, &TPI))
- return Err;
- addTemplateParam(I, std::move(TPI));
- return llvm::Error::success();
- }
case BI_TYPEDEF_BLOCK_ID: {
TypedefInfo TI;
if (auto Err = readBlock(ID, &TI))
diff --git a/clang-tools-extra/clang-doc/BitcodeWriter.cpp b/clang-tools-extra/clang-doc/BitcodeWriter.cpp
index 8a5647cb6a755..bb0698a5a4028 100644
--- a/clang-tools-extra/clang-doc/BitcodeWriter.cpp
+++ b/clang-tools-extra/clang-doc/BitcodeWriter.cpp
@@ -121,10 +121,7 @@ static const llvm::IndexedMap<llvm::StringRef, BlockIdToIndexFunctor>
{BI_BASE_RECORD_BLOCK_ID, "BaseRecordBlock"},
{BI_FUNCTION_BLOCK_ID, "FunctionBlock"},
{BI_COMMENT_BLOCK_ID, "CommentBlock"},
- {BI_REFERENCE_BLOCK_ID, "ReferenceBlock"},
- {BI_TEMPLATE_BLOCK_ID, "TemplateBlock"},
- {BI_TEMPLATE_SPECIALIZATION_BLOCK_ID, "TemplateSpecializationBlock"},
- {BI_TEMPLATE_PARAM_BLOCK_ID, "TemplateParamBlock"}};
+ {BI_REFERENCE_BLOCK_ID, "ReferenceBlock"}};
assert(Inits.size() == BlockIdCount);
for (const auto &Init : Inits)
BlockIdNameMap[Init.first] = Init.second;
@@ -189,12 +186,9 @@ static const llvm::IndexedMap<RecordIdDsc, RecordIdToIndexFunctor>
{FUNCTION_IS_METHOD, {"IsMethod", &BoolAbbrev}},
{REFERENCE_USR, {"USR", &SymbolIDAbbrev}},
{REFERENCE_NAME, {"Name", &StringAbbrev}},
- {REFERENCE_QUAL_NAME, {"QualName", &StringAbbrev}},
{REFERENCE_TYPE, {"RefType", &IntAbbrev}},
{REFERENCE_PATH, {"Path", &StringAbbrev}},
{REFERENCE_FIELD, {"Field", &IntAbbrev}},
- {TEMPLATE_PARAM_CONTENTS, {"Contents", &StringAbbrev}},
- {TEMPLATE_SPECIALIZATION_OF, {"SpecializationOf", &SymbolIDAbbrev}},
{TYPEDEF_USR, {"USR", &SymbolIDAbbrev}},
{TYPEDEF_NAME, {"Name", &StringAbbrev}},
{TYPEDEF_DEFLOCATION, {"DefLocation", &LocationAbbrev}},
@@ -250,12 +244,8 @@ static const std::vector<std::pair<BlockId, std::vector<RecordId>>>
FUNCTION_ACCESS, FUNCTION_IS_METHOD}},
// Reference Block
{BI_REFERENCE_BLOCK_ID,
- {REFERENCE_USR, REFERENCE_NAME, REFERENCE_QUAL_NAME, REFERENCE_TYPE,
- REFERENCE_PATH, REFERENCE_FIELD}},
- // Template Blocks.
- {BI_TEMPLATE_BLOCK_ID, {}},
- {BI_TEMPLATE_PARAM_BLOCK_ID, {TEMPLATE_PARAM_CONTENTS}},
- {BI_TEMPLATE_SPECIALIZATION_BLOCK_ID, {TEMPLATE_SPECIALIZATION_OF}}};
+ {REFERENCE_USR, REFERENCE_NAME, REFERENCE_TYPE, REFERENCE_PATH,
+ REFERENCE_FIELD}}};
// AbbreviationMap
@@ -388,8 +378,6 @@ void ClangDocBitcodeWriter::emitRecord(unsigned Val, RecordId ID) {
Stream.EmitRecordWithAbbrev(Abbrevs.get(ID), Record);
}
-void ClangDocBitcodeWriter::emitRecord(const TemplateInfo &Templ) {}
-
bool ClangDocBitcodeWriter::prepRecordData(RecordId ID, bool ShouldEmit) {
assert(RecordIdNameMap[ID] && "Unknown RecordId.");
if (!ShouldEmit)
@@ -428,7 +416,6 @@ void ClangDocBitcodeWriter::emitBlock(const Reference &R, FieldId Field) {
StreamSubBlockGuard Block(Stream, BI_REFERENCE_BLOCK_ID);
emitRecord(R.USR, REFERENCE_USR);
emitRecord(R.Name, REFERENCE_NAME);
- emitRecord(R.QualName, REFERENCE_QUAL_NAME);
emitRecord((unsigned)R.RefType, REFERENCE_TYPE);
emitRecord(R.Path, REFERENCE_PATH);
emitRecord((unsigned)Field, REFERENCE_FIELD);
@@ -569,8 +556,6 @@ void ClangDocBitcodeWriter::emitBlock(const RecordInfo &I) {
emitBlock(C);
for (const auto &C : I.Children.Typedefs)
emitBlock(C);
- if (I.Template)
- emitBlock(*I.Template);
}
void ClangDocBitcodeWriter::emitBlock(const BaseRecordInfo &I) {
@@ -606,28 +591,6 @@ void ClangDocBitcodeWriter::emitBlock(const FunctionInfo &I) {
emitBlock(I.ReturnType);
for (const auto &N : I.Params)
emitBlock(N);
- if (I.Template)
- emitBlock(*I.Template);
-}
-
-void ClangDocBitcodeWriter::emitBlock(const TemplateInfo &T) {
- StreamSubBlockGuard Block(Stream, BI_TEMPLATE_BLOCK_ID);
- for (const auto &P : T.Params)
- emitBlock(P);
- if (T.Specialization)
- emitBlock(*T.Specialization);
-}
-
-void ClangDocBitcodeWriter::emitBlock(const TemplateSpecializationInfo &T) {
- StreamSubBlockGuard Block(Stream, BI_TEMPLATE_SPECIALIZATION_BLOCK_ID);
- emitRecord(T.SpecializationOf, TEMPLATE_SPECIALIZATION_OF);
- for (const auto &P : T.Params)
- emitBlock(P);
-}
-
-void ClangDocBitcodeWriter::emitBlock(const TemplateParamInfo &T) {
- StreamSubBlockGuard Block(Stream, BI_TEMPLATE_PARAM_BLOCK_ID);
- emitRecord(T.Contents, TEMPLATE_PARAM_CONTENTS);
}
bool ClangDocBitcodeWriter::dispatchInfoForWrite(Info *I) {
diff --git a/clang-tools-extra/clang-doc/BitcodeWriter.h b/clang-tools-extra/clang-doc/BitcodeWriter.h
index 9a572e40e352f..5a2514a19b30d 100644
--- a/clang-tools-extra/clang-doc/BitcodeWriter.h
+++ b/clang-tools-extra/clang-doc/BitcodeWriter.h
@@ -17,6 +17,7 @@
#include "Representation.h"
#include "clang/AST/AST.h"
+#include "llvm/ADT/APSInt.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
@@ -63,9 +64,6 @@ enum BlockId {
BI_FUNCTION_BLOCK_ID,
BI_COMMENT_BLOCK_ID,
BI_REFERENCE_BLOCK_ID,
- BI_TEMPLATE_BLOCK_ID,
- BI_TEMPLATE_SPECIALIZATION_BLOCK_ID,
- BI_TEMPLATE_PARAM_BLOCK_ID,
BI_TYPEDEF_BLOCK_ID,
BI_LAST,
BI_FIRST = BI_VERSION_BLOCK_ID
@@ -123,12 +121,9 @@ enum RecordId {
BASE_RECORD_IS_PARENT,
REFERENCE_USR,
REFERENCE_NAME,
- REFERENCE_QUAL_NAME,
REFERENCE_TYPE,
REFERENCE_PATH,
REFERENCE_FIELD,
- TEMPLATE_PARAM_CONTENTS,
- TEMPLATE_SPECIALIZATION_OF,
TYPEDEF_USR,
TYPEDEF_NAME,
TYPEDEF_DEFLOCATION,
@@ -174,9 +169,6 @@ class ClangDocBitcodeWriter {
void emitBlock(const FieldTypeInfo &B);
void emitBlock(const MemberTypeInfo &T);
void emitBlock(const CommentInfo &B);
- void emitBlock(const TemplateInfo &T);
- void emitBlock(const TemplateSpecializationInfo &T);
- void emitBlock(const TemplateParamInfo &T);
void emitBlock(const Reference &B, FieldId F);
private:
@@ -223,7 +215,7 @@ class ClangDocBitcodeWriter {
void emitRecord(bool Value, RecordId ID);
void emitRecord(int Value, RecordId ID);
void emitRecord(unsigned Value, RecordId ID);
- void emitRecord(const TemplateInfo &Templ);
+ void emitRecord(llvm::APSInt Value, RecordId ID);
bool prepRecordData(RecordId ID, bool ShouldEmit = true);
// Emission of appropriate abbreviation type.
diff --git a/clang-tools-extra/clang-doc/Representation.cpp b/clang-tools-extra/clang-doc/Representation.cpp
index c1279997813a8..27b83d67513d9 100644
--- a/clang-tools-extra/clang-doc/Representation.cpp
+++ b/clang-tools-extra/clang-doc/Representation.cpp
@@ -250,8 +250,6 @@ void RecordInfo::merge(RecordInfo &&Other) {
reduceChildren(Children.Enums, std::move(Other.Children.Enums));
reduceChildren(Children.Typedefs, std::move(Other.Children.Typedefs));
SymbolInfo::merge(std::move(Other));
- if (!Template)
- Template = Other.Template;
}
void EnumInfo::merge(EnumInfo &&Other) {
@@ -276,8 +274,6 @@ void FunctionInfo::merge(FunctionInfo &&Other) {
if (Params.empty())
Params = std::move(Other.Params);
SymbolInfo::merge(std::move(Other));
- if (!Template)
- Template = Other.Template;
}
void TypedefInfo::merge(TypedefInfo &&Other) {
diff --git a/clang-tools-extra/clang-doc/Representation.h b/clang-tools-extra/clang-doc/Representation.h
index 32272cdde4ff6..2a690883b33e7 100644
--- a/clang-tools-extra/clang-doc/Representation.h
+++ b/clang-tools-extra/clang-doc/Representation.h
@@ -117,21 +117,13 @@ struct CommentInfo {
};
struct Reference {
- // This variant (that takes no qualified name parameter) uses the Name as the
- // QualName (very useful in unit tests to reduce verbosity). This can't use an
- // empty string to indicate the default because we need to accept the empty
- // string as a valid input for the global namespace (it will have
- // "GlobalNamespace" as the name, but an empty QualName).
Reference(SymbolID USR = SymbolID(), StringRef Name = StringRef(),
- InfoType IT = InfoType::IT_default)
- : USR(USR), Name(Name), QualName(Name), RefType(IT) {}
- Reference(SymbolID USR, StringRef Name, InfoType IT, StringRef QualName,
- StringRef Path = StringRef())
- : USR(USR), Name(Name), QualName(QualName), RefType(IT), Path(Path) {}
+ InfoType IT = InfoType::IT_default, StringRef Path = StringRef())
+ : USR(USR), Name(Name), RefType(IT), Path(Path) {}
bool operator==(const Reference &Other) const {
- return std::tie(USR, Name, QualName, RefType) ==
- std::tie(Other.USR, Other.Name, QualName, Other.RefType);
+ return std::tie(USR, Name, RefType) ==
+ std::tie(Other.USR, Other.Name, Other.RefType);
}
bool mergeable(const Reference &Other);
@@ -144,17 +136,7 @@ struct Reference {
llvm::SmallString<16> getFileBaseName() const;
SymbolID USR = SymbolID(); // Unique identifier for referenced decl
-
- // Name of type (possibly unresolved). Not including namespaces or template
- // parameters (so for a std::vector<int> this would be "vector"). See also
- // QualName.
- SmallString<16> Name;
-
- // Full qualified name of this type, including namespaces and template
- // parameter (for example this could be "std::vector<int>"). Contrast to
- // Name.
- SmallString<16> QualName;
-
+ SmallString<16> Name; // Name of type (possibly unresolved).
InfoType RefType = InfoType::IT_default; // Indicates the type of this
// Reference (namespace, record,
// function, enum, default).
@@ -187,46 +169,13 @@ struct TypeInfo {
// Convenience constructor for when there is no symbol ID or info type
// (normally used for built-in types in tests).
TypeInfo(StringRef Name, StringRef Path = StringRef())
- : Type(SymbolID(), Name, InfoType::IT_default, Name, Path) {}
+ : Type(SymbolID(), Name, InfoType::IT_default, Path) {}
bool operator==(const TypeInfo &Other) const { return Type == Other.Type; }
Reference Type; // Referenced type in this info.
};
-// Represents one template parameter.
-//
-// This is a very simple serialization of the text of the source code of the
-// template parameter. It is saved in a struct so there is a place to add the
-// name and default values in the future if needed.
-struct TemplateParamInfo {
- TemplateParamInfo() = default;
- explicit TemplateParamInfo(StringRef Contents) : Contents(Contents) {}
-
- // The literal contents of the code for that specifies this template parameter
- // for this declaration. Typical values will be "class T" and
- // "typename T = int".
- SmallString<16> Contents;
-};
-
-struct TemplateSpecializationInfo {
- // Indicates the declaration that this specializes.
- SymbolID SpecializationOf;
-
- // Template parameters applying to the specialized record/function.
- std::vector<TemplateParamInfo> Params;
-};
-
-// Records the template information for a struct or function that is a template
-// or an explicit template specialization.
-struct TemplateInfo {
- // May be empty for non-partial specializations.
- std::vector<TemplateParamInfo> Params;
-
- // Set when this is a specialization of another record/function.
- llvm::Optional<TemplateSpecializationInfo> Specialization;
-};
-
// Info for field types.
struct FieldTypeInfo : public TypeInfo {
FieldTypeInfo() = default;
@@ -368,13 +317,6 @@ struct FunctionInfo : public SymbolInfo {
// with value 0 to be used as the default.
// (AS_public = 0, AS_protected = 1, AS_private = 2, AS_none = 3)
AccessSpecifier Access = AccessSpecifier::AS_public;
-
- // Full qualified name of this function, including namespaces and template
- // specializations.
- SmallString<16> FullName;
-
- // When present, this function is a template or specialization.
- llvm::Optional<TemplateInfo> Template;
};
// TODO: Expand to allow for documenting templating, inheritance access,
@@ -390,13 +332,6 @@ struct RecordInfo : public SymbolInfo {
// Type of this record (struct, class, union, interface).
TagTypeKind TagType = TagTypeKind::TTK_Struct;
- // Full qualified name of this record, including namespaces and template
- // specializations.
- SmallString<16> FullName;
-
- // When present, this record is a template or specialization.
- llvm::Optional<TemplateInfo> Template;
-
// Indicates if the record was declared using a typedef. Things like anonymous
// structs in a typedef:
// typedef struct { ... } foo_t;
@@ -498,7 +433,7 @@ struct Index : public Reference {
Index(StringRef Name, StringRef JumpToSection)
: Reference(SymbolID(), Name), JumpToSection(JumpToSection) {}
Index(SymbolID USR, StringRef Name, InfoType IT, StringRef Path)
- : Reference(USR, Name, IT, Name, Path) {}
+ : Reference(USR, Name, IT, Path) {}
// This is used to look for a USR in a vector of Indexes using std::find
bool operator==(const SymbolID &Other) const { return USR == Other; }
bool operator<(const Index &Other) const;
diff --git a/clang-tools-extra/clang-doc/Serialize.cpp b/clang-tools-extra/clang-doc/Serialize.cpp
index 50cda2cb6fd3c..66a938d488e1d 100644
--- a/clang-tools-extra/clang-doc/Serialize.cpp
+++ b/clang-tools-extra/clang-doc/Serialize.cpp
@@ -250,7 +250,7 @@ TypeInfo getTypeInfoForType(const QualType &T) {
IT = InfoType::IT_default;
}
return TypeInfo(Reference(getUSRForDecl(TD), TD->getNameAsString(), IT,
- T.getAsString(), getInfoRelativePath(TD)));
+ getInfoRelativePath(TD)));
}
static bool isPublic(const clang::AccessSpecifier AS,
@@ -281,12 +281,12 @@ static bool shouldSerializeInfo(bool PublicOnly, bool IsInAnonymousNamespace,
// See MakeAndInsertIntoParent().
static void InsertChild(ScopeChildren &Scope, const NamespaceInfo &Info) {
Scope.Namespaces.emplace_back(Info.USR, Info.Name, InfoType::IT_namespace,
- Info.Name, getInfoRelativePath(Info.Namespace));
+ getInfoRelativePath(Info.Namespace));
}
static void InsertChild(ScopeChildren &Scope, const RecordInfo &Info) {
Scope.Records.emplace_back(Info.USR, Info.Name, InfoType::IT_record,
- Info.Name, getInfoRelativePath(Info.Namespace));
+ getInfoRelativePath(Info.Namespace));
}
static void InsertChild(ScopeChildren &Scope, EnumInfo Info) {
@@ -405,7 +405,10 @@ static void parseParameters(FunctionInfo &I, const FunctionDecl *D) {
for (const ParmVarDecl *P : D->parameters()) {
FieldTypeInfo &FieldInfo = I.Params.emplace_back(
getTypeInfoForType(P->getOriginalType()), P->getNameAsString());
- FieldInfo.DefaultValue = getSourceCode(D, P->getDefaultArgRange());
+
+ if (const Expr *DefaultArg = P->getDefaultArg()) {
+ FieldInfo.DefaultValue = getSourceCode(D, DefaultArg->getSourceRange());
+ }
}
}
@@ -421,19 +424,18 @@ static void parseBases(RecordInfo &I, const CXXRecordDecl *D) {
if (const auto *Ty = B.getType()->getAs<TemplateSpecializationType>()) {
const TemplateDecl *D = Ty->getTemplateName().getAsTemplateDecl();
I.Parents.emplace_back(getUSRForDecl(D), B.getType().getAsString(),
- InfoType::IT_record, B.getType().getAsString());
+ InfoType::IT_record);
} else if (const RecordDecl *P = getRecordDeclForType(B.getType()))
I.Parents.emplace_back(getUSRForDecl(P), P->getNameAsString(),
- InfoType::IT_record, P->getQualifiedNameAsString(),
- getInfoRelativePath(P));
+ InfoType::IT_record, getInfoRelativePath(P));
else
I.Parents.emplace_back(SymbolID(), B.getType().getAsString());
}
for (const CXXBaseSpecifier &B : D->vbases()) {
if (const RecordDecl *P = getRecordDeclForType(B.getType()))
- I.VirtualParents.emplace_back(
- getUSRForDecl(P), P->getNameAsString(), InfoType::IT_record,
- P->getQualifiedNameAsString(), getInfoRelativePath(P));
+ I.VirtualParents.emplace_back(getUSRForDecl(P), P->getNameAsString(),
+ InfoType::IT_record,
+ getInfoRelativePath(P));
else
I.VirtualParents.emplace_back(SymbolID(), B.getType().getAsString());
}
@@ -453,19 +455,16 @@ populateParentNamespaces(llvm::SmallVector<Reference, 4> &Namespaces,
} else
Namespace = N->getNameAsString();
Namespaces.emplace_back(getUSRForDecl(N), Namespace,
- InfoType::IT_namespace,
- N->getQualifiedNameAsString());
+ InfoType::IT_namespace);
} else if (const auto *N = dyn_cast<RecordDecl>(DC))
Namespaces.emplace_back(getUSRForDecl(N), N->getNameAsString(),
- InfoType::IT_record,
- N->getQualifiedNameAsString());
+ InfoType::IT_record);
else if (const auto *N = dyn_cast<FunctionDecl>(DC))
Namespaces.emplace_back(getUSRForDecl(N), N->getNameAsString(),
- InfoType::IT_function,
- N->getQualifiedNameAsString());
+ InfoType::IT_function);
else if (const auto *N = dyn_cast<EnumDecl>(DC))
Namespaces.emplace_back(getUSRForDecl(N), N->getNameAsString(),
- InfoType::IT_enum, N->getQualifiedNameAsString());
+ InfoType::IT_enum);
} while ((DC = DC->getParent()));
// The global namespace should be added to the list of namespaces if the decl
// corresponds to a Record and if it doesn't have any namespace (because this
@@ -477,30 +476,6 @@ populateParentNamespaces(llvm::SmallVector<Reference, 4> &Namespaces,
InfoType::IT_namespace);
}
-void PopulateTemplateParameters(llvm::Optional<TemplateInfo> &TemplateInfo,
- const clang::Decl *D) {
- if (const TemplateParameterList *ParamList =
- D->getDescribedTemplateParams()) {
- if (!TemplateInfo) {
- TemplateInfo.emplace();
- }
- for (const NamedDecl *ND : *ParamList) {
- TemplateInfo->Params.emplace_back(
- getSourceCode(ND, ND->getSourceRange()));
- }
- }
-}
-
-TemplateParamInfo TemplateArgumentToInfo(const clang::Decl *D,
- const TemplateArgument &Arg) {
- // The TemplateArgument's pretty printing handles all the normal cases
- // well enough for our requirements.
- std::string Str;
- llvm::raw_string_ostream Stream(Str);
- Arg.print(PrintingPolicy(D->getLangOpts()), Stream, false);
- return TemplateParamInfo(Str);
-}
-
template <typename T>
static void populateInfo(Info &I, const T *D, const FullComment *C,
bool &IsInAnonymousNamespace) {
@@ -533,26 +508,6 @@ static void populateFunctionInfo(FunctionInfo &I, const FunctionDecl *D,
IsInAnonymousNamespace);
I.ReturnType = getTypeInfoForType(D->getReturnType());
parseParameters(I, D);
-
- PopulateTemplateParameters(I.Template, D);
-
- // Handle function template specializations.
- if (const FunctionTemplateSpecializationInfo *FTSI =
- D->getTemplateSpecializationInfo()) {
- if (!I.Template)
- I.Template.emplace();
- I.Template->Specialization.emplace();
- auto &Specialization = *I.Template->Specialization;
-
- Specialization.SpecializationOf = getUSRForDecl(FTSI->getTemplate());
-
- // Template parameters to the specialization.
- if (FTSI->TemplateArguments) {
- for (const TemplateArgument &Arg : FTSI->TemplateArguments->asArray()) {
- Specialization.Params.push_back(TemplateArgumentToInfo(D, Arg));
- }
- }
- }
}
static void populateMemberTypeInfo(MemberTypeInfo &I, const FieldDecl *D) {
@@ -672,46 +627,6 @@ emitInfo(const RecordDecl *D, const FullComment *FC, int LineNumber,
}
I->Path = getInfoRelativePath(I->Namespace);
- PopulateTemplateParameters(I->Template, D);
-
- // Full and partial specializations.
- if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
- if (!I->Template)
- I->Template.emplace();
- I->Template->Specialization.emplace();
- auto &Specialization = *I->Template->Specialization;
-
- // What this is a specialization of.
- auto SpecOf = CTSD->getSpecializedTemplateOrPartial();
- if (SpecOf.is<ClassTemplateDecl *>()) {
- Specialization.SpecializationOf =
- getUSRForDecl(SpecOf.get<ClassTemplateDecl *>());
- } else if (SpecOf.is<ClassTemplatePartialSpecializationDecl *>()) {
- Specialization.SpecializationOf =
- getUSRForDecl(SpecOf.get<ClassTemplatePartialSpecializationDecl *>());
- }
-
- // Parameters to the specilization. For partial specializations, get the
- // parameters "as written" from the ClassTemplatePartialSpecializationDecl
- // because the non-explicit template parameters will have generated internal
- // placeholder names rather than the names the user typed that match the
- // template parameters.
- if (const ClassTemplatePartialSpecializationDecl *CTPSD =
- dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
- if (const ASTTemplateArgumentListInfo *AsWritten =
- CTPSD->getTemplateArgsAsWritten()) {
- for (unsigned i = 0; i < AsWritten->getNumTemplateArgs(); i++) {
- Specialization.Params.emplace_back(
- getSourceCode(D, (*AsWritten)[i].getSourceRange()));
- }
- }
- } else {
- for (const TemplateArgument &Arg : CTSD->getTemplateArgs().asArray()) {
- Specialization.Params.push_back(TemplateArgumentToInfo(D, Arg));
- }
- }
- }
-
// Records are inserted into the parent by reference, so we need to return
// both the parent and the record itself.
auto Parent = MakeAndInsertIntoParent<const RecordInfo &>(*I);
@@ -754,8 +669,7 @@ emitInfo(const CXXMethodDecl *D, const FullComment *FC, int LineNumber,
SymbolID ParentUSR = getUSRForDecl(Parent);
Func.Parent =
- Reference{ParentUSR, Parent->getNameAsString(), InfoType::IT_record,
- Parent->getQualifiedNameAsString()};
+ Reference{ParentUSR, Parent->getNameAsString(), InfoType::IT_record};
Func.Access = D->getAccess();
// Info is wrapped in its parent scope so is returned in the second position.
@@ -817,10 +731,8 @@ emitInfo(const EnumDecl *D, const FullComment *FC, int LineNumber,
return {};
Enum.Scoped = D->isScoped();
- if (D->isFixed()) {
- auto Name = D->getIntegerType().getAsString();
- Enum.BaseType = TypeInfo(Name, Name);
- }
+ if (D->isFixed())
+ Enum.BaseType = TypeInfo(D->getIntegerType().getAsString());
parseEnumerators(Enum, D);
// Info is wrapped in its parent scope so is returned in the second position.
diff --git a/clang-tools-extra/clang-doc/YAMLGenerator.cpp b/clang-tools-extra/clang-doc/YAMLGenerator.cpp
index 047a9a1e99eb2..0e662c0d9006c 100644
--- a/clang-tools-extra/clang-doc/YAMLGenerator.cpp
+++ b/clang-tools-extra/clang-doc/YAMLGenerator.cpp
@@ -9,7 +9,6 @@
//===----------------------------------------------------------------------===//
#include "Generators.h"
-#include "Representation.h"
#include "llvm/Support/YAMLTraits.h"
#include "llvm/Support/raw_ostream.h"
#include <optional>
@@ -25,7 +24,6 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(CommentInfo)
LLVM_YAML_IS_SEQUENCE_VECTOR(FunctionInfo)
LLVM_YAML_IS_SEQUENCE_VECTOR(EnumInfo)
LLVM_YAML_IS_SEQUENCE_VECTOR(EnumValueInfo)
-LLVM_YAML_IS_SEQUENCE_VECTOR(TemplateParamInfo)
LLVM_YAML_IS_SEQUENCE_VECTOR(TypedefInfo)
LLVM_YAML_IS_SEQUENCE_VECTOR(BaseRecordInfo)
LLVM_YAML_IS_SEQUENCE_VECTOR(std::unique_ptr<CommentInfo>)
@@ -145,7 +143,6 @@ static void RecordInfoMapping(IO &IO, RecordInfo &I) {
IO.mapOptional("ChildFunctions", I.Children.Functions);
IO.mapOptional("ChildEnums", I.Children.Enums);
IO.mapOptional("ChildTypedefs", I.Children.Typedefs);
- IO.mapOptional("Template", I.Template);
}
static void CommentInfoMapping(IO &IO, CommentInfo &I) {
@@ -178,7 +175,6 @@ template <> struct MappingTraits<Reference> {
static void mapping(IO &IO, Reference &Ref) {
IO.mapOptional("Type", Ref.RefType, InfoType::IT_default);
IO.mapOptional("Name", Ref.Name, SmallString<16>());
- IO.mapOptional("QualName", Ref.QualName, SmallString<16>());
IO.mapOptional("USR", Ref.USR, SymbolID());
IO.mapOptional("Path", Ref.Path, SmallString<128>());
}
@@ -272,28 +268,6 @@ template <> struct MappingTraits<FunctionInfo> {
// the AS that shouldn't be part of the output. Even though AS_public is the
// default in the struct, it should be displayed in the YAML output.
IO.mapOptional("Access", I.Access, clang::AccessSpecifier::AS_none);
- IO.mapOptional("Template", I.Template);
- }
-};
-
-template <> struct MappingTraits<TemplateParamInfo> {
- static void mapping(IO &IO, TemplateParamInfo &I) {
- IO.mapOptional("Contents", I.Contents);
- }
-};
-
-template <> struct MappingTraits<TemplateSpecializationInfo> {
- static void mapping(IO &IO, TemplateSpecializationInfo &I) {
- IO.mapOptional("SpecializationOf", I.SpecializationOf);
- IO.mapOptional("Params", I.Params);
- }
-};
-
-template <> struct MappingTraits<TemplateInfo> {
- static void mapping(IO &IO, TemplateInfo &I) {
- IO.mapOptional("Params", I.Params);
- IO.mapOptional("Specialization", I.Specialization,
- Optional<TemplateSpecializationInfo>());
}
};
diff --git a/clang-tools-extra/test/clang-doc/single-file-public.cpp b/clang-tools-extra/test/clang-doc/single-file-public.cpp
index 82e81749a1c52..91c3146bfef62 100644
--- a/clang-tools-extra/test/clang-doc/single-file-public.cpp
+++ b/clang-tools-extra/test/clang-doc/single-file-public.cpp
@@ -28,9 +28,8 @@ void Record::function_public() {}
// CHECK-NEXT: Namespace:
// CHECK-NEXT: - Type: Namespace
// CHECK-NEXT: Name: 'GlobalNamespace'
-// CHECK-NEXT: QualName: 'GlobalNamespace'
// CHECK-NEXT: DefLocation:
-// CHECK-NEXT: LineNumber: 12
+// CHECK-NEXT: LineNumber: [[@LINE-20]]
// CHECK-NEXT: Filename: '{{.*}}'
// CHECK-NEXT: TagType: Class
// CHECK-NEXT: ChildFunctions:
@@ -39,26 +38,22 @@ void Record::function_public() {}
// CHECK-NEXT: Namespace:
// CHECK-NEXT: - Type: Record
// CHECK-NEXT: Name: 'Record'
-// CHECK-NEXT: QualName: 'Record'
// CHECK-NEXT: USR: '{{([0-9A-F]{40})}}'
// CHECK-NEXT: - Type: Namespace
// CHECK-NEXT: Name: 'GlobalNamespace'
-// CHECK-NEXT: QualName: 'GlobalNamespace'
// CHECK-NEXT: DefLocation:
-// CHECK-NEXT: LineNumber: 22
+// CHECK-NEXT: LineNumber: [[@LINE-23]]
// CHECK-NEXT: Filename: '{{.*}}'
// CHECK-NEXT: Location:
-// CHECK-NEXT: - LineNumber: 17
+// CHECK-NEXT: - LineNumber: [[@LINE-31]]
// CHECK-NEXT: Filename: '{{.*}}'
// CHECK-NEXT: IsMethod: true
// CHECK-NEXT: Parent:
// CHECK-NEXT: Type: Record
// CHECK-NEXT: Name: 'Record'
-// CHECK-NEXT: QualName: 'Record'
// CHECK-NEXT: USR: '{{([0-9A-F]{40})}}'
// CHECK-NEXT: ReturnType:
// CHECK-NEXT: Type:
// CHECK-NEXT: Name: 'void'
-// CHECK-NEXT: QualName: 'void'
// CHECK-NEXT: Access: Public
// CHECK-NEXT: ...
diff --git a/clang-tools-extra/test/clang-doc/single-file.cpp b/clang-tools-extra/test/clang-doc/single-file.cpp
index 211afb3b45e52..3703f5d2209f4 100644
--- a/clang-tools-extra/test/clang-doc/single-file.cpp
+++ b/clang-tools-extra/test/clang-doc/single-file.cpp
@@ -11,23 +11,21 @@ void function(int x);
void function(int x) {}
// CHECK: ---
-// CHECK-NEXT: USR: '{{([0-9A-F]{40})}}'
+// CHECK-NEXT: USR: '{{[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]}}'
// CHECK-NEXT: ChildFunctions:
-// CHECK-NEXT: - USR: '{{([0-9A-F]{40})}}'
+// CHECK-NEXT: - USR: '{{[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]}}'
// CHECK-NEXT: Name: 'function'
// CHECK-NEXT: DefLocation:
-// CHECK-NEXT: LineNumber: 11
+// CHECK-NEXT: LineNumber: [[@LINE-8]]
// CHECK-NEXT: Filename: '{{.*}}
// CHECK-NEXT: Location:
-// CHECK-NEXT: - LineNumber: 9
+// CHECK-NEXT: - LineNumber: [[@LINE-13]]
// CHECK-NEXT: Filename: '{{.*}}'
// CHECK-NEXT: Params:
// CHECK-NEXT: - Type:
// CHECK-NEXT: Name: 'int'
-// CHECK-NEXT: QualName: 'int'
// CHECK-NEXT: Name: 'x'
// CHECK-NEXT: ReturnType:
// CHECK-NEXT: Type:
// CHECK-NEXT: Name: 'void'
-// CHECK-NEXT: QualName: 'void'
// CHECK-NEXT:...
diff --git a/clang-tools-extra/test/clang-doc/templates.cpp b/clang-tools-extra/test/clang-doc/templates.cpp
deleted file mode 100644
index eb7f4599629f4..0000000000000
--- a/clang-tools-extra/test/clang-doc/templates.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-// RUN: rm -rf %t
-// RUN: mkdir %t
-// RUN: echo "" > %t/compile_flags.txt
-// RUN: cp "%s" "%t/test.cpp"
-// RUN: clang-doc --doxygen --executor=standalone -p %t %t/test.cpp -output=%t/docs
-// RUN: cat %t/docs/index.yaml | FileCheck %s --check-prefix=CHECK
-// RUN: rm -rf %t
-
-template<typename T, int U = 1>
-void function<bool, 0>(T x) {}
-
-template<>
-void function<bool, 0>(bool x) {}
-
-template<class... T>
-void ParamPackFunction(T... args);
-
-// CHECK: ---
-// CHECK-NEXT: USR: '{{([0-9A-F]{40})}}'
-// CHECK-NEXT: ChildFunctions:
-// CHECK-NEXT: - USR: '{{([0-9A-F]{40})}}'
-// CHECK-NEXT: Name: 'function'
-// CHECK-NEXT: DefLocation:
-// CHECK-NEXT: LineNumber: 10
-// CHECK-NEXT: Filename: '{{.*}}'
-// CHECK-NEXT: Params:
-// CHECK-NEXT: - Type:
-// CHECK-NEXT: Name: 'T'
-// CHECK-NEXT: QualName: 'T'
-// CHECK-NEXT: Name: 'x'
-// CHECK-NEXT: ReturnType:
-// CHECK-NEXT: Type:
-// CHECK-NEXT: Name: 'void'
-// CHECK-NEXT: QualName: 'void'
-// CHECK-NEXT: Template:
-// CHECK-NEXT: Params:
-// CHECK-NEXT: - Contents: 'typename T'
-// CHECK-NEXT: - Contents: 'int U = 1'
-// CHECK-NEXT: - USR: '{{([0-9A-F]{40})}}'
-// CHECK-NEXT: Name: 'function'
-// CHECK-NEXT: DefLocation:
-// CHECK-NEXT: LineNumber: 12
-// CHECK-NEXT: Filename: '{{.*}}'
-// CHECK-NEXT: Params:
-// CHECK-NEXT: - Type:
-// CHECK-NEXT: Name: '_Bool'
-// CHECK-NEXT: QualName: '_Bool'
-// CHECK-NEXT: Name: 'x'
-// CHECK-NEXT: ReturnType:
-// CHECK-NEXT: Type:
-// CHECK-NEXT: Name: 'void'
-// CHECK-NEXT: QualName: 'void'
-// CHECK-NEXT: Template:
-// CHECK-NEXT: Specialization:
-// CHECK-NEXT: SpecializationOf: '{{([0-9A-F]{40})}}'
-// CHECK-NEXT: Params:
-// CHECK-NEXT: - Contents: 'bool'
-// CHECK-NEXT: - Contents: '0'
-// CHECK-NEXT: - USR: '{{([0-9A-F]{40})}}'
-// CHECK-NEXT: Name: 'ParamPackFunction'
-// CHECK-NEXT: Location:
-// CHECK-NEXT: - LineNumber: 16
-// CHECK-NEXT: Filename: '{{.*}}'
-// CHECK-NEXT: Params:
-// CHECK-NEXT: - Type:
-// CHECK-NEXT: Name: 'T...'
-// CHECK-NEXT: QualName: 'T...'
-// CHECK-NEXT: Name: 'args'
-// CHECK-NEXT: ReturnType:
-// CHECK-NEXT: Type:
-// CHECK-NEXT: Name: 'void'
-// CHECK-NEXT: QualName: 'void'
-// CHECK-NEXT: Template:
-// CHECK-NEXT: Params:
-// CHECK-NEXT: - Contents: 'class... T'
-// CHECK-NEXT: ...
diff --git a/clang-tools-extra/unittests/clang-doc/HTMLGeneratorTest.cpp b/clang-tools-extra/unittests/clang-doc/HTMLGeneratorTest.cpp
index 5141259161653..d91225352c85b 100644
--- a/clang-tools-extra/unittests/clang-doc/HTMLGeneratorTest.cpp
+++ b/clang-tools-extra/unittests/clang-doc/HTMLGeneratorTest.cpp
@@ -44,10 +44,9 @@ TEST(HTMLGeneratorTest, emitNamespaceHTML) {
I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);
I.Children.Namespaces.emplace_back(EmptySID, "ChildNamespace",
- InfoType::IT_namespace,
- "Namespace::ChildNamespace", "Namespace");
+ InfoType::IT_namespace, "Namespace");
I.Children.Records.emplace_back(EmptySID, "ChildStruct", InfoType::IT_record,
- "Namespace::ChildStruct", "Namespace");
+ "Namespace");
I.Children.Functions.emplace_back();
I.Children.Functions.back().Access = AccessSpecifier::AS_none;
I.Children.Functions.back().Name = "OneFunction";
@@ -153,13 +152,14 @@ TEST(HTMLGeneratorTest, emitRecordHTML) {
SmallString<16> PathTo;
llvm::sys::path::native("path/to", PathTo);
- I.Members.emplace_back(TypeInfo("int"), "X", AccessSpecifier::AS_private);
+ I.Members.emplace_back(TypeInfo("int", "X/Y"), "X",
+ AccessSpecifier::AS_private);
I.TagType = TagTypeKind::TTK_Class;
- I.Parents.emplace_back(EmptySID, "F", InfoType::IT_record, "F", PathTo);
+ I.Parents.emplace_back(EmptySID, "F", InfoType::IT_record, PathTo);
I.VirtualParents.emplace_back(EmptySID, "G", InfoType::IT_record);
I.Children.Records.emplace_back(EmptySID, "ChildStruct", InfoType::IT_record,
- "X::Y::Z::r::ChildStruct", "X/Y/Z/r");
+ "X/Y/Z/r");
I.Children.Functions.emplace_back();
I.Children.Functions.back().Name = "OneFunction";
I.Children.Enums.emplace_back();
@@ -195,7 +195,11 @@ TEST(HTMLGeneratorTest, emitRecordHTML) {
</p>
<h2 id="Members">Members</h2>
<ul>
- <li>private int X</li>
+ <li>
+ private
+ <a href="../../../X/Y/int.html">int</a>
+ X
+ </li>
</ul>
<h2 id="Records">Records</h2>
<ul>
@@ -273,8 +277,8 @@ TEST(HTMLGeneratorTest, emitFunctionHTML) {
SmallString<16> PathTo;
llvm::sys::path::native("path/to", PathTo);
- I.ReturnType = TypeInfo(
- Reference(EmptySID, "float", InfoType::IT_default, "float", PathTo));
+ I.ReturnType =
+ TypeInfo(Reference(EmptySID, "float", InfoType::IT_default, PathTo));
I.Params.emplace_back(TypeInfo("int", PathTo), "P");
I.IsMethod = true;
I.Parent = Reference(EmptySID, "Parent", InfoType::IT_record);
diff --git a/clang-tools-extra/unittests/clang-doc/SerializeTest.cpp b/clang-tools-extra/unittests/clang-doc/SerializeTest.cpp
index ca370de5a516e..05b62451adbc5 100644
--- a/clang-tools-extra/unittests/clang-doc/SerializeTest.cpp
+++ b/clang-tools-extra/unittests/clang-doc/SerializeTest.cpp
@@ -390,7 +390,7 @@ class J : public I<int> {} ;)raw",
RecordInfo *F = InfoAsRecord(Infos[0].get());
RecordInfo ExpectedF(EmptySID, /*Name=*/"F", /*Path=*/"GlobalNamespace");
ExpectedF.Namespace.emplace_back(EmptySID, "GlobalNamespace",
- InfoType::IT_namespace, "");
+ InfoType::IT_namespace);
ExpectedF.TagType = TagTypeKind::TTK_Class;
ExpectedF.DefLoc = Location(0, llvm::SmallString<16>{"test.cpp"});
CheckRecordInfo(&ExpectedF, F);
@@ -410,10 +410,9 @@ class J : public I<int> {} ;)raw",
ExpectedE.Namespace.emplace_back(EmptySID, "GlobalNamespace",
InfoType::IT_namespace);
ExpectedE.Parents.emplace_back(EmptySID, /*Name=*/"F", InfoType::IT_record,
- /*QualName=*/"", /*Path*=*/"GlobalNamespace");
- ExpectedE.VirtualParents.emplace_back(EmptySID, /*Name=*/"G",
- InfoType::IT_record, /*QualName=*/"G",
- /*Path*=*/"GlobalNamespace");
+ /*Path*=*/"GlobalNamespace");
+ ExpectedE.VirtualParents.emplace_back(
+ EmptySID, /*Name=*/"G", InfoType::IT_record, /*Path*=*/"GlobalNamespace");
ExpectedE.Bases.emplace_back(EmptySID, /*Name=*/"F",
/*Path=*/"GlobalNamespace", false,
AccessSpecifier::AS_public, true);
@@ -456,10 +455,9 @@ class J : public I<int> {} ;)raw",
ExpectedH.TagType = TagTypeKind::TTK_Class;
ExpectedH.DefLoc = Location(0, llvm::SmallString<16>{"test.cpp"});
ExpectedH.Parents.emplace_back(EmptySID, /*Name=*/"E", InfoType::IT_record,
- /*QualName=*/"E", /*Path=*/"GlobalNamespace");
- ExpectedH.VirtualParents.emplace_back(EmptySID, /*Name=*/"G",
- InfoType::IT_record, /*QualName=*/"G",
- /*Path=*/"GlobalNamespace");
+ /*Path=*/"GlobalNamespace");
+ ExpectedH.VirtualParents.emplace_back(
+ EmptySID, /*Name=*/"G", InfoType::IT_record, /*Path=*/"GlobalNamespace");
ExpectedH.Bases.emplace_back(EmptySID, /*Name=*/"E",
/*Path=*/"GlobalNamespace", false,
AccessSpecifier::AS_private, true);
@@ -564,7 +562,7 @@ TEST(SerializeTest, emitChildRecords) {
NamespaceInfo *ParentA = InfoAsNamespace(Infos[1].get());
NamespaceInfo ExpectedParentA(EmptySID);
ExpectedParentA.Children.Records.emplace_back(
- EmptySID, "A", InfoType::IT_record, "A", "GlobalNamespace");
+ EmptySID, "A", InfoType::IT_record, "GlobalNamespace");
CheckNamespaceInfo(&ExpectedParentA, ParentA);
RecordInfo *ParentB = InfoAsRecord(Infos[3].get());
@@ -572,13 +570,13 @@ TEST(SerializeTest, emitChildRecords) {
llvm::SmallString<128> ExpectedParentBPath("GlobalNamespace/A");
llvm::sys::path::native(ExpectedParentBPath);
ExpectedParentB.Children.Records.emplace_back(
- EmptySID, "B", InfoType::IT_record, "A::B", ExpectedParentBPath);
+ EmptySID, "B", InfoType::IT_record, ExpectedParentBPath);
CheckRecordInfo(&ExpectedParentB, ParentB);
NamespaceInfo *ParentC = InfoAsNamespace(Infos[7].get());
NamespaceInfo ExpectedParentC(EmptySID);
ExpectedParentC.Children.Records.emplace_back(
- EmptySID, "C", InfoType::IT_record, "C", "@nonymous_namespace");
+ EmptySID, "C", InfoType::IT_record, "@nonymous_namespace");
CheckNamespaceInfo(&ExpectedParentC, ParentC);
}
@@ -596,8 +594,8 @@ TEST(SerializeTest, emitChildNamespaces) {
NamespaceInfo *ParentB = InfoAsNamespace(Infos[3].get());
NamespaceInfo ExpectedParentB(EmptySID);
- ExpectedParentB.Children.Namespaces.emplace_back(
- EmptySID, "B", InfoType::IT_namespace, "A::B", "A");
+ ExpectedParentB.Children.Namespaces.emplace_back(EmptySID, "B",
+ InfoType::IT_namespace, "A");
CheckNamespaceInfo(&ExpectedParentB, ParentB);
}
@@ -628,105 +626,5 @@ TEST(SerializeTests, emitTypedefs) {
EXPECT_EQ("double", SecondTD.Underlying.Type.Name);
}
-TEST(SerializeTests, emitFunctionTemplate) {
- EmittedInfoList Infos;
- // A template and a specialization.
- ExtractInfosFromCode("template<typename T = int> void GetFoo(T);\n"
- "template<> void GetFoo<bool>(bool);",
- 2,
- /*Public=*/false, Infos);
-
- // First info will be the global namespace.
- NamespaceInfo *GlobalNS1 = InfoAsNamespace(Infos[0].get());
- ASSERT_EQ(1u, GlobalNS1->Children.Functions.size());
-
- const FunctionInfo &Func1 = GlobalNS1->Children.Functions[0];
- EXPECT_EQ("GetFoo", Func1.Name);
- ASSERT_TRUE(Func1.Template);
- EXPECT_FALSE(Func1.Template->Specialization); // Not a specialization.
-
- // Template parameter.
- ASSERT_EQ(1u, Func1.Template->Params.size());
- EXPECT_EQ("typename T = int", Func1.Template->Params[0].Contents);
-
- // The second will be another global namespace with the function in it (the
- // global namespace is duplicated because the items haven't been merged at the
- // serialization phase of processing).
- NamespaceInfo *GlobalNS2 = InfoAsNamespace(Infos[1].get());
- ASSERT_EQ(1u, GlobalNS2->Children.Functions.size());
-
- // This one is a template specialization.
- const FunctionInfo &Func2 = GlobalNS2->Children.Functions[0];
- EXPECT_EQ("GetFoo", Func2.Name);
- ASSERT_TRUE(Func2.Template);
- EXPECT_TRUE(Func2.Template->Params.empty()); // No template params.
- ASSERT_TRUE(Func2.Template->Specialization);
-
- // Specialization values.
- ASSERT_EQ(1u, Func2.Template->Specialization->Params.size());
- EXPECT_EQ("bool", Func2.Template->Specialization->Params[0].Contents);
- EXPECT_EQ(Func1.USR, Func2.Template->Specialization->SpecializationOf);
-}
-
-TEST(SerializeTests, emitClassTemplate) {
- EmittedInfoList Infos;
- // This will generate 2x the number of infos: each Record will be followed by
- // a copy of the global namespace containing it (this test checks the data
- // pre-merge).
- ExtractInfosFromCode(
- "template<int I> class MyTemplate { int i[I]; };\n"
- "template<> class MyTemplate<0> {};\n"
- "template<typename T, int U = 1> class OtherTemplate {};\n"
- "template<int U> class OtherTemplate<MyTemplate<0>, U> {};",
- 8,
- /*Public=*/false, Infos);
-
- // First record.
- const RecordInfo *Rec1 = InfoAsRecord(Infos[0].get());
- EXPECT_EQ("MyTemplate", Rec1->Name);
- ASSERT_TRUE(Rec1->Template);
- EXPECT_FALSE(Rec1->Template->Specialization); // Not a specialization.
-
- // First record template parameter.
- ASSERT_EQ(1u, Rec1->Template->Params.size());
- EXPECT_EQ("int I", Rec1->Template->Params[0].Contents);
-
- // Second record.
- const RecordInfo *Rec2 = InfoAsRecord(Infos[2].get());
- EXPECT_EQ("MyTemplate", Rec2->Name);
- ASSERT_TRUE(Rec2->Template);
- EXPECT_TRUE(Rec2->Template->Params.empty()); // No template params.
- ASSERT_TRUE(Rec2->Template->Specialization);
-
- // Second record specialization values.
- ASSERT_EQ(1u, Rec2->Template->Specialization->Params.size());
- EXPECT_EQ("0", Rec2->Template->Specialization->Params[0].Contents);
- EXPECT_EQ(Rec1->USR, Rec2->Template->Specialization->SpecializationOf);
-
- // Third record.
- const RecordInfo *Rec3 = InfoAsRecord(Infos[4].get());
- EXPECT_EQ("OtherTemplate", Rec3->Name);
- ASSERT_TRUE(Rec3->Template);
-
- // Third record template parameters.
- ASSERT_EQ(2u, Rec3->Template->Params.size());
- EXPECT_EQ("typename T", Rec3->Template->Params[0].Contents);
- EXPECT_EQ("int U = 1", Rec3->Template->Params[1].Contents);
-
- // Fourth record.
- const RecordInfo *Rec4 = InfoAsRecord(Infos[6].get());
- EXPECT_EQ("OtherTemplate", Rec3->Name);
- ASSERT_TRUE(Rec4->Template);
- ASSERT_TRUE(Rec4->Template->Specialization);
-
- // Fourth record template + specialization parameters.
- ASSERT_EQ(1u, Rec4->Template->Params.size());
- EXPECT_EQ("int U", Rec4->Template->Params[0].Contents);
- ASSERT_EQ(2u, Rec4->Template->Specialization->Params.size());
- EXPECT_EQ("MyTemplate<0>",
- Rec4->Template->Specialization->Params[0].Contents);
- EXPECT_EQ("U", Rec4->Template->Specialization->Params[1].Contents);
-}
-
} // namespace doc
} // end namespace clang
diff --git a/clang-tools-extra/unittests/clang-doc/YAMLGeneratorTest.cpp b/clang-tools-extra/unittests/clang-doc/YAMLGeneratorTest.cpp
index 535d49169b5df..d6410f28282e4 100644
--- a/clang-tools-extra/unittests/clang-doc/YAMLGeneratorTest.cpp
+++ b/clang-tools-extra/unittests/clang-doc/YAMLGeneratorTest.cpp
@@ -28,11 +28,10 @@ TEST(YAMLGeneratorTest, emitNamespaceYAML) {
I.Path = "path/to/A";
I.Namespace.emplace_back(EmptySID, "A", InfoType::IT_namespace);
- I.Children.Namespaces.emplace_back(
- EmptySID, "ChildNamespace", InfoType::IT_namespace,
- "path::to::A::Namespace::ChildNamespace", "path/to/A/Namespace");
+ I.Children.Namespaces.emplace_back(EmptySID, "ChildNamespace",
+ InfoType::IT_namespace,
+ "path/to/A/Namespace");
I.Children.Records.emplace_back(EmptySID, "ChildStruct", InfoType::IT_record,
- "path::to::A::Namespace::ChildStruct",
"path/to/A/Namespace");
I.Children.Functions.emplace_back();
I.Children.Functions.back().Name = "OneFunction";
@@ -54,16 +53,13 @@ Path: 'path/to/A'
Namespace:
- Type: Namespace
Name: 'A'
- QualName: 'A'
ChildNamespaces:
- Type: Namespace
Name: 'ChildNamespace'
- QualName: 'path::to::A::Namespace::ChildNamespace'
Path: 'path/to/A/Namespace'
ChildRecords:
- Type: Record
Name: 'ChildStruct'
- QualName: 'path::to::A::Namespace::ChildStruct'
Path: 'path/to/A/Namespace'
ChildFunctions:
- USR: '0000000000000000000000000000000000000000'
@@ -87,7 +83,8 @@ TEST(YAMLGeneratorTest, emitRecordYAML) {
I.DefLoc = Location(10, llvm::SmallString<16>{"test.cpp"});
I.Loc.emplace_back(12, llvm::SmallString<16>{"test.cpp"});
- I.Members.emplace_back(TypeInfo("int"), "X", AccessSpecifier::AS_private);
+ I.Members.emplace_back(TypeInfo("int", "path/to/int"), "X",
+ AccessSpecifier::AS_private);
// Member documentation.
CommentInfo TopComment;
@@ -106,15 +103,15 @@ TEST(YAMLGeneratorTest, emitRecordYAML) {
AccessSpecifier::AS_public, true);
I.Bases.back().Children.Functions.emplace_back();
I.Bases.back().Children.Functions.back().Name = "InheritedFunctionOne";
- I.Bases.back().Members.emplace_back(TypeInfo("int"), "N",
+ I.Bases.back().Members.emplace_back(TypeInfo("int", "path/to/int"), "N",
AccessSpecifier::AS_private);
// F is in the global namespace
I.Parents.emplace_back(EmptySID, "F", InfoType::IT_record, "");
I.VirtualParents.emplace_back(EmptySID, "G", InfoType::IT_record,
- "path::to::G::G", "path/to/G");
+ "path/to/G");
I.Children.Records.emplace_back(EmptySID, "ChildStruct", InfoType::IT_record,
- "path::to::A::r::ChildStruct", "path/to/A/r");
+ "path/to/A/r");
I.Children.Functions.emplace_back();
I.Children.Functions.back().Name = "OneFunction";
I.Children.Enums.emplace_back();
@@ -134,7 +131,6 @@ Path: 'path/to/A'
Namespace:
- Type: Namespace
Name: 'A'
- QualName: 'A'
DefLocation:
LineNumber: 10
Filename: 'test.cpp'
@@ -146,7 +142,7 @@ IsTypeDef: true
Members:
- Type:
Name: 'int'
- QualName: 'int'
+ Path: 'path/to/int'
Name: 'X'
Access: Private
Description:
@@ -165,7 +161,7 @@ IsTypeDef: true
Members:
- Type:
Name: 'int'
- QualName: 'int'
+ Path: 'path/to/int'
Name: 'N'
Access: Private
ChildFunctions:
@@ -182,12 +178,10 @@ IsTypeDef: true
VirtualParents:
- Type: Record
Name: 'G'
- QualName: 'path::to::G::G'
Path: 'path/to/G'
ChildRecords:
- Type: Record
Name: 'ChildStruct'
- QualName: 'path::to::A::r::ChildStruct'
Path: 'path/to/A/r'
ChildFunctions:
- USR: '0000000000000000000000000000000000000000'
@@ -212,9 +206,10 @@ TEST(YAMLGeneratorTest, emitFunctionYAML) {
I.Access = AccessSpecifier::AS_none;
- I.ReturnType = TypeInfo(Reference(EmptySID, "void", InfoType::IT_default));
- I.Params.emplace_back(TypeInfo("int"), "P");
- I.Params.emplace_back(TypeInfo("double"), "D");
+ I.ReturnType = TypeInfo(
+ Reference(EmptySID, "void", InfoType::IT_default, "path/to/void"));
+ I.Params.emplace_back(TypeInfo("int", "path/to/int"), "P");
+ I.Params.emplace_back(TypeInfo("double", "path/to/double"), "D");
I.Params.back().DefaultValue = "2.0 * M_PI";
I.IsMethod = true;
I.Parent = Reference(EmptySID, "Parent", InfoType::IT_record);
@@ -232,7 +227,6 @@ Name: 'f'
Namespace:
- Type: Namespace
Name: 'A'
- QualName: 'A'
DefLocation:
LineNumber: 10
Filename: 'test.cpp'
@@ -243,21 +237,20 @@ IsMethod: true
Parent:
Type: Record
Name: 'Parent'
- QualName: 'Parent'
Params:
- Type:
Name: 'int'
- QualName: 'int'
+ Path: 'path/to/int'
Name: 'P'
- Type:
Name: 'double'
- QualName: 'double'
+ Path: 'path/to/double'
Name: 'D'
DefaultValue: '2.0 * M_PI'
ReturnType:
Type:
Name: 'void'
- QualName: 'void'
+ Path: 'path/to/void'
...
)raw";
EXPECT_EQ(Expected, Actual.str());
@@ -291,7 +284,6 @@ Name: 'e'
Namespace:
- Type: Namespace
Name: 'A'
- QualName: 'A'
DefLocation:
LineNumber: 10
Filename: 'test.cpp'
@@ -330,7 +322,6 @@ Scoped: true
BaseType:
Type:
Name: 'short'
- QualName: 'short'
Members:
- Name: 'X'
Value: '-9876'
@@ -358,7 +349,6 @@ USR: '0000000000000000000000000000000000000000'
Name: 'MyUsing'
Underlying:
Name: 'int'
- QualName: 'int'
IsUsing: true
...
)raw";
@@ -558,16 +548,13 @@ Name: 'f'
Params:
- Type:
Name: 'int'
- QualName: 'int'
Name: 'I'
- Type:
Name: 'int'
- QualName: 'int'
Name: 'J'
ReturnType:
Type:
Name: 'void'
- QualName: 'void'
...
)raw";
More information about the cfe-commits
mailing list