yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
3485710e9
master
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 : 27TokenType getType ()const {return token .type ; } 28 29List < Token > leadingTrivia ; 30Token token ; 31List < Token > trailingTrivia ; 32Count skipCount = 0 ; 33}; 34 35struct TokenWithTrivia 36{ 37public : 38TokenWithTrivia () {} 39 40TokenWithTrivia (RefPtr < TokenWithTriviaNode > node ) 41 :node (node ) 42 { 43 } 44 45SourceLoc const & getLoc ()const {return node -> token .loc ; } 46 47Token const & getToken ()const {return node -> token ; } 48 49TokenType getType ()const {return node ?node -> getType () :TokenType ::Unknown ; } 50 51UnownedStringSlice getContent ()const 52 { 53return node ?node -> token .getContent () :UnownedStringSlice (); 54 } 55 56Count getSkipCount ()const {return node ?node -> skipCount :0 ; } 57 58void setType (TokenType type )const {node -> token .type = type ; } 59 60List < Token > const & getLeadingTrivia ()const {return node -> leadingTrivia ; } 61List < Token > const & getTrailingTrivia ()const {return node -> trailingTrivia ; } 62 63operator TokenWithTriviaNode * () {return node ; } 64 65private : 66RefPtr < TokenWithTriviaNode > node ; 67}; 68 69 70// Syntax 71 72class Declarator :public Node 73{ 74}; 75 76class NameDeclarator :public Declarator 77{ 78public : 79NameDeclarator (TokenWithTrivia nameToken ) 80 :nameToken (nameToken ) 81 { 82 } 83 84TokenWithTrivia nameToken ; 85}; 86 87class PtrDeclarator :public Declarator 88{ 89public : 90PtrDeclarator (RefPtr < Declarator > base ) 91 :base (base ) 92 { 93 } 94 95RefPtr < 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 : 116TableModifier (String s ) 117 :tableSource (s ) 118 { 119 } 120String tableSource ; 121int tableRef = LUA_NOREF ; 122}; 123 124enum class Mode 125{ 126Fiddle , 127Cpp , 128}; 129 130class Decl :public Node 131{ 132public : 133template < typename T > 134T * findModifier () 135 { 136for (autom :modifiers ) 137 { 138if (autofound = as < T > (m )) 139return found ; 140 } 141return nullptr ; 142 } 143 144List < RefPtr < ModifierNode >>modifiers ; 145TokenWithTrivia nameToken ; 146Mode mode = Mode ::Cpp ; 147}; 148 149class ContainerDecl :public Decl 150{ 151public : 152List < RefPtr < Decl >>members ; 153Dictionary < 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 : 176LogicalContainerDecl * 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 : 192RefPtr < Expr > directBaseType ; 193 194List < AggTypeDecl *> directSubTypeDecls ; 195 196bool 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 : 209RefPtr < Expr > type ; 210RefPtr < Expr > initExpr ; 211}; 212 213class FiddleMacroInvocation :public Decl 214{ 215public : 216TokenWithTrivia fiddleToken ;// the actual `FIDDLE` identifier 217 218RefPtr < Node > node ;// the node whose generated content should get emitted... 219}; 220 221class FiddleLuaCallInvocation :public Decl 222{ 223public : 224TokenWithTrivia fiddleToken ;// the actual `FIDDLE` identifier 225String callString ; 226RefPtr < Node > parentDecl ; 227}; 228 229class UncheckedExpr :public Expr 230{ 231}; 232 233class CheckedExpr :public Expr 234{ 235}; 236 237class NameExpr :public UncheckedExpr 238{ 239public : 240NameExpr (TokenWithTrivia nameToken ) 241 :nameToken (nameToken ) 242 { 243 } 244 245TokenWithTrivia nameToken ; 246}; 247 248class LiteralExpr :public UncheckedExpr 249{ 250public : 251LiteralExpr (TokenWithTrivia token ) 252 :token (token ) 253 { 254 } 255 256TokenWithTrivia token ; 257}; 258 259class MemberExpr :public UncheckedExpr 260{ 261public : 262MemberExpr (RefPtr < Expr > base ,TokenWithTrivia memberNameToken ) 263 :base (base ),memberNameToken (memberNameToken ) 264 { 265 } 266 267RefPtr < Expr > base ; 268TokenWithTrivia memberNameToken ; 269}; 270 271class StaticMemberRef :public UncheckedExpr 272{ 273public : 274StaticMemberRef (RefPtr < Expr > base ,TokenWithTrivia memberNameToken ) 275 :base (base ),memberNameToken (memberNameToken ) 276 { 277 } 278 279RefPtr < Expr > base ; 280TokenWithTrivia memberNameToken ; 281}; 282 283typedef Expr Arg ; 284 285class PtrType :public UncheckedExpr 286{ 287public : 288PtrType (RefPtr < Expr > base ) 289 :base (base ) 290 { 291 } 292 293RefPtr < Expr > base ; 294}; 295 296class SpecializeExpr :public UncheckedExpr 297{ 298public : 299SpecializeExpr () {} 300 301RefPtr < Expr > base ; 302List < RefPtr < Expr >>args ; 303}; 304 305class CallExpr :public UncheckedExpr 306{ 307public : 308CallExpr (RefPtr < Expr > base ,List < RefPtr < Arg >>args ) 309 :base (base ),args (args ) 310 { 311 } 312 313RefPtr < Expr > base ; 314List < RefPtr < Arg >>args ; 315}; 316 317class DirectDeclRef :public CheckedExpr 318{ 319public : 320DirectDeclRef (Decl * decl ) 321 :decl (decl ) 322 { 323 } 324 325Decl * 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 autodecl = findDecl_ (outerDecl ,name ); 336if (!decl ) 337return nullptr ; 338 339 autoasType = as < T > (decl); 340if (!asType) 341{ 342// TODO: might need this case to be an error... 343return nullptr ; 344} 345 346return asType; 347} 348 349 350RefPtr < SourceUnit > parseSourceUnit ( 351SourceView * inputSourceView, 352LogicalModule * logicalModule, 353NamePool * namePool, 354DiagnosticSink * sink, 355SourceManager * sourceManager, 356String outputFileName); 357 358bool hasAnyFiddleInvocations ( SourceUnit * sourceUnit); 359 360void checkModule ( LogicalModule * module, DiagnosticSink * sink); 361 362 363void registerScrapedStuffWithScript ( LogicalModule * logicalModule); 364 365void emitSourceUnitMacros ( 366SourceUnit * sourceUnit, 367StringBuilder & builder, 368DiagnosticSink * sink, 369SourceManager * sourceManager, 370LogicalModule * logicalModule); 371} // namespace fiddle