module exports and name mangling

This commit is contained in:
nub31
2026-02-10 20:33:27 +01:00
parent 6ae10d5f90
commit 7872a4b6b8
7 changed files with 139 additions and 48 deletions

View File

@@ -43,8 +43,38 @@ public sealed class Parser(string fileName, List<Token> tokens)
{
var startIndex = index;
Dictionary<Keyword, TokenKeyword> modifiers = [];
while (true)
{
if (Peek() is TokenKeyword keyword)
{
switch (keyword.Keyword)
{
case Keyword.Export:
Next();
modifiers[Keyword.Export] = keyword;
break;
case Keyword.Packed:
Next();
modifiers[Keyword.Packed] = keyword;
break;
default:
goto modifier_done;
}
}
}
modifier_done:
if (TryExpectKeyword(Keyword.Func))
{
var exported = modifiers.Remove(Keyword.Export);
foreach (var modifier in modifiers)
// todo(nub31): Add to diagnostics instead of throwing
throw new CompileException(Diagnostic.Error("Invalid modifier for function").At(fileName, modifier.Value).Build());
var name = ExpectIdent();
var parameters = new List<NodeDefinitionFunc.Param>();
@@ -63,11 +93,18 @@ public sealed class Parser(string fileName, List<Token> tokens)
var body = ParseStatement();
return new NodeDefinitionFunc(TokensFrom(startIndex), name, parameters, body, returnType);
return new NodeDefinitionFunc(TokensFrom(startIndex), exported, name, parameters, body, returnType);
}
if (TryExpectKeyword(Keyword.Struct))
{
var exported = modifiers.Remove(Keyword.Export);
var packed = modifiers.Remove(Keyword.Packed);
foreach (var modifier in modifiers)
// todo(nub31): Add to diagnostics instead of throwing
throw new CompileException(Diagnostic.Error("Invalid modifier for struct").At(fileName, modifier.Value).Build());
var name = ExpectIdent();
var fields = new List<NodeDefinitionStruct.Field>();
@@ -81,7 +118,7 @@ public sealed class Parser(string fileName, List<Token> tokens)
fields.Add(new NodeDefinitionStruct.Field(TokensFrom(fieldStartIndex), fieldName, fieldType));
}
return new NodeDefinitionStruct(TokensFrom(startIndex), name, fields);
return new NodeDefinitionStruct(TokensFrom(startIndex), exported, packed, name, fields);
}
throw new CompileException(Diagnostic.Error("Not a valid definition").At(fileName, Peek()).Build());
@@ -556,8 +593,9 @@ public abstract class Node(List<Token> tokens)
public abstract class NodeDefinition(List<Token> tokens) : Node(tokens);
public sealed class NodeDefinitionFunc(List<Token> tokens, TokenIdent name, List<NodeDefinitionFunc.Param> parameters, NodeStatement body, NodeType returnType) : NodeDefinition(tokens)
public sealed class NodeDefinitionFunc(List<Token> tokens, bool exported, TokenIdent name, List<NodeDefinitionFunc.Param> parameters, NodeStatement body, NodeType returnType) : NodeDefinition(tokens)
{
public bool Exported { get; } = exported;
public TokenIdent Name { get; } = name;
public List<Param> Parameters { get; } = parameters;
public NodeStatement Body { get; } = body;
@@ -570,8 +608,10 @@ public sealed class NodeDefinitionFunc(List<Token> tokens, TokenIdent name, List
}
}
public sealed class NodeDefinitionStruct(List<Token> tokens, TokenIdent name, List<NodeDefinitionStruct.Field> fields) : NodeDefinition(tokens)
public sealed class NodeDefinitionStruct(List<Token> tokens, bool exported, bool packed, TokenIdent name, List<NodeDefinitionStruct.Field> fields) : NodeDefinition(tokens)
{
public bool Exported { get; } = exported;
public bool Packed { get; } = packed;
public TokenIdent Name { get; } = name;
public List<Field> Fields { get; } = fields;