示例#1
0
        ResolveResult ResolveAtCaret(ParserUpdateStepEventArgs e)
        {
            if (disableDefinitionView)
            {
                return(null);
            }
            IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow;

            if (window == null)
            {
                return(null);
            }
            ITextEditorProvider provider = window.ActiveViewContent as ITextEditorProvider;

            if (provider == null)
            {
                return(null);
            }
            ITextEditor editor = provider.TextEditor;

            // e might be null when this is a manually triggered update
            // don't resolve when an unrelated file was changed
            if (e != null && editor.FileName != e.FileName)
            {
                return(null);
            }

            IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(editor.FileName);

            if (expressionFinder == null)
            {
                return(null);
            }
            ITextEditorCaret caret   = editor.Caret;
            string           content = (e == null) ? editor.Document.Text : e.Content.Text;

            if (caret.Offset > content.Length)
            {
                LoggingService.Debug("caret.Offset = " + caret.Offset + ", content.Length=" + content.Length);
                return(null);
            }
            try {
                ExpressionResult expr = expressionFinder.FindFullExpression(content, caret.Offset);
                if (expr.Expression == null)
                {
                    return(null);
                }
                return(ParserService.Resolve(expr, caret.Line, caret.Column, editor.FileName, content));
            } catch (Exception ex) {
                disableDefinitionView = true;
                ctl.Visibility        = Visibility.Collapsed;
                MessageService.ShowException(ex, "Error resolving at " + caret.Line + "/" + caret.Column
                                             + ". DefinitionViewPad is disabled until you restart SharpDevelop.");
                return(null);
            }
        }
示例#2
0
        ResolveResult ResolveAtCaret(ParserUpdateStepEventArgs e)
        {
            if (disableDefinitionView)
            {
                return(null);
            }
            IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow;

            if (window == null)
            {
                return(null);
            }
            ITextEditorControlProvider provider = window.ActiveViewContent as ITextEditorControlProvider;

            if (provider == null)
            {
                return(null);
            }
            TextEditorControl ctl = provider.TextEditorControl;

            // e might be null when this is a manually triggered update
            string fileName = (e == null) ? ctl.FileName : e.FileName;

            if (ctl.FileName != fileName)
            {
                return(null);
            }
            IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(fileName);

            if (expressionFinder == null)
            {
                return(null);
            }
            Caret  caret   = ctl.ActiveTextAreaControl.Caret;
            string content = (e == null) ? ctl.Text : e.Content;

            if (caret.Offset > content.Length)
            {
                LoggingService.Debug("caret.Offset = " + caret.Offset + ", content.Length=" + content.Length);
                return(null);
            }
            try {
                ExpressionResult expr = expressionFinder.FindFullExpression(content, caret.Offset);
                if (expr.Expression == null)
                {
                    return(null);
                }
                return(ParserService.Resolve(expr, caret.Line + 1, caret.Column + 1, fileName, content));
            } catch (Exception ex) {
                disableDefinitionView = true;
                this.Control.Visible  = false;
                MessageService.ShowError(ex, "Error resolving at " + (caret.Line + 1) + "/" + (caret.Column + 1)
                                         + ". DefinitionViewPad is disabled until you restart SharpDevelop.");
                return(null);
            }
        }
        public void SetupDataProvider(string fileName, TextArea textArea)
        {
            if (setupOnlyOnce && this.textArea != null)
            {
                return;
            }
            IDocument document = textArea.Document;

            this.fileName = fileName;
            this.document = document;
            this.textArea = textArea;
            int useOffset = (lookupOffset < 0) ? textArea.Caret.Offset : lookupOffset;

            initialOffset = useOffset;


            IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(fileName);
            ExpressionResult  expressionResult;

            if (expressionFinder == null)
            {
                expressionResult = new ExpressionResult(TextUtilities.GetExpressionBeforeOffset(textArea, useOffset));
            }
            else
            {
                expressionResult = expressionFinder.FindExpression(textArea.Document.TextContent, useOffset);
            }

            if (expressionResult.Expression == null)             // expression is null when cursor is in string/comment
            {
                return;
            }
            expressionResult.Expression = expressionResult.Expression.Trim();

            if (LoggingService.IsDebugEnabled)
            {
                if (expressionResult.Context == ExpressionContext.Default)
                {
                    LoggingService.DebugFormatted("ShowInsight for >>{0}<<", expressionResult.Expression);
                }
                else
                {
                    LoggingService.DebugFormatted("ShowInsight for >>{0}<<, context={1}", expressionResult.Expression, expressionResult.Context);
                }
            }

            int caretLineNumber = document.GetLineNumberForOffset(useOffset);
            int caretColumn     = useOffset - document.GetLineSegment(caretLineNumber).Offset;

            // the parser works with 1 based coordinates
            SetupDataProvider(fileName, document, expressionResult, caretLineNumber + 1, caretColumn + 1);
        }
