private void MenuItemCallback(object sender, EventArgs e) { //////////////////////// // Find all references.. //////////////////////// // First, open up every .g4 file in project and parse. DTE application = DteExtensions.GetApplication(); if (application != null) { IEnumerable <ProjectItem> iterator = DteExtensions.SolutionFiles(application); ProjectItem[] list = iterator.ToArray(); foreach (var item in list) { //var doc = item.Document; CRASHES!!!! DO NOT USE! //var props = item.Properties; string file_name = item.Name; if (file_name != null) { string prefix = file_name.TrimSuffix(".g4"); if (prefix == file_name) { continue; } try { object prop = item.Properties.Item("FullPath").Value; string ffn = (string)prop; if (!ParserDetails._per_file_parser_details.ContainsKey(ffn)) { StreamReader sr = new StreamReader(ffn); ParserDetails foo = new ParserDetails(); ParserDetails._per_file_parser_details[ffn] = foo; foo.Parse(sr.ReadToEnd(), ffn); } } catch (Exception eeks) { } } } } string classification = this.Classification; SnapshotSpan span = this.Symbol; ITextView view = this.View; // First, find out what this view is, and what the file is. ITextBuffer buffer = view.TextBuffer; ITextDocument doc = buffer.GetTextDocument(); string path = doc.FilePath; List <IToken> where = new List <IToken>(); List <ParserDetails> where_details = new List <ParserDetails>(); IToken token = null; foreach (var kvp in ParserDetails._per_file_parser_details) { string file_name = kvp.Key; ParserDetails details = kvp.Value; if (classification == AntlrVSIX.Constants.ClassificationNameNonterminal) { var it = details._ant_nonterminals.Where( (t) => t.Text == span.GetText()); where.AddRange(it); foreach (var i in it) { where_details.Add(details); } } else if (classification == AntlrVSIX.Constants.ClassificationNameTerminal) { var it = details._ant_terminals.Where( (t) => t.Text == span.GetText()); where.AddRange(it); foreach (var i in it) { where_details.Add(details); } } else if (classification == AntlrVSIX.Constants.ClassificationNameLiteral) { var it = details._ant_literals.Where( (t) => t.Text == span.GetText()); where.AddRange(it); foreach (var i in it) { where_details.Add(details); } } } if (!where.Any()) { return; } // Populate the Antlr find results model/window with file/line/col info // for each occurrence. FindAntlrSymbolsModel.Instance.Results.Clear(); for (int i = 0; i < where.Count; ++i) { IToken x = where[i]; ParserDetails y = where_details[i]; var w = new Entry() { FileName = y.full_file_name, LineNumber = x.Line, ColumnNumber = x.Column, Token = x }; FindAntlrSymbolsModel.Instance.Results.Add(w); } }
private void RenameCallback(object sender, EventArgs e) { // Highlight the symbol, reposition it to the beginning of it. // Every character changes all occurrences of the symbol. // First, open up every .g4 file in project and parse. DTE application = DteExtensions.GetApplication(); if (application != null) { IEnumerable <ProjectItem> iterator = DteExtensions.SolutionFiles(application); ProjectItem[] list = iterator.ToArray(); foreach (var item in list) { //var doc = item.Document; CRASHES!!!! DO NOT USE! //var props = item.Properties; string file_name = item.Name; if (file_name != null) { string prefix = file_name.TrimSuffix(".g4"); if (prefix == file_name) { continue; } try { object prop = item.Properties.Item("FullPath").Value; string ffn = (string)prop; if (!ParserDetails._per_file_parser_details.ContainsKey(ffn)) { StreamReader sr = new StreamReader(ffn); ParserDetails foo = new ParserDetails(); ParserDetails._per_file_parser_details[ffn] = foo; foo.Parse(sr.ReadToEnd(), ffn); } } catch (Exception eeks) { } } } } string classification = this.Classification; SnapshotSpan span = this.Symbol; ITextView view = this.View; // First, find out what this view is, and what the file is. ITextBuffer buffer = view.TextBuffer; ITextDocument doc = buffer.GetTextDocument(); string path = doc.FilePath; IVsTextView vstv = IVsTextViewExtensions.GetIVsTextView(path); List <IToken> where = new List <IToken>(); List <ParserDetails> where_details = new List <ParserDetails>(); IToken token = null; foreach (var kvp in ParserDetails._per_file_parser_details) { string file_name = kvp.Key; ParserDetails details = kvp.Value; if (classification == AntlrVSIX.Constants.ClassificationNameNonterminal) { var it = details._ant_nonterminals.Where( (t) => t.Text == span.GetText()); where.AddRange(it); foreach (var i in it) { where_details.Add(details); } } else if (classification == AntlrVSIX.Constants.ClassificationNameTerminal) { var it = details._ant_terminals.Where( (t) => t.Text == span.GetText()); where.AddRange(it); foreach (var i in it) { where_details.Add(details); } } else if (classification == AntlrVSIX.Constants.ClassificationNameLiteral) { var it = details._ant_literals.Where( (t) => t.Text == span.GetText()); where.AddRange(it); foreach (var i in it) { where_details.Add(details); } } } if (!where.Any()) { return; } IWpfTextView wpftv = vstv.GetIWpfTextView(); if (wpftv == null) { return; } // Create new span in the appropriate view. ITextSnapshot cc = wpftv.TextBuffer.CurrentSnapshot; SnapshotSpan ss = new SnapshotSpan(cc, span.Start.Position, 1); SnapshotPoint sp = ss.Start; // Enable highlighter. RenameHighlightTagger.Enabled = true; // Put cursor on symbol. wpftv.Caret.MoveTo(sp); // This sets cursor, bot does not center. }
private void MenuItemCallback(object sender, EventArgs e) { //////////////////////// // Go to definition.... //////////////////////// // First, open up every .g4 file in project. // Get VS solution, if any, and parse all grammars DTE application = DteExtensions.GetApplication(); if (application != null) { IEnumerable <ProjectItem> iterator = DteExtensions.SolutionFiles(application); ProjectItem[] list = iterator.ToArray(); foreach (var item in list) { //var doc = item.Document; CRASHES!!!! DO NOT USE! //var props = item.Properties; string file_name = item.Name; if (file_name != null) { string prefix = file_name.TrimSuffix(".g4"); if (prefix == file_name) { continue; } try { object prop = item.Properties.Item("FullPath").Value; string ffn = (string)prop; if (!ParserDetails._per_file_parser_details.ContainsKey(ffn)) { StreamReader sr = new StreamReader(ffn); ParserDetails foo = new ParserDetails(); ParserDetails._per_file_parser_details[ffn] = foo; foo.Parse(sr.ReadToEnd(), ffn); } } catch (Exception eeks) { } } } } string classification = this.Classification; SnapshotSpan span = this.Symbol; ITextView view = this.View; // First, find out what this view is, and what the file is. ITextBuffer buffer = view.TextBuffer; ITextDocument doc = buffer.GetTextDocument(); string path = doc.FilePath; //ParserDetails details = null; //bool found = ParserDetails._per_file_parser_details.TryGetValue(path, out details); //if (!found) return; List <IToken> where = new List <IToken>(); List <ParserDetails> where_details = new List <ParserDetails>(); IToken token = null; foreach (var kvp in ParserDetails._per_file_parser_details) { string file_name = kvp.Key; ParserDetails details = kvp.Value; if (classification == AntlrVSIX.Constants.ClassificationNameNonterminal) { var it = details._ant_nonterminals_defining.Where( (t) => t.Text == span.GetText()); where.AddRange(it); foreach (var i in it) { where_details.Add(details); } } else if (classification == AntlrVSIX.Constants.ClassificationNameTerminal) { var it = details._ant_terminals_defining.Where( (t) => t.Text == span.GetText()); where.AddRange(it); foreach (var i in it) { where_details.Add(details); } } } if (where.Any()) { token = where.First(); } else { return; } ParserDetails where_token = where_details.First(); string full_file_name = where_token.full_file_name; IVsTextView vstv = IVsTextViewExtensions.GetIVsTextView(full_file_name); IVsTextViewExtensions.ShowFrame(full_file_name); vstv = IVsTextViewExtensions.GetIVsTextView(where_token.full_file_name); IWpfTextView wpftv = vstv.GetIWpfTextView(); if (wpftv == null) { return; } int line_number; int colum_number; vstv.GetLineAndColumn(token.StartIndex, out line_number, out colum_number); // Create new span in the appropriate view. ITextSnapshot cc = wpftv.TextBuffer.CurrentSnapshot; SnapshotSpan ss = new SnapshotSpan(cc, token.StartIndex, 1); SnapshotPoint sp = ss.Start; // Put cursor on symbol. wpftv.Caret.MoveTo(sp); // This sets cursor, bot does not center. // Center on cursor. //wpftv.Caret.EnsureVisible(); // This works, sort of. It moves the scroll bar, but it does not CENTER! Does not really work! if (line_number > 0) { vstv.CenterLines(line_number - 1, 2); } else { vstv.CenterLines(line_number, 1); } }