using NubLang.Ast; using NubLang.Generation; using NubLang.Syntax; using OmniSharp.Extensions.LanguageServer.Protocol; using OmniSharp.Extensions.LanguageServer.Protocol.Server; namespace NubLang.LSP; public class WorkspaceManager(DiagnosticsPublisher diagnosticsPublisher, ILanguageServerFacade server) { private readonly Dictionary _syntaxTrees = new(); private readonly Dictionary _compilationUnits = new(); public void Init(string rootPath) { var files = Directory.GetFiles(rootPath, "*.nub", SearchOption.AllDirectories); foreach (var path in files) { var text = File.ReadAllText(path); var tokenizer = new Tokenizer(path, text); tokenizer.Tokenize(); diagnosticsPublisher.Publish(path, tokenizer.Diagnostics); var parser = new Parser(); var parseResult = parser.Parse(tokenizer.Tokens); diagnosticsPublisher.Publish(path, parser.Diagnostics); _syntaxTrees[path] = parseResult; } Generate(); } public void UpdateFile(DocumentUri path) { var fsPath = path.GetFileSystemPath(); var text = File.ReadAllText(fsPath); var tokenizer = new Tokenizer(fsPath, text); tokenizer.Tokenize(); diagnosticsPublisher.Publish(path, tokenizer.Diagnostics); var parser = new Parser(); var parseResult = parser.Parse(tokenizer.Tokens); diagnosticsPublisher.Publish(path, parser.Diagnostics); _syntaxTrees[fsPath] = parseResult; Generate(); } private void Generate() { var modules = Module.Collect(_syntaxTrees.Select(x => x.Value).ToList()); foreach (var (fsPath, syntaxTree) in _syntaxTrees) { var typeChecker = new TypeChecker(syntaxTree, modules); var result = typeChecker.Check(); diagnosticsPublisher.Publish(fsPath, typeChecker.Diagnostics); _compilationUnits[fsPath] = result; var generator = new Generator(result); var c = generator.Emit(); server.SendNotification("nub/output", new { content = c, path = fsPath }); } } public void RemoveFile(DocumentUri path) { var fsPath = path.GetFileSystemPath(); _syntaxTrees.Remove(fsPath); _compilationUnits.Remove(fsPath); } public Dictionary GetCompilationUnits() { return _compilationUnits; } public CompilationUnit? GetCompilationUnit(DocumentUri path) { return _compilationUnits.GetValueOrDefault(path.GetFileSystemPath()); } }