示例#4
0
        /// <summary>
        /// Gets debugger tooltip information for the specified position.
        /// A descriptive text for the element or a DebuggerGridControl
        /// showing its current value (when in debugging mode) can be returned
        /// through the ToolTipInfo object.
        /// Returns <c>null</c>, if no tooltip information is available.
        /// </summary>
        internal static ToolTipInfo GetToolTipInfo(TextArea textArea, ToolTipRequestEventArgs e)
        {
            TextLocation      logicPos         = e.LogicalPosition;
            IDocument         doc              = textArea.Document;
            IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(textArea.MotherTextEditorControl.FileName);

            if (expressionFinder == null)
            {
                return(null);
            }
            LineSegment seg = doc.GetLineSegment(logicPos.Y);

            if (logicPos.X > seg.Length - 1)
            {
                return(null);
            }
            string           textContent      = doc.TextContent;
            ExpressionResult expressionResult = expressionFinder.FindFullExpression(textContent, seg.Offset + logicPos.X);
            string           expression       = (expressionResult.Expression ?? "").Trim();

            if (expression.Length > 0)
            {
                // Look if it is variable
                ResolveResult result = ParserService.Resolve(expressionResult, logicPos.Y + 1, logicPos.X + 1, textArea.MotherTextEditorControl.FileName, textContent);
                bool          debuggerCanShowValue;
                string        toolTipText = GetText(result, expression, out debuggerCanShowValue);
                if (Control.ModifierKeys == Keys.Control)
                {
                    toolTipText          = "expr: " + expressionResult.ToString() + "\n" + toolTipText;
                    debuggerCanShowValue = false;
                }
                if (toolTipText != null)
                {
                    if (debuggerCanShowValue && currentDebugger != null)
                    {
                        return(new ToolTipInfo(currentDebugger.GetTooltipControl(expressionResult.Expression)));
                    }
                    return(new ToolTipInfo(toolTipText));
                }
            }
            else
            {
                                #if DEBUG
                if (Control.ModifierKeys == Keys.Control)
                {
                    return(new ToolTipInfo("no expr: " + expressionResult.ToString()));
                }
                                #endif
            }
            return(null);
        }
示例#5
0
        private ResolveResult ResolveAtCaret(ParserUpdateStepEventArgs e)
        {
            IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow;

            if (window == null)
            {
                return(null);
            }
            ITextEditorControlProvider provider = window.ActiveViewContent as ITextEditorControlProvider;

            if (provider == null)
            {
                return(null);
            }
            TextEditorControl ctl = provider.TextEditorControl;

            // e might be null when this is a manually triggered update
            string fileName = (e == null) ? ctl.FileName : e.FileName;

            if (ctl.FileName != fileName)
            {
                return(null);
            }
            IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(fileName);

            if (expressionFinder == null)
            {
                return(null);
            }
            Caret            caret   = ctl.ActiveTextAreaControl.Caret;
            string           content = (e == null) ? ctl.Text : e.Content;
            ExpressionResult expr    = expressionFinder.FindFullExpression(content, caret.Offset);

            if (expr.Expression == null)
            {
                return(null);
            }

            // save the current position
            if (this.lastPoint != null && this.lastPoint == caret.Position)
            {
                return(null);
            }
            this.lastPoint = caret.Position;
            this.AddToStringCollection(string.Format(CultureInfo.InvariantCulture, "!{0}", expr.Expression));

            return(ParserService.Resolve(expr, caret.Line + 1, caret.Column + 1, fileName, content));
        }
