remove generics for now

This commit is contained in:
nub31
2025-07-22 20:08:51 +02:00
parent ae95a1f808
commit 2d2d346da0
5 changed files with 32 additions and 125 deletions

View File

@@ -1,27 +1,6 @@
struct Box<T>
{
value: T
}
func main(args: []cstring): i64 func main(args: []cstring): i64
{ {
let box = alloc Box<cstring> c::puts("test")
{
value = "bob"
}
let box2 = alloc Box<cstring>
{
value = "bob"
}
let box3 = alloc Box<u8>
{
value = 23
}
c::puts(box.value)
return 0 return 0
} }

View File

@@ -7,7 +7,6 @@ using NubLang.Generation;
using NubLang.Generation.QBE; using NubLang.Generation.QBE;
using NubLang.Syntax.Binding; using NubLang.Syntax.Binding;
using NubLang.Syntax.Binding.Node; using NubLang.Syntax.Binding.Node;
using NubLang.Syntax.Generics;
using NubLang.Syntax.Parsing; using NubLang.Syntax.Parsing;
using NubLang.Syntax.Parsing.Node; using NubLang.Syntax.Parsing.Node;
using NubLang.Syntax.Tokenization; using NubLang.Syntax.Tokenization;
@@ -95,9 +94,6 @@ foreach (var file in options.Files)
syntaxTrees[file] = syntaxTree; syntaxTrees[file] = syntaxTree;
} }
var genericInstantiator = new GenericInstantiator(syntaxTrees.Values);
genericInstantiator.Visit();
var definitionTable = new DefinitionTable(syntaxTrees.Values); var definitionTable = new DefinitionTable(syntaxTrees.Values);
var boundSyntaxTrees = new Dictionary<string, BoundSyntaxTree>(); var boundSyntaxTrees = new Dictionary<string, BoundSyntaxTree>();

View File

