/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\ |* *| |* Helper classes for BasicReaders *| |* *| |* Automatically generated file, do not edit! *| |* *| \*===----------------------------------------------------------------------===*/ template struct ReadDispatcher; template <> struct ReadDispatcher { template static llvm::APInt read(BasicReader &R, Args &&... args) { return R.readAPInt(std::forward(args)...); } }; template <> struct ReadDispatcher { template static llvm::APSInt read(BasicReader &R, Args &&... args) { return R.readAPSInt(std::forward(args)...); } }; template <> struct ReadDispatcher { template static ArrayType::ArraySizeModifier read(BasicReader &R, Args &&... args) { return R.readArraySizeModifier(std::forward(args)...); } }; template <> struct ReadDispatcher { template static attr::Kind read(BasicReader &R, Args &&... args) { return R.readAttrKind(std::forward(args)...); } }; template <> struct ReadDispatcher { template static AutoTypeKeyword read(BasicReader &R, Args &&... args) { return R.readAutoTypeKeyword(std::forward(args)...); } }; template <> struct ReadDispatcher { template static bool read(BasicReader &R, Args &&... args) { return R.readBool(std::forward(args)...); } }; template <> struct ReadDispatcher { template static BuiltinType::Kind read(BasicReader &R, Args &&... args) { return R.readBuiltinTypeKind(std::forward(args)...); } }; template <> struct ReadDispatcher { template static CXXRecordDecl* read(BasicReader &R, Args &&... args) { return R.readCXXRecordDeclRef(std::forward(args)...); } }; template <> struct ReadDispatcher { template static CallingConv read(BasicReader &R, Args &&... args) { return R.readCallingConv(std::forward(args)...); } }; template <> struct ReadDispatcher { template static ConceptDecl* read(BasicReader &R, Args &&... args) { return R.readConceptDeclRef(std::forward(args)...); } }; template <> struct ReadDispatcher { template static Decl* read(BasicReader &R, Args &&... args) { return R.readDeclRef(std::forward(args)...); } }; template <> struct ReadDispatcher { template static DeclarationName read(BasicReader &R, Args &&... args) { return R.readDeclarationName(std::forward(args)...); } }; template <> struct ReadDispatcher { template static DeclarationName::NameKind read(BasicReader &R, Args &&... args) { return R.readDeclarationNameKind(std::forward(args)...); } }; template <> struct ReadDispatcher { template static ElaboratedTypeKeyword read(BasicReader &R, Args &&... args) { return R.readElaboratedTypeKeyword(std::forward(args)...); } }; template <> struct ReadDispatcher { template static FunctionProtoType::ExceptionSpecInfo read(BasicReader &R, Args &&... args) { return R.readExceptionSpecInfo(std::forward(args)...); } }; template <> struct ReadDispatcher { template static Expr* read(BasicReader &R, Args &&... args) { return R.readExprRef(std::forward(args)...); } }; template <> struct ReadDispatcher { template static FunctionProtoType::ExtParameterInfo read(BasicReader &R, Args &&... args) { return R.readExtParameterInfo(std::forward(args)...); } }; template <> struct ReadDispatcher { template static FunctionDecl* read(BasicReader &R, Args &&... args) { return R.readFunctionDeclRef(std::forward(args)...); } }; template <> struct ReadDispatcher { template static IdentifierInfo* read(BasicReader &R, Args &&... args) { return R.readIdentifier(std::forward(args)...); } }; template <> struct ReadDispatcher { template static NamedDecl* read(BasicReader &R, Args &&... args) { return R.readNamedDeclRef(std::forward(args)...); } }; template <> struct ReadDispatcher { template static NamespaceAliasDecl* read(BasicReader &R, Args &&... args) { return R.readNamespaceAliasDeclRef(std::forward(args)...); } }; template <> struct ReadDispatcher { template static NamespaceDecl* read(BasicReader &R, Args &&... args) { return R.readNamespaceDeclRef(std::forward(args)...); } }; template <> struct ReadDispatcher { template static NestedNameSpecifier * read(BasicReader &R, Args &&... args) { return R.readNestedNameSpecifier(std::forward(args)...); } }; template <> struct ReadDispatcher { template static NestedNameSpecifier::SpecifierKind read(BasicReader &R, Args &&... args) { return R.readNestedNameSpecifierKind(std::forward(args)...); } }; template <> struct ReadDispatcher { template static ObjCProtocolDecl* read(BasicReader &R, Args &&... args) { return R.readObjCProtocolDeclRef(std::forward(args)...); } }; template <> struct ReadDispatcher { template static ObjCTypeParamDecl* read(BasicReader &R, Args &&... args) { return R.readObjCTypeParamDeclRef(std::forward(args)...); } }; template <> struct ReadDispatcher { template static OverloadedOperatorKind read(BasicReader &R, Args &&... args) { return R.readOverloadedOperatorKind(std::forward(args)...); } }; template <> struct ReadDispatcher { template static QualType read(BasicReader &R, Args &&... args) { return R.readQualType(std::forward(args)...); } }; template <> struct ReadDispatcher { template static Qualifiers read(BasicReader &R, Args &&... args) { return R.readQualifiers(std::forward(args)...); } }; template <> struct ReadDispatcher { template static RefQualifierKind read(BasicReader &R, Args &&... args) { return R.readRefQualifierKind(std::forward(args)...); } }; template <> struct ReadDispatcher { template static Selector read(BasicReader &R, Args &&... args) { return R.readSelector(std::forward(args)...); } }; template <> struct ReadDispatcher { template static SourceLocation read(BasicReader &R, Args &&... args) { return R.readSourceLocation(std::forward(args)...); } }; template <> struct ReadDispatcher { template static Stmt* read(BasicReader &R, Args &&... args) { return R.readStmtRef(std::forward(args)...); } }; template <> struct ReadDispatcher { template static TagDecl* read(BasicReader &R, Args &&... args) { return R.readTagDeclRef(std::forward(args)...); } }; template <> struct ReadDispatcher { template static TemplateArgument read(BasicReader &R, Args &&... args) { return R.readTemplateArgument(std::forward(args)...); } }; template <> struct ReadDispatcher { template static TemplateArgument::ArgKind read(BasicReader &R, Args &&... args) { return R.readTemplateArgumentKind(std::forward(args)...); } }; template <> struct ReadDispatcher { template static TemplateDecl* read(BasicReader &R, Args &&... args) { return R.readTemplateDeclRef(std::forward(args)...); } }; template <> struct ReadDispatcher { template static TemplateName read(BasicReader &R, Args &&... args) { return R.readTemplateName(std::forward(args)...); } }; template <> struct ReadDispatcher { template static TemplateName::NameKind read(BasicReader &R, Args &&... args) { return R.readTemplateNameKind(std::forward(args)...); } }; template <> struct ReadDispatcher { template static TemplateTemplateParmDecl* read(BasicReader &R, Args &&... args) { return R.readTemplateTemplateParmDeclRef(std::forward(args)...); } }; template <> struct ReadDispatcher { template static TemplateTypeParmDecl* read(BasicReader &R, Args &&... args) { return R.readTemplateTypeParmDeclRef(std::forward(args)...); } }; template <> struct ReadDispatcher { template static uint32_t read(BasicReader &R, Args &&... args) { return R.readUInt32(std::forward(args)...); } }; template <> struct ReadDispatcher { template static uint64_t read(BasicReader &R, Args &&... args) { return R.readUInt64(std::forward(args)...); } }; template <> struct ReadDispatcher { template static UnaryTransformType::UTTKind read(BasicReader &R, Args &&... args) { return R.readUnaryTypeTransformKind(std::forward(args)...); } }; template <> struct ReadDispatcher { template static ValueDecl* read(BasicReader &R, Args &&... args) { return R.readValueDeclRef(std::forward(args)...); } }; template <> struct ReadDispatcher { template static VectorType::VectorKind read(BasicReader &R, Args &&... args) { return R.readVectorKind(std::forward(args)...); } }; template struct ReadDispatcher> { template static llvm::ArrayRef read(BasicReader &R, Args &&... args) { return R.readArray(std::forward(args)...); } }; template struct ReadDispatcher> { template static llvm::Optional read(BasicReader &R, Args &&... args) { return R.readOptional(std::forward(args)...); } }; template struct UnpackOptionalValue; template <> struct UnpackOptionalValue { static Optional unpack(CXXRecordDecl* value) { return value ? llvm::Optional(value) : llvm::None; } }; template <> struct UnpackOptionalValue { static Optional unpack(ConceptDecl* value) { return value ? llvm::Optional(value) : llvm::None; } }; template <> struct UnpackOptionalValue { static Optional unpack(Decl* value) { return value ? llvm::Optional(value) : llvm::None; } }; template <> struct UnpackOptionalValue { static Optional unpack(Expr* value) { return value ? llvm::Optional(value) : llvm::None; } }; template <> struct UnpackOptionalValue { static Optional unpack(FunctionDecl* value) { return value ? llvm::Optional(value) : llvm::None; } }; template <> struct UnpackOptionalValue { static Optional unpack(IdentifierInfo* value) { return value ? llvm::Optional(value) : llvm::None; } }; template <> struct UnpackOptionalValue { static Optional unpack(NamedDecl* value) { return value ? llvm::Optional(value) : llvm::None; } }; template <> struct UnpackOptionalValue { static Optional unpack(NamespaceAliasDecl* value) { return value ? llvm::Optional(value) : llvm::None; } }; template <> struct UnpackOptionalValue { static Optional unpack(NamespaceDecl* value) { return value ? llvm::Optional(value) : llvm::None; } }; template <> struct UnpackOptionalValue { static Optional unpack(ObjCProtocolDecl* value) { return value ? llvm::Optional(value) : llvm::None; } }; template <> struct UnpackOptionalValue { static Optional unpack(ObjCTypeParamDecl* value) { return value ? llvm::Optional(value) : llvm::None; } }; template <> struct UnpackOptionalValue { static Optional unpack(QualType value) { return value.isNull() ? llvm::None : llvm::Optional(value); } }; template <> struct UnpackOptionalValue { static Optional unpack(Stmt* value) { return value ? llvm::Optional(value) : llvm::None; } }; template <> struct UnpackOptionalValue { static Optional unpack(TagDecl* value) { return value ? llvm::Optional(value) : llvm::None; } }; template <> struct UnpackOptionalValue { static Optional unpack(TemplateDecl* value) { return value ? llvm::Optional(value) : llvm::None; } }; template <> struct UnpackOptionalValue { static Optional unpack(TemplateName value) { return value.isNull() ? llvm::None : llvm::Optional(value); } }; template <> struct UnpackOptionalValue { static Optional unpack(TemplateTemplateParmDecl* value) { return value ? llvm::Optional(value) : llvm::None; } }; template <> struct UnpackOptionalValue { static Optional unpack(TemplateTypeParmDecl* value) { return value ? llvm::Optional(value) : llvm::None; } }; template <> struct UnpackOptionalValue { static Optional unpack(uint32_t value) { return value ? llvm::Optional(value - 1) : llvm::None; } }; template <> struct UnpackOptionalValue { static Optional unpack(uint64_t value) { return value ? llvm::Optional(value - 1) : llvm::None; } }; template <> struct UnpackOptionalValue { static Optional unpack(ValueDecl* value) { return value ? llvm::Optional(value) : llvm::None; } }; template class BasicReaderBase { ASTContext &C; protected: BasicReaderBase(ASTContext &ctx) : C(ctx) {} public: ASTContext &getASTContext() { return C; } Impl &asImpl() { return static_cast(*this); } ArrayType::ArraySizeModifier readArraySizeModifier() { return asImpl().template readEnum(); } attr::Kind readAttrKind() { return asImpl().template readEnum(); } AutoTypeKeyword readAutoTypeKeyword() { return asImpl().template readEnum(); } BuiltinType::Kind readBuiltinTypeKind() { return asImpl().template readEnum(); } CXXRecordDecl* readCXXRecordDeclRef() { return cast_or_null(asImpl().readDeclRef()); } CallingConv readCallingConv() { return asImpl().template readEnum(); } ConceptDecl* readConceptDeclRef() { return cast_or_null(asImpl().readDeclRef()); } DeclarationName readDeclarationName() { auto &ctx = asImpl().getASTContext(); auto &&subR = asImpl().readObject(); DeclarationName::NameKind kind = subR.find("kind").readDeclarationNameKind(); switch (kind) { case DeclarationName::Identifier: { IdentifierInfo* identifier = subR.find("identifier").readIdentifier(); return DeclarationName(identifier); } case DeclarationName::ObjCMultiArgSelector: { Selector selector = subR.find("selector").readSelector(); return DeclarationName(selector); } case DeclarationName::CXXConstructorName: { QualType type = subR.find("type").readQualType(); return ctx.DeclarationNames.getCXXConstructorName( ctx.getCanonicalType(type)); } case DeclarationName::CXXDestructorName: { QualType type = subR.find("type").readQualType(); return ctx.DeclarationNames.getCXXDestructorName( ctx.getCanonicalType(type)); } case DeclarationName::CXXConversionFunctionName: { QualType type = subR.find("type").readQualType(); return ctx.DeclarationNames.getCXXConversionFunctionName( ctx.getCanonicalType(type)); } case DeclarationName::CXXDeductionGuideName: { TemplateDecl* declaration = subR.find("declaration").readTemplateDeclRef(); return ctx.DeclarationNames.getCXXDeductionGuideName(declaration); } case DeclarationName::CXXOperatorName: { OverloadedOperatorKind operatorKind = subR.find("operatorKind").readOverloadedOperatorKind(); return ctx.DeclarationNames.getCXXOperatorName(operatorKind); } case DeclarationName::CXXLiteralOperatorName: { IdentifierInfo* identifier = subR.find("identifier").readIdentifier(); return ctx.DeclarationNames.getCXXLiteralOperatorName(identifier); } case DeclarationName::CXXUsingDirective: { return DeclarationName::getUsingDirectiveName(); } case DeclarationName::ObjCZeroArgSelector: { Selector selector = subR.find("selector").readSelector(); return DeclarationName(selector); } case DeclarationName::ObjCOneArgSelector: { Selector selector = subR.find("selector").readSelector(); return DeclarationName(selector); } } llvm_unreachable("bad DeclarationName::NameKind"); } DeclarationName::NameKind readDeclarationNameKind() { return asImpl().template readEnum(); } ElaboratedTypeKeyword readElaboratedTypeKeyword() { return asImpl().template readEnum(); } Expr* readExprRef() { return cast_or_null(asImpl().readStmtRef()); } FunctionDecl* readFunctionDeclRef() { return cast_or_null(asImpl().readDeclRef()); } NamedDecl* readNamedDeclRef() { return cast_or_null(asImpl().readDeclRef()); } NamespaceAliasDecl* readNamespaceAliasDeclRef() { return cast_or_null(asImpl().readDeclRef()); } NamespaceDecl* readNamespaceDeclRef() { return cast_or_null(asImpl().readDeclRef()); } NestedNameSpecifier::SpecifierKind readNestedNameSpecifierKind() { return asImpl().template readEnum(); } ObjCProtocolDecl* readObjCProtocolDeclRef() { return cast_or_null(asImpl().readDeclRef()); } ObjCTypeParamDecl* readObjCTypeParamDeclRef() { return cast_or_null(asImpl().readDeclRef()); } OverloadedOperatorKind readOverloadedOperatorKind() { return asImpl().template readEnum(); } RefQualifierKind readRefQualifierKind() { return asImpl().template readEnum(); } TagDecl* readTagDeclRef() { return cast_or_null(asImpl().readDeclRef()); } TemplateArgument readTemplateArgument() { auto &ctx = asImpl().getASTContext(); auto &&subR = asImpl().readObject(); TemplateArgument::ArgKind kind = subR.find("kind").readTemplateArgumentKind(); switch (kind) { case TemplateArgument::Null: { return TemplateArgument(); } case TemplateArgument::Type: { QualType type = subR.find("type").readQualType(); return TemplateArgument(type); } case TemplateArgument::Declaration: { ValueDecl* declaration = subR.find("declaration").readValueDeclRef(); QualType parameterType = subR.find("parameterType").readQualType(); return TemplateArgument(declaration, parameterType); } case TemplateArgument::NullPtr: { QualType type = subR.find("type").readQualType(); return TemplateArgument(type, /*nullptr*/ true); } case TemplateArgument::Integral: { llvm::APSInt value = subR.find("value").readAPSInt(); QualType type = subR.find("type").readQualType(); return TemplateArgument(ctx, value, type); } case TemplateArgument::Template: { TemplateName name = subR.find("name").readTemplateName(); return TemplateArgument(name); } case TemplateArgument::TemplateExpansion: { TemplateName name = subR.find("name").readTemplateName(); llvm::Optional numExpansions = subR.find("numExpansions").template readOptional(); auto numExpansionsUnsigned = numExpansions.map([](uint32_t i) { return unsigned(i); }); return TemplateArgument(name, numExpansionsUnsigned); } case TemplateArgument::Expression: { Expr* expression = subR.find("expression").readExprRef(); return TemplateArgument(expression); } case TemplateArgument::Pack: { llvm::SmallVector elements_buffer_0; llvm::ArrayRef elements = subR.find("elements").template readArray(elements_buffer_0); // Copy the pack into the ASTContext. TemplateArgument *ctxElements = new (ctx) TemplateArgument[elements.size()]; for (size_t i = 0, e = elements.size(); i != e; ++i) ctxElements[i] = elements[i]; return TemplateArgument(llvm::makeArrayRef(ctxElements, elements.size())); } } llvm_unreachable("bad TemplateArgument::ArgKind"); } TemplateArgument::ArgKind readTemplateArgumentKind() { return asImpl().template readEnum(); } TemplateDecl* readTemplateDeclRef() { return cast_or_null(asImpl().readDeclRef()); } TemplateName readTemplateName() { auto &ctx = asImpl().getASTContext(); auto &&subR = asImpl().readObject(); TemplateName::NameKind kind = subR.find("kind").readTemplateNameKind(); switch (kind) { case TemplateName::Template: { TemplateDecl* declaration = subR.find("declaration").readTemplateDeclRef(); return TemplateName(declaration); } case TemplateName::OverloadedTemplate: { llvm::SmallVector overloads_buffer_0; llvm::ArrayRef overloads = subR.find("overloads").template readArray(overloads_buffer_0); // Copy into an UnresolvedSet to satisfy the interface. UnresolvedSet<8> overloadSet; for (auto overload : overloads) { overloadSet.addDecl(overload); } return ctx.getOverloadedTemplateName(overloadSet.begin(), overloadSet.end()); } case TemplateName::AssumedTemplate: { DeclarationName name = subR.find("name").readDeclarationName(); return ctx.getAssumedTemplateName(name); } case TemplateName::QualifiedTemplate: { NestedNameSpecifier * qualifier = subR.find("qualifier").readNestedNameSpecifier(); bool hasTemplateKeyword = subR.find("hasTemplateKeyword").readBool(); TemplateDecl* declaration = subR.find("declaration").readTemplateDeclRef(); return ctx.getQualifiedTemplateName(qualifier, hasTemplateKeyword, declaration); } case TemplateName::DependentTemplate: { NestedNameSpecifier * qualifier = subR.find("qualifier").readNestedNameSpecifier(); llvm::Optional identifier = subR.find("identifier").template readOptional(); llvm::Optional operatorKind; if ( !identifier ) { operatorKind.emplace(subR.find("operatorKind").readOverloadedOperatorKind()); } if (identifier) { return ctx.getDependentTemplateName(qualifier, *identifier); } else { return ctx.getDependentTemplateName(qualifier, *operatorKind); } } case TemplateName::SubstTemplateTemplateParm: { TemplateTemplateParmDecl* parameter = subR.find("parameter").readTemplateTemplateParmDeclRef(); TemplateName replacement = subR.find("replacement").readTemplateName(); return ctx.getSubstTemplateTemplateParm(parameter, replacement); } case TemplateName::SubstTemplateTemplateParmPack: { TemplateTemplateParmDecl* parameterPack = subR.find("parameterPack").readTemplateTemplateParmDeclRef(); TemplateArgument argumentPack = subR.find("argumentPack").readTemplateArgument(); return ctx.getSubstTemplateTemplateParmPack(parameterPack, argumentPack); } } llvm_unreachable("bad TemplateName::NameKind"); } TemplateName::NameKind readTemplateNameKind() { return asImpl().template readEnum(); } TemplateTemplateParmDecl* readTemplateTemplateParmDeclRef() { return cast_or_null(asImpl().readDeclRef()); } TemplateTypeParmDecl* readTemplateTypeParmDeclRef() { return cast_or_null(asImpl().readDeclRef()); } UnaryTransformType::UTTKind readUnaryTypeTransformKind() { return asImpl().template readEnum(); } ValueDecl* readValueDeclRef() { return cast_or_null(asImpl().readDeclRef()); } VectorType::VectorKind readVectorKind() { return asImpl().template readEnum(); } };