This commit is contained in:
nub31
2026-02-10 19:50:55 +01:00
parent d3e2dcede8
commit 6ae10d5f90
7 changed files with 215 additions and 64 deletions

View File

@@ -24,11 +24,16 @@ public class ModuleGraph(Dictionary<string, ModuleGraph.Module> modules)
private readonly Dictionary<string, NubType> customTypes = new();
private readonly Dictionary<string, NubType> identifierTypes = new();
public List<NubType> GetCustomTypes()
public IReadOnlyList<NubType> GetCustomTypes()
{
return customTypes.Values.ToList();
}
public IReadOnlyDictionary<string, NubType> GetIdentifierTypes()
{
return identifierTypes;
}
public bool TryResolveCustomType(string name, [NotNullWhen(true)] out NubType? customType)
{
customType = customTypes.GetValueOrDefault(name);
@@ -61,7 +66,7 @@ public class ModuleGraph(Dictionary<string, ModuleGraph.Module> modules)
asts.Add(ast);
}
public ModuleGraph Build(out List<Diagnostic> diagnostics)
public ModuleGraph? Build(out List<Diagnostic> diagnostics)
{
diagnostics = [];
@@ -71,24 +76,11 @@ public class ModuleGraph(Dictionary<string, ModuleGraph.Module> modules)
// First pass: Register modules
foreach (var ast in asts)
{
var moduleDefinitions = ast.Definitions.OfType<NodeDefinitionModule>().ToList();
if (moduleDefinitions.Count == 0)
diagnostics.Add(Diagnostic.Error("Missing module declaration").At(ast.FileName, 1, 1, 1).Build());
foreach (var extraModuleDefinition in moduleDefinitions.Skip(1))
diagnostics.Add(Diagnostic.Warning("Duplicate module declaration will be ignored").At(ast.FileName, extraModuleDefinition).Build());
if (moduleDefinitions.Count >= 1)
if (!modules.ContainsKey(ast.ModuleName.Ident))
{
var currentModule = moduleDefinitions[0].Name.Ident;
if (!modules.ContainsKey(currentModule))
{
var module = new Module(currentModule);
modules.Add(currentModule, module);
astModuleCache[ast] = module;
}
var module = new Module(ast.ModuleName.Ident);
modules.Add(ast.ModuleName.Ident, module);
astModuleCache[ast] = module;
}
}
@@ -133,6 +125,9 @@ public class ModuleGraph(Dictionary<string, ModuleGraph.Module> modules)
}
}
if (diagnostics.Any(x => x.Severity == DiagnosticSeverity.Error))
return null;
return new ModuleGraph(modules);
NubType ResolveType(NodeType node)