int Run(Options options) { var path = options.Module.FullName; if (!options.Module.Exists) { Log.ErrorLine("Module '{0}' could not be found.", path); return(1); } var loader = new StandardModuleLoader(ModuleLoaderMode.Normal); _ = loader.SearchPaths.Add(Path.GetDirectoryName(path) !); var text = StringSourceText.FromAsync(path, File.OpenRead(path)).Result; var context = new SyntaxContext(); try { var mod = loader.LoadModule(text, context); foreach (var decl in mod.Declarations.OfType <Function>()) { decl.Test(); } } catch (ModuleLoadException) { // All errors will be reported in the context. } foreach (var diag in context.Diagnostics) { LogDiagnostic(diag); } // TODO return(context.HasDiagnostics ? 1 : 0); }
int Run(Options options) { ReadLine.AutoCompletionHandler = null; var loader = new StandardModuleLoader(ModuleLoaderMode.Interactive); var i = 0; while (true) { Console.ForegroundColor = ConsoleColor.Cyan; Console.Write($"flare({i})> "); Console.ResetColor(); var text = new StringBuilder(); var quit = false; var continued = false; while (true) { var input = ReadLine.Read(); if (input != string.Empty) { ReadLine.AddHistory(input); } var broken = false; if (input == "'repl:quit") { quit = true; break; } if (continued && input == "'repl:break") { broken = true; } else { _ = text.AppendLine(input); } var lex = LanguageLexer.Lex(StringSourceText.From("<repl>", text.ToString())); foreach (var diag in lex.Diagnostics) { LogDiagnostic(diag); } if (!lex.IsSuccess) { break; } var parse = LanguageParser.Parse(lex, SyntaxMode.Interactive); if (!broken && IsIncomplete(parse)) { Console.ForegroundColor = ConsoleColor.Cyan; Console.Write($".....({i})> "); Console.ResetColor(); continued = true; continue; } foreach (var diag in parse.Diagnostics) { LogDiagnostic(diag); } var analysis = LanguageAnalyzer.Analyze(parse, loader, new SyntaxContext()); foreach (var diag in analysis.Diagnostics) { LogDiagnostic(diag); } break; } if (quit) { break; } i++; } return(0); }