Example #1
0
        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);
        }
Example #2
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);
        }