blob: dbf54dfd9ecd93ebc5319c0085ccefae8ab7a7d1 [file] [log] [blame]
//===--- HLSLBuiltinTypeDeclBuilder.h - HLSL Builtin Type Decl Builder ---===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Helper classes for creating HLSL builtin class types. Used by external HLSL
// sema source.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_SEMA_HLSLBUILTINTYPEDECLBUILDER_H
#define LLVM_CLANG_SEMA_HLSLBUILTINTYPEDECLBUILDER_H
#include "clang/AST/Type.h"
#include "clang/Sema/Sema.h"
#include "llvm/ADT/StringMap.h"
using llvm::hlsl::ResourceClass;
namespace clang {
class ClassTemplateDecl;
class NamespaceDecl;
class CXXRecordDecl;
class FieldDecl;
namespace hlsl {
// Builder for builtin HLSL class types such as HLSL resource classes.
// Allows creating declaration of builtin types using the builder pattern
// like this:
//
// Decl = BuiltinTypeDeclBuilder(Sema, Namespace, "BuiltinClassName")
// .addSimpleTemplateParams({"T"}, Concept)
// .finalizeForwardDeclaration();
//
// And then completing the type like this:
//
// BuiltinTypeDeclBuilder(Sema, Decl)
// .addDefaultHandleConstructor();
// .addLoadMethods()
// .completeDefinition();
//
class BuiltinTypeDeclBuilder {
private:
Sema &SemaRef;
CXXRecordDecl *Record = nullptr;
ClassTemplateDecl *Template = nullptr;
ClassTemplateDecl *PrevTemplate = nullptr;
NamespaceDecl *HLSLNamespace = nullptr;
llvm::StringMap<FieldDecl *> Fields;
public:
friend struct TemplateParameterListBuilder;
friend struct BuiltinTypeMethodBuilder;
BuiltinTypeDeclBuilder(Sema &SemaRef, CXXRecordDecl *R);
BuiltinTypeDeclBuilder(Sema &SemaRef, NamespaceDecl *Namespace,
StringRef Name);
~BuiltinTypeDeclBuilder();
BuiltinTypeDeclBuilder &addSimpleTemplateParams(ArrayRef<StringRef> Names,
ConceptDecl *CD);
CXXRecordDecl *finalizeForwardDeclaration();
BuiltinTypeDeclBuilder &completeDefinition();
BuiltinTypeDeclBuilder &
addMemberVariable(StringRef Name, QualType Type, llvm::ArrayRef<Attr *> Attrs,
AccessSpecifier Access = AccessSpecifier::AS_private);
BuiltinTypeDeclBuilder &
addHandleMember(ResourceClass RC, bool IsROV, bool RawBuffer,
AccessSpecifier Access = AccessSpecifier::AS_private);
BuiltinTypeDeclBuilder &addArraySubscriptOperators();
// Builtin types methods
BuiltinTypeDeclBuilder &addDefaultHandleConstructor();
// Builtin types methods
BuiltinTypeDeclBuilder &addLoadMethods();
BuiltinTypeDeclBuilder &addIncrementCounterMethod();
BuiltinTypeDeclBuilder &addDecrementCounterMethod();
BuiltinTypeDeclBuilder &addHandleAccessFunction(DeclarationName &Name,
bool IsConst, bool IsRef);
BuiltinTypeDeclBuilder &addAppendMethod();
BuiltinTypeDeclBuilder &addConsumeMethod();
private:
FieldDecl *getResourceHandleField();
QualType getFirstTemplateTypeParam();
QualType getHandleElementType();
Expr *getConstantIntExpr(int value);
};
} // namespace hlsl
} // namespace clang
#endif // LLVM_CLANG_SEMA_HLSLBUILTINTYPEDECLBUILDER_H