private bool IsFullyBoundProject(ISolutionRuleSetsInformationProvider ruleSetInfoProvider, IRuleSetSerializer ruleSetSerializer, BindingConfiguration binding, Project project, Core.Language language) { Debug.Assert(binding != null); Debug.Assert(project != null); // If solution is not bound/is missing a rules configuration file, no need to go further var slnLevelBindingConfigFilepath = CalculateSonarQubeSolutionBindingConfigPath(ruleSetInfoProvider, binding, language); if (!fileSystem.File.Exists(slnLevelBindingConfigFilepath)) { return(false); } if (!BindingRefactoringDumpingGround.IsProjectLevelBindingRequired(project)) { return(true); // nothing else to check } // Projects that required project-level binding should be using RuleSets for configuration, // so we assume that the solution-level config file is a ruleset. RuleSet sonarQubeRuleSet = ruleSetSerializer.LoadRuleSet(slnLevelBindingConfigFilepath); if (sonarQubeRuleSet == null) { return(false); } RuleSetDeclaration[] declarations = ruleSetInfoProvider.GetProjectRuleSetsDeclarations(project).ToArray(); return(declarations.Length > 0 && // Need at least one declarations.All(declaration => this.IsRuleSetBound(ruleSetSerializer, project, declaration, sonarQubeRuleSet))); }
public void BindingUtilities_IsProjectLevelBindingRequired() { // 1. C# -> binding is required var csProject = new ProjectMock("c:\\foo.proj"); csProject.SetCSProjectKind(); BindingRefactoringDumpingGround.IsProjectLevelBindingRequired(csProject).Should().BeTrue(); // 2. VB.NET -> binding is required var vbProject = new ProjectMock("c:\\foo.proj"); vbProject.SetVBProjectKind(); BindingRefactoringDumpingGround.IsProjectLevelBindingRequired(vbProject).Should().BeTrue(); // 3. Cpp -> binding is required var cppProject = new ProjectMock("c:\\foo.proj"); cppProject.ProjectKind = ProjectSystemHelper.CppProjectKind; BindingRefactoringDumpingGround.IsProjectLevelBindingRequired(cppProject).Should().BeFalse(); // 4. Other -> binding is not required var otherProject = new ProjectMock("c:\\foo.proj"); otherProject.ProjectKind = "{" + Guid.NewGuid().ToString() + "}"; BindingRefactoringDumpingGround.IsProjectLevelBindingRequired(otherProject).Should().BeFalse(); }
// ISSUE : this method is doing too many things private RuleSetInformation[] CheckSlnLevelConfigExistsAndReturnAllProjectRuleSetsForAllConfigurations( BoundSonarQubeProject bindingInfo) { var projectSystem = this.serviceProvider.GetService <IProjectSystemHelper>(); projectSystem.AssertLocalServiceIsNotNull(); var ruleSetInfoProvider = this.serviceProvider.GetService <ISolutionRuleSetsInformationProvider>(); ruleSetInfoProvider.AssertLocalServiceIsNotNull(); var fileSystem = this.serviceProvider.GetService <IFileSystem>(); fileSystem.AssertLocalServiceIsNotNull(); var projectRuleSetAggregation = new Dictionary <string, RuleSetInformation>(StringComparer.OrdinalIgnoreCase); foreach (Project project in projectSystem.GetFilteredSolutionProjects()) { // Solution-level checks (done here because the expected solution-level config // depends on the languages supported by the project that exist) string baselineRuleSet = ruleSetInfoProvider.CalculateSolutionSonarQubeRuleSetFilePath( bindingInfo.ProjectKey, ProjectToLanguageMapper.GetLanguageForProject(project), SonarLintMode.LegacyConnected); if (!fileSystem.FileExist(baselineRuleSet)) { this.WriteWarning(Strings.ExpectedRuleSetNotFound, baselineRuleSet, project.FullName); continue; } if (!BindingRefactoringDumpingGround.IsProjectLevelBindingRequired(project)) { continue; } foreach (RuleSetDeclaration declaration in ruleSetInfoProvider.GetProjectRuleSetsDeclarations(project)) { string projectRuleSet = CalculateProjectRuleSetFullPath(ruleSetInfoProvider, project, declaration); this.AddOrUpdateAggregatedRuleSetInformation(projectRuleSetAggregation, baselineRuleSet, declaration, projectRuleSet); } } return(projectRuleSetAggregation.Values.ToArray()); }