示例#6
0
        /// <summary>
        /// Returns true if the offset where we are inserting is in Attibute context, that is [*expr*
        /// </summary>
        private bool IsInAttributeContext(ITextEditor editor, int offset)
        {
            if (editor == null || editor.Document == null)
            {
                return(false);
            }
            IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(editor.Document.Text, _projectContent);

            if (expressionFinder == null)
            {
                return(false);
            }
            ExpressionResult resolvedExpression = expressionFinder.FindFullExpression(editor.Document.Text, offset);

            return(resolvedExpression.Context == ExpressionContext.Attribute);
        }
        /// <summary>
        /// Returns true if the offset where we are inserting is in Attibute context, that is [*expr*
        /// </summary>
        bool IsInAttributeContext(ITextEditor editor, int offset)
        {
            if (editor == null || editor.Document == null)
            {
                return(false);
            }
            var expressionFinder = ParserService.GetExpressionFinder(editor.FileName);

            if (expressionFinder == null)
            {
                return(false);
            }
            var resolvedExpression = expressionFinder.FindFullExpression(editor.Document.Text, offset);

            return(resolvedExpression.Context == ExpressionContext.Attribute);
        }
示例#8
0
        void ShowDotCompletion(string currentText)
        {
            var    seg = Process.SelectedStackFrame.NextStatement;
            var    expressionFinder = ParserService.GetExpressionFinder(seg.Filename);
            var    info             = ParserService.GetParseInformation(seg.Filename);
            string text             = ParserService.GetParseableFileContent(seg.Filename).Text;
            int    currentOffset    = TextEditor.Caret.Offset - console.CommandOffset - 1;
            var    expr             = expressionFinder.FindExpression(currentText, currentOffset);

            expr.Region = new DomRegion(seg.StartLine, seg.StartColumn, seg.EndLine, seg.EndColumn);
            var rr = resolver.Resolve(expr, info, text);

            if (rr != null)
            {
                TextEditor.ShowCompletionWindow(new DotCodeCompletionItemProvider().GenerateCompletionListForResolveResult(rr, expr.Context));
            }
        }
        protected ExpressionResult GetExpressionFromOffset(ITextEditor editor, int offset)
        {
            if (editor == null)
            {
                throw new ArgumentNullException("editor");
            }
            IDocument         document         = editor.Document;
            IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(editor.FileName);

            if (expressionFinder == null)
            {
                return(ExpressionResult.Empty);
            }
            else
            {
                return(expressionFinder.FindExpression(document.Text, offset));
            }
        }
示例#10
0
        protected ResolveResult ResolveAtCaret(ITextEditor textEditor)
        {
            string            fileName         = textEditor.FileName;
            IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(fileName);

            if (expressionFinder == null)
            {
                return(null);
            }
            string           content = textEditor.Document.Text;
            ExpressionResult expr    = expressionFinder.FindFullExpression(content, textEditor.Caret.Offset);

            if (expr.Expression == null)
            {
                return(null);
            }
            return(ParserService.Resolve(expr, textEditor.Caret.Line, textEditor.Caret.Column, fileName, content));
        }
        protected ExpressionResult GetExpression(TextArea textArea)
        {
            IDocument         document         = textArea.Document;
            IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(fileName);

            if (expressionFinder == null)
            {
                return(new ExpressionResult(TextUtilities.GetExpressionBeforeOffset(textArea, textArea.Caret.Offset)));
            }
            else
            {
                ExpressionResult res = expressionFinder.FindExpression(document.GetText(0, textArea.Caret.Offset), textArea.Caret.Offset - 1);
                if (overrideContext != null)
                {
                    res.Context = overrideContext;
                }
                return(res);
            }
        }
