示例#1
0
        private void MenuItemCallback(object sender, EventArgs e)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            try
            {
                ////////////////////////
                /// Eliminate left recursion.
                ////////////////////////

                if (!(((IServiceProvider)ServiceProvider).GetService(typeof(VsTextManagerClass)) is IVsTextManager manager))
                {
                    return;
                }
                manager.GetActiveView(1, null, out IVsTextView view);
                if (view == null)
                {
                    return;
                }
                view.GetCaretPos(out int l, out int c);
                view.GetSelection(out int ls, out int cs, out int le, out int ce);
                view.GetBuffer(out IVsTextLines buf);
                if (buf == null)
                {
                    return;
                }
                ITextBuffer buffer = AntlrLanguageClient.AdaptersFactory.GetWpfTextView(view)?.TextBuffer;
                string      ffn    = buffer?.GetFFN();
                if (ffn == null)
                {
                    return;
                }
                Workspaces.Document document = Workspaces.Workspace.Instance.FindDocument(ffn);
                if (document == null)
                {
                    return;
                }
                int start = new LanguageServer.Module().GetIndex(ls, cs, document);
                int end   = new LanguageServer.Module().GetIndex(le, ce, document);
                AntlrLanguageClient.CMEliminateIndirectLeftRecursion(ffn, start, end);
            }
            catch (Exception exception)
            {
                Logger.Log.Notify(exception.StackTrace);
            }
        }
示例#2
0
        private void MenuItemCallback(object sender, EventArgs e)
        {
            try
            {
                ////////////////////////
                /// Replace multiple rules that priorize operators with one rule and multiple ordered alts.
                ////////////////////////

                IVsTextManager manager = ((IServiceProvider)ServiceProvider).GetService(typeof(VsTextManagerClass)) as IVsTextManager;
                if (manager == null)
                {
                    return;
                }
                manager.GetActiveView(1, null, out IVsTextView view);
                if (view == null)
                {
                    return;
                }
                view.GetCaretPos(out int l, out int c);
                view.GetSelection(out int ls, out int cs, out int le, out int ce);
                view.GetBuffer(out IVsTextLines buf);
                if (buf == null)
                {
                    return;
                }
                ITextBuffer buffer = AntlrLanguageClient.AdaptersFactory.GetWpfTextView(view)?.TextBuffer;
                string      ffn    = buffer.GetFFN();
                if (ffn == null)
                {
                    return;
                }
                Workspaces.Document document = Workspaces.Workspace.Instance.FindDocument(ffn);
                if (document == null)
                {
                    return;
                }
                int start = new LanguageServer.Module().GetIndex(ls, cs, document);
                int end   = new LanguageServer.Module().GetIndex(le, ce, document);
                AntlrLanguageClient.CMReplacePriorization(ffn, start, end);
            }
            catch (Exception exception)
            {
                Logger.Log.Notify(exception.StackTrace);
            }
        }
示例#3
0
        private void MenuItemCallback(object sender, EventArgs e)
        {
            try
            {
                ////////////////////////
                /// Unfold (substitute RHS of a rule into uses of the LHS symbol).
                ////////////////////////

                if (!(((IServiceProvider)ServiceProvider).GetService(typeof(VsTextManagerClass)) is IVsTextManager manager))
                {
                    return;
                }
                manager.GetActiveView(1, null, out IVsTextView view);
                if (view == null)
                {
                    return;
                }
                view.GetCaretPos(out int l, out int c);
                view.GetSelection(out int ls, out int cs, out int le, out int ce);
                view.GetBuffer(out IVsTextLines buf);
                if (buf == null)
                {
                    return;
                }
                ITextBuffer buffer = AntlrLanguageClient.AdaptersFactory.GetWpfTextView(view).TextBuffer;
                string      ffn    = buffer.GetFFN();
                if (ffn == null)
                {
                    return;
                }
                Workspaces.Document document = Workspaces.Workspace.Instance.FindDocument(ffn);
                if (document == null)
                {
                    return;
                }
                int start = new LanguageServer.Module().GetIndex(ls, cs, document);
                int end   = new LanguageServer.Module().GetIndex(le, ce, document);
                AntlrLanguageClient.CMUnfold(ffn, start, end);
            }
            catch (Exception exception)
            {
                Logger.Log.Notify(exception.StackTrace);
            }
        }
