From 5f035cbca70717e74ebf2c367e2aac6a80845ac5 Mon Sep 17 00:00:00 2001 From: Dan Quirk Date: Mon, 29 Feb 2016 16:13:40 -0800 Subject: [PATCH 01/17] Add --analyzer-list option for additional analyzer DLLs --- src/CodeFormatter/FormatOptions.cs | 34 ++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/CodeFormatter/FormatOptions.cs b/src/CodeFormatter/FormatOptions.cs index b6555f88..451fc137 100644 --- a/src/CodeFormatter/FormatOptions.cs +++ b/src/CodeFormatter/FormatOptions.cs @@ -67,6 +67,40 @@ internal class FormatOptions HelpText = "TEMPORARY: invoke built-in analyzers rather than rules to perform reformatting.")] public bool UseAnalyzers { get; set; } + [Option( + "analyzer-list", + HelpText = "A file containing a newline separated list of analyzer assemblies to be run against the target source.")] + public string AnalyzerListFile { get; set; } + + private ImmutableArray _analyzerListText; + public ImmutableArray AnalyzerListText + { + get + { + if (_analyzerListText == null) + { + _analyzerListText = InitializeAnalyzerListText(AnalyzerListFile); + } + return _analyzerListText; + } + internal set + { + _analyzerListText = value; + } + } + + private static ImmutableArray InitializeAnalyzerListText(string analyzerListFile) + { + ImmutableArray analyzerListText = new ImmutableArray(); + + if (!String.IsNullOrEmpty(analyzerListFile)) + { + analyzerListText = ImmutableArray.CreateRange(File.ReadAllLines(analyzerListFile)); + } + + return analyzerListText; + } + private ImmutableArray _copyrightHeaderText; public ImmutableArray CopyrightHeaderText { From eff50fc4419601269fe522cd6cd3813e112bab3a Mon Sep 17 00:00:00 2001 From: Dan Quirk Date: Mon, 29 Feb 2016 16:15:34 -0800 Subject: [PATCH 02/17] Add --analyzer-list target DLLs as MEF import targets --- src/CodeFormatter/Program.cs | 33 +++++++++++++++++-- .../FormattingEngine.cs | 4 ++- .../FormattingEngineImplementation.cs | 5 ++- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/CodeFormatter/Program.cs b/src/CodeFormatter/Program.cs index 0e9c3505..12fe0e39 100644 --- a/src/CodeFormatter/Program.cs +++ b/src/CodeFormatter/Program.cs @@ -18,6 +18,7 @@ using Microsoft.DotNet.CodeFormatter.Analyzers; using Microsoft.CodeAnalysis.Options; using System.Diagnostics; +using Microsoft.CodeAnalysis.Diagnostics; namespace CodeFormatter { @@ -119,9 +120,38 @@ private static int RunFormatCommand(FormatOptions options) } } + // Expects a list of file paths to analyzer DLLs or directories containing analyzer DLLs + private static Assembly[] GetAnalyzerAssemblies(ImmutableArray paths) + { + var assemblies = new System.Collections.Generic.List(); + foreach(var path in paths) + { + if(File.Exists(path)) + { + assemblies.Add(Assembly.LoadFile(path)); + } + else if (Directory.Exists(path)) + { + var DLLs = Directory.GetFiles(path).Where(file => file.EndsWith(".dll")); + foreach (var file in DLLs) + { + assemblies.Add(Assembly.LoadFile(file)); + } + } + } + + return assemblies.ToArray(); + } + private static async Task RunFormatAsync(FormatOptions options, CancellationToken cancellationToken) { - var engine = FormattingEngine.Create(OptionsHelper.DefaultCompositionAssemblies); + var assemblies = OptionsHelper.DefaultCompositionAssemblies; + if (options.AnalyzerListFile != null && options.AnalyzerListText != null && options.AnalyzerListText.Count() > 0) + { + assemblies = assemblies.Concat(GetAnalyzerAssemblies(options.AnalyzerListText)).ToArray(); + } + + var engine = FormattingEngine.Create(assemblies); var configBuilder = ImmutableArray.CreateBuilder(); configBuilder.Add(options.PreprocessorConfigurations.ToArray()); @@ -133,7 +163,6 @@ private static async Task RunFormatAsync(FormatOptions options, Cancellatio engine.FileNames = options.FileFilters.ToImmutableArray(); engine.CopyrightHeader = options.CopyrightHeaderText; - // Analyzers will hydrate rule enabled/disabled settings // directly from the options referenced by file path // in options.OptionsFilePath diff --git a/src/Microsoft.DotNet.CodeFormatting/FormattingEngine.cs b/src/Microsoft.DotNet.CodeFormatting/FormattingEngine.cs index 55beb840..7826e50e 100644 --- a/src/Microsoft.DotNet.CodeFormatting/FormattingEngine.cs +++ b/src/Microsoft.DotNet.CodeFormatting/FormattingEngine.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Reflection; using Microsoft.CodeAnalysis.Options; +using Microsoft.CodeAnalysis.Diagnostics; namespace Microsoft.DotNet.CodeFormatting { @@ -67,7 +68,8 @@ private static ConventionBuilder GetConventions() .Export(); conventions.ForTypesDerivedFrom() .Export(); - + conventions.ForTypesDerivedFrom() + .Export(); // New per-analyzer options mechanism, deriving // from VS Workspaces functionality conventions.ForTypesDerivedFrom() diff --git a/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs b/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs index 19a3593a..14eb80ec 100644 --- a/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs +++ b/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs @@ -230,7 +230,10 @@ private async Task FormatProjectWithLocalAnalyzersAsync(Workspace workspace, Pro private async Task FormatProjectWithGlobalAnalyzersAsync(Workspace workspace, ProjectId projectId, CancellationToken cancellationToken) { - var analyzers = _analyzers.Where(a => a.SupportedDiagnostics.All(d => d.CustomTags.Contains(RuleType.GlobalSemantic))); + // assume analyzers with no custom tags are global to be maximally conservative + var analyzers = _analyzers.Where(a => { + return a.SupportedDiagnostics.All(d => d.CustomTags.Contains(RuleType.GlobalSemantic) || d.CustomTags == null || d.CustomTags.Count() == 0); + }); // Since global analyzers can potentially conflict with each other, run them one by one. foreach (var analyzer in analyzers) From bb7278135752332719af0ba6d6f529f1e8ee576f Mon Sep 17 00:00:00 2001 From: Dan Quirk Date: Mon, 29 Feb 2016 16:16:15 -0800 Subject: [PATCH 03/17] Add logging of errors per analyzer, temporarily disable applying code fixes --- .../FormattingEngineImplementation.cs | 80 ++++++++++++++----- 1 file changed, 62 insertions(+), 18 deletions(-) diff --git a/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs b/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs index 14eb80ec..bdf77977 100644 --- a/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs +++ b/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs @@ -39,6 +39,7 @@ internal sealed partial class FormattingEngineImplementation : IFormattingEngine private readonly Stopwatch _watch = new Stopwatch(); private readonly Dictionary _ruleEnabledMap = new Dictionary(StringComparer.OrdinalIgnoreCase); private readonly ImmutableDictionary _diagnosticIdToFixerMap; + private CompilationWithAnalyzers _compilationWithAnalyzers; public ImmutableArray CopyrightHeader { @@ -244,26 +245,68 @@ private async Task FormatProjectWithGlobalAnalyzersAsync(Workspace workspace, Pr private async Task FormatWithAnalyzersCoreAsync(Workspace workspace, ProjectId projectId, IEnumerable analyzers, CancellationToken cancellationToken) { - var project = workspace.CurrentSolution.GetProject(projectId); - var diagnostics = await GetDiagnostics(project, analyzers, cancellationToken).ConfigureAwait(false); - - var batchFixer = WellKnownFixAllProviders.BatchFixer; - - var context = new FixAllContext( - project.Documents.First(), // TODO: Shouldn't this be the whole project? - new UberCodeFixer(_diagnosticIdToFixerMap), - FixAllScope.Project, - null, - diagnostics.Select(d => d.Id), - new FormattingEngineDiagnosticProvider(project, diagnostics), - cancellationToken); - - var fix = await batchFixer.GetFixAsync(context).ConfigureAwait(false); - if (fix != null) + if (analyzers != null && analyzers.Count() != 0) { - foreach (var operation in await fix.GetOperationsAsync(cancellationToken).ConfigureAwait(false)) + var project = workspace.CurrentSolution.GetProject(projectId); + var diagnostics = await GetDiagnostics(project, analyzers, cancellationToken).ConfigureAwait(false); + + var resultText = ""; + // TODO: make configurable + var resultPath = @"E:\CodeFormatterResults\"; + var resultFile = project.FilePath.Substring(project.FilePath.LastIndexOf("\\")).Replace(".csproj", "_CodeFormatterResults.txt"); + + var linesOfCodeInProject = -1; + + // TODO: make configurable with logOutput command + var logOutput = true; + + foreach (var a in analyzers) + { + var diags = await _compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync(ImmutableArray.Create(a), cancellationToken); + FormatLogger.WriteLine(String.Format("{0}\t{1}", a.ToString(), diags.Count())); + if (logOutput) + { + if(linesOfCodeInProject == -1) + { + var allLines = project.Documents.Select(async doc => + { + var text = await doc.GetTextAsync(); + var lines = text.Lines.Count; + return lines; + }); + var totalLines = await Task.WhenAll(allLines); + linesOfCodeInProject += totalLines.Sum(); + } + resultText += String.Format("{0}\t{1}\t{2}\t{3}\n", a.ToString(), project.Documents.Count(), linesOfCodeInProject, diags.Count()); + } + } + + if (logOutput) + { + System.IO.File.WriteAllText(resultPath + "\\" + resultFile, resultText); + } + + // TODO: make configurable based on 'codeformatter format' vs 'codeformatter analyze' + if (false) { - operation.Apply(workspace, cancellationToken); + var batchFixer = WellKnownFixAllProviders.BatchFixer; + var context = new FixAllContext( + project.Documents.First(), // TODO: Shouldn't this be the whole project? + new UberCodeFixer(_diagnosticIdToFixerMap), + FixAllScope.Project, + null, + diagnostics.Select(d => d.Id), + new FormattingEngineDiagnosticProvider(project, diagnostics), + cancellationToken); + + var fix = await batchFixer.GetFixAsync(context).ConfigureAwait(false); + if (fix != null) + { + foreach (var operation in await fix.GetOperationsAsync(cancellationToken).ConfigureAwait(false)) + { + operation.Apply(workspace, cancellationToken); + } + } } } } @@ -392,6 +435,7 @@ private async Task> GetDiagnostics(Project project, I if (analyzersToRun.Any()) { var compilationWithAnalyzers = compilation.WithAnalyzers(analyzersToRun.ToImmutableArray(), analyzerOptions); + _compilationWithAnalyzers = compilationWithAnalyzers; return await compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync().ConfigureAwait(false); } else From ae4b17d0d6f252a9c5387ca9760bdbbb7d7e258f Mon Sep 17 00:00:00 2001 From: Dan Quirk Date: Tue, 1 Mar 2016 16:31:34 -0800 Subject: [PATCH 04/17] Add tests for loading analyzer assemblies built against different Roslyn versions --- .../FormattingEngineCreationTests.cs | 67 ++++++++++++++++++ ...crosoft.DotNet.CodeFormatting.Tests.csproj | 6 ++ .../TestAnalyzers/RoslynV111Analyzer.dll | Bin 0 -> 13824 bytes .../TestAnalyzers/RoslynV11Analyzer.dll | Bin 0 -> 13824 bytes .../TestAnalyzers/RoslynV1Analyzer.dll | Bin 0 -> 13824 bytes 5 files changed, 73 insertions(+) create mode 100644 src/Microsoft.DotNet.CodeFormatting.Tests/FormattingEngineCreationTests.cs create mode 100644 src/Microsoft.DotNet.CodeFormatting.Tests/TestAnalyzers/RoslynV111Analyzer.dll create mode 100644 src/Microsoft.DotNet.CodeFormatting.Tests/TestAnalyzers/RoslynV11Analyzer.dll create mode 100644 src/Microsoft.DotNet.CodeFormatting.Tests/TestAnalyzers/RoslynV1Analyzer.dll diff --git a/src/Microsoft.DotNet.CodeFormatting.Tests/FormattingEngineCreationTests.cs b/src/Microsoft.DotNet.CodeFormatting.Tests/FormattingEngineCreationTests.cs new file mode 100644 index 00000000..b33380f2 --- /dev/null +++ b/src/Microsoft.DotNet.CodeFormatting.Tests/FormattingEngineCreationTests.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +using CodeFormatter; +using Microsoft.DotNet.CodeFormatter.Analyzers; +using Xunit; + +namespace Microsoft.DotNet.CodeFormatting.Tests +{ + public class FormattingEngineCreationTests + { + + private static Assembly[] DefaultCompositionAssemblies = + new Assembly[] { + typeof(FormattingEngine).Assembly, + typeof(OptimizeNamespaceImportsAnalyzer).Assembly + }; + // TODO: fix hardcoded path + private static string TestDLLDir = @"E:\src\codeformatter\src\Microsoft.DotNet.CodeFormatting.Tests\TestAnalyzers\"; + private static Assembly RoslynV100Analyzer = Assembly.LoadFile(TestDLLDir + "RoslynV1Analyzer.dll"); + private static Assembly RoslynV110Analyzer = Assembly.LoadFile(TestDLLDir + "RoslynV11Analyzer.dll"); + private static Assembly RoslynV111Analyzer = Assembly.LoadFile(TestDLLDir + "RoslynV111Analyzer.dll"); + //private static Assembly RoslynV120Beta1Analyzer = Assembly.LoadFile(TestDLLDir + "RoslynV120Beta1Analyzer.dll"); + + [Fact] + public void AnalyzersBuiltAgainstRoslynV100() + { + IEnumerable roslynV1AnalyzerDLL = new Assembly[] { RoslynV100Analyzer }; + Assert.DoesNotThrow(() => { + var assemblies = DefaultCompositionAssemblies.Concat(roslynV1AnalyzerDLL); + }); + } + + [Fact] + public void AnalyzersBuiltAgainstRoslynV110() + { + IEnumerable roslynV110AnalyzerDLL = new Assembly[] { RoslynV110Analyzer }; + Assert.DoesNotThrow(() => { + var assemblies = DefaultCompositionAssemblies.Concat(roslynV110AnalyzerDLL); + }); + } + + [Fact] + public void AnalyzersBuiltAgainstRoslynV111() + { + IEnumerable roslynV111AnalyzerDLL = new Assembly[] { RoslynV111Analyzer }; + Assert.DoesNotThrow(() => { + var assemblies = DefaultCompositionAssemblies.Concat(roslynV111AnalyzerDLL); + }); + } + + [Fact] + public void AnalyzersBuiltAgainstRoslynV120Beta1() + { + // TODO + //IEnumerable roslynV120Beta1AnalyzerDLL = new Assembly[] { RoslynV120Beta1Analyzer }; + //Assert.DoesNotThrow(() => { + // var assemblies = DefaultCompositionAssemblies.Concat(roslynV120Beta1AnalyzerDLL); + //}); + } + } +} diff --git a/src/Microsoft.DotNet.CodeFormatting.Tests/Microsoft.DotNet.CodeFormatting.Tests.csproj b/src/Microsoft.DotNet.CodeFormatting.Tests/Microsoft.DotNet.CodeFormatting.Tests.csproj index ee57404d..62352671 100644 --- a/src/Microsoft.DotNet.CodeFormatting.Tests/Microsoft.DotNet.CodeFormatting.Tests.csproj +++ b/src/Microsoft.DotNet.CodeFormatting.Tests/Microsoft.DotNet.CodeFormatting.Tests.csproj @@ -90,6 +90,7 @@ + @@ -144,6 +145,11 @@ + + + + + diff --git a/src/Microsoft.DotNet.CodeFormatting.Tests/TestAnalyzers/RoslynV111Analyzer.dll b/src/Microsoft.DotNet.CodeFormatting.Tests/TestAnalyzers/RoslynV111Analyzer.dll new file mode 100644 index 0000000000000000000000000000000000000000..ac7b0d4b24a21144e622341fdf4e5578b2561138 GIT binary patch literal 13824 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 He;)X6M?>c{ literal 0 HcmV?d00001 From e1b931e06eb2a1ba69dc302de13b8f37f256ab6c Mon Sep 17 00:00:00 2001 From: Dan Quirk Date: Wed, 2 Mar 2016 16:28:59 -0800 Subject: [PATCH 05/17] Use 'analyze' verb rather than 'format', clean up logging --- src/CodeFormatter/FormatOptions.cs | 52 +++++++++++----- src/CodeFormatter/Program.cs | 25 +++++--- .../FormatOptionsParsingTests.cs | 10 +-- .../FormattingEngineImplementation.cs | 62 ++++++++++--------- .../IFormattingEngine.cs | 3 + 5 files changed, 93 insertions(+), 59 deletions(-) diff --git a/src/CodeFormatter/FormatOptions.cs b/src/CodeFormatter/FormatOptions.cs index 451fc137..15f73168 100644 --- a/src/CodeFormatter/FormatOptions.cs +++ b/src/CodeFormatter/FormatOptions.cs @@ -15,53 +15,52 @@ namespace CodeFormatter { - [Verb("format", HelpText = "Apply code formatting rules and analyzers to specified project.")] - internal class FormatOptions + internal class CommandLineOptions { [Value( 0, - HelpText = "Project, solution or response file to drive code formatting.", + HelpText = "Project, solution or response file to drive code formatting.", Required = true)] - public IEnumerable FormatTargets { get; set; } + public IEnumerable Targets { get; set; } [Option( 'o', "options-file-path", HelpText = "Path to an options file that should be used to configure analysis")] public string OptionsFilePath { get; set; } - + [Option( - "file-filters", - HelpText = "Only apply changes to files with specified name(s).", + "file-filters", + HelpText = "Only apply changes to files with specified name(s).", Separator = ',')] public IEnumerable FileFilters { get; set; } [Option( - 'l', "lang", + 'l', "lang", HelpText = "Specifies the language to use when a response file is specified, e.g., 'C#', 'Visual Basic', ... (default: 'C#').")] public string Language { get; set; } [Option( - 'c', "configs", - HelpText = "Comma-separated list of preprocessor configurations the formatter should run under.", + 'c', "configs", + HelpText = "Comma-separated list of preprocessor configurations the formatter should run under.", Separator = ',')] public IEnumerable PreprocessorConfigurations { get; set; } [Option( - "copyright", + "copyright", HelpText = "Specifies file containing copyright header.")] - public string CopyrightHeaderFile { get; set; } + public string CopyrightHeaderFile { get; set; } [Option( - 'v', "verbose", + 'v', "verbose", HelpText = "Verbose output.")] public bool Verbose { get; set; } [Option( - "define-dotnet_formatter", + "define-dotnet_formatter", HelpText = "Define DOTNET_FORMATTER in order to allow #if !DOTNET_FORMATTER constructs in code (to opt out of reformatting).")] public bool DefineDotNetFormatter { get; set; } - + [Option( "use-analyzers", HelpText = "TEMPORARY: invoke built-in analyzers rather than rules to perform reformatting.")] @@ -72,6 +71,13 @@ internal class FormatOptions HelpText = "A file containing a newline separated list of analyzer assemblies to be run against the target source.")] public string AnalyzerListFile { get; set; } + [Option( + "log-output-path", + HelpText = "Path to a file where analysis or format results will be logged.")] + public string LogOutputPath { get; set; } + + public virtual bool ApplyFixes { get; } + private ImmutableArray _analyzerListText; public ImmutableArray AnalyzerListText { @@ -156,7 +162,7 @@ private ImmutableDictionary BuildRuleMapFromOptions() Debug.Assert(tokens.Length == 2); Debug.Assert(tokens[1].Equals("Enabled")); - string rule = tokens[0]; + string rule = tokens[0]; result[rule] = (bool)propertyBag[key]; } @@ -164,4 +170,16 @@ private ImmutableDictionary BuildRuleMapFromOptions() return _ruleMap; } } -} + + [Verb("format", HelpText = "Apply code formatting rules and analyzers to specified targets.")] + internal class FormatOptions : CommandLineOptions + { + public override bool ApplyFixes { get { return true; } } + } + + [Verb("analyze", HelpText = "Apply analyzers to specified targets but do not apply code fixes.")] + internal class AnalyzeOptions : CommandLineOptions + { + public override bool ApplyFixes { get { return false; } } + } +} \ No newline at end of file diff --git a/src/CodeFormatter/Program.cs b/src/CodeFormatter/Program.cs index 12fe0e39..f375cbea 100644 --- a/src/CodeFormatter/Program.cs +++ b/src/CodeFormatter/Program.cs @@ -32,11 +32,13 @@ private static int Main(string[] args) return Parser.Default.ParseArguments< ListOptions, ExportOptions, - FormatOptions>(args) + FormatOptions, + AnalyzeOptions>(args) .MapResult( (ListOptions listOptions) => RunListCommand(listOptions), (ExportOptions exportOptions) => RunExportOptionsCommand(exportOptions), (FormatOptions formatOptions) => RunFormatCommand(formatOptions), + (AnalyzeOptions analyzeOptions) => RunAnalyzeCommand(analyzeOptions), errs => FAILED); } @@ -91,9 +93,17 @@ private static void ListRulesAndAnalyzers(bool listAnalyzers, bool listRules) } } } + private static int RunAnalyzeCommand(AnalyzeOptions options) + { + return RunCommand(options, false); + } private static int RunFormatCommand(FormatOptions options) { + return RunCommand(options, true); + } + + private static int RunCommand(CommandLineOptions options, bool applyCodeFixes) { var cts = new CancellationTokenSource(); var ct = cts.Token; @@ -101,7 +111,7 @@ private static int RunFormatCommand(FormatOptions options) try { - RunFormatAsync(options, ct).Wait(ct); + RunAsync(options, ct).Wait(ct); Console.WriteLine("Completed formatting."); return SUCCEEDED; } @@ -143,7 +153,7 @@ private static Assembly[] GetAnalyzerAssemblies(ImmutableArray paths) return assemblies.ToArray(); } - private static async Task RunFormatAsync(FormatOptions options, CancellationToken cancellationToken) + private static async Task RunAsync(CommandLineOptions options, CancellationToken cancellationToken) { var assemblies = OptionsHelper.DefaultCompositionAssemblies; if (options.AnalyzerListFile != null && options.AnalyzerListText != null && options.AnalyzerListText.Count() > 0) @@ -162,7 +172,8 @@ private static async Task RunFormatAsync(FormatOptions options, Cancellatio engine.AllowTables = options.DefineDotNetFormatter; engine.FileNames = options.FileFilters.ToImmutableArray(); engine.CopyrightHeader = options.CopyrightHeaderText; - + engine.ApplyFixes = options.ApplyFixes; + engine.LogOutputPath = options.LogOutputPath; // Analyzers will hydrate rule enabled/disabled settings // directly from the options referenced by file path // in options.OptionsFilePath @@ -174,15 +185,15 @@ private static async Task RunFormatAsync(FormatOptions options, Cancellatio } } - foreach (var item in options.FormatTargets) + foreach (var item in options.Targets) { - await RunFormatItemAsync(engine, item, options.Language, options.UseAnalyzers, cancellationToken); + await RunItemAsync(engine, item, options.Language, options.UseAnalyzers, cancellationToken); } return SUCCEEDED; } - private static async Task RunFormatItemAsync( + private static async Task RunItemAsync( IFormattingEngine engine, string item, string language, diff --git a/src/Microsoft.DotNet.CodeFormatting.Tests/FormatOptionsParsingTests.cs b/src/Microsoft.DotNet.CodeFormatting.Tests/FormatOptionsParsingTests.cs index ea4ca45e..1654067b 100644 --- a/src/Microsoft.DotNet.CodeFormatting.Tests/FormatOptionsParsingTests.cs +++ b/src/Microsoft.DotNet.CodeFormatting.Tests/FormatOptionsParsingTests.cs @@ -53,7 +53,7 @@ public void AllRulesEnabled() Assert.Equal(0, result); Assert.NotNull(options); Assert.Equal(12, options.RuleMap.Count); - Assert.Equal(new[] { "test.csproj" }, options.FormatTargets); + Assert.Equal(new[] { "test.csproj" }, options.Targets); foreach (bool enabledSetting in options.RuleMap.Values) { @@ -72,7 +72,7 @@ public void AllRulesDisabled() Assert.Equal(0, result); Assert.NotNull(options); Assert.Equal(12, options.RuleMap.Count); - Assert.Equal(new[] { "test.csproj" }, options.FormatTargets); + Assert.Equal(new[] { "test.csproj" }, options.Targets); foreach(bool enabledSetting in options.RuleMap.Values) { @@ -102,9 +102,9 @@ public void MultipleTargets() Assert.Equal(0, result); Assert.NotNull(options); - Assert.Equal(2, options.FormatTargets.Count()); - Assert.True(options.FormatTargets.Contains("projectOne.csproj")); - Assert.True(options.FormatTargets.Contains("projectTwo.csproj")); + Assert.Equal(2, options.Targets.Count()); + Assert.True(options.Targets.Contains("projectOne.csproj")); + Assert.True(options.Targets.Contains("projectTwo.csproj")); } [Fact] diff --git a/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs b/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs index bdf77977..384a19ec 100644 --- a/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs +++ b/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs @@ -71,6 +71,10 @@ public IFormatLogger FormatLogger public string FormattingOptionsFilePath { get; set; } + public bool ApplyFixes { get; set; } + + public string LogOutputPath { get; set; } + public ImmutableArray AllRules { get @@ -243,6 +247,22 @@ private async Task FormatProjectWithGlobalAnalyzersAsync(Workspace workspace, Pr } } + private async Task getProjectLinesOfCodeCount(Project project) + { + var allLines = project.Documents.Select(async doc => + { + var text = await doc.GetTextAsync(); + return text.Lines.Count; + }); + var totalLines = await Task.WhenAll(allLines); + return totalLines.Sum(); + } + + private string createAnalyzerResultText(DiagnosticAnalyzer analyzer, ImmutableArray diagnostics, int documentCount, int linesOfCodeInProject) + { + return String.Format("{0}\t{1}\t{2}\t{3}\n", analyzer.ToString(), documentCount, linesOfCodeInProject, diagnostics.Count()); + } + private async Task FormatWithAnalyzersCoreAsync(Workspace workspace, ProjectId projectId, IEnumerable analyzers, CancellationToken cancellationToken) { if (analyzers != null && analyzers.Count() != 0) @@ -250,44 +270,26 @@ private async Task FormatWithAnalyzersCoreAsync(Workspace workspace, ProjectId p var project = workspace.CurrentSolution.GetProject(projectId); var diagnostics = await GetDiagnostics(project, analyzers, cancellationToken).ConfigureAwait(false); - var resultText = ""; - // TODO: make configurable - var resultPath = @"E:\CodeFormatterResults\"; - var resultFile = project.FilePath.Substring(project.FilePath.LastIndexOf("\\")).Replace(".csproj", "_CodeFormatterResults.txt"); + var projectResultText = ""; + var ext = project.Language == "C#" ? ".csproj" : ".vbproj"; + var resultFile = project.FilePath.Substring(project.FilePath.LastIndexOf(System.IO.Path.DirectorySeparatorChar)).Replace(ext, "_CodeFormatterResults.txt"); var linesOfCodeInProject = -1; - - // TODO: make configurable with logOutput command - var logOutput = true; - - foreach (var a in analyzers) + foreach (var analyzer in analyzers) { - var diags = await _compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync(ImmutableArray.Create(a), cancellationToken); - FormatLogger.WriteLine(String.Format("{0}\t{1}", a.ToString(), diags.Count())); - if (logOutput) - { - if(linesOfCodeInProject == -1) - { - var allLines = project.Documents.Select(async doc => - { - var text = await doc.GetTextAsync(); - var lines = text.Lines.Count; - return lines; - }); - var totalLines = await Task.WhenAll(allLines); - linesOfCodeInProject += totalLines.Sum(); - } - resultText += String.Format("{0}\t{1}\t{2}\t{3}\n", a.ToString(), project.Documents.Count(), linesOfCodeInProject, diags.Count()); - } + var diags = await _compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync(ImmutableArray.Create(analyzer), cancellationToken); + linesOfCodeInProject = linesOfCodeInProject == -1 ? await getProjectLinesOfCodeCount(project) : linesOfCodeInProject; + var analyzerResultText = createAnalyzerResultText(analyzer, diags, project.Documents.Count(), linesOfCodeInProject); + FormatLogger.Write(analyzerResultText); + projectResultText += analyzerResultText; } - if (logOutput) + if (LogOutputPath != null) { - System.IO.File.WriteAllText(resultPath + "\\" + resultFile, resultText); + System.IO.File.WriteAllText(System.IO.Path.Combine(LogOutputPath, resultFile), projectResultText); } - // TODO: make configurable based on 'codeformatter format' vs 'codeformatter analyze' - if (false) + if (ApplyFixes) { var batchFixer = WellKnownFixAllProviders.BatchFixer; var context = new FixAllContext( diff --git a/src/Microsoft.DotNet.CodeFormatting/IFormattingEngine.cs b/src/Microsoft.DotNet.CodeFormatting/IFormattingEngine.cs index 183a5604..be61e2ec 100644 --- a/src/Microsoft.DotNet.CodeFormatting/IFormattingEngine.cs +++ b/src/Microsoft.DotNet.CodeFormatting/IFormattingEngine.cs @@ -20,6 +20,9 @@ public interface IFormattingEngine bool AllowTables { get; set; } bool Verbose { get; set; } string FormattingOptionsFilePath { get; set; } + bool ApplyFixes { get; set; } + string LogOutputPath { get; set; } + void ToggleRuleEnabled(IRuleMetadata ruleMetaData, bool enabled); Task FormatSolutionAsync(Solution solution, bool useAnalyzers, CancellationToken cancellationToken); Task FormatProjectAsync(Project project, bool useAnalyzers, CancellationToken cancellationToken); From b73a72e44e6d17d7ac08dbf184e81f3fc7f7e326 Mon Sep 17 00:00:00 2001 From: Dan Quirk Date: Wed, 2 Mar 2016 17:47:28 -0800 Subject: [PATCH 06/17] Add test for Analyzer built against 1.2.0.0 --- .../FormattingEngineCreationTests.cs | 15 +++++++-------- ...Microsoft.DotNet.CodeFormatting.Tests.csproj | 5 +++-- ...lynV1Analyzer.dll => RoslynV100Analyzer.dll} | Bin ...ynV11Analyzer.dll => RoslynV110Analyzer.dll} | Bin .../TestAnalyzers/RoslynV120Beta1Analyzer.dll | Bin 0 -> 13824 bytes 5 files changed, 10 insertions(+), 10 deletions(-) rename src/Microsoft.DotNet.CodeFormatting.Tests/TestAnalyzers/{RoslynV1Analyzer.dll => RoslynV100Analyzer.dll} (100%) rename src/Microsoft.DotNet.CodeFormatting.Tests/TestAnalyzers/{RoslynV11Analyzer.dll => RoslynV110Analyzer.dll} (100%) create mode 100644 src/Microsoft.DotNet.CodeFormatting.Tests/TestAnalyzers/RoslynV120Beta1Analyzer.dll diff --git a/src/Microsoft.DotNet.CodeFormatting.Tests/FormattingEngineCreationTests.cs b/src/Microsoft.DotNet.CodeFormatting.Tests/FormattingEngineCreationTests.cs index b33380f2..6ceb3bce 100644 --- a/src/Microsoft.DotNet.CodeFormatting.Tests/FormattingEngineCreationTests.cs +++ b/src/Microsoft.DotNet.CodeFormatting.Tests/FormattingEngineCreationTests.cs @@ -22,10 +22,10 @@ public class FormattingEngineCreationTests }; // TODO: fix hardcoded path private static string TestDLLDir = @"E:\src\codeformatter\src\Microsoft.DotNet.CodeFormatting.Tests\TestAnalyzers\"; - private static Assembly RoslynV100Analyzer = Assembly.LoadFile(TestDLLDir + "RoslynV1Analyzer.dll"); - private static Assembly RoslynV110Analyzer = Assembly.LoadFile(TestDLLDir + "RoslynV11Analyzer.dll"); + private static Assembly RoslynV100Analyzer = Assembly.LoadFile(TestDLLDir + "RoslynV100Analyzer.dll"); + private static Assembly RoslynV110Analyzer = Assembly.LoadFile(TestDLLDir + "RoslynV110Analyzer.dll"); private static Assembly RoslynV111Analyzer = Assembly.LoadFile(TestDLLDir + "RoslynV111Analyzer.dll"); - //private static Assembly RoslynV120Beta1Analyzer = Assembly.LoadFile(TestDLLDir + "RoslynV120Beta1Analyzer.dll"); + private static Assembly RoslynV120Beta1Analyzer = Assembly.LoadFile(TestDLLDir + "RoslynV120Beta1Analyzer.dll"); [Fact] public void AnalyzersBuiltAgainstRoslynV100() @@ -57,11 +57,10 @@ public void AnalyzersBuiltAgainstRoslynV111() [Fact] public void AnalyzersBuiltAgainstRoslynV120Beta1() { - // TODO - //IEnumerable roslynV120Beta1AnalyzerDLL = new Assembly[] { RoslynV120Beta1Analyzer }; - //Assert.DoesNotThrow(() => { - // var assemblies = DefaultCompositionAssemblies.Concat(roslynV120Beta1AnalyzerDLL); - //}); + IEnumerable roslynV120Beta1AnalyzerDLL = new Assembly[] { RoslynV120Beta1Analyzer }; + Assert.DoesNotThrow(() => { + var assemblies = DefaultCompositionAssemblies.Concat(roslynV120Beta1AnalyzerDLL); + }); } } } diff --git a/src/Microsoft.DotNet.CodeFormatting.Tests/Microsoft.DotNet.CodeFormatting.Tests.csproj b/src/Microsoft.DotNet.CodeFormatting.Tests/Microsoft.DotNet.CodeFormatting.Tests.csproj index 62352671..6ad8497e 100644 --- a/src/Microsoft.DotNet.CodeFormatting.Tests/Microsoft.DotNet.CodeFormatting.Tests.csproj +++ b/src/Microsoft.DotNet.CodeFormatting.Tests/Microsoft.DotNet.CodeFormatting.Tests.csproj @@ -146,9 +146,10 @@ + - - + + diff --git a/src/Microsoft.DotNet.CodeFormatting.Tests/TestAnalyzers/RoslynV1Analyzer.dll b/src/Microsoft.DotNet.CodeFormatting.Tests/TestAnalyzers/RoslynV100Analyzer.dll similarity index 100% rename from src/Microsoft.DotNet.CodeFormatting.Tests/TestAnalyzers/RoslynV1Analyzer.dll rename to src/Microsoft.DotNet.CodeFormatting.Tests/TestAnalyzers/RoslynV100Analyzer.dll diff --git a/src/Microsoft.DotNet.CodeFormatting.Tests/TestAnalyzers/RoslynV11Analyzer.dll b/src/Microsoft.DotNet.CodeFormatting.Tests/TestAnalyzers/RoslynV110Analyzer.dll similarity index 100% rename from src/Microsoft.DotNet.CodeFormatting.Tests/TestAnalyzers/RoslynV11Analyzer.dll rename to src/Microsoft.DotNet.CodeFormatting.Tests/TestAnalyzers/RoslynV110Analyzer.dll diff --git a/src/Microsoft.DotNet.CodeFormatting.Tests/TestAnalyzers/RoslynV120Beta1Analyzer.dll b/src/Microsoft.DotNet.CodeFormatting.Tests/TestAnalyzers/RoslynV120Beta1Analyzer.dll new file mode 100644 index 0000000000000000000000000000000000000000..5dafd163f53768f7b42810682d84e8dbe5b7f97b GIT binary patch literal 13824 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 literal 0 HcmV?d00001 From 45a8f4cdd81c584786f812e443eebc0ae06cc663 Mon Sep 17 00:00:00 2001 From: Dan Quirk Date: Thu, 3 Mar 2016 10:17:12 -0800 Subject: [PATCH 07/17] Update to Roslyn 1.2-beta1 so analyzers built against any older Roslyn version should work --- src/CodeFormatter/App.config | 12 +++---- src/CodeFormatter/CodeFormatter.csproj | 32 +++++++++--------- src/CodeFormatter/packages.config | 16 ++++----- src/DeadRegions/App.config | 2 +- src/DeadRegions/DeadRegions.csproj | 32 +++++++++--------- src/DeadRegions/packages.config | 16 ++++----- ...otNet.CodeFormatter.Analyzers.Tests.csproj | 32 +++++++++--------- .../app.config | 4 +++ .../packages.config | 16 ++++----- ...soft.DotNet.CodeFormatter.Analyzers.csproj | 32 +++++++++--------- .../OptionsHelper.cs | 1 + .../app.config | 4 +++ .../packages.config | 16 ++++----- ...crosoft.DotNet.CodeFormatting.Tests.csproj | 32 +++++++++--------- .../app.config | 2 +- .../packages.config | 16 ++++----- .../AnalyzerFileLoader.cs | 17 ++++++++++ .../Microsoft.DotNet.CodeFormatting.csproj | 33 ++++++++++--------- .../app.config | 2 +- .../packages.config | 16 ++++----- ...oft.DotNet.DeadRegionAnalysis.Tests.csproj | 32 +++++++++--------- .../app.config | 2 +- .../packages.config | 16 ++++----- ...Microsoft.DotNet.DeadRegionAnalysis.csproj | 32 +++++++++--------- .../app.config | 4 +++ .../packages.config | 16 ++++----- .../XUnitConverter.Tests.csproj | 32 +++++++++--------- src/XUnitConverter.Tests/app.config | 2 +- src/XUnitConverter.Tests/packages.config | 16 ++++----- src/XUnitConverter/App.config | 2 +- src/XUnitConverter/XUnitConverter.csproj | 32 +++++++++--------- src/XUnitConverter/packages.config | 16 ++++----- 32 files changed, 283 insertions(+), 252 deletions(-) create mode 100644 src/Microsoft.DotNet.CodeFormatting/AnalyzerFileLoader.cs diff --git a/src/CodeFormatter/App.config b/src/CodeFormatter/App.config index 1cc1bd15..f1cb1f67 100644 --- a/src/CodeFormatter/App.config +++ b/src/CodeFormatter/App.config @@ -7,15 +7,15 @@ - + - + - + @@ -23,7 +23,7 @@ - + @@ -31,11 +31,11 @@ - + - + diff --git a/src/CodeFormatter/CodeFormatter.csproj b/src/CodeFormatter/CodeFormatter.csproj index 868ecd9c..2b4ccbaf 100644 --- a/src/CodeFormatter/CodeFormatter.csproj +++ b/src/CodeFormatter/CodeFormatter.csproj @@ -21,32 +21,32 @@ ..\packages\CommandLineParser.2.0.273-beta\lib\net45\CommandLine.dll True - - ..\packages\Microsoft.CodeAnalysis.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.dll + + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -75,8 +75,8 @@ True - - ..\packages\System.Reflection.Metadata.1.1.0\lib\dotnet5.2\System.Reflection.Metadata.dll + + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/CodeFormatter/packages.config b/src/CodeFormatter/packages.config index ebb7fde4..3438eb46 100644 --- a/src/CodeFormatter/packages.config +++ b/src/CodeFormatter/packages.config @@ -1,14 +1,14 @@  - + - - - - - - + + + + + + @@ -18,7 +18,7 @@ - + diff --git a/src/DeadRegions/App.config b/src/DeadRegions/App.config index b2b36510..a505237b 100644 --- a/src/DeadRegions/App.config +++ b/src/DeadRegions/App.config @@ -15,7 +15,7 @@ - + diff --git a/src/DeadRegions/DeadRegions.csproj b/src/DeadRegions/DeadRegions.csproj index 743ce86f..a5fb2e2f 100644 --- a/src/DeadRegions/DeadRegions.csproj +++ b/src/DeadRegions/DeadRegions.csproj @@ -12,32 +12,32 @@ - - ..\packages\Microsoft.CodeAnalysis.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.dll + + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -67,8 +67,8 @@ - - ..\packages\System.Reflection.Metadata.1.1.0\lib\dotnet5.2\System.Reflection.Metadata.dll + + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/DeadRegions/packages.config b/src/DeadRegions/packages.config index 6e7bcf9a..e80d2a79 100644 --- a/src/DeadRegions/packages.config +++ b/src/DeadRegions/packages.config @@ -1,13 +1,13 @@  - + - - - - - - + + + + + + @@ -17,7 +17,7 @@ - + diff --git a/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/Microsoft.DotNet.CodeFormatter.Analyzers.Tests.csproj b/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/Microsoft.DotNet.CodeFormatter.Analyzers.Tests.csproj index a19d33e8..d43eb15f 100644 --- a/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/Microsoft.DotNet.CodeFormatter.Analyzers.Tests.csproj +++ b/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/Microsoft.DotNet.CodeFormatter.Analyzers.Tests.csproj @@ -15,32 +15,32 @@ ..\packages\CommandLineParser.2.0.273-beta\lib\net45\CommandLine.dll True - - ..\packages\Microsoft.CodeAnalysis.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.dll + + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -70,8 +70,8 @@ True - - ..\packages\System.Reflection.Metadata.1.1.0\lib\dotnet5.2\System.Reflection.Metadata.dll + + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/app.config b/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/app.config index 3fc2bade..2ff0a934 100644 --- a/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/app.config +++ b/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/app.config @@ -18,6 +18,10 @@ + + + + \ No newline at end of file diff --git a/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/packages.config b/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/packages.config index ebb7fde4..3438eb46 100644 --- a/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/packages.config +++ b/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/packages.config @@ -1,14 +1,14 @@  - + - - - - - - + + + + + + @@ -18,7 +18,7 @@ - + diff --git a/src/Microsoft.DotNet.CodeFormatter.Analyzers/Microsoft.DotNet.CodeFormatter.Analyzers.csproj b/src/Microsoft.DotNet.CodeFormatter.Analyzers/Microsoft.DotNet.CodeFormatter.Analyzers.csproj index 9839fd60..721e6876 100644 --- a/src/Microsoft.DotNet.CodeFormatter.Analyzers/Microsoft.DotNet.CodeFormatter.Analyzers.csproj +++ b/src/Microsoft.DotNet.CodeFormatter.Analyzers/Microsoft.DotNet.CodeFormatter.Analyzers.csproj @@ -17,32 +17,32 @@ ..\packages\CommandLineParser.2.0.273-beta\lib\net45\CommandLine.dll True - - ..\packages\Microsoft.CodeAnalysis.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.dll + + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -71,8 +71,8 @@ True - - ..\packages\System.Reflection.Metadata.1.1.0\lib\dotnet5.2\System.Reflection.Metadata.dll + + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/Microsoft.DotNet.CodeFormatter.Analyzers/OptionsHelper.cs b/src/Microsoft.DotNet.CodeFormatter.Analyzers/OptionsHelper.cs index c95ce76a..9065c1ef 100644 --- a/src/Microsoft.DotNet.CodeFormatter.Analyzers/OptionsHelper.cs +++ b/src/Microsoft.DotNet.CodeFormatter.Analyzers/OptionsHelper.cs @@ -101,6 +101,7 @@ public static PerLanguageOption BuildDefaultEnabledProperty(string analyze return new PerLanguageOption(analyzerName, "Enabled", defaultValue: true); } + // TODO: fix hardcoded list internal static IEnumerable AllAnalyzerNames = new string[] { ExplicitThisAnalyzer.AnalyzerName, OptimizeNamespaceImportsAnalyzer.AnalyzerName, diff --git a/src/Microsoft.DotNet.CodeFormatter.Analyzers/app.config b/src/Microsoft.DotNet.CodeFormatter.Analyzers/app.config index 3fc2bade..2ff0a934 100644 --- a/src/Microsoft.DotNet.CodeFormatter.Analyzers/app.config +++ b/src/Microsoft.DotNet.CodeFormatter.Analyzers/app.config @@ -18,6 +18,10 @@ + + + + \ No newline at end of file diff --git a/src/Microsoft.DotNet.CodeFormatter.Analyzers/packages.config b/src/Microsoft.DotNet.CodeFormatter.Analyzers/packages.config index ebb7fde4..3438eb46 100644 --- a/src/Microsoft.DotNet.CodeFormatter.Analyzers/packages.config +++ b/src/Microsoft.DotNet.CodeFormatter.Analyzers/packages.config @@ -1,14 +1,14 @@  - + - - - - - - + + + + + + @@ -18,7 +18,7 @@ - + diff --git a/src/Microsoft.DotNet.CodeFormatting.Tests/Microsoft.DotNet.CodeFormatting.Tests.csproj b/src/Microsoft.DotNet.CodeFormatting.Tests/Microsoft.DotNet.CodeFormatting.Tests.csproj index 6ad8497e..ae206cb9 100644 --- a/src/Microsoft.DotNet.CodeFormatting.Tests/Microsoft.DotNet.CodeFormatting.Tests.csproj +++ b/src/Microsoft.DotNet.CodeFormatting.Tests/Microsoft.DotNet.CodeFormatting.Tests.csproj @@ -18,32 +18,32 @@ ..\packages\CommandLineParser.2.0.273-beta\lib\net45\CommandLine.dll True - - ..\packages\Microsoft.CodeAnalysis.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.dll + + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -73,8 +73,8 @@ True - - ..\packages\System.Reflection.Metadata.1.1.0\lib\dotnet5.2\System.Reflection.Metadata.dll + + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/Microsoft.DotNet.CodeFormatting.Tests/app.config b/src/Microsoft.DotNet.CodeFormatting.Tests/app.config index 6eb1ab80..e1697c3f 100644 --- a/src/Microsoft.DotNet.CodeFormatting.Tests/app.config +++ b/src/Microsoft.DotNet.CodeFormatting.Tests/app.config @@ -8,7 +8,7 @@ - + diff --git a/src/Microsoft.DotNet.CodeFormatting.Tests/packages.config b/src/Microsoft.DotNet.CodeFormatting.Tests/packages.config index b367d41f..9060b642 100644 --- a/src/Microsoft.DotNet.CodeFormatting.Tests/packages.config +++ b/src/Microsoft.DotNet.CodeFormatting.Tests/packages.config @@ -1,14 +1,14 @@  - + - - - - - - + + + + + + @@ -18,7 +18,7 @@ - + diff --git a/src/Microsoft.DotNet.CodeFormatting/AnalyzerFileLoader.cs b/src/Microsoft.DotNet.CodeFormatting/AnalyzerFileLoader.cs new file mode 100644 index 00000000..84b3f58c --- /dev/null +++ b/src/Microsoft.DotNet.CodeFormatting/AnalyzerFileLoader.cs @@ -0,0 +1,17 @@ +using System.Reflection; +using Microsoft.CodeAnalysis; + +namespace Microsoft.DotNet.CodeFormatting +{ + public class AnalyzerFileLoader : IAnalyzerAssemblyLoader + { + public void AddDependencyLocation(string fullPath) + { + } + + public Assembly LoadFromPath(string fullPath) + { + return Assembly.LoadFrom(fullPath); + } + } +} diff --git a/src/Microsoft.DotNet.CodeFormatting/Microsoft.DotNet.CodeFormatting.csproj b/src/Microsoft.DotNet.CodeFormatting/Microsoft.DotNet.CodeFormatting.csproj index 5870681f..1d7d4689 100644 --- a/src/Microsoft.DotNet.CodeFormatting/Microsoft.DotNet.CodeFormatting.csproj +++ b/src/Microsoft.DotNet.CodeFormatting/Microsoft.DotNet.CodeFormatting.csproj @@ -9,32 +9,32 @@ Microsoft.DotNet.CodeFormatting - - ..\packages\Microsoft.CodeAnalysis.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.dll + + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -63,8 +63,8 @@ True - - ..\packages\System.Reflection.Metadata.1.1.0\lib\dotnet5.2\System.Reflection.Metadata.dll + + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll True @@ -75,6 +75,7 @@ + diff --git a/src/Microsoft.DotNet.CodeFormatting/app.config b/src/Microsoft.DotNet.CodeFormatting/app.config index 6eb1ab80..e1697c3f 100644 --- a/src/Microsoft.DotNet.CodeFormatting/app.config +++ b/src/Microsoft.DotNet.CodeFormatting/app.config @@ -8,7 +8,7 @@ - + diff --git a/src/Microsoft.DotNet.CodeFormatting/packages.config b/src/Microsoft.DotNet.CodeFormatting/packages.config index 6e7bcf9a..e80d2a79 100644 --- a/src/Microsoft.DotNet.CodeFormatting/packages.config +++ b/src/Microsoft.DotNet.CodeFormatting/packages.config @@ -1,13 +1,13 @@  - + - - - - - - + + + + + + @@ -17,7 +17,7 @@ - + diff --git a/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/Microsoft.DotNet.DeadRegionAnalysis.Tests.csproj b/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/Microsoft.DotNet.DeadRegionAnalysis.Tests.csproj index 683a1f4f..4666e0ce 100644 --- a/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/Microsoft.DotNet.DeadRegionAnalysis.Tests.csproj +++ b/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/Microsoft.DotNet.DeadRegionAnalysis.Tests.csproj @@ -13,32 +13,32 @@ - - ..\packages\Microsoft.CodeAnalysis.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.dll + + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -68,8 +68,8 @@ - - ..\packages\System.Reflection.Metadata.1.1.0\lib\dotnet5.2\System.Reflection.Metadata.dll + + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/app.config b/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/app.config index e3380ab7..a06c9e74 100644 --- a/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/app.config +++ b/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/app.config @@ -8,7 +8,7 @@ - + diff --git a/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/packages.config b/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/packages.config index 1dccdf88..07835943 100644 --- a/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/packages.config +++ b/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/packages.config @@ -1,13 +1,13 @@  - + - - - - - - + + + + + + @@ -17,7 +17,7 @@ - + diff --git a/src/Microsoft.DotNet.DeadRegionAnalysis/Microsoft.DotNet.DeadRegionAnalysis.csproj b/src/Microsoft.DotNet.DeadRegionAnalysis/Microsoft.DotNet.DeadRegionAnalysis.csproj index 79dc0abb..882ffd4a 100644 --- a/src/Microsoft.DotNet.DeadRegionAnalysis/Microsoft.DotNet.DeadRegionAnalysis.csproj +++ b/src/Microsoft.DotNet.DeadRegionAnalysis/Microsoft.DotNet.DeadRegionAnalysis.csproj @@ -12,32 +12,32 @@ - - ..\packages\Microsoft.CodeAnalysis.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.dll + + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -67,8 +67,8 @@ - - ..\packages\System.Reflection.Metadata.1.1.0\lib\dotnet5.2\System.Reflection.Metadata.dll + + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/Microsoft.DotNet.DeadRegionAnalysis/app.config b/src/Microsoft.DotNet.DeadRegionAnalysis/app.config index 3fc2bade..2ff0a934 100644 --- a/src/Microsoft.DotNet.DeadRegionAnalysis/app.config +++ b/src/Microsoft.DotNet.DeadRegionAnalysis/app.config @@ -18,6 +18,10 @@ + + + + \ No newline at end of file diff --git a/src/Microsoft.DotNet.DeadRegionAnalysis/packages.config b/src/Microsoft.DotNet.DeadRegionAnalysis/packages.config index 6e7bcf9a..e80d2a79 100644 --- a/src/Microsoft.DotNet.DeadRegionAnalysis/packages.config +++ b/src/Microsoft.DotNet.DeadRegionAnalysis/packages.config @@ -1,13 +1,13 @@  - + - - - - - - + + + + + + @@ -17,7 +17,7 @@ - + diff --git a/src/XUnitConverter.Tests/XUnitConverter.Tests.csproj b/src/XUnitConverter.Tests/XUnitConverter.Tests.csproj index bfe30ce9..1f14dcfd 100644 --- a/src/XUnitConverter.Tests/XUnitConverter.Tests.csproj +++ b/src/XUnitConverter.Tests/XUnitConverter.Tests.csproj @@ -14,32 +14,32 @@ - - ..\packages\Microsoft.CodeAnalysis.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.dll + + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -69,8 +69,8 @@ True - - ..\packages\System.Reflection.Metadata.1.1.0\lib\dotnet5.2\System.Reflection.Metadata.dll + + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/XUnitConverter.Tests/app.config b/src/XUnitConverter.Tests/app.config index e3380ab7..a06c9e74 100644 --- a/src/XUnitConverter.Tests/app.config +++ b/src/XUnitConverter.Tests/app.config @@ -8,7 +8,7 @@ - + diff --git a/src/XUnitConverter.Tests/packages.config b/src/XUnitConverter.Tests/packages.config index 1dccdf88..07835943 100644 --- a/src/XUnitConverter.Tests/packages.config +++ b/src/XUnitConverter.Tests/packages.config @@ -1,13 +1,13 @@  - + - - - - - - + + + + + + @@ -17,7 +17,7 @@ - + diff --git a/src/XUnitConverter/App.config b/src/XUnitConverter/App.config index b8a5afac..0166ec16 100644 --- a/src/XUnitConverter/App.config +++ b/src/XUnitConverter/App.config @@ -15,7 +15,7 @@ - + diff --git a/src/XUnitConverter/XUnitConverter.csproj b/src/XUnitConverter/XUnitConverter.csproj index 34e678e6..d9ecbe00 100644 --- a/src/XUnitConverter/XUnitConverter.csproj +++ b/src/XUnitConverter/XUnitConverter.csproj @@ -12,32 +12,32 @@ - - ..\packages\Microsoft.CodeAnalysis.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.dll + + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.1.1\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.1.1\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -66,8 +66,8 @@ True - - ..\packages\System.Reflection.Metadata.1.1.0\lib\dotnet5.2\System.Reflection.Metadata.dll + + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/XUnitConverter/packages.config b/src/XUnitConverter/packages.config index 6e7bcf9a..e80d2a79 100644 --- a/src/XUnitConverter/packages.config +++ b/src/XUnitConverter/packages.config @@ -1,13 +1,13 @@  - + - - - - - - + + + + + + @@ -17,7 +17,7 @@ - + From eec6003e690e63f5cdd8950629772f9cb504002b Mon Sep 17 00:00:00 2001 From: Dan Quirk Date: Thu, 3 Mar 2016 18:01:37 -0800 Subject: [PATCH 08/17] Use AnalyzerFileReference to load additional analyzers --- src/CodeFormatter/Program.cs | 45 +++++++------------ .../FormattingEngineImplementation.cs | 13 ++++-- .../IFormattingEngine.cs | 2 + 3 files changed, 29 insertions(+), 31 deletions(-) diff --git a/src/CodeFormatter/Program.cs b/src/CodeFormatter/Program.cs index f375cbea..f43d32d1 100644 --- a/src/CodeFormatter/Program.cs +++ b/src/CodeFormatter/Program.cs @@ -130,37 +130,9 @@ private static int RunCommand(CommandLineOptions options, bool applyCodeFixes) { } } - // Expects a list of file paths to analyzer DLLs or directories containing analyzer DLLs - private static Assembly[] GetAnalyzerAssemblies(ImmutableArray paths) - { - var assemblies = new System.Collections.Generic.List(); - foreach(var path in paths) - { - if(File.Exists(path)) - { - assemblies.Add(Assembly.LoadFile(path)); - } - else if (Directory.Exists(path)) - { - var DLLs = Directory.GetFiles(path).Where(file => file.EndsWith(".dll")); - foreach (var file in DLLs) - { - assemblies.Add(Assembly.LoadFile(file)); - } - } - } - - return assemblies.ToArray(); - } - private static async Task RunAsync(CommandLineOptions options, CancellationToken cancellationToken) { var assemblies = OptionsHelper.DefaultCompositionAssemblies; - if (options.AnalyzerListFile != null && options.AnalyzerListText != null && options.AnalyzerListText.Count() > 0) - { - assemblies = assemblies.Concat(GetAnalyzerAssemblies(options.AnalyzerListText)).ToArray(); - } - var engine = FormattingEngine.Create(assemblies); var configBuilder = ImmutableArray.CreateBuilder(); @@ -174,6 +146,23 @@ private static async Task RunAsync(CommandLineOptions options, Cancellation engine.CopyrightHeader = options.CopyrightHeaderText; engine.ApplyFixes = options.ApplyFixes; engine.LogOutputPath = options.LogOutputPath; + + if (options.AnalyzerListFile != null && options.AnalyzerListText != null && options.AnalyzerListText.Count() > 0) + { + var loaderAssembly = Assembly.Load((typeof(CommandLineProject)).Assembly.FullName); + var loader = (IAnalyzerAssemblyLoader)Activator.CreateInstance(loaderAssembly.GetType("Microsoft.CodeAnalysis.SimpleAnalyzerAssemblyLoader")); + foreach(var analyzerPath in options.AnalyzerListText) + { + var analyzerRef = new AnalyzerFileReference(analyzerPath, loader); + var newAnalyzers = analyzerRef.GetAnalyzersForAllLanguages(); + if(newAnalyzers.Count() == 0) + { + throw new Exception(String.Format("Specified analyzer assembly {0} contained no analyzers", analyzerRef.GetAssembly().FullName)); + } + engine.AddAnalyzers(newAnalyzers); + } + } + // Analyzers will hydrate rule enabled/disabled settings // directly from the options referenced by file path // in options.OptionsFilePath diff --git a/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs b/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs index 384a19ec..1e928a54 100644 --- a/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs +++ b/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs @@ -31,7 +31,7 @@ internal sealed partial class FormattingEngineImplementation : IFormattingEngine private readonly FormattingOptions _options; private readonly IEnumerable _fixers; private readonly IEnumerable _filters; - private readonly IEnumerable _analyzers; + private IEnumerable _analyzers; private readonly IEnumerable _optionsProviders; private readonly IEnumerable> _syntaxRules; private readonly IEnumerable> _localSemanticRules; @@ -235,9 +235,11 @@ private async Task FormatProjectWithLocalAnalyzersAsync(Workspace workspace, Pro private async Task FormatProjectWithGlobalAnalyzersAsync(Workspace workspace, ProjectId projectId, CancellationToken cancellationToken) { - // assume analyzers with no custom tags are global to be maximally conservative + // Remaining analyzers are either RuleType.GlobalSemantic, in which case we need to run them one by one lest they conflict + // with each other, or else they are of an unknown type in which case we should conservatively treat them as if they + // may conflict with one another. var analyzers = _analyzers.Where(a => { - return a.SupportedDiagnostics.All(d => d.CustomTags.Contains(RuleType.GlobalSemantic) || d.CustomTags == null || d.CustomTags.Count() == 0); + return a.SupportedDiagnostics.All(d => !(d.CustomTags.Contains(RuleType.Syntactic) || d.CustomTags.Contains(RuleType.LocalSemantic))); }); // Since global analyzers can potentially conflict with each other, run them one by one. @@ -619,5 +621,10 @@ private async Task RunGlobalSemanticPass(Solution solution, IReadOnlyL return solution; } + + public void AddAnalyzers(ImmutableArray analyzers) + { + _analyzers = _analyzers.Concat(analyzers); + } } } diff --git a/src/Microsoft.DotNet.CodeFormatting/IFormattingEngine.cs b/src/Microsoft.DotNet.CodeFormatting/IFormattingEngine.cs index be61e2ec..4fbc9651 100644 --- a/src/Microsoft.DotNet.CodeFormatting/IFormattingEngine.cs +++ b/src/Microsoft.DotNet.CodeFormatting/IFormattingEngine.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Diagnostics; namespace Microsoft.DotNet.CodeFormatting { @@ -26,5 +27,6 @@ public interface IFormattingEngine void ToggleRuleEnabled(IRuleMetadata ruleMetaData, bool enabled); Task FormatSolutionAsync(Solution solution, bool useAnalyzers, CancellationToken cancellationToken); Task FormatProjectAsync(Project project, bool useAnalyzers, CancellationToken cancellationToken); + void AddAnalyzers(ImmutableArray immutableArray); } } From 29f291376ece1a82d6fab9dc1ae5866de7ab2c1a Mon Sep 17 00:00:00 2001 From: Dan Quirk Date: Tue, 8 Mar 2016 14:40:19 -0800 Subject: [PATCH 09/17] Upgrade Roslyn version to match newer analyzers --- src/CodeFormatter/CodeFormatter.csproj | 16 ++++++++-------- src/CodeFormatter/packages.config | 16 ++++++++-------- src/DeadRegions/DeadRegions.csproj | 16 ++++++++-------- src/DeadRegions/packages.config | 16 ++++++++-------- ...t.DotNet.CodeFormatter.Analyzers.Tests.csproj | 16 ++++++++-------- .../packages.config | 16 ++++++++-------- ...crosoft.DotNet.CodeFormatter.Analyzers.csproj | 16 ++++++++-------- .../packages.config | 16 ++++++++-------- .../Microsoft.DotNet.CodeFormatting.Tests.csproj | 16 ++++++++-------- .../packages.config | 16 ++++++++-------- .../Microsoft.DotNet.CodeFormatting.csproj | 16 ++++++++-------- .../packages.config | 16 ++++++++-------- ...rosoft.DotNet.DeadRegionAnalysis.Tests.csproj | 16 ++++++++-------- .../packages.config | 16 ++++++++-------- .../Microsoft.DotNet.DeadRegionAnalysis.csproj | 16 ++++++++-------- .../packages.config | 16 ++++++++-------- .../XUnitConverter.Tests.csproj | 16 ++++++++-------- src/XUnitConverter.Tests/packages.config | 16 ++++++++-------- src/XUnitConverter/XUnitConverter.csproj | 16 ++++++++-------- src/XUnitConverter/packages.config | 16 ++++++++-------- 20 files changed, 160 insertions(+), 160 deletions(-) diff --git a/src/CodeFormatter/CodeFormatter.csproj b/src/CodeFormatter/CodeFormatter.csproj index 2b4ccbaf..fae7cf4e 100644 --- a/src/CodeFormatter/CodeFormatter.csproj +++ b/src/CodeFormatter/CodeFormatter.csproj @@ -22,31 +22,31 @@ True - ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -76,7 +76,7 @@ - ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23811\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/CodeFormatter/packages.config b/src/CodeFormatter/packages.config index 3438eb46..8a79098e 100644 --- a/src/CodeFormatter/packages.config +++ b/src/CodeFormatter/packages.config @@ -1,14 +1,14 @@  - + - - - - - - + + + + + + @@ -18,7 +18,7 @@ - + diff --git a/src/DeadRegions/DeadRegions.csproj b/src/DeadRegions/DeadRegions.csproj index a5fb2e2f..13dc3a12 100644 --- a/src/DeadRegions/DeadRegions.csproj +++ b/src/DeadRegions/DeadRegions.csproj @@ -13,31 +13,31 @@ - ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -68,7 +68,7 @@ - ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23811\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/DeadRegions/packages.config b/src/DeadRegions/packages.config index e80d2a79..fabdbe28 100644 --- a/src/DeadRegions/packages.config +++ b/src/DeadRegions/packages.config @@ -1,13 +1,13 @@  - + - - - - - - + + + + + + @@ -17,7 +17,7 @@ - + diff --git a/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/Microsoft.DotNet.CodeFormatter.Analyzers.Tests.csproj b/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/Microsoft.DotNet.CodeFormatter.Analyzers.Tests.csproj index d43eb15f..743d9f7b 100644 --- a/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/Microsoft.DotNet.CodeFormatter.Analyzers.Tests.csproj +++ b/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/Microsoft.DotNet.CodeFormatter.Analyzers.Tests.csproj @@ -16,31 +16,31 @@ True - ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -71,7 +71,7 @@ - ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23811\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/packages.config b/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/packages.config index 3438eb46..8a79098e 100644 --- a/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/packages.config +++ b/src/Microsoft.DotNet.CodeFormatter.Analyzers.Tests/packages.config @@ -1,14 +1,14 @@  - + - - - - - - + + + + + + @@ -18,7 +18,7 @@ - + diff --git a/src/Microsoft.DotNet.CodeFormatter.Analyzers/Microsoft.DotNet.CodeFormatter.Analyzers.csproj b/src/Microsoft.DotNet.CodeFormatter.Analyzers/Microsoft.DotNet.CodeFormatter.Analyzers.csproj index 721e6876..c4d5c899 100644 --- a/src/Microsoft.DotNet.CodeFormatter.Analyzers/Microsoft.DotNet.CodeFormatter.Analyzers.csproj +++ b/src/Microsoft.DotNet.CodeFormatter.Analyzers/Microsoft.DotNet.CodeFormatter.Analyzers.csproj @@ -18,31 +18,31 @@ True - ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -72,7 +72,7 @@ - ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23811\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/Microsoft.DotNet.CodeFormatter.Analyzers/packages.config b/src/Microsoft.DotNet.CodeFormatter.Analyzers/packages.config index 3438eb46..8a79098e 100644 --- a/src/Microsoft.DotNet.CodeFormatter.Analyzers/packages.config +++ b/src/Microsoft.DotNet.CodeFormatter.Analyzers/packages.config @@ -1,14 +1,14 @@  - + - - - - - - + + + + + + @@ -18,7 +18,7 @@ - + diff --git a/src/Microsoft.DotNet.CodeFormatting.Tests/Microsoft.DotNet.CodeFormatting.Tests.csproj b/src/Microsoft.DotNet.CodeFormatting.Tests/Microsoft.DotNet.CodeFormatting.Tests.csproj index ae206cb9..c03afd83 100644 --- a/src/Microsoft.DotNet.CodeFormatting.Tests/Microsoft.DotNet.CodeFormatting.Tests.csproj +++ b/src/Microsoft.DotNet.CodeFormatting.Tests/Microsoft.DotNet.CodeFormatting.Tests.csproj @@ -19,31 +19,31 @@ True - ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -74,7 +74,7 @@ - ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23811\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/Microsoft.DotNet.CodeFormatting.Tests/packages.config b/src/Microsoft.DotNet.CodeFormatting.Tests/packages.config index 9060b642..6ba47189 100644 --- a/src/Microsoft.DotNet.CodeFormatting.Tests/packages.config +++ b/src/Microsoft.DotNet.CodeFormatting.Tests/packages.config @@ -1,14 +1,14 @@  - + - - - - - - + + + + + + @@ -18,7 +18,7 @@ - + diff --git a/src/Microsoft.DotNet.CodeFormatting/Microsoft.DotNet.CodeFormatting.csproj b/src/Microsoft.DotNet.CodeFormatting/Microsoft.DotNet.CodeFormatting.csproj index 1d7d4689..628a3d5e 100644 --- a/src/Microsoft.DotNet.CodeFormatting/Microsoft.DotNet.CodeFormatting.csproj +++ b/src/Microsoft.DotNet.CodeFormatting/Microsoft.DotNet.CodeFormatting.csproj @@ -10,31 +10,31 @@ - ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -64,7 +64,7 @@ - ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23811\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/Microsoft.DotNet.CodeFormatting/packages.config b/src/Microsoft.DotNet.CodeFormatting/packages.config index e80d2a79..fabdbe28 100644 --- a/src/Microsoft.DotNet.CodeFormatting/packages.config +++ b/src/Microsoft.DotNet.CodeFormatting/packages.config @@ -1,13 +1,13 @@  - + - - - - - - + + + + + + @@ -17,7 +17,7 @@ - + diff --git a/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/Microsoft.DotNet.DeadRegionAnalysis.Tests.csproj b/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/Microsoft.DotNet.DeadRegionAnalysis.Tests.csproj index 4666e0ce..600c001f 100644 --- a/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/Microsoft.DotNet.DeadRegionAnalysis.Tests.csproj +++ b/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/Microsoft.DotNet.DeadRegionAnalysis.Tests.csproj @@ -14,31 +14,31 @@ - ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -69,7 +69,7 @@ - ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23811\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/packages.config b/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/packages.config index 07835943..201ccef8 100644 --- a/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/packages.config +++ b/src/Microsoft.DotNet.DeadRegionAnalysis.Tests/packages.config @@ -1,13 +1,13 @@  - + - - - - - - + + + + + + @@ -17,7 +17,7 @@ - + diff --git a/src/Microsoft.DotNet.DeadRegionAnalysis/Microsoft.DotNet.DeadRegionAnalysis.csproj b/src/Microsoft.DotNet.DeadRegionAnalysis/Microsoft.DotNet.DeadRegionAnalysis.csproj index 882ffd4a..0f55e28c 100644 --- a/src/Microsoft.DotNet.DeadRegionAnalysis/Microsoft.DotNet.DeadRegionAnalysis.csproj +++ b/src/Microsoft.DotNet.DeadRegionAnalysis/Microsoft.DotNet.DeadRegionAnalysis.csproj @@ -13,31 +13,31 @@ - ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -68,7 +68,7 @@ - ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23811\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/Microsoft.DotNet.DeadRegionAnalysis/packages.config b/src/Microsoft.DotNet.DeadRegionAnalysis/packages.config index e80d2a79..fabdbe28 100644 --- a/src/Microsoft.DotNet.DeadRegionAnalysis/packages.config +++ b/src/Microsoft.DotNet.DeadRegionAnalysis/packages.config @@ -1,13 +1,13 @@  - + - - - - - - + + + + + + @@ -17,7 +17,7 @@ - + diff --git a/src/XUnitConverter.Tests/XUnitConverter.Tests.csproj b/src/XUnitConverter.Tests/XUnitConverter.Tests.csproj index 1f14dcfd..edbdeff3 100644 --- a/src/XUnitConverter.Tests/XUnitConverter.Tests.csproj +++ b/src/XUnitConverter.Tests/XUnitConverter.Tests.csproj @@ -15,31 +15,31 @@ - ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -70,7 +70,7 @@ - ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23811\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/XUnitConverter.Tests/packages.config b/src/XUnitConverter.Tests/packages.config index 07835943..201ccef8 100644 --- a/src/XUnitConverter.Tests/packages.config +++ b/src/XUnitConverter.Tests/packages.config @@ -1,13 +1,13 @@  - + - - - - - - + + + + + + @@ -17,7 +17,7 @@ - + diff --git a/src/XUnitConverter/XUnitConverter.csproj b/src/XUnitConverter/XUnitConverter.csproj index d9ecbe00..662bf083 100644 --- a/src/XUnitConverter/XUnitConverter.csproj +++ b/src/XUnitConverter/XUnitConverter.csproj @@ -13,31 +13,31 @@ - ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.dll + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.dll True - ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.CSharp.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.dll True - ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.VisualBasic.Workspaces.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.VisualBasic.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.dll True - ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160202-02\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll + ..\packages\Microsoft.CodeAnalysis.Workspaces.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.Workspaces.Desktop.dll True @@ -67,7 +67,7 @@ - ..\packages\System.Reflection.Metadata.1.2.0-rc3-23721\lib\dotnet5.2\System.Reflection.Metadata.dll + ..\packages\System.Reflection.Metadata.1.2.0-rc3-23811\lib\dotnet5.2\System.Reflection.Metadata.dll True diff --git a/src/XUnitConverter/packages.config b/src/XUnitConverter/packages.config index e80d2a79..fabdbe28 100644 --- a/src/XUnitConverter/packages.config +++ b/src/XUnitConverter/packages.config @@ -1,13 +1,13 @@  - + - - - - - - + + + + + + @@ -17,7 +17,7 @@ - + From e57bab3e09b38a3d8fa785b722047cedf6b6c7e8 Mon Sep 17 00:00:00 2001 From: Dan Quirk Date: Thu, 10 Mar 2016 18:28:00 -0800 Subject: [PATCH 10/17] Use Roslyn ErrorLogger for SARIF format logs and log analyzer execution time --- .../FormattingEngineImplementation.cs | 74 +++++++++++++------ 1 file changed, 52 insertions(+), 22 deletions(-) diff --git a/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs b/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs index 1e928a54..c6f9448a 100644 --- a/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs +++ b/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs @@ -7,7 +7,9 @@ using System.Collections.Immutable; using System.Composition; using System.Diagnostics; +using System.IO; using System.Linq; +using System.Reflection; using System.Threading; using System.Threading.Tasks; @@ -40,6 +42,8 @@ internal sealed partial class FormattingEngineImplementation : IFormattingEngine private readonly Dictionary _ruleEnabledMap = new Dictionary(StringComparer.OrdinalIgnoreCase); private readonly ImmutableDictionary _diagnosticIdToFixerMap; private CompilationWithAnalyzers _compilationWithAnalyzers; + private object _outputLogger; // Microsoft.CodeAnalysis.ErrorLogger + private Assembly _loggerAssembly; public ImmutableArray CopyrightHeader { @@ -92,6 +96,27 @@ public ImmutableArray AllSupportedDiagnostics .SelectMany(a => a.SupportedDiagnostics) .OrderBy(a => a.Id) .ToImmutableArray(); + + // Use the Roslyn ErrorLogger type to log diagnostics per analyzer to SARIF format + public void LogDiagnostics(string filePath, ImmutableArray diagnostics) + { + if (_loggerAssembly == null) + { + _loggerAssembly = Assembly.Load(typeof(CommandLineParser).Assembly.FullName); + } + + _outputLogger = Activator.CreateInstance( + _loggerAssembly.GetType("Microsoft.CodeAnalysis.ErrorLogger"), + new object[] { new FileStream(filePath, FileMode.Append, FileAccess.Write), "CodeFormatter", "0.1", _loggerAssembly.GetName().Version }); + + var logDiagMethodInfo = _outputLogger.GetType().GetMethod("LogDiagnostic", BindingFlags.NonPublic | BindingFlags.Instance); + foreach (var diagnostic in diagnostics) + { + logDiagMethodInfo.Invoke(_outputLogger, new object[] { diagnostic, System.Globalization.CultureInfo.DefaultThreadCurrentCulture }); + } + + ((IDisposable)_outputLogger).Dispose(); + } public FormattingEngineImplementation( FormattingOptions options, @@ -260,35 +285,39 @@ private async Task getProjectLinesOfCodeCount(Project project) return totalLines.Sum(); } - private string createAnalyzerResultText(DiagnosticAnalyzer analyzer, ImmutableArray diagnostics, int documentCount, int linesOfCodeInProject) - { - return String.Format("{0}\t{1}\t{2}\t{3}\n", analyzer.ToString(), documentCount, linesOfCodeInProject, diagnostics.Count()); - } - private async Task FormatWithAnalyzersCoreAsync(Workspace workspace, ProjectId projectId, IEnumerable analyzers, CancellationToken cancellationToken) { if (analyzers != null && analyzers.Count() != 0) { var project = workspace.CurrentSolution.GetProject(projectId); var diagnostics = await GetDiagnostics(project, analyzers, cancellationToken).ConfigureAwait(false); - - var projectResultText = ""; - var ext = project.Language == "C#" ? ".csproj" : ".vbproj"; - var resultFile = project.FilePath.Substring(project.FilePath.LastIndexOf(System.IO.Path.DirectorySeparatorChar)).Replace(ext, "_CodeFormatterResults.txt"); - - var linesOfCodeInProject = -1; - foreach (var analyzer in analyzers) - { - var diags = await _compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync(ImmutableArray.Create(analyzer), cancellationToken); - linesOfCodeInProject = linesOfCodeInProject == -1 ? await getProjectLinesOfCodeCount(project) : linesOfCodeInProject; - var analyzerResultText = createAnalyzerResultText(analyzer, diags, project.Documents.Count(), linesOfCodeInProject); - FormatLogger.Write(analyzerResultText); - projectResultText += analyzerResultText; - } - - if (LogOutputPath != null) + // Ensure at least 1 analyzer supporting the current project's language ran + if (_compilationWithAnalyzers != null) { - System.IO.File.WriteAllText(System.IO.Path.Combine(LogOutputPath, resultFile), projectResultText); + var ext = project.Language == "C#" ? ".csproj" : ".vbproj"; + var resultFile = project.FilePath.Substring(project.FilePath.LastIndexOf(Path.DirectorySeparatorChar)).Replace(ext, "_CodeFormatterResults.txt"); + + var linesOfCodeInProject = -1; + foreach (var analyzer in analyzers) + { + var diags = await _compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync(ImmutableArray.Create(analyzer), cancellationToken); + linesOfCodeInProject = linesOfCodeInProject == -1 ? await getProjectLinesOfCodeCount(project) : linesOfCodeInProject; + var analyzerTelemetryInfo = await _compilationWithAnalyzers.GetAnalyzerTelemetryInfoAsync(analyzer, cancellationToken); + var analyzerResultText = String.Format("{0}\t{1}\t{2}\t{3}\t{4}\r\n", + analyzer.ToString(), + project.Documents.Count(), + linesOfCodeInProject, + diagnostics.Count(), + analyzerTelemetryInfo.ExecutionTime); + + FormatLogger.Write(analyzerResultText); + + if (LogOutputPath != null) + { + LogDiagnostics((LogOutputPath + resultFile).Replace(".txt", ".json"), diags); + File.AppendAllText(LogOutputPath + resultFile, analyzerResultText); + } + } } if (ApplyFixes) @@ -444,6 +473,7 @@ private async Task> GetDiagnostics(Project project, I } else { + _compilationWithAnalyzers = null; return ImmutableArray.Empty; } } From 7bd2d43d3493ca2555b556b87fe0ea219f8e51b1 Mon Sep 17 00:00:00 2001 From: Dan Quirk Date: Thu, 10 Mar 2016 18:28:20 -0800 Subject: [PATCH 11/17] Fix loading directories of analyzers --- src/CodeFormatter/Program.cs | 52 +++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/src/CodeFormatter/Program.cs b/src/CodeFormatter/Program.cs index f43d32d1..97386f56 100644 --- a/src/CodeFormatter/Program.cs +++ b/src/CodeFormatter/Program.cs @@ -130,6 +130,31 @@ private static int RunCommand(CommandLineOptions options, bool applyCodeFixes) { } } + private static IAnalyzerAssemblyLoader _analyzerAssemblyLoader; + private static IAnalyzerAssemblyLoader AnalyzerAssemblyLoader { + get + { + if(_analyzerAssemblyLoader == null) + { + // use Roslyn's existing simple loader, there're no special requirements for our usage + var loaderAssembly = Assembly.Load((typeof(CommandLineProject)).Assembly.FullName); + _analyzerAssemblyLoader = (IAnalyzerAssemblyLoader)Activator.CreateInstance(loaderAssembly.GetType("Microsoft.CodeAnalysis.SimpleAnalyzerAssemblyLoader")); + } + return _analyzerAssemblyLoader; + } + } + + private static ImmutableArray LoadAnalyzersFromAssembly(string path, bool throwIfNoAnalyzersFound) + { + var analyzerRef = new AnalyzerFileReference(path, AnalyzerAssemblyLoader); + var newAnalyzers = analyzerRef.GetAnalyzersForAllLanguages(); + if (newAnalyzers.Count() == 0 && throwIfNoAnalyzersFound) + { + throw new Exception(String.Format("Specified analyzer assembly {0} contained no analyzers", analyzerRef.GetAssembly().FullName)); + } + return newAnalyzers; + } + private static async Task RunAsync(CommandLineOptions options, CancellationToken cancellationToken) { var assemblies = OptionsHelper.DefaultCompositionAssemblies; @@ -148,18 +173,27 @@ private static async Task RunAsync(CommandLineOptions options, Cancellation engine.LogOutputPath = options.LogOutputPath; if (options.AnalyzerListFile != null && options.AnalyzerListText != null && options.AnalyzerListText.Count() > 0) - { - var loaderAssembly = Assembly.Load((typeof(CommandLineProject)).Assembly.FullName); - var loader = (IAnalyzerAssemblyLoader)Activator.CreateInstance(loaderAssembly.GetType("Microsoft.CodeAnalysis.SimpleAnalyzerAssemblyLoader")); - foreach(var analyzerPath in options.AnalyzerListText) + { + foreach (var analyzerPath in options.AnalyzerListText) { - var analyzerRef = new AnalyzerFileReference(analyzerPath, loader); - var newAnalyzers = analyzerRef.GetAnalyzersForAllLanguages(); - if(newAnalyzers.Count() == 0) + if (File.Exists(analyzerPath)) + { + var newAnalyzers = LoadAnalyzersFromAssembly(analyzerPath, true); + engine.AddAnalyzers(newAnalyzers); + } + else if (Directory.Exists(analyzerPath)) { - throw new Exception(String.Format("Specified analyzer assembly {0} contained no analyzers", analyzerRef.GetAssembly().FullName)); + var DLLs = Directory.GetFiles(analyzerPath, "*.dll"); + foreach (var dll in DLLs) + { + // allows specifying a folder that contains analyzers as well as non-analyzer DLLs without throwing + var newAnalyzers = LoadAnalyzersFromAssembly(dll, false); + if (newAnalyzers.Count() > 0) + { + engine.AddAnalyzers(newAnalyzers); + } + } } - engine.AddAnalyzers(newAnalyzers); } } From 26e2202e67b1c572fbba975d08d13a059900f1bf Mon Sep 17 00:00:00 2001 From: Dan Quirk Date: Tue, 15 Mar 2016 18:36:42 -0700 Subject: [PATCH 12/17] Cleanup, perf fixes --- src/CodeFormatter/CodeFormatter.csproj | 1 + src/CodeFormatter/Program.cs | 73 ++++++++++---- .../FormattingEngine.cs | 2 - .../FormattingEngineImplementation.cs | 94 +++++++++++++------ 4 files changed, 121 insertions(+), 49 deletions(-) diff --git a/src/CodeFormatter/CodeFormatter.csproj b/src/CodeFormatter/CodeFormatter.csproj index fae7cf4e..fb6f63f9 100644 --- a/src/CodeFormatter/CodeFormatter.csproj +++ b/src/CodeFormatter/CodeFormatter.csproj @@ -21,6 +21,7 @@ ..\packages\CommandLineParser.2.0.273-beta\lib\net45\CommandLine.dll True + ..\packages\Microsoft.CodeAnalysis.Common.1.2.0-beta1-20160226-01\lib\net45\Microsoft.CodeAnalysis.dll True diff --git a/src/CodeFormatter/Program.cs b/src/CodeFormatter/Program.cs index 97386f56..f2c22d87 100644 --- a/src/CodeFormatter/Program.cs +++ b/src/CodeFormatter/Program.cs @@ -109,6 +109,9 @@ private static int RunCommand(CommandLineOptions options, bool applyCodeFixes) { Console.CancelKeyPress += delegate { cts.Cancel(); }; + var stopwatch = new Stopwatch(); + stopwatch.Start(); + try { RunAsync(options, ct).Wait(ct); @@ -128,6 +131,11 @@ private static int RunCommand(CommandLineOptions options, bool applyCodeFixes) { return FAILED; } + finally + { + stopwatch.Stop(); + Console.WriteLine("Total time: {0}", stopwatch.Elapsed); + } } private static IAnalyzerAssemblyLoader _analyzerAssemblyLoader; @@ -210,7 +218,26 @@ private static async Task RunAsync(CommandLineOptions options, Cancellation foreach (var item in options.Targets) { - await RunItemAsync(engine, item, options.Language, options.UseAnalyzers, cancellationToken); + // target was a text file with a list of project files to run against + if (StringComparer.OrdinalIgnoreCase.Equals(Path.GetExtension(item), ".txt")) + { + var targets = File.ReadAllLines(item); + foreach (var target in targets) + { + try + { + await RunItemAsync(engine, target, options.Language, options.UseAnalyzers, cancellationToken); + } + catch (Exception e) + { + Console.WriteLine("Exception: {0} with project {1}", e.Message, target); + } + } + } + else + { + await RunItemAsync(engine, item, options.Language, options.UseAnalyzers, cancellationToken); + } } return SUCCEEDED; @@ -225,32 +252,40 @@ private static async Task RunItemAsync( { Console.WriteLine(Path.GetFileName(item)); string extension = Path.GetExtension(item); - if (StringComparer.OrdinalIgnoreCase.Equals(extension, ".rsp")) + try { - using (var workspace = ResponseFileWorkspace.Create()) + if (StringComparer.OrdinalIgnoreCase.Equals(extension, ".rsp")) { - Project project = workspace.OpenCommandLineProject(item, language); - await engine.FormatProjectAsync(project, useAnalyzers, cancellationToken); + using (var workspace = ResponseFileWorkspace.Create()) + { + Project project = workspace.OpenCommandLineProject(item, language); + await engine.FormatProjectAsync(project, useAnalyzers, cancellationToken); + } } - } - else if (StringComparer.OrdinalIgnoreCase.Equals(extension, ".sln")) - { - using (var workspace = MSBuildWorkspace.Create()) + else if (StringComparer.OrdinalIgnoreCase.Equals(extension, ".sln")) { - workspace.LoadMetadataForReferencedProjects = true; - var solution = await workspace.OpenSolutionAsync(item, cancellationToken); - await engine.FormatSolutionAsync(solution, useAnalyzers, cancellationToken); + using (var workspace = MSBuildWorkspace.Create()) + { + workspace.LoadMetadataForReferencedProjects = true; + var solution = await workspace.OpenSolutionAsync(item, cancellationToken); + await engine.FormatSolutionAsync(solution, useAnalyzers, cancellationToken); + } } - } - else - { - using (var workspace = MSBuildWorkspace.Create()) + else { - workspace.LoadMetadataForReferencedProjects = true; - var project = await workspace.OpenProjectAsync(item, cancellationToken); - await engine.FormatProjectAsync(project, useAnalyzers, cancellationToken); + using (var workspace = MSBuildWorkspace.Create()) + { + workspace.LoadMetadataForReferencedProjects = true; + var project = await workspace.OpenProjectAsync(item, cancellationToken); + await engine.FormatProjectAsync(project, useAnalyzers, cancellationToken); + } } } + catch (Microsoft.Build.Exceptions.InvalidProjectFileException) + { + // Can occur if for example a Mono based project with unknown targets files is supplied + Console.WriteLine("Invalid project file in target {0}", item); + } } private static bool SetRuleMap(IFormattingEngine engine, ImmutableDictionary ruleMap) diff --git a/src/Microsoft.DotNet.CodeFormatting/FormattingEngine.cs b/src/Microsoft.DotNet.CodeFormatting/FormattingEngine.cs index 7826e50e..82f56ef9 100644 --- a/src/Microsoft.DotNet.CodeFormatting/FormattingEngine.cs +++ b/src/Microsoft.DotNet.CodeFormatting/FormattingEngine.cs @@ -68,8 +68,6 @@ private static ConventionBuilder GetConventions() .Export(); conventions.ForTypesDerivedFrom() .Export(); - conventions.ForTypesDerivedFrom() - .Export(); // New per-analyzer options mechanism, deriving // from VS Workspaces functionality conventions.ForTypesDerivedFrom() diff --git a/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs b/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs index c6f9448a..0bd9dd05 100644 --- a/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs +++ b/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs @@ -96,7 +96,7 @@ public ImmutableArray AllSupportedDiagnostics .SelectMany(a => a.SupportedDiagnostics) .OrderBy(a => a.Id) .ToImmutableArray(); - + // Use the Roslyn ErrorLogger type to log diagnostics per analyzer to SARIF format public void LogDiagnostics(string filePath, ImmutableArray diagnostics) { @@ -241,6 +241,7 @@ public async Task FormatProjectWithAnalyzersAsync(Project project, CancellationT await FormatProjectWithSyntaxAnalyzersAsync(workspace, project.Id, cancellationToken); await FormatProjectWithLocalAnalyzersAsync(workspace, project.Id, cancellationToken); await FormatProjectWithGlobalAnalyzersAsync(workspace, project.Id, cancellationToken); + await FormatProjectWithUnspecifiedAnalyzersAsync(workspace, project.Id, cancellationToken); watch.Stop(); FormatLogger.WriteLine("Total time for formatting {0} - {1}", project.Name, watch.Elapsed); @@ -260,12 +261,7 @@ private async Task FormatProjectWithLocalAnalyzersAsync(Workspace workspace, Pro private async Task FormatProjectWithGlobalAnalyzersAsync(Workspace workspace, ProjectId projectId, CancellationToken cancellationToken) { - // Remaining analyzers are either RuleType.GlobalSemantic, in which case we need to run them one by one lest they conflict - // with each other, or else they are of an unknown type in which case we should conservatively treat them as if they - // may conflict with one another. - var analyzers = _analyzers.Where(a => { - return a.SupportedDiagnostics.All(d => !(d.CustomTags.Contains(RuleType.Syntactic) || d.CustomTags.Contains(RuleType.LocalSemantic))); - }); + var analyzers = _analyzers.Where(a => a.SupportedDiagnostics.All(d => d.CustomTags.Contains(RuleType.GlobalSemantic))); // Since global analyzers can potentially conflict with each other, run them one by one. foreach (var analyzer in analyzers) @@ -274,10 +270,22 @@ private async Task FormatProjectWithGlobalAnalyzersAsync(Workspace workspace, Pr } } - private async Task getProjectLinesOfCodeCount(Project project) + private async Task FormatProjectWithUnspecifiedAnalyzersAsync(Workspace workspace, ProjectId projectId, CancellationToken cancellationToken) { - var allLines = project.Documents.Select(async doc => + var analyzers = _analyzers.Where(a => a.SupportedDiagnostics.All(d => { + return !(d.CustomTags.Contains(RuleType.Syntactic) || d.CustomTags.Contains(RuleType.LocalSemantic) || d.CustomTags.Contains(RuleType.GlobalSemantic)); + })); + + // Treat analyzers with unknown rule types as if they were global in case they might conflict with each other + foreach (var analyzer in analyzers) { + await FormatWithAnalyzersCoreAsync(workspace, projectId, new[] { analyzer }, cancellationToken); + } + } + + private async Task getProjectLinesOfCodeCount(Project project) + { + var allLines = project.Documents.Select(async doc => { var text = await doc.GetTextAsync(); return text.Lines.Count; }); @@ -294,28 +302,35 @@ private async Task FormatWithAnalyzersCoreAsync(Workspace workspace, ProjectId p // Ensure at least 1 analyzer supporting the current project's language ran if (_compilationWithAnalyzers != null) { - var ext = project.Language == "C#" ? ".csproj" : ".vbproj"; - var resultFile = project.FilePath.Substring(project.FilePath.LastIndexOf(Path.DirectorySeparatorChar)).Replace(ext, "_CodeFormatterResults.txt"); + var extension = StringComparer.OrdinalIgnoreCase.Equals(project.Language, "C#") ? ".csproj" : ".vbproj"; + var resultFile = project.FilePath.Substring(project.FilePath.LastIndexOf(Path.DirectorySeparatorChar)).Replace(extension, "_CodeFormatterResults.txt"); var linesOfCodeInProject = -1; foreach (var analyzer in analyzers) { var diags = await _compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync(ImmutableArray.Create(analyzer), cancellationToken); - linesOfCodeInProject = linesOfCodeInProject == -1 ? await getProjectLinesOfCodeCount(project) : linesOfCodeInProject; - var analyzerTelemetryInfo = await _compilationWithAnalyzers.GetAnalyzerTelemetryInfoAsync(analyzer, cancellationToken); - var analyzerResultText = String.Format("{0}\t{1}\t{2}\t{3}\t{4}\r\n", - analyzer.ToString(), - project.Documents.Count(), - linesOfCodeInProject, - diagnostics.Count(), - analyzerTelemetryInfo.ExecutionTime); - - FormatLogger.Write(analyzerResultText); - - if (LogOutputPath != null) + if (Verbose || LogOutputPath != null) { - LogDiagnostics((LogOutputPath + resultFile).Replace(".txt", ".json"), diags); - File.AppendAllText(LogOutputPath + resultFile, analyzerResultText); + linesOfCodeInProject = linesOfCodeInProject == -1 ? await getProjectLinesOfCodeCount(project) : linesOfCodeInProject; + var analyzerTelemetryInfo = await _compilationWithAnalyzers.GetAnalyzerTelemetryInfoAsync(analyzer, cancellationToken); + var analyzerResultText = string.Format("{0}\t{1}\t{2}\t{3}\t{4}\r\n", + analyzer.ToString(), + project.Documents.Count(), + linesOfCodeInProject, + diagnostics.Count(), + analyzerTelemetryInfo.ExecutionTime); + + if (Verbose) + { + FormatLogger.Write(analyzerResultText); + } + + if (LogOutputPath != null) + { + var resultPath = LogOutputPath + resultFile; + LogDiagnostics(Path.ChangeExtension(resultPath, "json"), diags); + File.AppendAllText(resultPath, analyzerResultText); + } } } } @@ -343,7 +358,7 @@ private async Task FormatWithAnalyzersCoreAsync(Workspace workspace, ProjectId p } } } - + public void ToggleRuleEnabled(IRuleMetadata ruleMetaData, bool enabled) { _ruleEnabledMap[ruleMetaData.Name] = enabled; @@ -654,7 +669,30 @@ private async Task RunGlobalSemanticPass(Solution solution, IReadOnlyL public void AddAnalyzers(ImmutableArray analyzers) { - _analyzers = _analyzers.Concat(analyzers); + var toAdd = new List(); + foreach (var analyzer in analyzers) + { + IEqualityComparer comparer = new AnalyzerComparer(); + if (!_analyzers.Contains(analyzer, comparer)) + { + toAdd.Add(analyzer); + } + } + _analyzers = _analyzers.Concat(toAdd.ToArray()); + } + } + + + internal class AnalyzerComparer : IEqualityComparer + { + public bool Equals(DiagnosticAnalyzer x, DiagnosticAnalyzer y) + { + return x.ToString() == y.ToString(); + } + + public int GetHashCode(DiagnosticAnalyzer obj) + { + return obj.GetHashCode(); } } -} +} \ No newline at end of file From d9289e02a3eaddb842bf358716f258acb2caec18 Mon Sep 17 00:00:00 2001 From: Dan Quirk Date: Mon, 21 Mar 2016 12:34:09 -0700 Subject: [PATCH 13/17] Clean up some task specific logging not suitable for general use --- .../FormattingEngineImplementation.cs | 32 ++----------------- 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs b/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs index 0bd9dd05..3fabfe1a 100644 --- a/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs +++ b/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs @@ -283,16 +283,6 @@ private async Task FormatProjectWithUnspecifiedAnalyzersAsync(Workspace workspac } } - private async Task getProjectLinesOfCodeCount(Project project) - { - var allLines = project.Documents.Select(async doc => { - var text = await doc.GetTextAsync(); - return text.Lines.Count; - }); - var totalLines = await Task.WhenAll(allLines); - return totalLines.Sum(); - } - private async Task FormatWithAnalyzersCoreAsync(Workspace workspace, ProjectId projectId, IEnumerable analyzers, CancellationToken cancellationToken) { if (analyzers != null && analyzers.Count() != 0) @@ -305,32 +295,14 @@ private async Task FormatWithAnalyzersCoreAsync(Workspace workspace, ProjectId p var extension = StringComparer.OrdinalIgnoreCase.Equals(project.Language, "C#") ? ".csproj" : ".vbproj"; var resultFile = project.FilePath.Substring(project.FilePath.LastIndexOf(Path.DirectorySeparatorChar)).Replace(extension, "_CodeFormatterResults.txt"); - var linesOfCodeInProject = -1; foreach (var analyzer in analyzers) { var diags = await _compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync(ImmutableArray.Create(analyzer), cancellationToken); if (Verbose || LogOutputPath != null) { - linesOfCodeInProject = linesOfCodeInProject == -1 ? await getProjectLinesOfCodeCount(project) : linesOfCodeInProject; var analyzerTelemetryInfo = await _compilationWithAnalyzers.GetAnalyzerTelemetryInfoAsync(analyzer, cancellationToken); - var analyzerResultText = string.Format("{0}\t{1}\t{2}\t{3}\t{4}\r\n", - analyzer.ToString(), - project.Documents.Count(), - linesOfCodeInProject, - diagnostics.Count(), - analyzerTelemetryInfo.ExecutionTime); - - if (Verbose) - { - FormatLogger.Write(analyzerResultText); - } - - if (LogOutputPath != null) - { - var resultPath = LogOutputPath + resultFile; - LogDiagnostics(Path.ChangeExtension(resultPath, "json"), diags); - File.AppendAllText(resultPath, analyzerResultText); - } + var resultPath = Path.ChangeExtension(LogOutputPath + resultFile, "json"); + LogDiagnostics(resultPath, diags); } } } From c108be19a84a71685cdf3da82804a236b5a6a9f4 Mon Sep 17 00:00:00 2001 From: Dan Quirk Date: Mon, 21 Mar 2016 12:43:24 -0700 Subject: [PATCH 14/17] PR cleanup --- .../AnalyzerFileLoader.cs | 17 ----------------- .../FormattingEngineImplementation.cs | 2 +- 2 files changed, 1 insertion(+), 18 deletions(-) delete mode 100644 src/Microsoft.DotNet.CodeFormatting/AnalyzerFileLoader.cs diff --git a/src/Microsoft.DotNet.CodeFormatting/AnalyzerFileLoader.cs b/src/Microsoft.DotNet.CodeFormatting/AnalyzerFileLoader.cs deleted file mode 100644 index 84b3f58c..00000000 --- a/src/Microsoft.DotNet.CodeFormatting/AnalyzerFileLoader.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Reflection; -using Microsoft.CodeAnalysis; - -namespace Microsoft.DotNet.CodeFormatting -{ - public class AnalyzerFileLoader : IAnalyzerAssemblyLoader - { - public void AddDependencyLocation(string fullPath) - { - } - - public Assembly LoadFromPath(string fullPath) - { - return Assembly.LoadFrom(fullPath); - } - } -} diff --git a/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs b/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs index 3fabfe1a..2b91e310 100644 --- a/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs +++ b/src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs @@ -654,7 +654,7 @@ public void AddAnalyzers(ImmutableArray analyzers) } } - + // Simple comparer to ensure we don't add the same analyzer twice given large lists of analyzer assemblies internal class AnalyzerComparer : IEqualityComparer { public bool Equals(DiagnosticAnalyzer x, DiagnosticAnalyzer y) From d0eb4593c3748e4c4c03f2d6a8ab412182632c0e Mon Sep 17 00:00:00 2001 From: Dan Quirk Date: Mon, 21 Mar 2016 12:44:57 -0700 Subject: [PATCH 15/17] More PR cleanup --- src/Microsoft.DotNet.CodeFormatting/FormattingEngine.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.DotNet.CodeFormatting/FormattingEngine.cs b/src/Microsoft.DotNet.CodeFormatting/FormattingEngine.cs index 82f56ef9..b731f0bf 100644 --- a/src/Microsoft.DotNet.CodeFormatting/FormattingEngine.cs +++ b/src/Microsoft.DotNet.CodeFormatting/FormattingEngine.cs @@ -10,7 +10,6 @@ using System.Collections.Generic; using System.Reflection; using Microsoft.CodeAnalysis.Options; -using Microsoft.CodeAnalysis.Diagnostics; namespace Microsoft.DotNet.CodeFormatting { From 6441bc97d428d05b4bb35d0f69e2af5f06c7fb12 Mon Sep 17 00:00:00 2001 From: Dan Quirk Date: Mon, 21 Mar 2016 13:34:04 -0700 Subject: [PATCH 16/17] Missed a file --- .../Microsoft.DotNet.CodeFormatting.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.DotNet.CodeFormatting/Microsoft.DotNet.CodeFormatting.csproj b/src/Microsoft.DotNet.CodeFormatting/Microsoft.DotNet.CodeFormatting.csproj index 628a3d5e..19378cf8 100644 --- a/src/Microsoft.DotNet.CodeFormatting/Microsoft.DotNet.CodeFormatting.csproj +++ b/src/Microsoft.DotNet.CodeFormatting/Microsoft.DotNet.CodeFormatting.csproj @@ -75,7 +75,6 @@ - From 8d638acf4cafa368258eda2dbf31851689819672 Mon Sep 17 00:00:00 2001 From: Dan Quirk Date: Fri, 25 Mar 2016 12:54:13 -0700 Subject: [PATCH 17/17] Use own IAnalyzerAssemblyLoader implementation rather than re-using Roslyn's via reflection --- .../BasicAnalyzerAssemblyLoader.cs | 51 +++++++++++++++++++ src/CodeFormatter/CodeFormatter.csproj | 1 + src/CodeFormatter/Program.cs | 16 +----- 3 files changed, 53 insertions(+), 15 deletions(-) create mode 100644 src/CodeFormatter/BasicAnalyzerAssemblyLoader.cs diff --git a/src/CodeFormatter/BasicAnalyzerAssemblyLoader.cs b/src/CodeFormatter/BasicAnalyzerAssemblyLoader.cs new file mode 100644 index 00000000..8cbb17a0 --- /dev/null +++ b/src/CodeFormatter/BasicAnalyzerAssemblyLoader.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis; + +namespace CodeFormatter +{ + public class BasicAnalyzerAssemblyLoader : IAnalyzerAssemblyLoader + { + private readonly Dictionary _pathsToAssemblies = new Dictionary(StringComparer.OrdinalIgnoreCase); + private readonly Dictionary _namesToAssemblies = new Dictionary(); + private readonly List _dependencyPaths = new List(); + + public void AddDependencyLocation(string fullPath) + { + if (fullPath == null) + { + throw new ArgumentNullException(nameof(fullPath)); + } + + if (!_dependencyPaths.Contains(fullPath, StringComparer.OrdinalIgnoreCase)) + { + _dependencyPaths.Add(fullPath); + } + } + + public Assembly LoadFromPath(string fullPath) + { + if (fullPath == null) + { + throw new ArgumentNullException(nameof(fullPath)); + } + + Assembly assembly; + if (_pathsToAssemblies.TryGetValue(fullPath, out assembly)) + { + return assembly; + } + else + { + assembly = Assembly.LoadFrom(fullPath); + _pathsToAssemblies[fullPath] = assembly; + _namesToAssemblies[assembly.FullName] = assembly; + return assembly; + } + } + } +} diff --git a/src/CodeFormatter/CodeFormatter.csproj b/src/CodeFormatter/CodeFormatter.csproj index fb6f63f9..65892f7a 100644 --- a/src/CodeFormatter/CodeFormatter.csproj +++ b/src/CodeFormatter/CodeFormatter.csproj @@ -87,6 +87,7 @@ + diff --git a/src/CodeFormatter/Program.cs b/src/CodeFormatter/Program.cs index f2c22d87..1ca3ed8d 100644 --- a/src/CodeFormatter/Program.cs +++ b/src/CodeFormatter/Program.cs @@ -138,23 +138,9 @@ private static int RunCommand(CommandLineOptions options, bool applyCodeFixes) { } } - private static IAnalyzerAssemblyLoader _analyzerAssemblyLoader; - private static IAnalyzerAssemblyLoader AnalyzerAssemblyLoader { - get - { - if(_analyzerAssemblyLoader == null) - { - // use Roslyn's existing simple loader, there're no special requirements for our usage - var loaderAssembly = Assembly.Load((typeof(CommandLineProject)).Assembly.FullName); - _analyzerAssemblyLoader = (IAnalyzerAssemblyLoader)Activator.CreateInstance(loaderAssembly.GetType("Microsoft.CodeAnalysis.SimpleAnalyzerAssemblyLoader")); - } - return _analyzerAssemblyLoader; - } - } - private static ImmutableArray LoadAnalyzersFromAssembly(string path, bool throwIfNoAnalyzersFound) { - var analyzerRef = new AnalyzerFileReference(path, AnalyzerAssemblyLoader); + var analyzerRef = new AnalyzerFileReference(path, new BasicAnalyzerAssemblyLoader()); var newAnalyzers = analyzerRef.GetAnalyzersForAllLanguages(); if (newAnalyzers.Count() == 0 && throwIfNoAnalyzersFound) {