示例#12
0
        public override void Execute(TextArea textArea)
        {
            TextEditorControl textEditorControl = textArea.MotherTextEditorControl;
            IDocument         document          = textEditorControl.Document;
            string            textContent       = document.TextContent;

            int caretLineNumber = document.GetLineNumberForOffset(textEditorControl.ActiveTextAreaControl.Caret.Offset) + 1;
            int caretColumn     = textEditorControl.ActiveTextAreaControl.Caret.Offset - document.GetLineSegment(caretLineNumber - 1).Offset + 1;

            IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(textEditorControl.FileName);

            if (expressionFinder == null)
            {
                return;
            }
            ExpressionResult expression = expressionFinder.FindFullExpression(textContent, textEditorControl.ActiveTextAreaControl.Caret.Offset);

            if (expression.Expression == null || expression.Expression.Length == 0)
            {
                return;
            }
            ResolveResult result = ParserService.Resolve(expression, caretLineNumber, caretColumn, textEditorControl.FileName, textContent);

            if (result != null)
            {
                FilePosition pos = result.GetDefinitionPosition();
                if (pos.IsEmpty == false)
                {
                    try {
                        if (pos.Position.IsEmpty)
                        {
                            FileService.OpenFile(pos.FileName);
                        }
                        else
                        {
                            FileService.JumpToFilePosition(pos.FileName, pos.Line - 1, pos.Column - 1);
                        }
                    } catch (Exception ex) {
                        MessageService.ShowError(ex, "Error jumping to '" + pos.FileName + "'.");
                    }
                }
            }
        }
示例#13
0
        protected ResolveResult ResolveAtCaret(TextEditorControl textEditor)
        {
            string            fileName         = textEditor.FileName;
            IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(fileName);

            if (expressionFinder == null)
            {
                return(null);
            }
            Caret            caret   = textEditor.ActiveTextAreaControl.Caret;
            string           content = textEditor.Document.TextContent;
            ExpressionResult expr    = expressionFinder.FindFullExpression(content, caret.Offset);

            if (expr.Expression == null)
            {
                return(null);
            }
            return(ParserService.Resolve(expr, caret.Line + 1, caret.Column + 1, fileName, content));
        }
示例#14
0
        public IInsightItem[] ProvideInsight(ITextEditor editor)
        {
            if (editor == null)
            {
                throw new ArgumentNullException("editor");
            }

            IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(editor.FileName);

            if (expressionFinder == null)
            {
                return(null);
            }

            IDocument        document         = editor.Document;
            int              useOffset        = (this.LookupOffset < 0) ? editor.Caret.Offset : this.LookupOffset;
            ExpressionResult expressionResult = expressionFinder.FindExpression(document.Text, useOffset);

            if (expressionResult.Expression == null) // expression is null when cursor is in string/comment
            {
                return(null);
            }

            if (LoggingService.IsDebugEnabled)
            {
                if (expressionResult.Context == ExpressionContext.Default)
                {
                    LoggingService.DebugFormatted("ShowInsight for >>{0}<<", expressionResult.Expression);
                }
                else
                {
                    LoggingService.DebugFormatted("ShowInsight for >>{0}<<, context={1}", expressionResult.Expression, expressionResult.Context);
                }
            }

            var           position = document.OffsetToPosition(useOffset);
            ResolveResult rr       = ParserService.Resolve(expressionResult, position.Line, position.Column, editor.FileName, document.Text);

            return(ProvideInsight(expressionResult, rr));
        }
