module exports and name mangling
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user