From 06a41840c7906f9edfd5908748d6c47a786d0dd4 Mon Sep 17 00:00:00 2001 From: filipw Date: Mon, 3 Feb 2020 12:37:55 +0100 Subject: [PATCH 1/6] addded support for RunAnalyzers and RunAnalyzersDuringLiveAnalysis --- .../ProjectFileInfo.ProjectData.cs | 19 ++++++++++++++++--- .../ProjectFile/ProjectFileInfo.cs | 2 ++ .../ProjectFile/ProjectFileInfoExtensions.cs | 5 +++++ .../ProjectFile/PropertyNames.cs | 2 ++ src/OmniSharp.MSBuild/ProjectManager.cs | 6 ++++++ 5 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfo.ProjectData.cs b/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfo.ProjectData.cs index 1e6aa214ee..be8c4ca16a 100644 --- a/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfo.ProjectData.cs +++ b/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfo.ProjectData.cs @@ -53,6 +53,8 @@ private class ProjectData public ImmutableDictionary ReferenceAliases { get; } public ImmutableDictionary ProjectReferenceAliases { get; } public bool TreatWarningsAsErrors { get; } + public bool RunAnalyzers { get; } + public bool RunAnalyzersDuringLiveAnalysis { get; } public string DefaultNamespace { get; } private ProjectData() @@ -91,6 +93,8 @@ private ProjectData( string assemblyOriginatorKeyFile, bool treatWarningsAsErrors, string defaultNamespace, + bool runAnalyzers, + bool runAnalyzersDuringLiveAnalysis, RuleSet ruleset) : this() { @@ -122,6 +126,9 @@ private ProjectData( TreatWarningsAsErrors = treatWarningsAsErrors; RuleSet = ruleset; DefaultNamespace = defaultNamespace; + + RunAnalyzers = runAnalyzers; + RunAnalyzersDuringLiveAnalysis = runAnalyzersDuringLiveAnalysis; } private ProjectData( @@ -149,12 +156,14 @@ private ProjectData( ImmutableArray additionalFiles, bool treatWarningsAsErrors, string defaultNamespace, + bool runAnalyzers, + bool runAnalyzersDuringLiveAnalysis, RuleSet ruleset, ImmutableDictionary referenceAliases, ImmutableDictionary projectReferenceAliases) : this(guid, name, assemblyName, targetPath, outputPath, intermediateOutputPath, projectAssetsFile, configuration, platform, targetFramework, targetFrameworks, outputKind, languageVersion, nullableContextOptions, allowUnsafeCode, checkForOverflowUnderflow, - documentationFile, preprocessorSymbolNames, suppressedDiagnosticIds, signAssembly, assemblyOriginatorKeyFile, treatWarningsAsErrors, defaultNamespace, ruleset) + documentationFile, preprocessorSymbolNames, suppressedDiagnosticIds, signAssembly, assemblyOriginatorKeyFile, treatWarningsAsErrors, defaultNamespace, runAnalyzers, runAnalyzersDuringLiveAnalysis, ruleset) { SourceFiles = sourceFiles.EmptyIfDefault(); ProjectReferences = projectReferences.EmptyIfDefault(); @@ -200,11 +209,13 @@ public static ProjectData Create(MSB.Evaluation.Project project) var signAssembly = PropertyConverter.ToBoolean(project.GetPropertyValue(PropertyNames.SignAssembly), defaultValue: false); var assemblyOriginatorKeyFile = project.GetPropertyValue(PropertyNames.AssemblyOriginatorKeyFile); var treatWarningsAsErrors = PropertyConverter.ToBoolean(project.GetPropertyValue(PropertyNames.TreatWarningsAsErrors), defaultValue: false); + var runAnalyzers = PropertyConverter.ToBoolean(project.GetPropertyValue(PropertyNames.RunAnalyzers), defaultValue: true); + var runAnalyzersDuringLiveAnalysis = PropertyConverter.ToBoolean(project.GetPropertyValue(PropertyNames.RunAnalyzersDuringLiveAnalysis), defaultValue: true); return new ProjectData( guid, name, assemblyName, targetPath, outputPath, intermediateOutputPath, projectAssetsFile, configuration, platform, targetFramework, targetFrameworks, outputKind, languageVersion, nullableContextOptions, allowUnsafeCode, checkForOverflowUnderflow, - documentationFile, preprocessorSymbolNames, suppressedDiagnosticIds, signAssembly, assemblyOriginatorKeyFile, treatWarningsAsErrors, defaultNamespace, ruleset: null); + documentationFile, preprocessorSymbolNames, suppressedDiagnosticIds, signAssembly, assemblyOriginatorKeyFile, treatWarningsAsErrors, defaultNamespace, runAnalyzers, runAnalyzersDuringLiveAnalysis, ruleset: null); } public static ProjectData Create(MSB.Execution.ProjectInstance projectInstance) @@ -240,6 +251,8 @@ public static ProjectData Create(MSB.Execution.ProjectInstance projectInstance) var suppressedDiagnosticIds = PropertyConverter.ToSuppressedDiagnosticIds(projectInstance.GetPropertyValue(PropertyNames.NoWarn)); var signAssembly = PropertyConverter.ToBoolean(projectInstance.GetPropertyValue(PropertyNames.SignAssembly), defaultValue: false); var treatWarningsAsErrors = PropertyConverter.ToBoolean(projectInstance.GetPropertyValue(PropertyNames.TreatWarningsAsErrors), defaultValue: false); + var runAnalyzers = PropertyConverter.ToBoolean(projectInstance.GetPropertyValue(PropertyNames.RunAnalyzers), defaultValue: false); + var runAnalyzersDuringLiveAnalysis = PropertyConverter.ToBoolean(projectInstance.GetPropertyValue(PropertyNames.RunAnalyzersDuringLiveAnalysis), defaultValue: false); var assemblyOriginatorKeyFile = projectInstance.GetPropertyValue(PropertyNames.AssemblyOriginatorKeyFile); var ruleset = ResolveRulesetIfAny(projectInstance); @@ -310,7 +323,7 @@ public static ProjectData Create(MSB.Execution.ProjectInstance projectInstance) configuration, platform, targetFramework, targetFrameworks, outputKind, languageVersion, nullableContextOptions, allowUnsafeCode, checkForOverflowUnderflow, documentationFile, preprocessorSymbolNames, suppressedDiagnosticIds, signAssembly, assemblyOriginatorKeyFile, - sourceFiles, projectReferences.ToImmutable(), references.ToImmutable(), packageReferences, analyzers, additionalFiles, treatWarningsAsErrors, defaultNamespace, ruleset, + sourceFiles, projectReferences.ToImmutable(), references.ToImmutable(), packageReferences, analyzers, additionalFiles, treatWarningsAsErrors, defaultNamespace, runAnalyzers, runAnalyzersDuringLiveAnalysis, ruleset, referenceAliases.ToImmutableDictionary(), projectReferenceAliases.ToImmutable()); } diff --git a/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfo.cs b/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfo.cs index 1d7177847b..2d9651af76 100644 --- a/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfo.cs +++ b/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfo.cs @@ -55,6 +55,8 @@ internal partial class ProjectFileInfo public ImmutableDictionary ReferenceAliases => _data.ReferenceAliases; public ImmutableDictionary ProjectReferenceAliases => _data.ProjectReferenceAliases; public bool TreatWarningsAsErrors => _data.TreatWarningsAsErrors; + public bool RunAnalyzers => _data.RunAnalyzers; + public bool RunAnalyzersDuringLiveAnalysis => _data.RunAnalyzersDuringLiveAnalysis; public string DefaultNamespace => _data.DefaultNamespace; public ProjectIdInfo ProjectIdInfo { get; } diff --git a/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfoExtensions.cs b/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfoExtensions.cs index ada58e331a..d983e7655e 100644 --- a/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfoExtensions.cs +++ b/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfoExtensions.cs @@ -76,6 +76,11 @@ public static ProjectInfo CreateProjectInfo(this ProjectFileInfo projectFileInfo private static IEnumerable ResolveAnalyzerReferencesForProject(ProjectFileInfo projectFileInfo, IAnalyzerAssemblyLoader analyzerAssemblyLoader) { + if (!projectFileInfo.RunAnalyzers || !projectFileInfo.RunAnalyzersDuringLiveAnalysis) + { + return Enumerable.Empty(); + } + foreach(var analyzerAssemblyPath in projectFileInfo.Analyzers.Distinct()) { analyzerAssemblyLoader.AddDependencyLocation(analyzerAssemblyPath); diff --git a/src/OmniSharp.MSBuild/ProjectFile/PropertyNames.cs b/src/OmniSharp.MSBuild/ProjectFile/PropertyNames.cs index d28f8e1a49..2b1f0806f5 100644 --- a/src/OmniSharp.MSBuild/ProjectFile/PropertyNames.cs +++ b/src/OmniSharp.MSBuild/ProjectFile/PropertyNames.cs @@ -32,6 +32,8 @@ internal static class PropertyNames public const string _ResolveReferenceDependencies = nameof(_ResolveReferenceDependencies); public const string RootNamespace = nameof(RootNamespace); public const string RoslynTargetsPath = nameof(RoslynTargetsPath); + public const string RunAnalyzers = nameof(RunAnalyzers); + public const string RunAnalyzersDuringLiveAnalysis = nameof(RunAnalyzersDuringLiveAnalysis); public const string SignAssembly = nameof(SignAssembly); public const string SkipCompilerExecution = nameof(SkipCompilerExecution); public const string SolutionDir = nameof(SolutionDir); diff --git a/src/OmniSharp.MSBuild/ProjectManager.cs b/src/OmniSharp.MSBuild/ProjectManager.cs index 6be793bfec..d14b8bd723 100644 --- a/src/OmniSharp.MSBuild/ProjectManager.cs +++ b/src/OmniSharp.MSBuild/ProjectManager.cs @@ -444,6 +444,12 @@ private void UpdateProject(string projectFilePath) private void UpdateAnalyzerReferences(Project project, ProjectFileInfo projectFileInfo) { + if (!projectFileInfo.RunAnalyzers || !projectFileInfo.RunAnalyzersDuringLiveAnalysis) + { + _workspace.SetAnalyzerReferences(project.Id, ImmutableArray.Empty); + return; + } + var analyzerFileReferences = projectFileInfo.Analyzers .Select(analyzerReferencePath => new AnalyzerFileReference(analyzerReferencePath, _analyzerAssemblyLoader)) .ToImmutableArray(); From 2861e1a9107f48896c41be72ba615d9a254da1c9 Mon Sep 17 00:00:00 2001 From: filipw Date: Tue, 17 Mar 2020 15:18:08 +0100 Subject: [PATCH 2/6] added tests --- build.json | 3 +++ .../ProjectWithDisabledAnalyzers/Program.cs | 12 ++++++++++++ .../ProjectWithDisabledAnalyzers.csproj | 12 ++++++++++++ .../ProjectWithDisabledAnalyzers2/Program.cs | 12 ++++++++++++ .../ProjectWithDisabledAnalyzers2.csproj | 12 ++++++++++++ .../ProjectWithAnalyzersTests.cs | 19 ++++++++++++++++++- 6 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 test-assets/test-projects/ProjectWithDisabledAnalyzers/Program.cs create mode 100644 test-assets/test-projects/ProjectWithDisabledAnalyzers/ProjectWithDisabledAnalyzers.csproj create mode 100644 test-assets/test-projects/ProjectWithDisabledAnalyzers2/Program.cs create mode 100644 test-assets/test-projects/ProjectWithDisabledAnalyzers2/ProjectWithDisabledAnalyzers2.csproj diff --git a/build.json b/build.json index 11090f0a04..8e3f8ea3f5 100644 --- a/build.json +++ b/build.json @@ -35,6 +35,9 @@ "ProjectWithMultiTFMLib", "ExternAlias", "ProjectWithComplexAnalyzers", + "ProjectWithDisabledAnalyzers", + "ProjectWithDisabledAnalyzers2", + "ProjectWithAnalyzers", "NetCore30Project" ], "CakeTestAssets": [ diff --git a/test-assets/test-projects/ProjectWithDisabledAnalyzers/Program.cs b/test-assets/test-projects/ProjectWithDisabledAnalyzers/Program.cs new file mode 100644 index 0000000000..8168c80511 --- /dev/null +++ b/test-assets/test-projects/ProjectWithDisabledAnalyzers/Program.cs @@ -0,0 +1,12 @@ +using System; + +namespace HelloWorld +{ + class Program + { + static void Main(string[] args) + { + Console.WriteLine("Hello World!"); + } + } +} diff --git a/test-assets/test-projects/ProjectWithDisabledAnalyzers/ProjectWithDisabledAnalyzers.csproj b/test-assets/test-projects/ProjectWithDisabledAnalyzers/ProjectWithDisabledAnalyzers.csproj new file mode 100644 index 0000000000..a769c05836 --- /dev/null +++ b/test-assets/test-projects/ProjectWithDisabledAnalyzers/ProjectWithDisabledAnalyzers.csproj @@ -0,0 +1,12 @@ + + + + Exe + netcoreapp2.1 + ./nugets/ + false + + + + + diff --git a/test-assets/test-projects/ProjectWithDisabledAnalyzers2/Program.cs b/test-assets/test-projects/ProjectWithDisabledAnalyzers2/Program.cs new file mode 100644 index 0000000000..8168c80511 --- /dev/null +++ b/test-assets/test-projects/ProjectWithDisabledAnalyzers2/Program.cs @@ -0,0 +1,12 @@ +using System; + +namespace HelloWorld +{ + class Program + { + static void Main(string[] args) + { + Console.WriteLine("Hello World!"); + } + } +} diff --git a/test-assets/test-projects/ProjectWithDisabledAnalyzers2/ProjectWithDisabledAnalyzers2.csproj b/test-assets/test-projects/ProjectWithDisabledAnalyzers2/ProjectWithDisabledAnalyzers2.csproj new file mode 100644 index 0000000000..bfa10df6be --- /dev/null +++ b/test-assets/test-projects/ProjectWithDisabledAnalyzers2/ProjectWithDisabledAnalyzers2.csproj @@ -0,0 +1,12 @@ + + + + Exe + netcoreapp2.1 + ./nugets/ + false + + + + + diff --git a/tests/OmniSharp.MSBuild.Tests/ProjectWithAnalyzersTests.cs b/tests/OmniSharp.MSBuild.Tests/ProjectWithAnalyzersTests.cs index b219ead2e8..3c18f8b3a8 100644 --- a/tests/OmniSharp.MSBuild.Tests/ProjectWithAnalyzersTests.cs +++ b/tests/OmniSharp.MSBuild.Tests/ProjectWithAnalyzersTests.cs @@ -71,10 +71,27 @@ public async Task WhenProjectIsLoadedThenItContainsCustomRulesetsFromCsproj() { var project = host.Workspace.CurrentSolution.Projects.Single(); - Assert.Contains(project.CompilationOptions.SpecificDiagnosticOptions, x => x.Key == "CA1021" && x.Value == ReportDiagnostic.Warn); + var diagnostics = await host.RequestCodeCheckAsync(Path.Combine(testProject.Directory, "Program.cs")); + + Assert.NotEmpty(diagnostics.QuickFixes); + Assert.Contains(diagnostics.QuickFixes.OfType(), x => x.Id == "IDE0060"); // Unused args. } } + [Theory] + [InlineData("ProjectWithDisabledAnalyzers")] + [InlineData("ProjectWithDisabledAnalyzers2")] + public async Task WhenProjectWithRunAnalyzersDisabledIsLoadedThenAnalyzersAreIgnored(string projectName) + { + using var testProject = await TestAssets.Instance.GetTestProjectAsync(projectName); + await RestoreProject(testProject); + + using var host = CreateMSBuildTestHost(testProject.Directory, configurationData: TestHelpers.GetConfigurationDataWithAnalyzerConfig(roslynAnalyzersEnabled: true)); + var analyzerReferences = host.Workspace.CurrentSolution.Projects.Single().AnalyzerReferences.ToList(); + + Assert.Empty(analyzerReferences); + } + [Fact] public async Task WhenProjectRulesetFileIsChangedThenUpdateRulesAccordingly() { From 7d24cc97b86b33e1a23454ecb209fac36ebae14b Mon Sep 17 00:00:00 2001 From: filipw Date: Wed, 18 Mar 2020 15:05:05 +0100 Subject: [PATCH 3/6] fixed tests --- .../ProjectFile/ProjectFileInfo.ProjectData.cs | 4 ++-- tests/OmniSharp.MSBuild.Tests/ProjectWithAnalyzersTests.cs | 7 ++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfo.ProjectData.cs b/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfo.ProjectData.cs index be8c4ca16a..6602d98f64 100644 --- a/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfo.ProjectData.cs +++ b/src/OmniSharp.MSBuild/ProjectFile/ProjectFileInfo.ProjectData.cs @@ -251,8 +251,8 @@ public static ProjectData Create(MSB.Execution.ProjectInstance projectInstance) var suppressedDiagnosticIds = PropertyConverter.ToSuppressedDiagnosticIds(projectInstance.GetPropertyValue(PropertyNames.NoWarn)); var signAssembly = PropertyConverter.ToBoolean(projectInstance.GetPropertyValue(PropertyNames.SignAssembly), defaultValue: false); var treatWarningsAsErrors = PropertyConverter.ToBoolean(projectInstance.GetPropertyValue(PropertyNames.TreatWarningsAsErrors), defaultValue: false); - var runAnalyzers = PropertyConverter.ToBoolean(projectInstance.GetPropertyValue(PropertyNames.RunAnalyzers), defaultValue: false); - var runAnalyzersDuringLiveAnalysis = PropertyConverter.ToBoolean(projectInstance.GetPropertyValue(PropertyNames.RunAnalyzersDuringLiveAnalysis), defaultValue: false); + var runAnalyzers = PropertyConverter.ToBoolean(projectInstance.GetPropertyValue(PropertyNames.RunAnalyzers), defaultValue: true); + var runAnalyzersDuringLiveAnalysis = PropertyConverter.ToBoolean(projectInstance.GetPropertyValue(PropertyNames.RunAnalyzersDuringLiveAnalysis), defaultValue: true); var assemblyOriginatorKeyFile = projectInstance.GetPropertyValue(PropertyNames.AssemblyOriginatorKeyFile); var ruleset = ResolveRulesetIfAny(projectInstance); diff --git a/tests/OmniSharp.MSBuild.Tests/ProjectWithAnalyzersTests.cs b/tests/OmniSharp.MSBuild.Tests/ProjectWithAnalyzersTests.cs index 3c18f8b3a8..9b1d9219f3 100644 --- a/tests/OmniSharp.MSBuild.Tests/ProjectWithAnalyzersTests.cs +++ b/tests/OmniSharp.MSBuild.Tests/ProjectWithAnalyzersTests.cs @@ -67,14 +67,11 @@ public async Task WhenProjectHasAnalyzersItDoesntLockAnalyzerDlls() public async Task WhenProjectIsLoadedThenItContainsCustomRulesetsFromCsproj() { using (var testProject = await TestAssets.Instance.GetTestProjectAsync("ProjectWithAnalyzers")) - using (var host = CreateMSBuildTestHost(testProject.Directory)) + using (var host = CreateMSBuildTestHost(testProject.Directory, configurationData: TestHelpers.GetConfigurationDataWithAnalyzerConfig(roslynAnalyzersEnabled: true))) { var project = host.Workspace.CurrentSolution.Projects.Single(); - var diagnostics = await host.RequestCodeCheckAsync(Path.Combine(testProject.Directory, "Program.cs")); - - Assert.NotEmpty(diagnostics.QuickFixes); - Assert.Contains(diagnostics.QuickFixes.OfType(), x => x.Id == "IDE0060"); // Unused args. + Assert.Contains(project.CompilationOptions.SpecificDiagnosticOptions, x => x.Key == "CA1021" && x.Value == ReportDiagnostic.Warn); } } From a61fcec0de8e4010e5da92a924d8ab724eb6e90c Mon Sep 17 00:00:00 2001 From: filipw Date: Wed, 18 Mar 2020 15:10:49 +0100 Subject: [PATCH 4/6] run analyzers in CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ae47c27de..e4b9d85734 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ All changes to the project will be documented in this file. ## [1.34.15] - not yet released * Support for .NET Core 3.1 in csx files (PR: [#1731](https://github.com/OmniSharp/omnisharp-roslyn/pull/1731)) +* Support for `` and `` (PR: [#1739](https://github.com/OmniSharp/omnisharp-roslyn/pull/1739)) ## [1.34.14] - 2020-03-09 * Added support for `annotations` value of `Nullable` csproj property ([#1721](https://github.com/OmniSharp/omnisharp-roslyn/issues/1721), PR: [#1722](https://github.com/OmniSharp/omnisharp-roslyn/pull/1722)) From fb1091dbc9b309a68e0be7761028c85a5b36d88d Mon Sep 17 00:00:00 2001 From: Filip W Date: Wed, 25 Mar 2020 16:08:32 +0100 Subject: [PATCH 5/6] Update build.json --- build.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build.json b/build.json index c87d5b65b5..8c09180fe8 100644 --- a/build.json +++ b/build.json @@ -41,7 +41,6 @@ "ProjectWithDisabledAnalyzers", "ProjectWithDisabledAnalyzers2", "ProjectWithAnalyzers", - "NetCore30Project" "NetCore30Project", "Net50Project" ], @@ -54,4 +53,4 @@ "RestoreOnlyTestAssets": [ "ProjectWithMissingType" ] -} \ No newline at end of file +} From 15d536aaf620c3f80fc254d1d28bfd050157c8f1 Mon Sep 17 00:00:00 2001 From: Filip W Date: Thu, 26 Mar 2020 14:57:05 +0100 Subject: [PATCH 6/6] Update CHANGELOG.md --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3daad6a089..ed4d1db3ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,11 @@ # Changelog All changes to the project will be documented in this file. +## [1.34.16] - not yet released +* Support for `` and `` (PR: [#1739](https://github.com/OmniSharp/omnisharp-roslyn/pull/1739)) + ## [1.34.15] - 2020-03-25 * Support for .NET Core 3.1 in csx files (PR: [#1731](https://github.com/OmniSharp/omnisharp-roslyn/pull/1731)) -* Support for `` and `` (PR: [#1739](https://github.com/OmniSharp/omnisharp-roslyn/pull/1739)) * Update the minimal MSBuild to better support .NET 5 Previews ([omnisharp-vscode#3653](https://github.com/OmniSharp/omnisharp-vscode/issues/3653), PR: [#1746](https://github.com/OmniSharp/omnisharp-roslyn/pull/1746)) * Updated to Roslyn [3.6.0-3.20170.19] (PR: [#1745](https://github.com/OmniSharp/omnisharp-roslyn/pull/1745))