Skip to content

Commit c502a81

Browse files
committed
[HLSL] Add helpers to simplify HLSL resource type declarations. NFC
A few changes to HLSLExternalSemaSource and its BuiltinTypeDeclBuilder to make defining buffer types less verbose. This will make it a lot easier to see what the differences between the various buffer types are once we start introducing more of them. Pull Request: #73967
1 parent df3db03 commit c502a81

File tree

2 files changed

+36
-22
lines changed

2 files changed

+36
-22
lines changed

clang/include/clang/Sema/HLSLExternalSemaSource.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ class HLSLExternalSemaSource : public ExternalSemaSource {
3030

3131
void defineHLSLVectorAlias();
3232
void defineTrivialHLSLTypes();
33-
void forwardDeclareHLSLTypes();
33+
void defineHLSLTypesWithForwardDeclarations();
3434

35-
void completeBufferType(CXXRecordDecl *Record);
35+
void onCompletion(CXXRecordDecl *Record, CompletionFunction Fn);
3636

3737
public:
3838
~HLSLExternalSemaSource() override;

clang/lib/Sema/HLSLExternalSemaSource.cpp

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,7 @@ struct BuiltinTypeDeclBuilder {
306306
}
307307

308308
TemplateParameterListBuilder addTemplateArgumentList();
309+
BuiltinTypeDeclBuilder &addSimpleTemplateParams(ArrayRef<StringRef> Names);
309310
};
310311

311312
struct TemplateParameterListBuilder {
@@ -360,11 +361,19 @@ struct TemplateParameterListBuilder {
360361
return Builder;
361362
}
362363
};
364+
} // namespace
363365

364366
TemplateParameterListBuilder BuiltinTypeDeclBuilder::addTemplateArgumentList() {
365367
return TemplateParameterListBuilder(*this);
366368
}
367-
} // namespace
369+
370+
BuiltinTypeDeclBuilder &
371+
BuiltinTypeDeclBuilder::addSimpleTemplateParams(ArrayRef<StringRef> Names) {
372+
TemplateParameterListBuilder Builder = this->addTemplateArgumentList();
373+
for (StringRef Name : Names)
374+
Builder.addTypeParameter(Name);
375+
return Builder.finalizeTemplateArgs();
376+
}
368377

369378
HLSLExternalSemaSource::~HLSLExternalSemaSource() {}
370379

@@ -390,7 +399,7 @@ void HLSLExternalSemaSource::InitializeSema(Sema &S) {
390399
// Force external decls in the HLSL namespace to load from the PCH.
391400
(void)HLSLNamespace->getCanonicalDecl()->decls_begin();
392401
defineTrivialHLSLTypes();
393-
forwardDeclareHLSLTypes();
402+
defineHLSLTypesWithForwardDeclarations();
394403

395404
// This adds a `using namespace hlsl` directive. In DXC, we don't put HLSL's
396405
// built in types inside a namespace, but we are planning to change that in
@@ -467,18 +476,32 @@ void HLSLExternalSemaSource::defineTrivialHLSLTypes() {
467476
.Record;
468477
}
469478

470-
void HLSLExternalSemaSource::forwardDeclareHLSLTypes() {
479+
/// Set up common members and attributes for buffer types
480+
static BuiltinTypeDeclBuilder setupBufferType(CXXRecordDecl *Decl, Sema &S,
481+
ResourceClass RC,
482+
ResourceKind RK) {
483+
return BuiltinTypeDeclBuilder(Decl)
484+
.addHandleMember()
485+
.addDefaultHandleConstructor(S, RC)
486+
.annotateResourceClass(RC, RK);
487+
}
488+
489+
void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
471490
CXXRecordDecl *Decl;
472491
Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RWBuffer")
473-
.addTemplateArgumentList()
474-
.addTypeParameter("element_type")
475-
.finalizeTemplateArgs()
492+
.addSimpleTemplateParams({"element_type"})
476493
.Record;
477-
if (!Decl->isCompleteDefinition())
478-
Completions.insert(
479-
std::make_pair(Decl->getCanonicalDecl(),
480-
std::bind(&HLSLExternalSemaSource::completeBufferType,
481-
this, std::placeholders::_1)));
494+
onCompletion(Decl, [this](CXXRecordDecl *Decl) {
495+
setupBufferType(Decl, *SemaPtr, ResourceClass::UAV,
496+
ResourceKind::TypedBuffer)
497+
.addArraySubscriptOperators()
498+
.completeDefinition();
499+
});
500+
}
501+
502+
void HLSLExternalSemaSource::onCompletion(CXXRecordDecl *Record,
503+
CompletionFunction Fn) {
504+
Completions.insert(std::make_pair(Record->getCanonicalDecl(), Fn));
482505
}
483506

484507
void HLSLExternalSemaSource::CompleteType(TagDecl *Tag) {
@@ -496,12 +519,3 @@ void HLSLExternalSemaSource::CompleteType(TagDecl *Tag) {
496519
return;
497520
It->second(Record);
498521
}
499-
500-
void HLSLExternalSemaSource::completeBufferType(CXXRecordDecl *Record) {
501-
BuiltinTypeDeclBuilder(Record)
502-
.addHandleMember()
503-
.addDefaultHandleConstructor(*SemaPtr, ResourceClass::UAV)
504-
.addArraySubscriptOperators()
505-
.annotateResourceClass(ResourceClass::UAV, ResourceKind::TypedBuffer)
506-
.completeDefinition();
507-
}

0 commit comments

Comments
 (0)