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); } }
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); }
/// <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); }
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)); }
/// <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); }
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)); } }
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); } }
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 + "'."); } } } }
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)); }
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)); }
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)); } }
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; } } } }
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()); } }
/// <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 } }
/// <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)); } } } } }
/// <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)); } } } } } }