示例#15
0
        ResolveResult ResolveAtCaret(ParserUpdateStepEventArgs e)
        {
            IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow;

            if (window == null)
            {
                return(null);
            }
            ITextEditorControlProvider provider = window.ActiveViewContent as ITextEditorControlProvider;

            if (provider == null)
            {
                return(null);
            }
            TextEditorControl ctl = provider.TextEditorControl;

            // e might be null when this is a manually triggered update
            string fileName = (e == null) ? ctl.FileName : e.FileName;

            if (ctl.FileName != fileName)
            {
                return(null);
            }
            IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(fileName);

            if (expressionFinder == null)
            {
                return(null);
            }
            Caret            caret   = ctl.ActiveTextAreaControl.Caret;
            string           content = (e == null) ? ctl.Text : e.Content;
            ExpressionResult expr    = expressionFinder.FindFullExpression(content, caret.Offset);

            if (expr.Expression == null)
            {
                return(null);
            }
            return(ParserService.Resolve(expr, caret.Line + 1, caret.Column + 1, fileName, content));
        }
        private void ShowDotCompletion(string currentText)
        {
            var seg = Breakpoint;

            var expressionFinder = ParserService.GetExpressionFinder(seg.FileName.ToString());
            var info             = ParserService.GetParseInformation(seg.FileName.ToString());

            string text = ParserService.GetParseableFileContent(seg.FileName.ToString()).Text;

            int currentOffset = TextEditor.Caret.Offset - console.CommandOffset - 1;

            var expr = expressionFinder.FindExpression(currentText, currentOffset);

            expr.Region = new DomRegion(seg.LineNumber, seg.ColumnNumber, seg.LineNumber, seg.ColumnNumber);

            var rr = resolver.Resolve(expr, info, text);

            if (rr != null)
            {
                TextEditor.ShowCompletionWindow(new DotCodeCompletionItemProvider().GenerateCompletionListForResolveResult(rr, expr.Context));
            }
        }
示例#17
0
        public void ShowHelp()
        {
            // Resolve expression at cursor and show help
            TextArea          textArea         = this.TextArea;
            IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(this.Adapter.FileName);

            if (expressionFinder == null)
            {
                return;
            }
            string           textContent      = this.Text;
            ExpressionResult expressionResult = expressionFinder.FindFullExpression(textContent, textArea.Caret.Offset);
            string           expression       = expressionResult.Expression;

            if (!string.IsNullOrEmpty(expression))
            {
                ResolveResult     result = ParserService.Resolve(expressionResult, textArea.Caret.Line, textArea.Caret.Column, this.Adapter.FileName, textContent);
                TypeResolveResult trr    = result as TypeResolveResult;
                if (trr != null)
                {
                    HelpProvider.ShowHelp(trr.ResolvedClass);
                }
                MemberResolveResult mrr = result as MemberResolveResult;
                if (mrr != null)
                {
                    switch (mrr.ResolvedMember.DeclaringType.ClassType)
                    {
                    case ClassType.Enum:
                        HelpProvider.ShowHelp(mrr.ResolvedMember.DeclaringType);
                        break;

                    default:
                        HelpProvider.ShowHelp(mrr.ResolvedMember);
                        break;
                    }
                }
            }
        }
