Anon funcs works
This commit is contained in:
@@ -67,19 +67,19 @@ public partial class QBEGenerator
|
||||
|
||||
foreach (var funcDef in _syntaxTree.Definitions.OfType<BoundLocalFunc>())
|
||||
{
|
||||
EmitFuncDefinition(funcDef, LocalFuncName(funcDef), funcDef.Parameters, funcDef.ReturnType, funcDef.Body);
|
||||
EmitFuncDefinition(LocalFuncName(funcDef), funcDef.Signature.Parameters, funcDef.Signature.ReturnType, funcDef.Body);
|
||||
_writer.NewLine();
|
||||
}
|
||||
|
||||
while (_anonymousFunctions.TryDequeue(out var anon))
|
||||
{
|
||||
EmitFuncDefinition(anon.Func, anon.Name, anon.Func.Parameters, anon.Func.ReturnType, anon.Func.Body);
|
||||
EmitFuncDefinition(anon.Name, anon.Func.Parameters, anon.Func.ReturnType, anon.Func.Body);
|
||||
_writer.NewLine();
|
||||
}
|
||||
|
||||
foreach (var (impl, name) in _implFunctions)
|
||||
{
|
||||
EmitFuncDefinition(impl, name, impl.Parameters, impl.ReturnType, impl.Body);
|
||||
EmitFuncDefinition(name, impl.Signature.Parameters, impl.Signature.ReturnType, impl.Body);
|
||||
_writer.NewLine();
|
||||
}
|
||||
|
||||
@@ -347,8 +347,10 @@ public partial class QBEGenerator
|
||||
return "l";
|
||||
}
|
||||
|
||||
private void EmitFuncDefinition(BoundNode debugNode, string name, List<BoundFuncParameter> parameters, NubType returnType, BoundBlock body)
|
||||
private void EmitFuncDefinition(string name, IEnumerable<BoundFuncParameter> parameters, NubType returnType, BoundBlock body)
|
||||
{
|
||||
var parameterArray = parameters.ToArray();
|
||||
|
||||
_variables.Clear();
|
||||
_variableScopes.Clear();
|
||||
_labelIndex = 0;
|
||||
@@ -364,14 +366,13 @@ public partial class QBEGenerator
|
||||
|
||||
builder.Append(name);
|
||||
|
||||
var parameterStrings = parameters.Select(x => FuncQBETypeName(x.Type) + $" %{x.Name}");
|
||||
var parameterStrings = parameterArray.Select(x => FuncQBETypeName(x.Type) + $" %{x.Name}");
|
||||
|
||||
builder.Append($"({string.Join(", ", parameterStrings)})");
|
||||
|
||||
_writer.StartFunction(builder.ToString());
|
||||
_writer.WriteDebugLocation(debugNode);
|
||||
|
||||
var parameterVars = parameters.Select(parameter => new Variable(parameter.Name, new Val("%" + parameter.Name, parameter.Type, ValKind.Direct))).ToList();
|
||||
var parameterVars = parameterArray.Select(parameter => new Variable(parameter.Name, new Val("%" + parameter.Name, parameter.Type, ValKind.Direct))).ToList();
|
||||
|
||||
EmitBlock(body, parameterVars);
|
||||
|
||||
@@ -438,7 +439,7 @@ public partial class QBEGenerator
|
||||
|
||||
foreach (var func in traitDef.Functions)
|
||||
{
|
||||
_writer.Indented($"l, # func {func.Name}({string.Join(", ", func.Parameters.Select(x => $"{x.Name}: {x.Type}"))}): {func.ReturnType}");
|
||||
_writer.Indented($"l, # func {func.Name}({string.Join(", ", func.Signature.Parameters.Select(x => $"{x.Name}: {x.Type}"))}): {func.Signature.ReturnType}");
|
||||
}
|
||||
|
||||
_writer.WriteLine("}");
|
||||
|
||||
Reference in New Issue
Block a user