示例#4
0
        private void MenuItemCallback(object sender, EventArgs e)
        {
            try
            {
                ////////////////////////
                /// Remove useless parser productions.
                ////////////////////////

                IVsTextManager manager = ((IServiceProvider)ServiceProvider).GetService(typeof(VsTextManagerClass)) as IVsTextManager;
                if (manager == null)
                {
                    return;
                }
                manager.GetActiveView(1, null, out IVsTextView view);
                if (view == null)
                {
                    return;
                }
                view.GetCaretPos(out int l, out int c);
                view.GetBuffer(out IVsTextLines buf);
                if (buf == null)
                {
                    return;
                }
                ITextBuffer buffer = AntlrLanguageClient.AdaptersFactory.GetWpfTextView(view)?.TextBuffer;
                string      ffn    = buffer.GetFFN();
                if (ffn == null)
                {
                    return;
                }
                Workspaces.Document document = Workspaces.Workspace.Instance.FindDocument(ffn);
                if (document == null)
                {
                    return;
                }
                int pos = new LanguageServer.Module().GetIndex(l, c, document);
                AntlrLanguageClient.CMMoveStartRuleToTop(ffn);
            }
            catch (Exception exception)
            {
                Logger.Log.Notify(exception.StackTrace);
            }
        }
示例#5
0
        public void Execute(Repl repl, ReplParser.TextContext tree, bool piped)
        {
            var args             = tree.arg();
            var arg              = args?.GetText();
            var line_number      = (arg == "line-number");
            var lines            = repl.input_output_stack.Pop();
            var serializeOptions = new JsonSerializerOptions();

            serializeOptions.Converters.Add(new AntlrJson.ParseTreeConverter());
            serializeOptions.WriteIndented = false;
            var      obj1   = JsonSerializer.Deserialize <AntlrJson.ParsingResultSet>(lines, serializeOptions);
            var      nodes  = obj1.Nodes;
            var      parser = obj1.Parser;
            var      lexer  = obj1.Lexer;
            var      fn     = obj1.FileName;
            Document doc    = null;

            if (!(fn == null || fn == "stdin"))
            {
                doc = repl._docs.ReadDoc(fn);
            }
            foreach (var node in nodes)
            {
                if (line_number && doc != null)
                {
                    var    source_interval = node.SourceInterval;
                    int    a     = source_interval.a;
                    int    b     = source_interval.b;
                    IToken ta    = parser.TokenStream.Get(a);
                    IToken tb    = parser.TokenStream.Get(b);
                    var    start = ta.StartIndex;
                    var    stop  = tb.StopIndex + 1;
                    var(line_a, col_a) = new LanguageServer.Module().GetLineColumn(start, doc);
                    var(line_b, col_b) = new LanguageServer.Module().GetLineColumn(stop, doc);
                    System.Console.Write(System.IO.Path.GetFileName(doc.FullPath)
                                         + ":" + line_a + "," + col_a
                                         + "-" + line_b + "," + col_b
                                         + "\t");
                }
                System.Console.WriteLine(this.Reconstruct(node));
            }
        }
示例#6
0
        private void MenuItemCallback(object sender, EventArgs e)
        {
            try
            {
                ////////////////////////
                /// Eliminate Antlr keywords mistakenly used as non-terminal names!
                ////////////////////////

                if (!(((IServiceProvider)ServiceProvider).GetService(typeof(VsTextManagerClass)) is IVsTextManager manager))
                {
                    return;
                }
                manager.GetActiveView(1, null, out IVsTextView view);
                if (view == null)
                {
                    return;
                }
                view.GetCaretPos(out int l, out int c);
                view.GetBuffer(out IVsTextLines buf);
                if (buf == null)
                {
                    return;
                }
                ITextBuffer buffer = AntlrLanguageClient.AdaptersFactory.GetWpfTextView(view)?.TextBuffer;
                string      ffn    = buffer?.GetFFN();
                if (ffn == null)
                {
                    return;
                }
                Workspaces.Document document = Workspaces.Workspace.Instance.FindDocument(ffn);
                if (document == null)
                {
                    return;
                }
                int pos = new LanguageServer.Module().GetIndex(l, c, document);
                AntlrLanguageClient.CMEliminateAntlrKeywordsInRules(ffn);
            }
            catch (Exception exception)
            {
                Logger.Log.Notify(exception.StackTrace);
            }
        }
