using NubLang.Tokenization;

namespace NubLang.Parsing.Syntax;

public abstract record TypeSyntax(List<Token> Tokens) : SyntaxNode(Tokens);

public record FuncTypeSyntax(List<Token> Tokens, List<TypeSyntax> Parameters, TypeSyntax ReturnType) : TypeSyntax(Tokens);

public record PointerTypeSyntax(List<Token> Tokens, TypeSyntax BaseType) : TypeSyntax(Tokens);

public record VoidTypeSyntax(List<Token> Tokens) : TypeSyntax(Tokens);

public record IntTypeSyntax(List<Token> Tokens, bool Signed, int Width) : TypeSyntax(Tokens);

public record FloatTypeSyntax(List<Token> Tokens, int Width) : TypeSyntax(Tokens);

public record BoolTypeSyntax(List<Token> Tokens) : TypeSyntax(Tokens);

public record StringTypeSyntax(List<Token> Tokens) : TypeSyntax(Tokens);

public record CStringTypeSyntax(List<Token> Tokens) : TypeSyntax(Tokens);

public record ArrayTypeSyntax(List<Token> Tokens, TypeSyntax BaseType) : TypeSyntax(Tokens);

public record CustomTypeSyntax(List<Token> Tokens, string Module, string Name) : TypeSyntax(Tokens);

public record StructTemplateTypeSyntax(List<Token> Tokens, List<TypeSyntax> TemplateParameters, string Module, string Name) : TypeSyntax(Tokens);

public record SubstitutionTypeSyntax(List<Token> Tokens, string Name) : TypeSyntax(Tokens);