Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Data; using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Data;
using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Updater; using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Updater;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
using Microsoft.CodeAnalysis.EditorConfig; using Microsoft.CodeAnalysis.EditorConfig;
using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.PooledObjects;
Expand All @@ -22,31 +23,34 @@ namespace Microsoft.CodeAnalysis.Editor.EditorConfigSettings.DataProvider.Analyz
internal sealed class AnalyzerSettingsProvider : SettingsProviderBase<AnalyzerSetting, AnalyzerSettingsUpdater, AnalyzerSetting, ReportDiagnostic> internal sealed class AnalyzerSettingsProvider : SettingsProviderBase<AnalyzerSetting, AnalyzerSettingsUpdater, AnalyzerSetting, ReportDiagnostic>
{ {
public AnalyzerSettingsProvider( public AnalyzerSettingsProvider(
IThreadingContext threadingContext,
string fileName, string fileName,
AnalyzerSettingsUpdater settingsUpdater, AnalyzerSettingsUpdater settingsUpdater,
Workspace workspace, Workspace workspace,
IGlobalOptionService optionService) IGlobalOptionService optionService)
: base(fileName, settingsUpdater, workspace, optionService) : base(threadingContext, fileName, settingsUpdater, workspace, optionService)
{ {
Update(); Update();
} }


protected override void UpdateOptions( protected override async Task UpdateOptionsAsync(
TieredAnalyzerConfigOptions options, Solution solution, ImmutableArray<Project> projectsInScope) TieredAnalyzerConfigOptions options, Solution solution, ImmutableArray<Project> projectsInScope, CancellationToken cancellationToken)
{ {
var analyzerReferences = RoslynEnumerableExtensions.DistinctBy(projectsInScope.SelectMany(p => p.AnalyzerReferences), a => a.Id).ToImmutableArray(); var analyzerReferences = RoslynEnumerableExtensions.DistinctBy(projectsInScope.SelectMany(p => p.AnalyzerReferences), a => a.Id).ToImmutableArray();
foreach (var analyzerReference in analyzerReferences) foreach (var analyzerReference in analyzerReferences)
{ {
var configSettings = GetSettings(solution, analyzerReference, options.EditorConfigOptions); var configSettings = await GetSettingsAsync(
solution, analyzerReference, options.EditorConfigOptions, cancellationToken).ConfigureAwait(false);
AddRange(configSettings); AddRange(configSettings);
} }
} }


private ImmutableArray<AnalyzerSetting> GetSettings( private async Task<ImmutableArray<AnalyzerSetting>> GetSettingsAsync(
Solution solution, AnalyzerReference analyzerReference, AnalyzerConfigOptions editorConfigOptions) Solution solution, AnalyzerReference analyzerReference, AnalyzerConfigOptions editorConfigOptions, CancellationToken cancellationToken)
{ {
var service = solution.Services.GetRequiredService<IDiagnosticAnalyzerService>(); var service = solution.Services.GetRequiredService<IDiagnosticAnalyzerService>();
var map = service.GetDiagnosticDescriptors(solution, analyzerReference); var map = await service.GetDiagnosticDescriptorsAsync(
solution, analyzerReference, cancellationToken).ConfigureAwait(false);


using var _ = ArrayBuilder<AnalyzerSetting>.GetInstance(out var allSettings); using var _ = ArrayBuilder<AnalyzerSetting>.GetInstance(out var allSettings);


Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -4,17 +4,19 @@


using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Data; using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Data;
using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Updater; using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Updater;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Options;


namespace Microsoft.CodeAnalysis.Editor.EditorConfigSettings.DataProvider.Analyzer; namespace Microsoft.CodeAnalysis.Editor.EditorConfigSettings.DataProvider.Analyzer;


internal sealed class AnalyzerSettingsProviderFactory( internal sealed class AnalyzerSettingsProviderFactory(
IThreadingContext threadingContext,
Workspace workspace, Workspace workspace,
IGlobalOptionService globalOptionService) : IWorkspaceSettingsProviderFactory<AnalyzerSetting> IGlobalOptionService globalOptionService) : IWorkspaceSettingsProviderFactory<AnalyzerSetting>
{ {
public ISettingsProvider<AnalyzerSetting> GetForFile(string filePath) public ISettingsProvider<AnalyzerSetting> GetForFile(string filePath)
{ {
var updater = new AnalyzerSettingsUpdater(workspace, filePath); var updater = new AnalyzerSettingsUpdater(workspace, filePath);
return new AnalyzerSettingsProvider(filePath, updater, workspace, globalOptionService); return new AnalyzerSettingsProvider(threadingContext, filePath, updater, workspace, globalOptionService);
} }
} }
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System; using System;
using System.Composition; using System.Composition;
using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Data; using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Data;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
using Microsoft.CodeAnalysis.Host; using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Host.Mef; using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Options;
Expand All @@ -15,8 +16,9 @@ namespace Microsoft.CodeAnalysis.Editor.EditorConfigSettings.DataProvider.Analyz
[method: ImportingConstructor] [method: ImportingConstructor]
[method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)] [method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
internal sealed class AnalyzerSettingsWorkspaceServiceFactory( internal sealed class AnalyzerSettingsWorkspaceServiceFactory(
IThreadingContext threadingContext,
IGlobalOptionService globalOptionService) : IWorkspaceServiceFactory IGlobalOptionService globalOptionService) : IWorkspaceServiceFactory
{ {
public IWorkspaceService CreateService(HostWorkspaceServices workspaceServices) public IWorkspaceService CreateService(HostWorkspaceServices workspaceServices)
=> new AnalyzerSettingsProviderFactory(workspaceServices.Workspace, globalOptionService); => new AnalyzerSettingsProviderFactory(threadingContext, workspaceServices.Workspace, globalOptionService);
} }
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -5,26 +5,34 @@
using System; using System;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeStyle; using Microsoft.CodeAnalysis.CodeStyle;
using Microsoft.CodeAnalysis.Diagnostics.Analyzers.NamingStyles; using Microsoft.CodeAnalysis.Diagnostics.Analyzers.NamingStyles;
using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Data; using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Data;
using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Updater; using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Updater;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Options;
using RoslynEnumerableExtensions = Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Extensions.EnumerableExtensions; using RoslynEnumerableExtensions = Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Extensions.EnumerableExtensions;


namespace Microsoft.CodeAnalysis.Editor.EditorConfigSettings.DataProvider.NamingStyles; namespace Microsoft.CodeAnalysis.Editor.EditorConfigSettings.DataProvider.NamingStyles;


internal sealed class NamingStyleSettingsProvider : SettingsProviderBase<NamingStyleSetting, NamingStyleSettingsUpdater, (Action<(object, object?)>, NamingStyleSetting), object> internal sealed class NamingStyleSettingsProvider : SettingsProviderBase<NamingStyleSetting, NamingStyleSettingsUpdater, (Action<(object, object?)>, NamingStyleSetting), object>
{ {
public NamingStyleSettingsProvider(string fileName, NamingStyleSettingsUpdater settingsUpdater, Workspace workspace, IGlobalOptionService globalOptions) public NamingStyleSettingsProvider(
: base(fileName, settingsUpdater, workspace, globalOptions) IThreadingContext threadingContext,
string fileName,
NamingStyleSettingsUpdater settingsUpdater,
Workspace workspace,
IGlobalOptionService globalOptions)
: base(threadingContext, fileName, settingsUpdater, workspace, globalOptions)
{ {
Update(); Update();
} }


protected override void UpdateOptions( protected override Task UpdateOptionsAsync(
TieredAnalyzerConfigOptions options, Solution solution, ImmutableArray<Project> projectsInScope) TieredAnalyzerConfigOptions options, Solution solution, ImmutableArray<Project> projectsInScope, CancellationToken cancellationToken)
{ {
options.GetInitialLocationAndValue<NamingStylePreferences>(NamingStyleOptions.NamingPreferences, out var location, out var namingPreferences); options.GetInitialLocationAndValue<NamingStylePreferences>(NamingStyleOptions.NamingPreferences, out var location, out var namingPreferences);


Expand All @@ -33,5 +41,6 @@ protected override void UpdateOptions(
var namingStyles = namingPreferences.Rules.NamingRules.Select(namingRule => new NamingStyleSetting(namingRule, allStyles, SettingsUpdater, fileName)); var namingStyles = namingPreferences.Rules.NamingRules.Select(namingRule => new NamingStyleSetting(namingRule, allStyles, SettingsUpdater, fileName));


AddRange(namingStyles); AddRange(namingStyles);
return Task.CompletedTask;
} }
} }
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -4,18 +4,19 @@


using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Data; using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Data;
using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Updater; using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Updater;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Options;


namespace Microsoft.CodeAnalysis.Editor.EditorConfigSettings.DataProvider.NamingStyles; namespace Microsoft.CodeAnalysis.Editor.EditorConfigSettings.DataProvider.NamingStyles;


internal sealed class NamingStyleSettingsProviderFactory(Workspace workspace, IGlobalOptionService globalOptions) : IWorkspaceSettingsProviderFactory<NamingStyleSetting> internal sealed class NamingStyleSettingsProviderFactory(
IThreadingContext threadingContext,
Workspace workspace,
IGlobalOptionService globalOptions) : IWorkspaceSettingsProviderFactory<NamingStyleSetting>
{ {
private readonly Workspace _workspace = workspace;
private readonly IGlobalOptionService _globalOptions = globalOptions;

public ISettingsProvider<NamingStyleSetting> GetForFile(string filePath) public ISettingsProvider<NamingStyleSetting> GetForFile(string filePath)
{ {
var updater = new NamingStyleSettingsUpdater(_workspace, _globalOptions, filePath); var updater = new NamingStyleSettingsUpdater(workspace, globalOptions, filePath);
return new NamingStyleSettingsProvider(filePath, updater, _workspace, _globalOptions); return new NamingStyleSettingsProvider(threadingContext, filePath, updater, workspace, globalOptions);
} }
} }
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System; using System;
using System.Composition; using System.Composition;
using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Data; using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Data;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
using Microsoft.CodeAnalysis.Host; using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Host.Mef; using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Options;
Expand All @@ -14,10 +15,10 @@ namespace Microsoft.CodeAnalysis.Editor.EditorConfigSettings.DataProvider.Naming
[ExportWorkspaceServiceFactory(typeof(IWorkspaceSettingsProviderFactory<NamingStyleSetting>)), Shared] [ExportWorkspaceServiceFactory(typeof(IWorkspaceSettingsProviderFactory<NamingStyleSetting>)), Shared]
[method: ImportingConstructor] [method: ImportingConstructor]
[method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)] [method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
internal sealed class NamingStyleSettingsWorkspaceServiceFactory(IGlobalOptionService globalOptions) : IWorkspaceServiceFactory internal sealed class NamingStyleSettingsWorkspaceServiceFactory(
IThreadingContext threadingContext,
IGlobalOptionService globalOptions) : IWorkspaceServiceFactory
{ {
private readonly IGlobalOptionService _globalOptions = globalOptions;

public IWorkspaceService CreateService(HostWorkspaceServices workspaceServices) public IWorkspaceService CreateService(HostWorkspaceServices workspaceServices)
=> new NamingStyleSettingsProviderFactory(workspaceServices.Workspace, _globalOptions); => new NamingStyleSettingsProviderFactory(threadingContext, workspaceServices.Workspace, globalOptions);
} }
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -16,32 +16,35 @@
using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Data; using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Data;
using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Extensions; using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Extensions;
using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Updater; using Microsoft.CodeAnalysis.Editor.EditorConfigSettings.Updater;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
using Microsoft.CodeAnalysis.ErrorReporting;
using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Text; using Microsoft.CodeAnalysis.Text;
using Microsoft.VisualStudio.Shell;
using Roslyn.Utilities; using Roslyn.Utilities;


namespace Microsoft.CodeAnalysis.Editor.EditorConfigSettings.DataProvider; namespace Microsoft.CodeAnalysis.Editor.EditorConfigSettings.DataProvider;


internal abstract class SettingsProviderBase<TData, TOptionsUpdater, TOption, TValue> : ISettingsProvider<TData> internal abstract class SettingsProviderBase<TData, TOptionsUpdater, TOption, TValue>(
IThreadingContext threadingContext,
string fileName,
TOptionsUpdater settingsUpdater,
Workspace workspace,
IGlobalOptionService globalOptions) : ISettingsProvider<TData>
where TOptionsUpdater : ISettingUpdater<TOption, TValue> where TOptionsUpdater : ISettingUpdater<TOption, TValue>
{ {
private readonly List<TData> _snapshot = []; private readonly List<TData> _snapshot = [];
private static readonly object s_gate = new(); private static readonly object s_gate = new();
private ISettingsEditorViewModel? _viewModel; private ISettingsEditorViewModel? _viewModel;
protected readonly string FileName;
protected readonly TOptionsUpdater SettingsUpdater;
protected readonly Workspace Workspace;
public readonly IGlobalOptionService GlobalOptions;


protected abstract void UpdateOptions(TieredAnalyzerConfigOptions options, Solution solution, ImmutableArray<Project> projectsInScope); private readonly IThreadingContext _threadingContext = threadingContext;
protected readonly string FileName = fileName;
protected readonly TOptionsUpdater SettingsUpdater = settingsUpdater;
protected readonly Workspace Workspace = workspace;
public readonly IGlobalOptionService GlobalOptions = globalOptions;


protected SettingsProviderBase(string fileName, TOptionsUpdater settingsUpdater, Workspace workspace, IGlobalOptionService globalOptions) protected abstract Task UpdateOptionsAsync(
{ TieredAnalyzerConfigOptions options, Solution solution, ImmutableArray<Project> projectsInScope, CancellationToken cancellationToken);
FileName = fileName;
SettingsUpdater = settingsUpdater;
Workspace = workspace;
GlobalOptions = globalOptions;
}


protected void Update() protected void Update()
{ {
Expand All @@ -60,7 +63,8 @@ protected void Update()
return; return;
} }


var configFileDirectoryOptions = project.State.GetAnalyzerOptionsForPath(givenFolder.FullName, CancellationToken.None); var cancellationToken = _threadingContext.DisposalToken;
var configFileDirectoryOptions = project.State.GetAnalyzerOptionsForPath(givenFolder.FullName, cancellationToken);
var projectDirectoryOptions = project.GetAnalyzerConfigOptions(); var projectDirectoryOptions = project.GetAnalyzerConfigOptions();


// TODO: Support for multiple languages https://github.com/dotnet/roslyn/issues/65859 // TODO: Support for multiple languages https://github.com/dotnet/roslyn/issues/65859
Expand All @@ -70,7 +74,8 @@ protected void Update()
language: LanguageNames.CSharp, language: LanguageNames.CSharp,
editorConfigFileName: FileName); editorConfigFileName: FileName);


UpdateOptions(options, solution, projects); _ = UpdateOptionsAsync(options, solution, projects, cancellationToken)
.ReportNonFatalErrorUnlessCancelledAsync(cancellationToken);
} }


public async Task<SourceText> GetChangedEditorConfigAsync(SourceText sourceText) public async Task<SourceText> GetChangedEditorConfigAsync(SourceText sourceText)
Expand Down
Loading
Loading