示例#18
0
        public ToolStripItem[] BuildSubmenu(Codon codon, object owner)
        {
            ToolStripMenuItem item;

            TextEditorControl textEditorControl = (TextEditorControl)owner;

            if (textEditorControl.FileName == null)
            {
                return(new ToolStripItem[0]);
            }
            List <ToolStripItem> resultItems = new List <ToolStripItem>();
            TextArea             textArea    = textEditorControl.ActiveTextAreaControl.TextArea;
            IDocument            doc         = textArea.Document;
            int caretLine = textArea.Caret.Line;

            // list of dotnet names that have definition bookmarks in this line
            List <string> definitions = new List <string>();

            // Include definitions (use the bookmarks which should already be present)
            foreach (Bookmark mark in doc.BookmarkManager.Marks)
            {
                if (mark != null && mark.LineNumber == caretLine)
                {
                    ClassMemberBookmark cmb = mark as ClassMemberBookmark;
                    ClassBookmark       cb  = mark as ClassBookmark;
                    IClass type             = null;
                    if (cmb != null)
                    {
                        definitions.Add(cmb.Member.DotNetName);
                        item = new ToolStripMenuItem(MemberNode.GetText(cmb.Member),
                                                     ClassBrowserIconService.ImageList.Images[cmb.IconIndex]);
                        MenuService.AddItemsToMenu(item.DropDown.Items, mark, ClassMemberBookmark.ContextMenuPath);
                        resultItems.Add(item);
                        type = cmb.Member.DeclaringType;
                    }
                    else if (cb != null)
                    {
                        type = cb.Class;
                    }
                    if (type != null)
                    {
                        definitions.Add(type.DotNetName);
                        item = new ToolStripMenuItem(type.Name, ClassBrowserIconService.ImageList.Images[ClassBrowserIconService.GetIcon(type)]);
                        MenuService.AddItemsToMenu(item.DropDown.Items,
                                                   cb ?? new ClassBookmark(textArea.Document, type),
                                                   ClassBookmark.ContextMenuPath);
                        resultItems.Add(item);
                    }
                }
            }

            // Include menu for member that has been clicked on
            IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(textEditorControl.FileName);
            ExpressionResult  expressionResult;
            ResolveResult     rr;
            int insertIndex = resultItems.Count;                // Insert items at this position to get the outermost expression first, followed by the inner expressions (if any).

            expressionResult = FindFullExpressionAtCaret(textArea, expressionFinder);
repeatResolve:
            rr   = ResolveExpressionAtCaret(textArea, expressionResult);
            item = null;
            if (rr is MethodResolveResult)
            {
                item = MakeItem(definitions, ((MethodResolveResult)rr).GetMethodIfSingleOverload());
            }
            else if (rr is MemberResolveResult)
            {
                MemberResolveResult mrr = (MemberResolveResult)rr;
                item = MakeItem(definitions, mrr.ResolvedMember);
                if (RefactoringService.FixIndexerExpression(expressionFinder, ref expressionResult, mrr))
                {
                    if (item != null)
                    {
                        resultItems.Insert(insertIndex, item);
                    }
                    // Include menu for the underlying expression of the
                    // indexer expression as well.
                    goto repeatResolve;
                }
            }
            else if (rr is TypeResolveResult)
            {
                item = MakeItem(definitions, ((TypeResolveResult)rr).ResolvedClass);
            }
            else if (rr is LocalResolveResult)
            {
                item        = MakeItem((LocalResolveResult)rr, caretLine + 1 == ((LocalResolveResult)rr).Field.Region.BeginLine);
                insertIndex = 0;                        // Insert local variable menu item at the topmost position.
            }
            if (item != null)
            {
                resultItems.Insert(insertIndex, item);
            }

            // Include menu for current class and method
            IMember callingMember = null;

            if (rr != null)
            {
                callingMember = rr.CallingMember;
            }
            else
            {
                ParseInformation parseInfo = ParserService.GetParseInformation(textEditorControl.FileName);
                if (parseInfo != null)
                {
                    ICompilationUnit cu = parseInfo.MostRecentCompilationUnit;
                    if (cu != null)
                    {
                        IClass callingClass = cu.GetInnermostClass(caretLine + 1, textArea.Caret.Column + 1);
                        callingMember = GetCallingMember(callingClass, caretLine + 1, textArea.Caret.Column + 1);
                    }
                }
            }
            if (callingMember != null)
            {
                item = MakeItem(definitions, callingMember);
                if (item != null)
                {
                    item.Text = StringParser.Parse("${res:SharpDevelop.Refactoring.CurrentMethod}: ") + callingMember.Name;
                    resultItems.Add(item);
                }
            }

            if (resultItems.Count == 0)
            {
                return(new ToolStripItem[0]);
            }
            else
            {
                resultItems.Add(new MenuSeparator());
                return(resultItems.ToArray());
            }
        }
