Пример #1
0
        void IExecutableAction.Execute(IDataContext context, DelegateExecute nextExecute)
        {
            ITextControl textControl = context.GetData(TextControlDataConstants.TEXT_CONTROL);

            if (textControl == null)
            {
                MessageBox.ShowError("Text control unavailable.");
                return;
            }
            ISolution solution = context.GetData(JetBrains.ProjectModel.DataContext.ProjectModelDataConstants.SOLUTION);

            if (solution == null)
            {
                return;
            }

            IClrTypeName clrTypeClassName = ResharperHelper.GetClassNameAppropriateToLocation(solution, textControl);

            if (clrTypeClassName == null)
            {
                return;
            }

            var typeDeclaration = ResharperHelper.FindFirstCharpTypeDeclarationInDocument(solution, textControl.Document);

            if (typeDeclaration == null)
            {
                return;
            }

            var currentProject = context.GetData(JetBrains.ProjectModel.DataContext.ProjectModelDataConstants.Project);

            if (currentProject == null)
            {
                ResharperHelper.AppendLineToOutputWindow("Internal Error: No current project");
                return;
            }

            var targetProjects = currentProject.GetAssociatedProjects(textControl.ToProjectFile(solution));

            if (targetProjects.IsEmpty())
            {
                ResharperHelper.AppendLineToOutputWindow("Unable to locate associated assembly - check project namespaces and testcop Regex");
                //ProjectMappingHelper.GetProjectMappingHeper().DumpDebug(solution);
                return;
            }

            var settings = solution.GetPsiServices().SettingsStore
                           .BindToContextTransient(ContextRange.Smart(textControl.ToDataContext()))
                           .GetKey <TestFileAnalysisSettings>(SettingsOptimization.OptimizeDefault);

            var baseFileName = ResharperHelper.GetBaseFileName(context, solution);

            bool isTestFile = baseFileName.EndsWith(settings.TestClassSuffixes());

            if (isTestFile != currentProject.IsTestProject())
            {
                ResharperHelper.AppendLineToOutputWindow(
                    string.Format("Don't know how to navigate with '{0}' within project '{1}'. It is a {2} file within a {3} project"
                                  , baseFileName, currentProject.Name, isTestFile ? "test" : "code", currentProject.IsTestProject() ? "test" : "code"));
                return;
            }

            var elementsFoundInTarget   = new List <IClrDeclaredElement>();
            var elementsFoundInSolution = new List <IClrDeclaredElement>();


            foreach (var singleTargetProject in targetProjects)
            {
                foreach (var patternMatcher in singleTargetProject.FilePattern)
                {
                    //FindByClassName
                    elementsFoundInSolution.AddRangeIfMissing(ResharperHelper.FindClass(solution, patternMatcher.RegEx.ToString()), _declElementMatcher);
                    elementsFoundInTarget.AddRangeIfMissing(ResharperHelper.FindClass(solution, patternMatcher.RegEx.ToString(), new List <IProject>()
                    {
                        singleTargetProject.Project
                    }), _declElementMatcher);

                    if (!isTestFile)
                    {
                        //Find via filename (for when we switch to test files)
                        var otherMatches = ResharperHelper.FindFirstTypeWithinCodeFiles(solution, patternMatcher.RegEx, singleTargetProject.Project);
                        elementsFoundInTarget.AddRangeIfMissing(otherMatches, _declElementMatcher);
                    }
                }
            }

            if (!isTestFile)
            {
                var references = FindReferencesWithinAssociatedAssembly(context, solution, textControl, clrTypeClassName, targetProjects);
                elementsFoundInTarget.AddRangeIfMissing(references, _declElementMatcher);
            }

            JumpToTestMenuHelper.PromptToOpenOrCreateClassFiles(_menuDisplayer, textControl.Lifetime, context,
                                                                solution
                                                                , currentProject, clrTypeClassName, targetProjects
                                                                , elementsFoundInTarget, elementsFoundInSolution);
        }