protected override void Run() { //1. identify if the member belongs to an interface var entity = MemberExtensionsHelper.Instance.GetEntityAtCaret(); //2. find classes that implement the interface //3. go to member in that class Document activeDocument = IdeApp.Workbench.ActiveDocument; if (activeDocument != null && !(activeDocument.FileName == FilePath.Null)) { ResolveResult resolveResult; object item = CurrentRefactoryOperationsHandler.GetItem(activeDocument, out resolveResult); var resolvedEntity = item as AbstractResolvedEntity; if (resolvedEntity != null && resolvedEntity.DeclaringType.Kind == TypeKind.Interface) { NavigateToAbstractMember(resolvedEntity); } else if (IsRequestingCycleMostRecentMemberNavigation()) { CycleResults(); } else if (ViewModelHelper.Instance.IsActiveFileXamlFile) { _mostRecentEntity = null; NavigateToXamlValue(resolvedEntity); } else { _mostRecentEntity = null; NavigateToNonAbstractMember(item); } } }
void ResetResults() { _mostRecentEntity = null; _currentMemberReference = null; _foundMemberReferences = new List <MemberReference> (); _didFindFirstResult = false; }
void NavigateToAbstractMember(AbstractResolvedEntity entity) { ResetResults(); var member = entity as IMember; //if we already have a _mostRecentEntity and it's the same as the member we're on //then we just cycle the results _mostRecentEntity = entity; _lastSearchTime = DateTime.UtcNow; FindDerivedSymbolsHelper.FindDerivedMembers(member, ReportResult); }
void NavigateToXamlValue(AbstractResolvedEntity entity) { var editor = IdeApp.Workbench.ActiveDocument.Editor; //first try to go to the element //get text at caret, and expand out till we get soem quotes var line = IdeApp.Workbench.ActiveDocument.Editor.Caret.Line; var column = IdeApp.Workbench.ActiveDocument.Editor.Caret.Column; var text = IdeApp.Workbench.ActiveDocument.Editor.GetLineText(line); var member = MemberExtensionsHelper.Instance.GetNearestEntity(false, true); //TODO get the exact property //var memberText = editor.GetTextBetween (member.Region.Begin, member.Region.End); //try to work out what this is.. // var didPass = XamlHelper.PerformXamlNavigationActionUsingText (editor.Text); var isPropertyValue = XamlHelper.GetIsPropertyValue(text, column); var valueText = XamlHelper.GetWordAtColumn(text, column); if (isPropertyValue) { if (!string.IsNullOrEmpty(valueText)) { //crude mechanism for now to work out if this is a binding statemnet or not string fileName = null; if (text.Contains("{")) { //consider that it's a property on the vm //TODO make more robust.. check before opening fileName = ViewModelHelper.Instance.VMFileNameForActiveDocument; } else { //consider that it's a handler on the code behind //TODO make more robust.. check before opening fileName = ViewModelHelper.Instance.CodeBehindFileNameForActiveDocument; } ViewModelHelper.Instance.OpenDocument(fileName); //now go to the member MemberExtensionsHelper.Instance.GotoMemberWithName(valueText); } } else { var unresolvedMember = member as AbstractUnresolvedMember; if (unresolvedMember?.ReturnType != null) { var returnType = unresolvedMember.ReturnType as GetClassTypeReference; var fileNameString = returnType.FullTypeName.ReflectionName.Replace(".", "/"); Project targetProject; var fileName = DocumentHelper.GetFileNameWithType(fileNameString, out targetProject); if (fileName != null) { IdeHelper.OpenDocument(fileName, targetProject); if (!string.IsNullOrEmpty(valueText)) { MemberExtensionsHelper.Instance.GotoMemberWithName(valueText); } } } } }