Type instancing
This commit is contained in:
@@ -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))
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user