Type instancing

This commit is contained in:
nub31
2026-02-09 21:32:37 +01:00
parent 00a172b922
commit d409bb4d92
3 changed files with 137 additions and 128 deletions

View File

@@ -18,8 +18,9 @@ public class ModuleGraph(Dictionary<string, ModuleGraph.Module> modules)
return module != null;
}
public sealed class Module
public sealed class Module(string name)
{
public string Name { get; } = name;
private readonly Dictionary<string, NubType> customTypes = new();
private readonly Dictionary<string, NubType> identifierTypes = new();
@@ -84,7 +85,7 @@ public class ModuleGraph(Dictionary<string, ModuleGraph.Module> modules)
if (!modules.ContainsKey(currentModule))
{
var module = new Module();
var module = new Module(currentModule);
modules.Add(currentModule, module);
astModuleCache[ast] = module;
}
@@ -98,7 +99,7 @@ public class ModuleGraph(Dictionary<string, ModuleGraph.Module> modules)
if (module == null) continue;
foreach (var structDef in ast.Definitions.OfType<NodeDefinitionStruct>())
module.AddCustomType(structDef.Name.Ident, new NubTypeStruct());
module.AddCustomType(structDef.Name.Ident, new NubTypeStruct(module.Name, structDef.Name.Ident));
}
// Third pass: Resolve struct fields
@@ -127,7 +128,7 @@ public class ModuleGraph(Dictionary<string, ModuleGraph.Module> modules)
{
var parameters = funcDef.Parameters.Select(x => ResolveType(x.Type)).ToList();
var returnType = ResolveType(funcDef.ReturnType);
var funcType = new NubTypeFunc(parameters, returnType);
var funcType = NubTypeFunc.Get(parameters, returnType);
module.AddIdentifier(funcDef.Name.Ident, funcType);
}
}
@@ -138,14 +139,14 @@ public class ModuleGraph(Dictionary<string, ModuleGraph.Module> modules)
{
return node switch
{
NodeTypeBool => new NubTypeBool(),
NodeTypeBool => NubTypeBool.Instance,
NodeTypeCustom type => ResolveCustomType(type),
NodeTypeFunc type => new NubTypeFunc(type.Parameters.Select(ResolveType).ToList(), ResolveType(type.ReturnType)),
NodeTypePointer type => new NubTypePointer(ResolveType(type.To)),
NodeTypeSInt type => new NubTypeSInt(type.Width),
NodeTypeUInt type => new NubTypeUInt(type.Width),
NodeTypeString => new NubTypeString(),
NodeTypeVoid => new NubTypeVoid(),
NodeTypeFunc type => NubTypeFunc.Get(type.Parameters.Select(ResolveType).ToList(), ResolveType(type.ReturnType)),
NodeTypePointer type => NubTypePointer.Get(ResolveType(type.To)),
NodeTypeSInt type => NubTypeSInt.Get(type.Width),
NodeTypeUInt type => NubTypeUInt.Get(type.Width),
NodeTypeString => NubTypeString.Instance,
NodeTypeVoid => NubTypeVoid.Instance,
_ => throw new ArgumentOutOfRangeException(nameof(node))
};
}