Source code for crosstl.backend.slang.SlangAst
"""Slang AST Node definitions"""
from ..common_ast import (
ASTNode,
AssignmentNode,
BinaryOpNode,
ForNode,
FunctionCallNode,
FunctionNode,
IfNode,
MemberAccessNode,
ReturnNode,
ShaderNode,
StructNode,
TernaryOpNode,
UnaryOpNode,
VariableNode,
VectorConstructorNode,
)
# Keep common AST imports used for re-exports (autoflake-safe).
_COMMON_NODES = (
AssignmentNode,
BinaryOpNode,
ForNode,
FunctionCallNode,
FunctionNode,
IfNode,
MemberAccessNode,
ReturnNode,
ShaderNode,
StructNode,
TernaryOpNode,
UnaryOpNode,
VariableNode,
VectorConstructorNode,
)
# Slang-specific nodes
[docs]
class ImportNode(ASTNode):
"""Node representing an import statement"""
def __init__(self, module_path, imported_items=None, alias=None):
self.module_path = module_path
self.imported_items = imported_items or []
self.alias = alias
def __repr__(self):
return f"ImportNode(module_path={self.module_path}, imported_items={self.imported_items}, alias={self.alias})"
[docs]
class ExportNode(ASTNode):
"""Node representing an export statement"""
def __init__(self, exported_items):
self.exported_items = exported_items
def __repr__(self):
return f"ExportNode(exported_items={self.exported_items})"
[docs]
class TypedefNode(ASTNode):
"""Node representing a type alias"""
def __init__(self, name, target_type):
self.name = name
self.target_type = target_type
def __repr__(self):
return f"TypedefNode(name={self.name}, target_type={self.target_type})"
[docs]
class GenericNode(ASTNode):
"""Node representing a generic type parameter"""
def __init__(self, name, constraints=None):
self.name = name
self.constraints = constraints or []
def __repr__(self):
return f"GenericNode(name={self.name}, constraints={self.constraints})"
[docs]
class ExtensionNode(ASTNode):
"""Node representing a Slang extension"""
def __init__(self, extended_type, methods):
self.extended_type = extended_type
self.methods = methods
def __repr__(self):
return f"ExtensionNode(extended_type={self.extended_type}, methods={len(self.methods)})"