/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\ |* *| |* Helper classes for BasicWriters *| |* *| |* Automatically generated file, do not edit! *| |* *| \*===----------------------------------------------------------------------===*/ template struct WriteDispatcher; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeAPInt(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeAPSInt(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeArraySizeModifier(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeAttrKind(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeAutoTypeKeyword(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeBool(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeBuiltinTypeKind(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeCXXRecordDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeCXXRecordDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeCallingConv(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeConceptDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeConceptDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeDeclarationName(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeDeclarationNameKind(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeElaboratedTypeKeyword(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeExceptionSpecInfo(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeExprRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeExprRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeExtParameterInfo(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeFunctionDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeFunctionDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeIdentifier(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeIdentifier(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeNamedDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeNamedDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeNamespaceAliasDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeNamespaceAliasDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeNamespaceDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeNamespaceDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeNestedNameSpecifier(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeNestedNameSpecifierKind(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeObjCProtocolDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeObjCProtocolDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeObjCTypeParamDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeObjCTypeParamDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeOverloadedOperatorKind(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeQualType(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeQualifiers(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeRefQualifierKind(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeSelector(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeSourceLocation(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeStmtRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeStmtRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeTagDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeTagDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeTemplateArgument(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeTemplateArgumentKind(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeTemplateDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeTemplateDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeTemplateName(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeTemplateNameKind(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeTemplateTemplateParmDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeTemplateTemplateParmDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeTemplateTypeParmDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeTemplateTypeParmDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeUInt32(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeUInt64(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeUnaryTypeTransformKind(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeValueDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeValueDeclRef(std::forward(args)...); } }; template <> struct WriteDispatcher { template static void write(BasicWriter &W, Args &&... args) { return W.writeVectorKind(std::forward(args)...); } }; template struct WriteDispatcher> { template static void write(BasicWriter &W, Args &&... args) { return W.writeArray(std::forward(args)...); } }; template struct WriteDispatcher> { template static void write(BasicWriter &W, Args &&... args) { return W.writeOptional(std::forward(args)...); } }; template struct PackOptionalValue; template <> struct PackOptionalValue { static CXXRecordDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static const CXXRecordDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static ConceptDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static const ConceptDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static Decl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static const Decl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static Expr* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static const Expr* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static FunctionDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static const FunctionDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static IdentifierInfo* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static const IdentifierInfo* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static NamedDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static const NamedDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static NamespaceAliasDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static const NamespaceAliasDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static NamespaceDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static const NamespaceDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static ObjCProtocolDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static const ObjCProtocolDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static ObjCTypeParamDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static const ObjCTypeParamDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static QualType pack(Optional value) { return value ? *value : QualType(); } }; template <> struct PackOptionalValue { static Stmt* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static const Stmt* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static TagDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static const TagDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static TemplateDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static const TemplateDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static TemplateName pack(Optional value) { return value ? *value : TemplateName(); } }; template <> struct PackOptionalValue { static TemplateTemplateParmDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static const TemplateTemplateParmDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static TemplateTypeParmDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static const TemplateTypeParmDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static uint32_t pack(Optional value) { return value ? *value + 1 : 0; } }; template <> struct PackOptionalValue { static uint64_t pack(Optional value) { return value ? *value + 1 : 0; } }; template <> struct PackOptionalValue { static ValueDecl* pack(Optional value) { return value ? *value : nullptr; } }; template <> struct PackOptionalValue { static const ValueDecl* pack(Optional value) { return value ? *value : nullptr; } }; template class BasicWriterBase { protected: BasicWriterBase() {} public: Impl &asImpl() { return static_cast(*this); } void writeArraySizeModifier(ArrayType::ArraySizeModifier value) { asImpl().writeEnum(value); } void writeAttrKind(attr::Kind value) { asImpl().writeEnum(value); } void writeAutoTypeKeyword(AutoTypeKeyword value) { asImpl().writeEnum(value); } void writeBuiltinTypeKind(BuiltinType::Kind value) { asImpl().writeEnum(value); } void writeCXXRecordDeclRef(const CXXRecordDecl* value) { asImpl().writeDeclRef(value); } void writeCallingConv(CallingConv value) { asImpl().writeEnum(value); } void writeConceptDeclRef(const ConceptDecl* value) { asImpl().writeDeclRef(value); } void writeDeclarationName(DeclarationName node) { auto &&subW = asImpl().writeObject(); DeclarationName::NameKind kind = (node.getNameKind()); subW.find("kind").writeDeclarationNameKind(kind); switch (kind) { case DeclarationName::Identifier: { const IdentifierInfo* identifier = ( node.getAsIdentifierInfo() ); subW.find("identifier").writeIdentifier(identifier); return; } case DeclarationName::ObjCMultiArgSelector: { Selector selector = ( node.getObjCSelector() ); subW.find("selector").writeSelector(selector); return; } case DeclarationName::CXXConstructorName: { QualType type = ( node.getCXXNameType() ); subW.find("type").writeQualType(type); return; } case DeclarationName::CXXDestructorName: { QualType type = ( node.getCXXNameType() ); subW.find("type").writeQualType(type); return; } case DeclarationName::CXXConversionFunctionName: { QualType type = ( node.getCXXNameType() ); subW.find("type").writeQualType(type); return; } case DeclarationName::CXXDeductionGuideName: { const TemplateDecl* declaration = ( node.getCXXDeductionGuideTemplate() ); subW.find("declaration").writeTemplateDeclRef(declaration); return; } case DeclarationName::CXXOperatorName: { OverloadedOperatorKind operatorKind = ( node.getCXXOverloadedOperator() ); subW.find("operatorKind").writeOverloadedOperatorKind(operatorKind); return; } case DeclarationName::CXXLiteralOperatorName: { const IdentifierInfo* identifier = ( node.getCXXLiteralIdentifier() ); subW.find("identifier").writeIdentifier(identifier); return; } case DeclarationName::CXXUsingDirective: { return; } case DeclarationName::ObjCZeroArgSelector: { Selector selector = ( node.getObjCSelector() ); subW.find("selector").writeSelector(selector); return; } case DeclarationName::ObjCOneArgSelector: { Selector selector = ( node.getObjCSelector() ); subW.find("selector").writeSelector(selector); return; } } llvm_unreachable("bad DeclarationName::NameKind"); } void writeDeclarationNameKind(DeclarationName::NameKind value) { asImpl().writeEnum(value); } void writeElaboratedTypeKeyword(ElaboratedTypeKeyword value) { asImpl().writeEnum(value); } void writeExprRef(const Expr* value) { asImpl().writeStmtRef(value); } void writeFunctionDeclRef(const FunctionDecl* value) { asImpl().writeDeclRef(value); } void writeNamedDeclRef(const NamedDecl* value) { asImpl().writeDeclRef(value); } void writeNamespaceAliasDeclRef(const NamespaceAliasDecl* value) { asImpl().writeDeclRef(value); } void writeNamespaceDeclRef(const NamespaceDecl* value) { asImpl().writeDeclRef(value); } void writeNestedNameSpecifierKind(NestedNameSpecifier::SpecifierKind value) { asImpl().writeEnum(value); } void writeObjCProtocolDeclRef(const ObjCProtocolDecl* value) { asImpl().writeDeclRef(value); } void writeObjCTypeParamDeclRef(const ObjCTypeParamDecl* value) { asImpl().writeDeclRef(value); } void writeOverloadedOperatorKind(OverloadedOperatorKind value) { asImpl().writeEnum(value); } void writeRefQualifierKind(RefQualifierKind value) { asImpl().writeEnum(value); } void writeTagDeclRef(const TagDecl* value) { asImpl().writeDeclRef(value); } void writeTemplateArgument(TemplateArgument node) { auto &&subW = asImpl().writeObject(); TemplateArgument::ArgKind kind = (node.getKind()); subW.find("kind").writeTemplateArgumentKind(kind); switch (kind) { case TemplateArgument::Null: { return; } case TemplateArgument::Type: { QualType type = ( node.getAsType() ); subW.find("type").writeQualType(type); return; } case TemplateArgument::Declaration: { const ValueDecl* declaration = ( node.getAsDecl() ); subW.find("declaration").writeValueDeclRef(declaration); QualType parameterType = ( node.getParamTypeForDecl() ); subW.find("parameterType").writeQualType(parameterType); return; } case TemplateArgument::NullPtr: { QualType type = ( node.getNullPtrType() ); subW.find("type").writeQualType(type); return; } case TemplateArgument::Integral: { llvm::APSInt value = ( node.getAsIntegral() ); subW.find("value").writeAPSInt(value); QualType type = ( node.getIntegralType() ); subW.find("type").writeQualType(type); return; } case TemplateArgument::Template: { TemplateName name = ( node.getAsTemplateOrTemplatePattern() ); subW.find("name").writeTemplateName(name); return; } case TemplateArgument::TemplateExpansion: { TemplateName name = ( node.getAsTemplateOrTemplatePattern() ); subW.find("name").writeTemplateName(name); llvm::Optional numExpansions = ( // Translate unsigned -> uint32_t just in case. node.getNumTemplateExpansions().map( [](unsigned i) { return uint32_t(i); }) ); subW.find("numExpansions").writeOptional(numExpansions); return; } case TemplateArgument::Expression: { const Expr* expression = ( node.getAsExpr() ); subW.find("expression").writeExprRef(expression); return; } case TemplateArgument::Pack: { llvm::ArrayRef elements = ( node.pack_elements() ); subW.find("elements").writeArray(elements); return; } } llvm_unreachable("bad TemplateArgument::ArgKind"); } void writeTemplateArgumentKind(TemplateArgument::ArgKind value) { asImpl().writeEnum(value); } void writeTemplateDeclRef(const TemplateDecl* value) { asImpl().writeDeclRef(value); } void writeTemplateName(TemplateName node) { auto &&subW = asImpl().writeObject(); TemplateName::NameKind kind = (node.getKind()); subW.find("kind").writeTemplateNameKind(kind); switch (kind) { case TemplateName::Template: { const TemplateDecl* declaration = ( node.getAsTemplateDecl() ); subW.find("declaration").writeTemplateDeclRef(declaration); return; } case TemplateName::OverloadedTemplate: { llvm::ArrayRef overloads = ( node.getAsOverloadedTemplate()->decls() ); subW.find("overloads").writeArray(overloads); return; } case TemplateName::AssumedTemplate: { DeclarationName name = ( node.getAsAssumedTemplateName()->getDeclName() ); subW.find("name").writeDeclarationName(name); return; } case TemplateName::QualifiedTemplate: { auto qtn = node.getAsQualifiedTemplateName(); NestedNameSpecifier * qualifier = ( qtn->getQualifier() ); subW.find("qualifier").writeNestedNameSpecifier(qualifier); bool hasTemplateKeyword = ( qtn->hasTemplateKeyword() ); subW.find("hasTemplateKeyword").writeBool(hasTemplateKeyword); const TemplateDecl* declaration = ( qtn->getTemplateDecl() ); subW.find("declaration").writeTemplateDeclRef(declaration); return; } case TemplateName::DependentTemplate: { auto dtn = node.getAsDependentTemplateName(); NestedNameSpecifier * qualifier = ( dtn->getQualifier() ); subW.find("qualifier").writeNestedNameSpecifier(qualifier); llvm::Optional identifier = ( makeOptionalFromPointer( dtn->isIdentifier() ? dtn->getIdentifier() : nullptr) ); subW.find("identifier").writeOptional(identifier); if ( !identifier ) { OverloadedOperatorKind operatorKind = ( dtn->getOperator() ); subW.find("operatorKind").writeOverloadedOperatorKind(operatorKind); } return; } case TemplateName::SubstTemplateTemplateParm: { auto parm = node.getAsSubstTemplateTemplateParm(); const TemplateTemplateParmDecl* parameter = ( parm->getParameter() ); subW.find("parameter").writeTemplateTemplateParmDeclRef(parameter); TemplateName replacement = ( parm->getReplacement() ); subW.find("replacement").writeTemplateName(replacement); return; } case TemplateName::SubstTemplateTemplateParmPack: { auto parm = node.getAsSubstTemplateTemplateParmPack(); const TemplateTemplateParmDecl* parameterPack = ( parm->getParameterPack() ); subW.find("parameterPack").writeTemplateTemplateParmDeclRef(parameterPack); TemplateArgument argumentPack = ( parm->getArgumentPack() ); subW.find("argumentPack").writeTemplateArgument(argumentPack); return; } } llvm_unreachable("bad TemplateName::NameKind"); } void writeTemplateNameKind(TemplateName::NameKind value) { asImpl().writeEnum(value); } void writeTemplateTemplateParmDeclRef(const TemplateTemplateParmDecl* value) { asImpl().writeDeclRef(value); } void writeTemplateTypeParmDeclRef(const TemplateTypeParmDecl* value) { asImpl().writeDeclRef(value); } void writeUnaryTypeTransformKind(UnaryTransformType::UTTKind value) { asImpl().writeEnum(value); } void writeValueDeclRef(const ValueDecl* value) { asImpl().writeDeclRef(value); } void writeVectorKind(VectorType::VectorKind value) { asImpl().writeEnum(value); } };