summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-ast-boilerplate.cpp
blob: 54f5f9bb1730bf1a570621992f9928155a9aa0cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// slang-ast-boilerplate.cpp

#include "slang-ast-all.h"
#include "slang-ast-builder.h"
#include "slang-ast-forward-declarations.h"

namespace Slang
{
template<typename T>
struct Helper
{
    static void* create(ASTBuilder* builder) { return builder->createImpl<T>(); }

    static void destruct(void* obj) { ((T*)obj)->~T(); }
};

#if 0 // FIDDLE TEMPLATE:
%for _,T in ipairs(Slang.NodeBase.subclasses) do
const SyntaxClassInfo $T::kSyntaxClassInfo = {
    "$T",
    $(T.getDebugVisType),
    ASTNodeType::$T,
    $(#T.subclasses),
%  if T.isAbstract then
    nullptr, // create
    nullptr, // destruct
%  else
    &Helper<$T>::create,
    &Helper<$T>::destruct,
%  end
};
%end
#else // FIDDLE OUTPUT:
#define FIDDLE_GENERATED_OUTPUT_ID 0
#include "slang-ast-boilerplate.cpp.fiddle"
#endif // FIDDLE END

static SyntaxClassInfo const* kAllSyntaxClasses[] = {
#if 0 // FIDDLE TEMPLATE:
%for _,T in ipairs(Slang.NodeBase.subclasses) do
    &$T::kSyntaxClassInfo,
%end
#else // FIDDLE OUTPUT:
#define FIDDLE_GENERATED_OUTPUT_ID 1
#include "slang-ast-boilerplate.cpp.fiddle"
#endif // FIDDLE END
};

SyntaxClassBase::SyntaxClassBase(ASTNodeType tag)
{
    assert(int(tag) >= 0 && int(tag) < SLANG_COUNT_OF(kAllSyntaxClasses));
    _info = kAllSyntaxClasses[int(tag)];
}

} // namespace Slang