yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

CopilotMerge NamePool and RootNamePool into a single type (#7797)3485710e9

master
6.3 KiB371 linesraw
1// slang-fiddle-scrape.h
2#pragma once
3
4#include "compiler-core/slang-lexer.h"
5#include "lua/lauxlib.h"
6#include "slang-fiddle-diagnostics.h"
7
8namespace fiddle
9{
10using namespace Slang;
11
12class Val : public RefObject
13{
14public:
15};
16
17class Node : public Val
18{
19public:
20};
21
22// Grouping Tokens and Trivia
23
24class TokenWithTriviaNode : public RefObject
25{
26public:
27    TokenType getType() const { return token.type; }
28
29    List<Token> leadingTrivia;
30    Token token;
31    List<Token> trailingTrivia;
32    Count skipCount = 0;
33};
34
35struct TokenWithTrivia
36{
37public:
38    TokenWithTrivia() {}
39
40    TokenWithTrivia(RefPtr<TokenWithTriviaNode> node)
41        : node(node)
42    {
43    }
44
45    SourceLoc const& getLoc() const { return node->token.loc; }
46
47    Token const& getToken() const { return node->token; }
48
49    TokenType getType() const { return node ? node->getType() : TokenType::Unknown; }
50
51    UnownedStringSlice getContent() const
52    {
53        return node ? node->token.getContent() : UnownedStringSlice();
54    }
55
56    Count getSkipCount() const { return node ? node->skipCount : 0; }
57
58    void setType(TokenType type) const { node->token.type = type; }
59
60    List<Token> const& getLeadingTrivia() const { return node->leadingTrivia; }
61    List<Token> const& getTrailingTrivia() const { return node->trailingTrivia; }
62
63    operator TokenWithTriviaNode*() { return node; }
64
65private:
66    RefPtr<TokenWithTriviaNode> node;
67};
68
69
70// Syntax
71
72class Declarator : public Node
73{
74};
75
76class NameDeclarator : public Declarator
77{
78public:
79    NameDeclarator(TokenWithTrivia nameToken)
80        : nameToken(nameToken)
81    {
82    }
83
84    TokenWithTrivia nameToken;
85};
86
87class PtrDeclarator : public Declarator
88{
89public:
90    PtrDeclarator(RefPtr<Declarator> base)
91        : base(base)
92    {
93    }
94
95    RefPtr<Declarator> base;
96};
97
98class Expr : public Node
99{
100public:
101};
102
103class ModifierNode : public Node
104{
105};
106
107class AbstractModifier : public ModifierNode
108{
109};
110class HiddenModifier : public ModifierNode
111{
112};
113class TableModifier : public ModifierNode
114{
115public:
116    TableModifier(String s)
117        : tableSource(s)
118    {
119    }
120    String tableSource;
121    int tableRef = LUA_NOREF;
122};
123
124enum class Mode
125{
126    Fiddle,
127    Cpp,
128};
129
130class Decl : public Node
131{
132public:
133    template<typename T>
134    T* findModifier()
135    {
136        for (auto m : modifiers)
137        {
138            if (auto found = as<T>(m))
139                return found;
140        }
141        return nullptr;
142    }
143
144    List<RefPtr<ModifierNode>> modifiers;
145    TokenWithTrivia nameToken;
146    Mode mode = Mode::Cpp;
147};
148
149class ContainerDecl : public Decl
150{
151public:
152    List<RefPtr<Decl>> members;
153    Dictionary<String, RefPtr<Decl>> mapNameToMember;
154};
155
156class LogicalContainerDecl : public ContainerDecl
157{
158};
159
160class LogicalNamespaceBase : public LogicalContainerDecl
161{
162};
163
164class LogicalModule : public LogicalNamespaceBase
165{
166public:
167};
168
169class LogicalNamespace : public LogicalNamespaceBase
170{
171};
172
173class PhysicalContainerDecl : public ContainerDecl
174{
175public:
176    LogicalContainerDecl* logicalVersion = nullptr;
177};
178
179class SourceUnit : public PhysicalContainerDecl
180{
181public:
182};
183
184class PhysicalNamespaceDecl : public PhysicalContainerDecl
185{
186public:
187};
188
189class AggTypeDecl : public ContainerDecl
190{
191public:
192    RefPtr<Expr> directBaseType;
193
194    List<AggTypeDecl*> directSubTypeDecls;
195
196    bool isSubTypeOf(char const* name);
197};
198
199class ClassDecl : public AggTypeDecl
200{
201};
202class StructDecl : public AggTypeDecl
203{
204};
205
206class VarDecl : public Decl
207{
208public:
209    RefPtr<Expr> type;
210    RefPtr<Expr> initExpr;
211};
212
213class FiddleMacroInvocation : public Decl
214{
215public:
216    TokenWithTrivia fiddleToken; // the actual `FIDDLE` identifier
217
218    RefPtr<Node> node; // the node whose generated content should get emitted...
219};
220
221class FiddleLuaCallInvocation : public Decl
222{
223public:
224    TokenWithTrivia fiddleToken; // the actual `FIDDLE` identifier
225    String callString;
226    RefPtr<Node> parentDecl;
227};
228
229class UncheckedExpr : public Expr
230{
231};
232
233class CheckedExpr : public Expr
234{
235};
236
237class NameExpr : public UncheckedExpr
238{
239public:
240    NameExpr(TokenWithTrivia nameToken)
241        : nameToken(nameToken)
242    {
243    }
244
245    TokenWithTrivia nameToken;
246};
247
248class LiteralExpr : public UncheckedExpr
249{
250public:
251    LiteralExpr(TokenWithTrivia token)
252        : token(token)
253    {
254    }
255
256    TokenWithTrivia token;
257};
258
259class MemberExpr : public UncheckedExpr
260{
261public:
262    MemberExpr(RefPtr<Expr> base, TokenWithTrivia memberNameToken)
263        : base(base), memberNameToken(memberNameToken)
264    {
265    }
266
267    RefPtr<Expr> base;
268    TokenWithTrivia memberNameToken;
269};
270
271class StaticMemberRef : public UncheckedExpr
272{
273public:
274    StaticMemberRef(RefPtr<Expr> base, TokenWithTrivia memberNameToken)
275        : base(base), memberNameToken(memberNameToken)
276    {
277    }
278
279    RefPtr<Expr> base;
280    TokenWithTrivia memberNameToken;
281};
282
283typedef Expr Arg;
284
285class PtrType : public UncheckedExpr
286{
287public:
288    PtrType(RefPtr<Expr> base)
289        : base(base)
290    {
291    }
292
293    RefPtr<Expr> base;
294};
295
296class SpecializeExpr : public UncheckedExpr
297{
298public:
299    SpecializeExpr() {}
300
301    RefPtr<Expr> base;
302    List<RefPtr<Expr>> args;
303};
304
305class CallExpr : public UncheckedExpr
306{
307public:
308    CallExpr(RefPtr<Expr> base, List<RefPtr<Arg>> args)
309        : base(base), args(args)
310    {
311    }
312
313    RefPtr<Expr> base;
314    List<RefPtr<Arg>> args;
315};
316
317class DirectDeclRef : public CheckedExpr
318{
319public:
320    DirectDeclRef(Decl* decl)
321        : decl(decl)
322    {
323    }
324
325    Decl* decl = nullptr;
326};
327
328//
329
330Decl* findDecl_(ContainerDecl* outerDecl, UnownedStringSlice const& name);
331
332template<typename T>
333T* findDecl(ContainerDecl* outerDecl, UnownedStringSlice const& name)
334{
335    auto decl = findDecl_(outerDecl, name);
336    if (!decl)
337        return nullptr;
338
339    auto asType = as<T>(decl);
340    if (!asType)
341    {
342        // TODO: might need this case to be an error...
343        return nullptr;
344    }
345
346    return asType;
347}
348
349
350RefPtr<SourceUnit> parseSourceUnit(
351    SourceView* inputSourceView,
352    LogicalModule* logicalModule,
353    NamePool* namePool,
354    DiagnosticSink* sink,
355    SourceManager* sourceManager,
356    String outputFileName);
357
358bool hasAnyFiddleInvocations(SourceUnit* sourceUnit);
359
360void checkModule(LogicalModule* module, DiagnosticSink* sink);
361
362
363void registerScrapedStuffWithScript(LogicalModule* logicalModule);
364
365void emitSourceUnitMacros(
366    SourceUnit* sourceUnit,
367    StringBuilder& builder,
368    DiagnosticSink* sink,
369    SourceManager* sourceManager,
370    LogicalModule* logicalModule);
371} // namespace fiddle