Skip to content

Commit b66a00c

Browse files
committed
Add new namingRules property - allowedNamespaceComponentTerms
1 parent 23ffa4c commit b66a00c

4 files changed

Lines changed: 78 additions & 7 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers.Test/NamingRules/SA1300UnitTests.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,31 @@ public async Task TestLowerCaseNamespaceAsync()
4444
await VerifyCSharpFixAsync(testCode, expected, fixedCode, CancellationToken.None).ConfigureAwait(false);
4545
}
4646

47+
[Fact]
48+
public async Task TestAllowedLowerCaseNamespaceIsNotReportedAsync()
49+
{
50+
var customTestSettings = @"
51+
{
52+
""settings"": {
53+
""namingRules"": {
54+
""allowedNamespaceComponentTerms"": [ ""eBay"" ]
55+
}
56+
}
57+
}
58+
";
59+
60+
var testCode = @"namespace eBay
61+
{
62+
63+
}";
64+
65+
await new CSharpTest
66+
{
67+
TestCode = testCode,
68+
Settings = customTestSettings,
69+
}.RunAsync(CancellationToken.None).ConfigureAwait(false);
70+
}
71+
4772
[Fact]
4873
public async Task TestLowerCaseComlicatedNamespaceAsync()
4974
{
@@ -67,6 +92,31 @@ public async Task TestLowerCaseComlicatedNamespaceAsync()
6792
await VerifyCSharpFixAsync(testCode, expected, fixedCode, CancellationToken.None).ConfigureAwait(false);
6893
}
6994

95+
[Fact]
96+
public async Task TestAllowedLowerCaseComplicatedNamespaceIsNotReportedAsync()
97+
{
98+
var customTestSettings = @"
99+
{
100+
""settings"": {
101+
""namingRules"": {
102+
""allowedNamespaceComponentTerms"": [ ""iPod"" ]
103+
}
104+
}
105+
}
106+
";
107+
108+
var testCode = @"namespace Apple.iPod.Library
109+
{
110+
111+
}";
112+
113+
await new CSharpTest
114+
{
115+
TestCode = testCode,
116+
Settings = customTestSettings,
117+
}.RunAsync(CancellationToken.None).ConfigureAwait(false);
118+
}
119+
70120
[Fact]
71121
public async Task TestUpperCaseClassAsync()
72122
{

StyleCop.Analyzers/StyleCop.Analyzers.Test/Settings/SettingsUnitTests.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public void VerifySettingsDefaults()
2929
Assert.Equal("Copyright (c) PlaceholderCompany. All rights reserved.", styleCopSettings.DocumentationRules.GetCopyrightText("unused"));
3030
Assert.True(styleCopSettings.NamingRules.AllowCommonHungarianPrefixes);
3131
Assert.Empty(styleCopSettings.NamingRules.AllowedHungarianPrefixes);
32+
Assert.Empty(styleCopSettings.NamingRules.AllowedNamespaceComponentTerms);
3233

3334
Assert.NotNull(styleCopSettings.OrderingRules);
3435
Assert.Equal(UsingDirectivesPlacement.InsideNamespace, styleCopSettings.OrderingRules.UsingDirectivesPlacement);
@@ -61,6 +62,7 @@ public async Task VerifySettingsAreReadCorrectlyAsync()
6162
""namingRules"": {
6263
""allowCommonHungarianPrefixes"": false,
6364
""allowedHungarianPrefixes"": [""a"", ""ab"", ""ignoredTooLong""],
65+
""allowedNamespaceComponentTerms"": [""eBay"", ""iMac""],
6466
""unrecognizedValue"": 3
6567
},
6668
""layoutRules"": {
@@ -93,6 +95,7 @@ public async Task VerifySettingsAreReadCorrectlyAsync()
9395
Assert.Equal("ru-RU", styleCopSettings.DocumentationRules.DocumentationCulture);
9496
Assert.False(styleCopSettings.NamingRules.AllowCommonHungarianPrefixes);
9597
Assert.Equal(new[] { "a", "ab" }, styleCopSettings.NamingRules.AllowedHungarianPrefixes);
98+
Assert.Equal(new[] { "eBay", "iMac" }, styleCopSettings.NamingRules.AllowedNamespaceComponentTerms);
9699

97100
Assert.NotNull(styleCopSettings.LayoutRules);
98101
Assert.Equal(OptionSetting.Require, styleCopSettings.LayoutRules.NewlineAtEndOfFile);

StyleCop.Analyzers/StyleCop.Analyzers/NamingRules/SA1300ElementMustBeginWithUpperCaseLetter.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ namespace StyleCop.Analyzers.NamingRules
1212
using Microsoft.CodeAnalysis.Diagnostics;
1313
using StyleCop.Analyzers.Helpers;
1414
using StyleCop.Analyzers.Lightup;
15+
using StyleCop.Analyzers.Settings.ObjectModel;
1516

1617
/// <summary>
1718
/// The name of a C# element does not begin with an upper-case letter.
@@ -45,7 +46,7 @@ internal class SA1300ElementMustBeginWithUpperCaseLetter : DiagnosticAnalyzer
4546
private static readonly DiagnosticDescriptor Descriptor =
4647
new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, AnalyzerCategory.NamingRules, DiagnosticSeverity.Warning, AnalyzerConstants.EnabledByDefault, Description, HelpLink);
4748

48-
private static readonly Action<SyntaxNodeAnalysisContext> NamespaceDeclarationAction = HandleNamespaceDeclaration;
49+
private static readonly Action<SyntaxNodeAnalysisContext, StyleCopSettings> NamespaceDeclarationAction = HandleNamespaceDeclaration;
4950
private static readonly Action<SyntaxNodeAnalysisContext> ClassDeclarationAction = HandleClassDeclaration;
5051
private static readonly Action<SyntaxNodeAnalysisContext> EnumDeclarationAction = HandleEnumDeclaration;
5152
private static readonly Action<SyntaxNodeAnalysisContext> EnumMemberDeclarationAction = HandleEnumMemberDeclaration;
@@ -82,13 +83,13 @@ public override void Initialize(AnalysisContext context)
8283
context.RegisterSyntaxNodeAction(PropertyDeclarationAction, SyntaxKind.PropertyDeclaration);
8384
}
8485

