WIP: dev #1
@@ -121,7 +121,6 @@ public class Generator
|
|||||||
private readonly ModuleGraph moduleGraph;
|
private readonly ModuleGraph moduleGraph;
|
||||||
private readonly string? entryPoint;
|
private readonly string? entryPoint;
|
||||||
private IndentedTextWriter writer = new();
|
private IndentedTextWriter writer = new();
|
||||||
private readonly HashSet<NubType> referencedTypes = [];
|
|
||||||
private readonly Dictionary<string, string> referencedStringLiterals = [];
|
private readonly Dictionary<string, string> referencedStringLiterals = [];
|
||||||
private readonly HashSet<NubType> emittedTypes = [];
|
private readonly HashSet<NubType> emittedTypes = [];
|
||||||
private readonly Stack<Scope> scopes = new();
|
private readonly Stack<Scope> scopes = new();
|
||||||
@@ -152,9 +151,9 @@ public class Generator
|
|||||||
if (info.Source == Module.DefinitionSource.Internal && !info.Extern && !info.Exported)
|
if (info.Source == Module.DefinitionSource.Internal && !info.Extern && !info.Exported)
|
||||||
writer.Write("static ");
|
writer.Write("static ");
|
||||||
|
|
||||||
var parameters = function.Parameters.Select(x => CType(x.Type, x.Name.Ident));
|
var parameters = function.Parameters.Select(x => $"{TypeName(x.Type)} {x.Name.Ident}");
|
||||||
|
|
||||||
writer.WriteLine($"{CType(function.ReturnType, info.MangledName)}({string.Join(", ", parameters)})");
|
writer.WriteLine($"{TypeName(function.ReturnType)} {info.MangledName}({string.Join(", ", parameters)})");
|
||||||
writer.WriteLine("{");
|
writer.WriteLine("{");
|
||||||
using (writer.Indent())
|
using (writer.Indent())
|
||||||
{
|
{
|
||||||
@@ -182,9 +181,9 @@ public class Generator
|
|||||||
writer.Write("static ");
|
writer.Write("static ");
|
||||||
|
|
||||||
if (info.Type is NubTypeFunc fn)
|
if (info.Type is NubTypeFunc fn)
|
||||||
writer.WriteLine($"{CType(fn.ReturnType, info.MangledName)}({string.Join(", ", fn.Parameters.Select(p => CType(p)))});");
|
writer.WriteLine($"{TypeName(fn.ReturnType)} {info.MangledName}({string.Join(", ", fn.Parameters.Select(TypeName))});");
|
||||||
else
|
else
|
||||||
writer.WriteLine($"{CType(info.Type, info.MangledName)};");
|
writer.WriteLine($"{TypeName(info.Type)} {info.MangledName};");
|
||||||
|
|
||||||
writer.WriteLine();
|
writer.WriteLine();
|
||||||
}
|
}
|
||||||
@@ -211,11 +210,14 @@ public class Generator
|
|||||||
|
|
||||||
writer = new IndentedTextWriter();
|
writer = new IndentedTextWriter();
|
||||||
|
|
||||||
while (referencedTypes.Count != 0)
|
|
||||||
|
while (emittedTypes.Count != typeNames.Count)
|
||||||
{
|
{
|
||||||
var type = referencedTypes.ElementAt(0);
|
var nextTypes = typeNames.Keys.ToArray();
|
||||||
EmitTypeDefinitionIfNotEmitted(type);
|
foreach (var type in nextTypes)
|
||||||
referencedTypes.Remove(type);
|
{
|
||||||
|
EmitTypeDefinitionIfNotEmitted(type);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var types = writer.ToString();
|
var types = writer.ToString();
|
||||||
@@ -266,7 +268,7 @@ public class Generator
|
|||||||
{
|
{
|
||||||
foreach (var field in structInfo.Fields)
|
foreach (var field in structInfo.Fields)
|
||||||
{
|
{
|
||||||
writer.WriteLine($"{CType(field.Type, field.Name)};");
|
writer.WriteLine($"{TypeName(field.Type)} {field.Name};");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
writer.WriteLine($"}} {name};");
|
writer.WriteLine($"}} {name};");
|
||||||
@@ -285,7 +287,7 @@ public class Generator
|
|||||||
{
|
{
|
||||||
foreach (var field in anonymousStructType.Fields)
|
foreach (var field in anonymousStructType.Fields)
|
||||||
{
|
{
|
||||||
writer.WriteLine($"{CType(field.Type, field.Name)};");
|
writer.WriteLine($"{TypeName(field.Type)} {field.Name};");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
writer.WriteLine($"}} {name};");
|
writer.WriteLine($"}} {name};");
|
||||||
@@ -319,7 +321,7 @@ public class Generator
|
|||||||
{
|
{
|
||||||
if (variant.Type is not null)
|
if (variant.Type is not null)
|
||||||
{
|
{
|
||||||
writer.WriteLine($"{CType(variant.Type, variant.Name)};");
|
writer.WriteLine($"{TypeName(variant.Type)} {variant.Name};");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -363,7 +365,7 @@ public class Generator
|
|||||||
{
|
{
|
||||||
writer.WriteLine("size_t count;");
|
writer.WriteLine("size_t count;");
|
||||||
writer.WriteLine("size_t capacity;");
|
writer.WriteLine("size_t capacity;");
|
||||||
writer.WriteLine($"{CType(arrayType.ElementType)} *items;");
|
writer.WriteLine($"{TypeName(arrayType.ElementType)} *items;");
|
||||||
writer.WriteLine("uint32_t ref;");
|
writer.WriteLine("uint32_t ref;");
|
||||||
}
|
}
|
||||||
writer.WriteLine($"}} {backingName};");
|
writer.WriteLine($"}} {backingName};");
|
||||||
@@ -509,7 +511,7 @@ public class Generator
|
|||||||
{
|
{
|
||||||
var value = EmitExpression(statement.Value);
|
var value = EmitExpression(statement.Value);
|
||||||
EmitCopyConstructor(value, statement.Value.Type);
|
EmitCopyConstructor(value, statement.Value.Type);
|
||||||
writer.WriteLine($"{CType(statement.Type, statement.Name.Ident)} = {value};");
|
writer.WriteLine($"{TypeName(statement.Type)} {statement.Name.Ident} = {value};");
|
||||||
scopes.Peek().DeconstructableNames.Add((statement.Name.Ident, statement.Type));
|
scopes.Peek().DeconstructableNames.Add((statement.Name.Ident, statement.Type));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -577,7 +579,7 @@ public class Generator
|
|||||||
using (writer.Indent())
|
using (writer.Indent())
|
||||||
{
|
{
|
||||||
var arrayType = (NubTypeArray)statement.Array.Type;
|
var arrayType = (NubTypeArray)statement.Array.Type;
|
||||||
writer.WriteLine($"{CType(arrayType.ElementType, statement.VariableName.Ident)} = {array}->items[{index}];");
|
writer.WriteLine($"{TypeName(arrayType.ElementType)} {statement.VariableName.Ident} = {array}->items[{index}];");
|
||||||
EmitStatement(statement.Body);
|
EmitStatement(statement.Body);
|
||||||
}
|
}
|
||||||
writer.WriteLine("}");
|
writer.WriteLine("}");
|
||||||
@@ -610,7 +612,7 @@ public class Generator
|
|||||||
if (@case.VariableName != null)
|
if (@case.VariableName != null)
|
||||||
{
|
{
|
||||||
Debug.Assert(variantInfo.Type is not null);
|
Debug.Assert(variantInfo.Type is not null);
|
||||||
writer.WriteLine($"{CType(variantInfo.Type, @case.VariableName.Ident)} = {target}.{@case.Variant.Ident};");
|
writer.WriteLine($"{TypeName(variantInfo.Type)} {@case.VariableName.Ident} = {target}.{@case.Variant.Ident};");
|
||||||
}
|
}
|
||||||
|
|
||||||
EmitStatement(@case.Body);
|
EmitStatement(@case.Body);
|
||||||
@@ -658,7 +660,7 @@ public class Generator
|
|||||||
if (expression.Operation == TypedNodeExpressionBinary.Op.Add && expression.Left.Type is NubTypeString && expression.Right.Type is NubTypeString)
|
if (expression.Operation == TypedNodeExpressionBinary.Op.Add && expression.Left.Type is NubTypeString && expression.Right.Type is NubTypeString)
|
||||||
{
|
{
|
||||||
scopes.Peek().DeconstructableNames.Add((name, expression.Type));
|
scopes.Peek().DeconstructableNames.Add((name, expression.Type));
|
||||||
writer.WriteLine($"{CType(NubTypeString.Instance, name)} = string_concat({left}, {right});");
|
writer.WriteLine($"{TypeName(NubTypeString.Instance)} {name} = string_concat({left}, {right});");
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -682,7 +684,7 @@ public class Generator
|
|||||||
_ => throw new ArgumentOutOfRangeException()
|
_ => throw new ArgumentOutOfRangeException()
|
||||||
};
|
};
|
||||||
|
|
||||||
writer.WriteLine($"{CType(expression.Type, name)} = {op};");
|
writer.WriteLine($"{TypeName(expression.Type)} {name} = {op};");
|
||||||
|
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
@@ -700,7 +702,7 @@ public class Generator
|
|||||||
_ => throw new ArgumentOutOfRangeException()
|
_ => throw new ArgumentOutOfRangeException()
|
||||||
};
|
};
|
||||||
|
|
||||||
writer.WriteLine($"{CType(expression.Type, name)} = {op};");
|
writer.WriteLine($"{TypeName(expression.Type)} {name} = {op};");
|
||||||
|
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
@@ -728,7 +730,7 @@ public class Generator
|
|||||||
|
|
||||||
var initializerStrings = initializerValues.Select(x => $".{x.Key} = {x.Value}");
|
var initializerStrings = initializerValues.Select(x => $".{x.Key} = {x.Value}");
|
||||||
|
|
||||||
writer.WriteLine($"{CType(expression.Type, name)} = ({CType(expression.Type)}){{ {string.Join(", ", initializerStrings)} }};");
|
writer.WriteLine($"{TypeName(expression.Type)} {name} = ({TypeName(expression.Type)}){{ {string.Join(", ", initializerStrings)} }};");
|
||||||
|
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
@@ -753,7 +755,7 @@ public class Generator
|
|||||||
EmitCopyConstructor(value, expression.Value.Type);
|
EmitCopyConstructor(value, expression.Value.Type);
|
||||||
}
|
}
|
||||||
|
|
||||||
writer.Write($"{CType(expression.Type, name)} = ({CType(expression.Type)}){{ .tag = {tag}");
|
writer.Write($"{TypeName(expression.Type)} {name} = ({TypeName(expression.Type)}){{ .tag = {tag}");
|
||||||
|
|
||||||
if (value != null)
|
if (value != null)
|
||||||
writer.WriteLine($", .{enumVariantType.Variant} = {value} }};");
|
writer.WriteLine($", .{enumVariantType.Variant} = {value} }};");
|
||||||
@@ -768,7 +770,7 @@ public class Generator
|
|||||||
var name = Tmp();
|
var name = Tmp();
|
||||||
scopes.Peek().DeconstructableNames.Add((name, expression.Type));
|
scopes.Peek().DeconstructableNames.Add((name, expression.Type));
|
||||||
|
|
||||||
writer.WriteLine($"{CType(expression.Type, name)} = {TypeName(expression.Type)}_make();");
|
writer.WriteLine($"{TypeName(expression.Type)} {name} = {TypeName(expression.Type)}_make();");
|
||||||
|
|
||||||
foreach (var value in expression.Values)
|
foreach (var value in expression.Values)
|
||||||
{
|
{
|
||||||
@@ -784,7 +786,7 @@ public class Generator
|
|||||||
var name = Tmp();
|
var name = Tmp();
|
||||||
scopes.Peek().DeconstructableNames.Add((name, expression.Type));
|
scopes.Peek().DeconstructableNames.Add((name, expression.Type));
|
||||||
var value = EmitExpression(expression.Value);
|
var value = EmitExpression(expression.Value);
|
||||||
writer.WriteLine($"{CType(expression.Type, name)} = string_from_cstr({value});");
|
writer.WriteLine($"{TypeName(expression.Type)} {name} = string_from_cstr({value});");
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -832,7 +834,7 @@ public class Generator
|
|||||||
var parameterValues = expression.Parameters.Select(EmitExpression).ToList();
|
var parameterValues = expression.Parameters.Select(EmitExpression).ToList();
|
||||||
|
|
||||||
var tmp = Tmp();
|
var tmp = Tmp();
|
||||||
writer.WriteLine($"{CType(expression.Type, tmp)} = {name}({string.Join(", ", parameterValues)});");
|
writer.WriteLine($"{TypeName(expression.Type)} {tmp} = {name}({string.Join(", ", parameterValues)});");
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -865,12 +867,6 @@ public class Generator
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string CType(NubType node, string? varName = null)
|
|
||||||
{
|
|
||||||
referencedTypes.Add(node);
|
|
||||||
return $"{TypeName(node)}" + (varName != null ? $" {varName}" : "");
|
|
||||||
}
|
|
||||||
|
|
||||||
private string Tmp()
|
private string Tmp()
|
||||||
{
|
{
|
||||||
return $"_tmp{tmpNameIndex++}";
|
return $"_tmp{tmpNameIndex++}";
|
||||||
|
|||||||
Reference in New Issue
Block a user