示例#19
0
        /// <summary>
        /// Gets debugger tooltip information for the specified position.
        /// A descriptive string for the element or a DebuggerTooltipControl
        /// showing its current value (when in debugging mode) can be returned
        /// through the ToolTipRequestEventArgs.SetTooltip() method.
        /// </summary>
        internal static void HandleToolTipRequest(ToolTipRequestEventArgs e)
        {
            if (!e.InDocument)
            {
                return;
            }
            Location logicPos = e.LogicalPosition;
            var      doc      = e.Editor.Document;
            FileName fileName = e.Editor.FileName;

            IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(fileName);

            if (expressionFinder == null)
            {
                return;
            }

            var currentLine = doc.GetLine(logicPos.Y);

            if (logicPos.X > currentLine.Length)
            {
                return;
            }
            string           textContent      = doc.Text;
            ExpressionResult expressionResult = expressionFinder.FindFullExpression(textContent, doc.PositionToOffset(logicPos.Line, logicPos.Column));
            string           expression       = (expressionResult.Expression ?? "").Trim();

            if (expression.Length > 0)
            {
                // Look if it is variable
                ResolveResult result = ParserService.Resolve(expressionResult, logicPos.Y, logicPos.X, fileName, textContent);
                bool          debuggerCanShowValue;
                string        toolTipText = GetText(result, expression, out debuggerCanShowValue);
                if (Control.ModifierKeys == Keys.Control)
                {
                    toolTipText          = "expr: " + expressionResult.ToString() + "\n" + toolTipText;
                    debuggerCanShowValue = false;
                }
                if (toolTipText != null)
                {
                    if (debuggerCanShowValue && currentDebugger != null)
                    {
                        object toolTip = currentDebugger.GetTooltipControl(e.LogicalPosition, expressionResult.Expression);
                        if (toolTip != null)
                        {
                            e.SetToolTip(toolTip);
                        }
                        else
                        {
                            e.SetToolTip(toolTipText);
                        }
                    }
                    else
                    {
                        e.SetToolTip(toolTipText);
                    }
                }
            }
            else
            {
                                #if DEBUG
                if (Control.ModifierKeys == Keys.Control)
                {
                    e.SetToolTip("no expr: " + expressionResult.ToString());
                }
                                #endif
            }
        }
示例#20
0
        /// <summary>
        /// This method can be used in three modes (like RunFindReferences)
        /// </summary>
        static void AddReferences(List <Reference> list,
                                  IClass parentClass, IMember member,
                                  bool isLocal,
                                  string fileName, string fileContent)
        {
            TextFinder textFinder;             // the class used to find the position to resolve

            if (member == null)
            {
                textFinder = parentClass.ProjectContent.Language.GetFindClassReferencesTextFinder(parentClass);
            }
            else
            {
                Debug.Assert(member.DeclaringType.GetCompoundClass() == parentClass.GetCompoundClass());
                textFinder = parentClass.ProjectContent.Language.GetFindMemberReferencesTextFinder(member);
            }

            // It is possible that a class or member does not have a name (when parsing incomplete class definitions)
            // - in that case, we cannot find references.
            if (textFinder == null)
            {
                return;
            }

            string fileContentForFinder = textFinder.PrepareInputText(fileContent);

            IExpressionFinder expressionFinder = null;
            TextFinderMatch   match            = new TextFinderMatch(-1, 0);

            while (true)
            {
                match = textFinder.Find(fileContentForFinder, match.Position + 1);
                if (match.Position < 0)
                {
                    break;
                }

                if (expressionFinder == null)
                {
                    expressionFinder = ParserService.GetExpressionFinder(fileName);
                    if (expressionFinder == null)
                    {
                        // ignore file if we cannot get an expression finder
                        return;
                    }
                }
                ExpressionResult expr = expressionFinder.FindFullExpression(fileContent, match.ResolvePosition);
                if (expr.Expression != null)
                {
                    Point position = GetPosition(fileContent, match.ResolvePosition);
repeatResolve:
                    // TODO: Optimize by re-using the same resolver if multiple expressions were
                    // found in this file (the resolver should parse all methods at once)
                    ResolveResult rr = ParserService.Resolve(expr, position.Y, position.X, fileName, fileContent);
                    MemberResolveResult mrr = rr as MemberResolveResult;
                    if (member != null)
                    {
                        // find reference to member
                        if (rr != null && rr.IsReferenceTo(member))
                        {
                            list.Add(new Reference(fileName, match.Position, match.Length, expr.Expression, rr));
                        }
                        else if (FixIndexerExpression(expressionFinder, ref expr, mrr))
                        {
                            goto repeatResolve;
                        }
                    }
                    else
                    {
                        // find reference to class
                        if (rr != null && rr.IsReferenceTo(parentClass))
                        {
                            list.Add(new Reference(fileName, match.Position, match.Length, expr.Expression, rr));
                        }
                    }
                }
            }
        }
