提交 68cfbed6 编写于 作者: T Tom Meschter

Extract code to modify rule sets

Extract the code to modify rule sets to a helper type.
上级 e0c54290
......@@ -148,102 +148,9 @@ private void UpdateRuleSetFile(string pathToRuleSet, ReportDiagnostic value)
{
var ruleSetDocument = XDocument.Load(pathToRuleSet);
var newAction = ConvertReportDiagnosticToAction(value);
var analyzerID = _analyzerItem.AnalyzerReference.Display;
var rules = FindOrCreateRulesElement(ruleSetDocument, analyzerID);
var rule = FindOrCreateRuleElement(rules, _descriptor.Id);
if (value == ReportDiagnostic.Default)
{
// If the new severity is 'Default' we just delete the entry for the rule from the ruleset file.
// In the absence of an explicit entry in the ruleset file, the rule reverts back to its 'Default'
// severity (so far as the 'current' ruleset file is concerened - the rule's effective severity
// could still be decided by other factors such as project settings or a base ruleset file).
rule.Remove();
}
else
{
rule.Attribute("Action").Value = newAction;
}
var allMatchingRules = ruleSetDocument.Root
.Descendants("Rule")
.Where(r => r.Attribute("Id").Value.Equals(_descriptor.Id))
.ToList();
foreach (var matchingRule in allMatchingRules)
{
if (value == ReportDiagnostic.Default)
{
// If the new severity is 'Default' we just delete the entry for the rule from the ruleset file.
// In the absence of an explicit entry in the ruleset file, the rule reverts back to its 'Default'
// severity (so far as the 'current' ruleset file is concerened - the rule's effective severity
// could still be decided by other factors such as project settings or a base ruleset file).
matchingRule.Remove();
}
else
{
matchingRule.Attribute("Action").Value = newAction;
}
}
ruleSetDocument.SetSeverity(_analyzerItem.AnalyzerReference.Display, _descriptor.Id, value);
ruleSetDocument.Save(pathToRuleSet);
}
private XElement FindOrCreateRuleElement(XElement rules, string id)
{
var ruleElement = rules
.Elements("Rule")
.FirstOrDefault(r => r.Attribute("Id").Value.Equals(id));
if (ruleElement == null)
{
ruleElement = new XElement("Rule",
new XAttribute("Id", id),
new XAttribute("Action", "Warning"));
rules.Add(ruleElement);
}
return ruleElement;
}
private XElement FindOrCreateRulesElement(XDocument ruleSetDocument, string analyzerID)
{
var rulesElement = ruleSetDocument.Root
.Elements("Rules")
.FirstOrDefault(r => r.Attribute("AnalyzerId").Value.Equals(analyzerID));
if (rulesElement == null)
{
rulesElement = new XElement("Rules",
new XAttribute("AnalyzerId", analyzerID),
new XAttribute("RuleNamespace", analyzerID));
ruleSetDocument.Root.Add(rulesElement);
}
return rulesElement;
}
private static string ConvertReportDiagnosticToAction(ReportDiagnostic value)
{
switch (value)
{
case ReportDiagnostic.Default:
return "Default";
case ReportDiagnostic.Error:
return "Error";
case ReportDiagnostic.Warn:
return "Warning";
case ReportDiagnostic.Info:
return "Info";
case ReportDiagnostic.Hidden:
return "Hidden";
case ReportDiagnostic.Suppress:
return "None";
default:
throw ExceptionUtilities.Unreachable;
}
}
}
}
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Linq;
using System.Xml.Linq;
using Microsoft.CodeAnalysis;
using Roslyn.Utilities;
namespace Microsoft.VisualStudio.LanguageServices.Implementation.SolutionExplorer
{
internal static class RuleSetDocumentExtensions
{
internal static void SetSeverity(this XDocument ruleSet, string analyzerId, string ruleId, ReportDiagnostic value)
{
var newAction = ConvertReportDiagnosticToAction(value);
var rules = FindOrCreateRulesElement(ruleSet, analyzerId);
var rule = FindOrCreateRuleElement(rules, ruleId);
if (value == ReportDiagnostic.Default)
{
// If the new severity is 'Default' we just delete the entry for the rule from the ruleset file.
// In the absence of an explicit entry in the ruleset file, the rule reverts back to its 'Default'
// severity (so far as the 'current' ruleset file is concerened - the rule's effective severity
// could still be decided by other factors such as project settings or a base ruleset file).
rule.Remove();
}
else
{
rule.Attribute("Action").Value = newAction;
}
var allMatchingRules = ruleSet.Root
.Descendants("Rule")
.Where(r => r.Attribute("Id").Value.Equals(ruleId))
.ToList();
foreach (var matchingRule in allMatchingRules)
{
if (value == ReportDiagnostic.Default)
{
// If the new severity is 'Default' we just delete the entry for the rule from the ruleset file.
// In the absence of an explicit entry in the ruleset file, the rule reverts back to its 'Default'
// severity (so far as the 'current' ruleset file is concerened - the rule's effective severity
// could still be decided by other factors such as project settings or a base ruleset file).
matchingRule.Remove();
}
else
{
matchingRule.Attribute("Action").Value = newAction;
}
}
}
private static string ConvertReportDiagnosticToAction(ReportDiagnostic value)
{
switch (value)
{
case ReportDiagnostic.Default:
return "Default";
case ReportDiagnostic.Error:
return "Error";
case ReportDiagnostic.Warn:
return "Warning";
case ReportDiagnostic.Info:
return "Info";
case ReportDiagnostic.Hidden:
return "Hidden";
case ReportDiagnostic.Suppress:
return "None";
default:
throw ExceptionUtilities.Unreachable;
}
}
private static XElement FindOrCreateRuleElement(XElement rules, string id)
{
var ruleElement = rules
.Elements("Rule")
.FirstOrDefault(r => r.Attribute("Id").Value.Equals(id));
if (ruleElement == null)
{
ruleElement = new XElement("Rule",
new XAttribute("Id", id),
new XAttribute("Action", "Warning"));
rules.Add(ruleElement);
}
return ruleElement;
}
private static XElement FindOrCreateRulesElement(XDocument ruleSetDocument, string analyzerID)
{
var rulesElement = ruleSetDocument.Root
.Elements("Rules")
.FirstOrDefault(r => r.Attribute("AnalyzerId").Value.Equals(analyzerID));
if (rulesElement == null)
{
rulesElement = new XElement("Rules",
new XAttribute("AnalyzerId", analyzerID),
new XAttribute("RuleNamespace", analyzerID));
ruleSetDocument.Root.Add(rulesElement);
}
return rulesElement;
}
}
}
......@@ -148,6 +148,7 @@
<Compile Include="LocalizableProperties.cs" />
<Compile Include="DiagnosticItem\DiagnosticItemSource.cs" />
<Compile Include="DiagnosticItem\DiagnosticItem.cs" />
<Compile Include="RuleSetDocumentExtensions.cs" />
<Compile Include="SolutionExplorerShim.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册