@@ -306,6 +306,7 @@ struct BuiltinTypeDeclBuilder {
306
306
}
307
307
308
308
TemplateParameterListBuilder addTemplateArgumentList ();
309
+ BuiltinTypeDeclBuilder &addSimpleTemplateParams (ArrayRef<StringRef> Names);
309
310
};
310
311
311
312
struct TemplateParameterListBuilder {
@@ -360,11 +361,19 @@ struct TemplateParameterListBuilder {
360
361
return Builder;
361
362
}
362
363
};
364
+ } // namespace
363
365
364
366
TemplateParameterListBuilder BuiltinTypeDeclBuilder::addTemplateArgumentList () {
365
367
return TemplateParameterListBuilder (*this );
366
368
}
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
+ }
368
377
369
378
HLSLExternalSemaSource::~HLSLExternalSemaSource () {}
370
379
@@ -390,7 +399,7 @@ void HLSLExternalSemaSource::InitializeSema(Sema &S) {
390
399
// Force external decls in the HLSL namespace to load from the PCH.
391
400
(void )HLSLNamespace->getCanonicalDecl ()->decls_begin ();
392
401
defineTrivialHLSLTypes ();
393
- forwardDeclareHLSLTypes ();
402
+ defineHLSLTypesWithForwardDeclarations ();
394
403
395
404
// This adds a `using namespace hlsl` directive. In DXC, we don't put HLSL's
396
405
// built in types inside a namespace, but we are planning to change that in
@@ -467,18 +476,32 @@ void HLSLExternalSemaSource::defineTrivialHLSLTypes() {
467
476
.Record ;
468
477
}
469
478
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 () {
471
490
CXXRecordDecl *Decl;
472
491
Decl = BuiltinTypeDeclBuilder (*SemaPtr, HLSLNamespace, " RWBuffer" )
473
- .addTemplateArgumentList ()
474
- .addTypeParameter (" element_type" )
475
- .finalizeTemplateArgs ()
492
+ .addSimpleTemplateParams ({" element_type" })
476
493
.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));
482
505
}
483
506
484
507
void HLSLExternalSemaSource::CompleteType (TagDecl *Tag) {
@@ -496,12 +519,3 @@ void HLSLExternalSemaSource::CompleteType(TagDecl *Tag) {
496
519
return ;
497
520
It->second (Record);
498
521
}
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