示例#21
0
        /// <summary>
        /// This method can be used in three modes (like RunFindReferences)
        /// </summary>
        static void AddReferences(List <Reference> list,
                                  IClass parentClass, IMember member,
                                  bool isLocal,
                                  string fileName, string fileContent)
        {
            string lowerFileContent = fileContent.ToLowerInvariant();
            string searchedText;             // the text that is searched for
            bool   searchingIndexer = false;

            if (member == null)
            {
                searchedText = parentClass.Name.ToLowerInvariant();
            }
            else
            {
                // When looking for a member, the name of the parent class does not always exist
                // in the file where the member is accessed.
                // (examples: derived classes, partial classes)
                if (member is IMethod && ((IMethod)member).IsConstructor)
                {
                    searchedText = parentClass.Name.ToLowerInvariant();
                }
                else
                {
                    if (member is IProperty && ((IProperty)member).IsIndexer)
                    {
                        searchingIndexer = true;
                        searchedText     = GetIndexerExpressionStartToken(fileName);
                    }
                    else
                    {
                        searchedText = member.Name.ToLowerInvariant();
                    }
                }
            }

            // It is possible that a class or member does not have a name (when parsing incomplete class definitions)
            // - in that case, we cannot find references.
            if (searchedText.Length == 0)
            {
                return;
            }

            int pos = -1;
            int exprPos;
            IExpressionFinder expressionFinder = null;

            while ((pos = lowerFileContent.IndexOf(searchedText, pos + 1)) >= 0)
            {
                if (!searchingIndexer)
                {
                    if (pos > 0 && char.IsLetterOrDigit(fileContent, pos - 1))
                    {
                        continue;                         // memberName is not a whole word (a.SomeName cannot reference Name)
                    }
                    if (pos < fileContent.Length - searchedText.Length - 1 &&
                        char.IsLetterOrDigit(fileContent, pos + searchedText.Length))
                    {
                        continue;                         // memberName is not a whole word (a.Name2 cannot reference Name)
                    }
                    exprPos = pos;
                }
                else
                {
                    exprPos = pos - 1;                          // indexer expressions are found by resolving the part before the indexer
                }

                if (expressionFinder == null)
                {
                    expressionFinder = ParserService.GetExpressionFinder(fileName);
                }
                ExpressionResult expr = expressionFinder.FindFullExpression(fileContent, exprPos);
                if (expr.Expression != null)
                {
                    Point position = GetPosition(fileContent, exprPos);
repeatResolve:
                    // TODO: Optimize by re-using the same resolver if multiple expressions were
                    // found in this file (the resolver should parse all methods at once)
                    ResolveResult rr = ParserService.Resolve(expr, position.Y, position.X, fileName, fileContent);
                    MemberResolveResult mrr = rr as MemberResolveResult;
                    if (isLocal)
                    {
                        // find reference to local variable
                        if (IsReferenceToLocalVariable(rr, member))
                        {
                            list.Add(new Reference(fileName, pos, searchedText.Length, expr.Expression, rr));
                        }
                        else if (FixIndexerExpression(expressionFinder, ref expr, mrr))
                        {
                            goto repeatResolve;
                        }
                    }
                    else if (member != null)
                    {
                        // find reference to member
                        if (IsReferenceToMember(member, rr))
                        {
                            list.Add(new Reference(fileName, pos, searchedText.Length, expr.Expression, rr));
                        }
                        else if (FixIndexerExpression(expressionFinder, ref expr, mrr))
                        {
                            goto repeatResolve;
                        }
                    }
                    else
                    {
                        // find reference to class
                        if (mrr != null)
                        {
                            if (mrr.ResolvedMember is IMethod && ((IMethod)mrr.ResolvedMember).IsConstructor)
                            {
                                if (mrr.ResolvedMember.DeclaringType.FullyQualifiedName == parentClass.FullyQualifiedName)
                                {
                                    list.Add(new Reference(fileName, pos, searchedText.Length, expr.Expression, rr));
                                }
                            }
                        }
                        else
                        {
                            if (rr is TypeResolveResult && rr.ResolvedType.FullyQualifiedName == parentClass.FullyQualifiedName)
                            {
                                list.Add(new Reference(fileName, pos, searchedText.Length, expr.Expression, rr));
                            }
                        }
                    }
                }
            }
        }