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);
                        }
                    }
                }
            }
        }