@@ -3,12 +3,7 @@ using NubLang.Syntax.Tokenization;
namespace NubLang.Syntax.Parsing.Node; namespace NubLang.Syntax.Parsing.Node;
public record GenericParameter(IReadOnlyList<Token> Tokens, string Name) : SyntaxNode(Tokens) public abstract record DefinitionSyntax(IReadOnlyList<Token> Tokens, string Namespace) : SyntaxNode(Tokens);
{
public override IEnumerable<SyntaxNode> GetChildren() => [];
}
public abstract record DefinitionSyntax(IReadOnlyList<Token> Tokens, string Namespace, IReadOnlyList<GenericParameter> Parameters) : SyntaxNode(Tokens);
public record FuncParameterSyntax(IReadOnlyList<Token> Tokens, string Name, TypeSyntax Type) : SyntaxNode(Tokens) public record FuncParameterSyntax(IReadOnlyList<Token> Tokens, string Name, TypeSyntax Type) : SyntaxNode(Tokens)
{ {
@@ -31,29 +26,19 @@ public record FuncSignatureSyntax(IReadOnlyList<Token> Tokens, IReadOnlyList<Fun
} }
} }
public record LocalFuncSyntax(IReadOnlyList<Token> Tokens, string Namespace, IReadOnlyList<GenericParameter> Parameters, string Name, FuncSignatureSyntax Signature, BlockSyntax Body) : DefinitionSyntax(Tokens, Namespace, Parameters) public record LocalFuncSyntax(IReadOnlyList<Token> Tokens, string Namespace, string Name, FuncSignatureSyntax Signature, BlockSyntax Body) : DefinitionSyntax(Tokens, Namespace)
{ {
public override IEnumerable<SyntaxNode> GetChildren() public override IEnumerable<SyntaxNode> GetChildren()
{ {
foreach (var parameter in Parameters)
{
yield return parameter;
}
yield return Signature; yield return Signature;
yield return Body; yield return Body;
} }
} }
public record ExternFuncSyntax(IReadOnlyList<Token> Tokens, string Namespace, IReadOnlyList<GenericParameter> Parameters, string Name, string CallName, FuncSignatureSyntax Signature) : DefinitionSyntax(Tokens, Namespace, Parameters) public record ExternFuncSyntax(IReadOnlyList<Token> Tokens, string Namespace, string Name, string CallName, FuncSignatureSyntax Signature) : DefinitionSyntax(Tokens, Namespace)
{ {
public override IEnumerable<SyntaxNode> GetChildren() public override IEnumerable<SyntaxNode> GetChildren()
{ {
foreach (var parameter in Parameters)
{
yield return parameter;
}
yield return Signature; yield return Signature;
} }
} }
@@ -79,15 +64,10 @@ public record StructFuncSyntax(IReadOnlyList<Token> Tokens, string Name, FuncSig
} }
} }
public record StructSyntax(IReadOnlyList<Token> Tokens, string Namespace, IReadOnlyList<GenericParameter> Parameters, string Name, IReadOnlyList<StructFieldSyntax> Fields, IReadOnlyList<StructFuncSyntax> Functions) : DefinitionSyntax(Tokens, Namespace, Parameters) public record StructSyntax(IReadOnlyList<Token> Tokens, string Namespace, string Name, IReadOnlyList<StructFieldSyntax> Fields, IReadOnlyList<StructFuncSyntax> Functions) : DefinitionSyntax(Tokens, Namespace)
{ {
public override IEnumerable<SyntaxNode> GetChildren() public override IEnumerable<SyntaxNode> GetChildren()
{ {
foreach (var parameter in Parameters)
{
yield return parameter;
}
foreach (var field in Fields) foreach (var field in Fields)
{ {
yield return field; yield return field;
@@ -108,15 +88,10 @@ public record InterfaceFuncSyntax(IReadOnlyList<Token> Tokens, string Name, Func
} }
} }
public record InterfaceSyntax(IReadOnlyList<Token> Tokens, string Namespace, IReadOnlyList<GenericParameter> Parameters, string Name, IReadOnlyList<InterfaceFuncSyntax> Functions) : DefinitionSyntax(Tokens, Namespace, Parameters) public record InterfaceSyntax(IReadOnlyList<Token> Tokens, string Namespace, string Name, IReadOnlyList<InterfaceFuncSyntax> Functions) : DefinitionSyntax(Tokens, Namespace)
{ {
public override IEnumerable<SyntaxNode> GetChildren() public override IEnumerable<SyntaxNode> GetChildren()
{ {
foreach (var parameter in Parameters)
{
yield return parameter;
}
foreach (var func in Functions) foreach (var func in Functions)
{ {
yield return func; yield return func;

View File

@@ -29,7 +29,7 @@ public abstract record TypeSyntax(IReadOnlyList<Token> Tokens) : SyntaxNode(Toke
StringTypeSyntax => "string", StringTypeSyntax => "string",
PointerTypeSyntax ptr => $"ptr_{ptr.BaseType.MangledName()}", PointerTypeSyntax ptr => $"ptr_{ptr.BaseType.MangledName()}",
ArrayTypeSyntax arr => $"arr_{arr.BaseType.MangledName()}", ArrayTypeSyntax arr => $"arr_{arr.BaseType.MangledName()}",
CustomTypeSyntax custom => $"{custom.Namespace}_{custom.Name}_{string.Join("_", custom.Arguments.Select(x => x.MangledName()))}", CustomTypeSyntax custom => $"{custom.Namespace}_{custom.Name}",
FuncTypeSyntax func => $"func_{string.Join("_", func.Parameters.Select(x => x.MangledName()))}_to_{func.ReturnType.MangledName()}", FuncTypeSyntax func => $"func_{string.Join("_", func.Parameters.Select(x => x.MangledName()))}_to_{func.ReturnType.MangledName()}",
_ => throw new NotSupportedException($"Unknown type syntax: {GetType().Name}") _ => throw new NotSupportedException($"Unknown type syntax: {GetType().Name}")
}; };
@@ -77,18 +77,7 @@ public record StringTypeSyntax(IReadOnlyList<Token> Tokens) : TypeSyntax(Tokens)
public override IEnumerable<SyntaxNode> GetChildren() => []; public override IEnumerable<SyntaxNode> GetChildren() => [];
} }
public record CustomTypeSyntax(IReadOnlyList<Token> Tokens, string Namespace, string Name, IReadOnlyList<TypeSyntax> Arguments) : TypeSyntax(Tokens) public record CustomTypeSyntax(IReadOnlyList<Token> Tokens, string Namespace, string Name) : TypeSyntax(Tokens)
{
public override IEnumerable<SyntaxNode> GetChildren()
{
foreach (var argument in Arguments)
{
yield return argument;
}
}
}
public record GenericTypeSyntax(IReadOnlyList<Token> Tokens, string Name) : TypeSyntax(Tokens)
{ {
public override IEnumerable<SyntaxNode> GetChildren() => []; public override IEnumerable<SyntaxNode> GetChildren() => [];
} }

View File

@@ -12,7 +12,6 @@ public sealed class Parser
private readonly IReadOnlyList<Token> _tokens; private readonly IReadOnlyList<Token> _tokens;
private readonly List<Diagnostic> _diagnostics = []; private readonly List<Diagnostic> _diagnostics = [];
private List<GenericParameter> _genericParameters = [];
private int _tokenIndex; private int _tokenIndex;
public Parser(IReadOnlyList<Token> tokens) public Parser(IReadOnlyList<Token> tokens)
@@ -24,7 +23,6 @@ public sealed class Parser
public SyntaxTree Parse() public SyntaxTree Parse()
{ {
_diagnostics.Clear(); _diagnostics.Clear();
_genericParameters = [];
_tokenIndex = 0; _tokenIndex = 0;
if (TryExpectSymbol(Symbol.Namespace)) if (TryExpectSymbol(Symbol.Namespace))
@@ -36,40 +34,18 @@ public sealed class Parser
while (Peek().HasValue) while (Peek().HasValue)
{ {
_genericParameters = [];
var startIndex = _tokenIndex; var startIndex = _tokenIndex;
try try
{ {
var keyword = ExpectSymbol(); var keyword = ExpectSymbol();
var name = ExpectIdentifier();
if (TryExpectSymbol(Symbol.LessThan))
{
while (!TryExpectSymbol(Symbol.GreaterThan))
{
var argumentStartIndex = _tokenIndex;
var identifier = ExpectIdentifier();
if (!TryExpectSymbol(Symbol.Comma) && Peek().TryGetValue(out var token) && token is not SymbolToken { Symbol: Symbol.GreaterThan })
{
_diagnostics.Add(Diagnostic
.Warning("Missing comma between template parameters")
.WithHelp("Add a ',' to separate parameters")
.At(token)
.Build());
}
var parameter = new GenericParameter(GetTokens(argumentStartIndex), identifier.Value);
_genericParameters.Add(parameter);
}
}
var definition = keyword.Symbol switch var definition = keyword.Symbol switch
{ {
Symbol.Extern => ParseExtern(startIndex, name, _genericParameters), Symbol.Extern => ParseExtern(startIndex),
Symbol.Func => ParseFunc(startIndex, name, _genericParameters), Symbol.Func => ParseFunc(startIndex),
Symbol.Struct => ParseStruct(startIndex, name, _genericParameters), Symbol.Struct => ParseStruct(startIndex),
Symbol.Interface => ParseInterface(startIndex, name, _genericParameters), Symbol.Interface => ParseInterface(startIndex),
_ => throw new ParseException(Diagnostic _ => throw new ParseException(Diagnostic
.Error($"Expected 'extern', 'func', 'struct', 'trait' or 'impl' but found '{keyword.Symbol}'") .Error($"Expected 'extern', 'func', 'struct', 'trait' or 'impl' but found '{keyword.Symbol}'")
.WithHelp("Valid definition keywords are 'extern', 'func', 'struct', 'trait' and 'impl'") .WithHelp("Valid definition keywords are 'extern', 'func', 'struct', 'trait' and 'impl'")
@@ -140,18 +116,21 @@ public sealed class Parser
return new FuncParameterSyntax(GetTokens(startIndex), name.Value, type); return new FuncParameterSyntax(GetTokens(startIndex), name.Value, type);
} }
private DefinitionSyntax ParseExtern(int startIndex, IdentifierToken name, IReadOnlyList<GenericParameter> genericParameters) private DefinitionSyntax ParseExtern(int startIndex)
{ {
var keyword = ExpectSymbol(); var keyword = ExpectSymbol();
return keyword.Symbol switch return keyword.Symbol switch
{ {
Symbol.Func => ParseExternFunc(startIndex, name, genericParameters), Symbol.Func => ParseExternFunc(startIndex),
_ => throw new ParseException(Diagnostic.Error($"Unexpected symbol {keyword.Symbol} after extern declaration").At(keyword).Build()) _ => throw new ParseException(Diagnostic.Error($"Unexpected symbol {keyword.Symbol} after extern declaration").At(keyword).Build())
}; };
} }
private ExternFuncSyntax ParseExternFunc(int startIndex, IdentifierToken name, IReadOnlyList<GenericParameter> genericParameters) private ExternFuncSyntax ParseExternFunc(int startIndex)
{ {
var name = ExpectIdentifier();
var callName = name.Value; var callName = name.Value;
if (TryExpectSymbol(Symbol.Calls)) if (TryExpectSymbol(Symbol.Calls))
@@ -161,19 +140,22 @@ public sealed class Parser
var signature = ParseFuncSignature(); var signature = ParseFuncSignature();
return new ExternFuncSyntax(GetTokens(startIndex), _namespace, genericParameters, name.Value, callName, signature); return new ExternFuncSyntax(GetTokens(startIndex), _namespace, name.Value, callName, signature);
} }
private LocalFuncSyntax ParseFunc(int startIndex, IdentifierToken name, IReadOnlyList<GenericParameter> genericParameters) private LocalFuncSyntax ParseFunc(int startIndex)
{ {
var name = ExpectIdentifier();
var signature = ParseFuncSignature(); var signature = ParseFuncSignature();
var body = ParseBlock(); var body = ParseBlock();
return new LocalFuncSyntax(GetTokens(startIndex), _namespace, genericParameters, name.Value, signature, body); return new LocalFuncSyntax(GetTokens(startIndex), _namespace, name.Value, signature, body);
} }
private DefinitionSyntax ParseStruct(int startIndex, IdentifierToken name, IReadOnlyList<GenericParameter> genericParameters) private DefinitionSyntax ParseStruct(int startIndex)
{ {
var name = ExpectIdentifier();
ExpectSymbol(Symbol.OpenBrace); ExpectSymbol(Symbol.OpenBrace);
List<StructFieldSyntax> fields = []; List<StructFieldSyntax> fields = [];
@@ -188,7 +170,7 @@ public sealed class Parser
if (TryExpectSymbol(Symbol.Func)) if (TryExpectSymbol(Symbol.Func))
{ {
var funcName = ExpectIdentifier().Value; var funcName = ExpectIdentifier().Value;
var thisArg = new FuncParameterSyntax([], "this", new CustomTypeSyntax([], _namespace, name.Value, genericParameters.Select(x => new GenericTypeSyntax(x.Tokens, x.Name)).ToList())); var thisArg = new FuncParameterSyntax([], "this", new CustomTypeSyntax([], _namespace, name.Value));
var funcSignature = ParseFuncSignature(thisArg); var funcSignature = ParseFuncSignature(thisArg);
var funcBody = ParseBlock(); var funcBody = ParseBlock();
@@ -211,11 +193,13 @@ public sealed class Parser
} }
} }
return new StructSyntax(GetTokens(startIndex), _namespace, genericParameters, name.Value, fields, funcs); return new StructSyntax(GetTokens(startIndex), _namespace, name.Value, fields, funcs);
} }
private InterfaceSyntax ParseInterface(int startIndex, IdentifierToken name, IReadOnlyList<GenericParameter> genericParameters) private InterfaceSyntax ParseInterface(int startIndex)
{ {
var name = ExpectIdentifier();
ExpectSymbol(Symbol.OpenBrace); ExpectSymbol(Symbol.OpenBrace);
List<InterfaceFuncSyntax> functions = []; List<InterfaceFuncSyntax> functions = [];
@@ -232,7 +216,7 @@ public sealed class Parser
functions.Add(new InterfaceFuncSyntax(GetTokens(funcStartIndex), funcName, signature)); functions.Add(new InterfaceFuncSyntax(GetTokens(funcStartIndex), funcName, signature));
} }
return new InterfaceSyntax(GetTokens(startIndex), _namespace, genericParameters, name.Value, functions); return new InterfaceSyntax(GetTokens(startIndex), _namespace, name.Value, functions);
} }
private StatementSyntax ParseStatement() private StatementSyntax ParseStatement()
@@ -646,12 +630,6 @@ public sealed class Parser
if (TryExpectIdentifier(out var name)) if (TryExpectIdentifier(out var name))
{ {
var genericParameter = _genericParameters.FirstOrDefault(x => x.Name == name.Value);
if (genericParameter != null)
{
return new GenericTypeSyntax(GetTokens(startIndex), genericParameter.Name);
}
return name.Value switch return name.Value switch
{ {
"void" => new VoidTypeSyntax(GetTokens(startIndex)), "void" => new VoidTypeSyntax(GetTokens(startIndex)),
@@ -679,17 +657,7 @@ public sealed class Parser
@namespace = ExpectIdentifier().Value; @namespace = ExpectIdentifier().Value;
} }
var parameters = new List<TypeSyntax>(); return new CustomTypeSyntax(GetTokens(startIndex), @namespace, name.Value);
if (TryExpectSymbol(Symbol.LessThan))
{
while (!TryExpectSymbol(Symbol.GreaterThan))
{
parameters.Add(ParseType());
}
}
return new CustomTypeSyntax(GetTokens(startIndex), @namespace, name.Value, parameters);
} }
} }