示例#7
0
        public IEnumerable <Info> Get(Document doc)
        {
            try
            {
                ParsingResults pd        = ParsingResultsFactory.Create(doc);
                var            workspace = doc.Workspace;
                if (pd.ParseTree == null)
                {
                    Compile(workspace);
                }

                List <Info> combined = new List <Info>();
                foreach (KeyValuePair <Antlr4.Runtime.IToken, int> p in pd.ColorizedList)
                {
                    if (p.Key == null)
                    {
                        continue;
                    }
                    var sym = p.Key;
                    var st  = sym.StartIndex;
                    var en  = sym.StopIndex + 1;
                    int s1  = st;
                    int s2  = en;
                    // Create multiple "info" for multiline tokens.
                    var(ls, cs) = new LanguageServer.Module().GetLineColumn(st, doc);
                    var(le, ce) = new LanguageServer.Module().GetLineColumn(en, doc);
                    if (ls == le)
                    {
                        combined.Add(
                            new Info()
                        {
                            start = s1,
                            end   = s2 - 1,
                            kind  = p.Value
                        });
                    }
                    else
                    {
                        var text         = sym.Text;
                        int start_region = st;
                        for (int cur_index = 0; cur_index < text.Length;)
                        {
                            if (text[cur_index] == '\n' || text[cur_index] == '\r')
                            {
                                // Emit Info().
                                if (text[cur_index] == '\r' && (cur_index + 1 < text.Length) && text[cur_index + 1] == '\n')
                                {
                                    cur_index++;
                                }
                                cur_index++;
                                combined.Add(
                                    new Info()
                                {
                                    start = start_region,
                                    end   = st + cur_index - 1,
                                    kind  = p.Value
                                });
                                start_region = st + cur_index;
                            }
                            else
                            {
                                cur_index++;
                            }
                        }
                        if (start_region != en)
                        {
                            combined.Add(
                                new Info()
                            {
                                start = start_region,
                                end   = en - 1,
                                kind  = p.Value
                            });
                        }
                    }
                }
                // Sort the list.
                IOrderedEnumerable <Info> sorted_combined_tokens = combined.OrderBy(t => t.start).ThenBy(t => t.end);
                return(sorted_combined_tokens);
            }
            catch (Exception)
            {
            }
            return(new List <Info>());
        }
示例#8
0
        private void MenuItemCallback(bool split)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            try
            {
                ////////////////////////
                /// Reorder parser productions.
                ////////////////////////

                if (!(((IServiceProvider)ServiceProvider).GetService(typeof(VsTextManagerClass)) is IVsTextManager manager))
                {
                    return;
                }
                manager.GetActiveView(1, null, out IVsTextView view);
                if (view == null)
                {
                    return;
                }
                view.GetCaretPos(out int l, out int c);
                view.GetBuffer(out IVsTextLines buf);
                if (buf == null)
                {
                    return;
                }
                ITextBuffer buffer = AntlrLanguageClient.AdaptersFactory.GetWpfTextView(view)?.TextBuffer;
                string      ffn    = buffer.GetFFN();
                if (ffn == null)
                {
                    return;
                }
                Workspaces.Document document = Workspaces.Workspace.Instance.FindDocument(ffn);
                if (document == null)
                {
                    return;
                }
                int pos = new LanguageServer.Module().GetIndex(l, c, document);
                Dictionary <string, string> changes = AntlrLanguageClient.CMSplitCombineGrammars(ffn, split);
                EnvDTE.Project project       = null;
                string         the_namespace = "";
                for (; ;)
                {
                    string current_grammar_ffn = ffn;
                    (EnvDTE.Project, EnvDTE.ProjectItem)p_f_original_grammar = LspAntlr.MakeChanges.FindProjectAndItem(current_grammar_ffn);
                    project = p_f_original_grammar.Item1;
                    try
                    {
                        object prop = p_f_original_grammar.Item2.Properties.Item("CustomToolNamespace").Value;
                        the_namespace = prop.ToString();
                    }
                    catch (Exception)
                    {
                    }
                    break;
                }
                if (project == null)
                {
                    EnvDTE.DTE      dte      = (EnvDTE.DTE)Package.GetGlobalService(typeof(EnvDTE.DTE));
                    EnvDTE.Projects projects = dte.Solution.Projects;
                    project = projects.Item(EnvDTE.Constants.vsMiscFilesProjectUniqueName);
                }
                if (changes == null)
                {
                    return;
                }
                MakeChanges.EnterChanges(changes, project, the_namespace);
            }
            catch (Exception exception)
            {
                Logger.Log.Notify(exception.StackTrace);
            }
        }