diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueManager.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueManager.cs index c4dfcb277c..1177b7a7f2 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueManager.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueManager.cs @@ -48,15 +48,19 @@ namespace CSharpBinding.Refactoring this.provider = provider; this.ProviderType = provider.GetType(); var attributes = ProviderType.GetCustomAttributes(typeof(IssueDescriptionAttribute), true); - if (attributes.Length == 1) + + Severity defaultSeverity = Severity.Hint; + if (attributes.Length == 1) { this.Attribute = (IssueDescriptionAttribute)attributes[0]; + defaultSeverity = this.Attribute.Severity; + } + var properties = PropertyService.NestedProperties("CSharpIssueSeveritySettings"); + this.CurrentSeverity = properties.Get(ProviderType.FullName, defaultSeverity); } - public Severity DefaultSeverity { - get { return Attribute != null ? Attribute.Severity : Severity.Hint; } - } + public Severity CurrentSeverity { get; set; } - public IssueMarker DefaultMarker { + public IssueMarker MarkerType { get { return Attribute != null ? Attribute.IssueMarker : IssueMarker.Underline; } } @@ -66,22 +70,16 @@ namespace CSharpBinding.Refactoring } } - public static IReadOnlyDictionary GetIssueSeveritySettings() + internal static void SaveIssueSeveritySettings() { - // TODO: cache the result - var dict = new Dictionary(); - var prop = PropertyService.NestedProperties("CSharpIssueSeveritySettings"); + var properties = PropertyService.NestedProperties("CSharpIssueSeveritySettings"); foreach (var provider in issueProviders.Value) { - dict[provider.ProviderType] = prop.Get(provider.ProviderType.FullName, provider.DefaultSeverity); - } - return dict; - } - - public static void SetIssueSeveritySettings(IReadOnlyDictionary dict) - { - var prop = PropertyService.NestedProperties("CSharpIssueSeveritySettings"); - foreach (var pair in dict) { - prop.Set(pair.Key.FullName, pair.Value); + if (provider.Attribute != null) { + if (provider.CurrentSeverity == provider.Attribute.Severity) + properties.Remove(provider.ProviderType.FullName); + else + properties.Set(provider.ProviderType.FullName, provider.CurrentSeverity); + } } } @@ -116,7 +114,7 @@ namespace CSharpBinding.Refactoring public readonly IReadOnlyList Actions; public readonly Severity Severity; - public InspectionTag(IssueManager manager, IssueProvider provider, ITextSourceVersion inspectedVersion, string description, int startOffset, int endOffset, Severity severity, IEnumerable actions) + public InspectionTag(IssueManager manager, IssueProvider provider, ITextSourceVersion inspectedVersion, string description, int startOffset, int endOffset, IEnumerable actions) { this.manager = manager; this.Provider = provider; @@ -124,7 +122,7 @@ namespace CSharpBinding.Refactoring this.Description = description; this.StartOffset = startOffset; this.EndOffset = endOffset; - this.Severity = severity; + this.Severity = provider.CurrentSeverity; this.Actions = actions.Select(Wrap).ToList(); } @@ -170,7 +168,7 @@ namespace CSharpBinding.Refactoring color.A = 186; marker.MarkerColor = color; marker.MarkerTypes = TextMarkerTypes.ScrollBarRightTriangle; - switch (Provider.DefaultMarker) { + switch (Provider.MarkerType) { case IssueMarker.Underline: marker.MarkerTypes |= TextMarkerTypes.SquigglyUnderline; break; @@ -248,12 +246,8 @@ namespace CSharpBinding.Refactoring var compilation = ParserService.GetCompilationForFile(parseInfo.FileName); var resolver = parseInfo.GetResolver(compilation); var context = new SDRefactoringContext(textSource, resolver, new TextLocation(0, 0), 0, 0, cancellationToken); - var settings = GetIssueSeveritySettings(); foreach (var issueProvider in issueProviders.Value) { - Severity severity; - if (!settings.TryGetValue(issueProvider.ProviderType, out severity)) - severity = Severity.Hint; - if (severity == Severity.None) + if (issueProvider.CurrentSeverity == Severity.None) continue; foreach (var issue in issueProvider.GetIssues(context)) { @@ -264,7 +258,6 @@ namespace CSharpBinding.Refactoring issue.Desription, context.GetOffset(issue.Start), context.GetOffset(issue.End), - severity, issue.Action != null ? new [] { issue.Action } : new CodeAction[0])); } } diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueOptions.xaml.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueOptions.xaml.cs index df56876e66..b75aa7dcea 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueOptions.xaml.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueOptions.xaml.cs @@ -33,7 +33,7 @@ namespace CSharpBinding.Refactoring viewModels = new ObservableCollection( from p in IssueManager.IssueProviders where p.Attribute != null - select new IssueOptionsViewModel(p.ProviderType, p.Attribute) + select new IssueOptionsViewModel(p) ); ICollectionView view = CollectionViewSource.GetDefaultView(viewModels); if (viewModels.Any(p => !string.IsNullOrEmpty(p.Category))) @@ -44,21 +44,17 @@ namespace CSharpBinding.Refactoring public override void LoadOptions() { base.LoadOptions(); - var settings = IssueManager.GetIssueSeveritySettings(); foreach (var m in viewModels) { - Severity severity; - if (settings.TryGetValue(m.ProviderType, out severity)) - m.Severity = severity; + m.Severity = m.Provider.CurrentSeverity; } } public override bool SaveOptions() { - Dictionary dict = new Dictionary(); foreach (var m in viewModels) { - dict[m.ProviderType] = m.Severity; + m.Provider.CurrentSeverity = m.Severity; } - IssueManager.SetIssueSeveritySettings(dict); + IssueManager.SaveIssueSeveritySettings(); return base.SaveOptions(); } diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueOptionsViewModel.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueOptionsViewModel.cs index bd23de79e9..d2b6f5f328 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueOptionsViewModel.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueOptionsViewModel.cs @@ -8,22 +8,18 @@ using ICSharpCode.SharpDevelop.Widgets; namespace CSharpBinding.Refactoring { - public class IssueOptionsViewModel : ViewModelBase + sealed class IssueOptionsViewModel : ViewModelBase { - readonly Type providerType; + internal readonly IssueManager.IssueProvider Provider; readonly IssueDescriptionAttribute attribute; - public IssueOptionsViewModel(Type providerType, IssueDescriptionAttribute attribute) + internal IssueOptionsViewModel(IssueManager.IssueProvider provider) { - this.providerType = providerType; - this.attribute = attribute; + this.Provider = provider; + this.attribute = provider.Attribute; this.Severity = attribute.Severity; } - public Type ProviderType { - get { return providerType; } - } - // TODO: Translate public string Title { get { return attribute.Title; } diff --git a/src/Main/Core/Project/Src/Services/PropertyService/Properties.cs b/src/Main/Core/Project/Src/Services/PropertyService/Properties.cs index a13952ca74..d60e7b5bb2 100644 --- a/src/Main/Core/Project/Src/Services/PropertyService/Properties.cs +++ b/src/Main/Core/Project/Src/Services/PropertyService/Properties.cs @@ -326,10 +326,7 @@ namespace ICSharpCode.Core return null; XElement element = serializedVal as XElement; if (element != null) { - using (var xmlReader = element.CreateReader()) { - xmlReader.MoveToContent(); - xmlReader.Read(); // skip - xmlReader.MoveToContent(); + using (var xmlReader = element.Elements().Single().CreateReader()) { return XamlServices.Load(xmlReader); } } else { @@ -355,6 +352,7 @@ namespace ICSharpCode.Core removed = true; HandleOldValue(oldValue); MakeDirty(); + dict.Remove(key); } } if (removed)