85-
private static void HandleNamespaceDeclaration(SyntaxNodeAnalysisContext context)
86+
private static void HandleNamespaceDeclaration(SyntaxNodeAnalysisContext context, StyleCopSettings settings)
8687
{
8788
NameSyntax nameSyntax = ((NamespaceDeclarationSyntax)context.Node).Name;
88-
CheckNameSyntax(context, nameSyntax);
89+
CheckNameSyntax(context, nameSyntax, settings);
8990
}
9091

91-
private static void CheckNameSyntax(SyntaxNodeAnalysisContext context, NameSyntax nameSyntax)
92+
private static void CheckNameSyntax(SyntaxNodeAnalysisContext context, NameSyntax nameSyntax, StyleCopSettings settings)
9293
{
9394
if (nameSyntax == null || nameSyntax.IsMissing)
9495
{
@@ -97,12 +98,13 @@ private static void CheckNameSyntax(SyntaxNodeAnalysisContext context, NameSynta
9798

9899
if (nameSyntax is QualifiedNameSyntax qualifiedNameSyntax)
99100
{
100-
CheckNameSyntax(context, qualifiedNameSyntax.Left);
101-
CheckNameSyntax(context, qualifiedNameSyntax.Right);
101+
CheckNameSyntax(context, qualifiedNameSyntax.Left, settings);
102+
CheckNameSyntax(context, qualifiedNameSyntax.Right, settings);
102103
return;
103104
}
104105

105-
if (nameSyntax is SimpleNameSyntax simpleNameSyntax)
106+
if (nameSyntax is SimpleNameSyntax simpleNameSyntax &&
107+
!settings.NamingRules.AllowedNamespaceComponentTerms.Contains(simpleNameSyntax.Identifier.ValueText))
106108
{
107109
CheckElementNameToken(context, simpleNameSyntax.Identifier);
108110
return;

StyleCop.Analyzers/StyleCop.Analyzers/Settings/ObjectModel/NamingSettings.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33

44
namespace StyleCop.Analyzers.Settings.ObjectModel
55
{
6+
using System.Collections.Generic;
67
using System.Collections.Immutable;
8+
using System.Linq;
79
using System.Text.RegularExpressions;
810
using LightJson;
911

@@ -14,13 +16,19 @@ internal class NamingSettings
1416
/// </summary>
1517
private readonly ImmutableArray<string>.Builder allowedHungarianPrefixes;
1618

19+
/// <summary>
20+
/// This is the backing field for the <see cref="AllowedNamespaceComponentTerms"/> property.
21+
/// </summary>
22+
private readonly ImmutableArray<string>.Builder allowedNamespaceComponentTerms;
23+
1724
/// <summary>
1825
/// Initializes a new instance of the <see cref="NamingSettings"/> class.
1926
/// </summary>
2027
protected internal NamingSettings()
2128
{
2229
this.AllowCommonHungarianPrefixes = true;
2330
this.allowedHungarianPrefixes = ImmutableArray.CreateBuilder<string>();
31+
this.allowedNamespaceComponentTerms = ImmutableArray.CreateBuilder<string>();
2432

2533
this.IncludeInferredTupleElementNames = false;
2634
this.TupleElementNameCasing = TupleElementNameCase.CamelCase;
@@ -57,6 +65,11 @@ protected internal NamingSettings(JsonObject namingSettingsObject)
5765

5866
break;
5967

68+
case "allowedNamespaceComponentTerms":
69+
kvp.AssertIsArray();
70+
this.allowedNamespaceComponentTerms.AddRange(kvp.Value.AsJsonArray.Select(x => x.ToStringValue(kvp.Key)));
71+
break;
72+
6073
case "includeInferredTupleElementNames":
6174
this.IncludeInferredTupleElementNames = kvp.ToBooleanValue();
6275
break;
@@ -76,6 +89,9 @@ protected internal NamingSettings(JsonObject namingSettingsObject)
7689
public ImmutableArray<string> AllowedHungarianPrefixes
7790
=> this.allowedHungarianPrefixes.ToImmutable();
7891

92+
public ImmutableArray<string> AllowedNamespaceComponentTerms
93+
=> this.allowedNamespaceComponentTerms.ToImmutable();
94+
7995
public bool IncludeInferredTupleElementNames { get; }
8096

8197
public TupleElementNameCase TupleElementNameCasing { get; }

0 commit comments

Comments
 (0)