Skip to content

Commit 9168ce9

Browse files
committed
Add light-up support for CasePatternSwitchLabelSyntax and WhenClauseSyntax
1 parent 45e0f02 commit 9168ce9

4 files changed

Lines changed: 210 additions & 12 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers/Lightup/CSharp7.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,14 @@
116116
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.AccessorDeclarationSyntax.ExpressionBody.get -> Microsoft.CodeAnalysis.CSharp.Syntax.ArrowExpressionClauseSyntax`
117117
* [x] ~~`Microsoft.CodeAnalysis.CSharp.Syntax.AccessorDeclarationSyntax.Update(Microsoft.CodeAnalysis.SyntaxList<Microsoft.CodeAnalysis.CSharp.Syntax.AttributeListSyntax> attributeLists, Microsoft.CodeAnalysis.SyntaxTokenList modifiers, Microsoft.CodeAnalysis.SyntaxToken keyword, Microsoft.CodeAnalysis.CSharp.Syntax.BlockSyntax body, Microsoft.CodeAnalysis.CSharp.Syntax.ArrowExpressionClauseSyntax expressionBody, Microsoft.CodeAnalysis.SyntaxToken semicolonToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.AccessorDeclarationSyntax`~~
118118
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.AccessorDeclarationSyntax.WithExpressionBody(Microsoft.CodeAnalysis.CSharp.Syntax.ArrowExpressionClauseSyntax expressionBody) -> Microsoft.CodeAnalysis.CSharp.Syntax.AccessorDeclarationSyntax`
119-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax`
120-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax.Pattern.get -> Microsoft.CodeAnalysis.CSharp.Syntax.PatternSyntax`
119+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax`
120+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax.Pattern.get -> Microsoft.CodeAnalysis.CSharp.Syntax.PatternSyntax`
121121
* [x] ~~`Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax.Update(Microsoft.CodeAnalysis.SyntaxToken keyword, Microsoft.CodeAnalysis.CSharp.Syntax.PatternSyntax pattern, Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax whenClause, Microsoft.CodeAnalysis.SyntaxToken colonToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax`~~
122-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax.WhenClause.get -> Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax`
123-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax.WithColonToken(Microsoft.CodeAnalysis.SyntaxToken colonToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax`
124-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax.WithKeyword(Microsoft.CodeAnalysis.SyntaxToken keyword) -> Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax`
125-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax.WithPattern(Microsoft.CodeAnalysis.CSharp.Syntax.PatternSyntax pattern) -> Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax`
126-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax.WithWhenClause(Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax whenClause) -> Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax`
122+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax.WhenClause.get -> Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax`
123+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax.WithColonToken(Microsoft.CodeAnalysis.SyntaxToken colonToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax`
124+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax.WithKeyword(Microsoft.CodeAnalysis.SyntaxToken keyword) -> Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax`
125+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax.WithPattern(Microsoft.CodeAnalysis.CSharp.Syntax.PatternSyntax pattern) -> Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax`
126+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax.WithWhenClause(Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax whenClause) -> Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax`
127127
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.CommonForEachStatementSyntax`
128128
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.ConstantPatternSyntax`
129129
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.ConstantPatternSyntax.Expression.get -> Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax`
@@ -249,12 +249,12 @@
249249
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax.WithElements(Microsoft.CodeAnalysis.SeparatedSyntaxList<Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax> elements) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax`
250250
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax.WithOpenParenToken(Microsoft.CodeAnalysis.SyntaxToken openParenToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax`
251251
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.VariableDesignationSyntax`
252-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax`
253-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax.Condition.get -> Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax`
252+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax`
253+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax.Condition.get -> Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax`
254254
* [x] ~~`Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax.Update(Microsoft.CodeAnalysis.SyntaxToken whenKeyword, Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax condition) -> Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax`~~
255-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax.WhenKeyword.get -> Microsoft.CodeAnalysis.SyntaxToken`
256-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax.WithCondition(Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax condition) -> Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax`
257-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax.WithWhenKeyword(Microsoft.CodeAnalysis.SyntaxToken whenKeyword) -> Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax`
255+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax.WhenKeyword.get -> Microsoft.CodeAnalysis.SyntaxToken`
256+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax.WithCondition(Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax condition) -> Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax`
257+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax.WithWhenKeyword(Microsoft.CodeAnalysis.SyntaxToken whenKeyword) -> Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax`
258258
* [x] `Microsoft.CodeAnalysis.CSharp.SyntaxKind.CasePatternSwitchLabel = 9009 -> Microsoft.CodeAnalysis.CSharp.SyntaxKind`
259259
* [x] `Microsoft.CodeAnalysis.CSharp.SyntaxKind.ConstantPattern = 9002 -> Microsoft.CodeAnalysis.CSharp.SyntaxKind`
260260
* [x] `Microsoft.CodeAnalysis.CSharp.SyntaxKind.DeclarationExpression = 9040 -> Microsoft.CodeAnalysis.CSharp.SyntaxKind`
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
// Copyright (c) Tunnel Vision Laboratories, LLC. All Rights Reserved.
2+
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
3+
4+
namespace StyleCop.Analyzers.Lightup
5+
{
6+
using System;
7+
using System.Reflection;
8+
using Microsoft.CodeAnalysis;
9+
using Microsoft.CodeAnalysis.CSharp;
10+
using Microsoft.CodeAnalysis.CSharp.Syntax;
11+
12+
internal struct CasePatternSwitchLabelSyntaxWrapper : ISyntaxWrapper<SwitchLabelSyntax>
13+
{
14+
private const string CasePatternSwitchLabelSyntaxTypeName = "Microsoft.CodeAnalysis.CSharp.Syntax.CasePatternSwitchLabelSyntax";
15+
private static readonly Type CasePatternSwitchLabelSyntaxType;
16+
17+
private static readonly Func<SwitchLabelSyntax, CSharpSyntaxNode> PatternAccessor;
18+
private static readonly Func<SwitchLabelSyntax, CSharpSyntaxNode> WhenClauseAccessor;
19+
private static readonly Func<SwitchLabelSyntax, SyntaxToken, SwitchLabelSyntax> WithKeywordAccessor;
20+
private static readonly Func<SwitchLabelSyntax, SyntaxToken, SwitchLabelSyntax> WithColonTokenAccessor;
21+
private static readonly Func<SwitchLabelSyntax, CSharpSyntaxNode, SwitchLabelSyntax> WithPatternAccessor;
22+
private static readonly Func<SwitchLabelSyntax, CSharpSyntaxNode, SwitchLabelSyntax> WithWhenClauseAccessor;
23+
24+
private readonly SwitchLabelSyntax node;
25+
26+
static CasePatternSwitchLabelSyntaxWrapper()
27+
{
28+
CasePatternSwitchLabelSyntaxType = typeof(CSharpSyntaxNode).GetTypeInfo().Assembly.GetType(CasePatternSwitchLabelSyntaxTypeName);
29+
PatternAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<SwitchLabelSyntax, CSharpSyntaxNode>(CasePatternSwitchLabelSyntaxType, nameof(Pattern));
30+
WhenClauseAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<SwitchLabelSyntax, CSharpSyntaxNode>(CasePatternSwitchLabelSyntaxType, nameof(WhenClause));
31+
WithKeywordAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<SwitchLabelSyntax, SyntaxToken>(CasePatternSwitchLabelSyntaxType, nameof(SwitchLabelSyntax.Keyword));
32+
WithColonTokenAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<SwitchLabelSyntax, SyntaxToken>(CasePatternSwitchLabelSyntaxType, nameof(SwitchLabelSyntax.ColonToken));
33+
WithPatternAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<SwitchLabelSyntax, CSharpSyntaxNode>(CasePatternSwitchLabelSyntaxType, nameof(Pattern));
34+
WithWhenClauseAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<SwitchLabelSyntax, CSharpSyntaxNode>(CasePatternSwitchLabelSyntaxType, nameof(WhenClause));
35+
}
36+
37+
private CasePatternSwitchLabelSyntaxWrapper(SwitchLabelSyntax node)
38+
{
39+
this.node = node;
40+
}
41+
42+
public SwitchLabelSyntax SyntaxNode => this.node;
43+
44+
public PatternSyntaxWrapper Pattern
45+
{
46+
get
47+
{
48+
return (PatternSyntaxWrapper)PatternAccessor(this.SyntaxNode);
49+
}
50+
}
51+
52+
public WhenClauseSyntaxWrapper WhenClause
53+
{
54+
get
55+
{
56+
return (WhenClauseSyntaxWrapper)WhenClauseAccessor(this.SyntaxNode);
57+
}
58+
}
59+
60+
public static explicit operator CasePatternSwitchLabelSyntaxWrapper(SyntaxNode node)
61+
{
62+
if (node == null)
63+
{
64+
return default(CasePatternSwitchLabelSyntaxWrapper);
65+
}
66+
67+
if (!IsInstance(node))
68+
{
69+
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{CasePatternSwitchLabelSyntaxTypeName}'");
70+
}
71+
72+
return new CasePatternSwitchLabelSyntaxWrapper((SwitchLabelSyntax)node);
73+
}
74+
75+
public static implicit operator SwitchLabelSyntax(CasePatternSwitchLabelSyntaxWrapper wrapper)
76+
{
77+
return wrapper.node;
78+
}
79+
80+
public static bool IsInstance(SyntaxNode node)
81+
{
82+
return node != null && LightupHelpers.CanWrapNode(node, CasePatternSwitchLabelSyntaxType);
83+
}
84+
85+
public CasePatternSwitchLabelSyntaxWrapper WithKeyword(SyntaxToken keyword)
86+
{
87+
return new CasePatternSwitchLabelSyntaxWrapper(WithKeywordAccessor(this.SyntaxNode, keyword));
88+
}
89+
90+
public CasePatternSwitchLabelSyntaxWrapper WithColonToken(SyntaxToken colonToken)
91+
{
92+
return new CasePatternSwitchLabelSyntaxWrapper(WithColonTokenAccessor(this.SyntaxNode, colonToken));
93+
}
94+
95+
public CasePatternSwitchLabelSyntaxWrapper WithPattern(PatternSyntaxWrapper pattern)
96+
{
97+
return new CasePatternSwitchLabelSyntaxWrapper(WithPatternAccessor(this.SyntaxNode, pattern));
98+
}
99+
100+
public CasePatternSwitchLabelSyntaxWrapper WithWhenClause(WhenClauseSyntaxWrapper whenClause)
101+
{
102+
return new CasePatternSwitchLabelSyntaxWrapper(WithWhenClauseAccessor(this.SyntaxNode, whenClause));
103+
}
104+
}
105+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
// Copyright (c) Tunnel Vision Laboratories, LLC. All Rights Reserved.
2+
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
3+
4+
namespace StyleCop.Analyzers.Lightup
5+
{
6+
using System;
7+
using System.Reflection;
8+
using Microsoft.CodeAnalysis;
9+
using Microsoft.CodeAnalysis.CSharp;
10+
using Microsoft.CodeAnalysis.CSharp.Syntax;
11+
12+
internal struct WhenClauseSyntaxWrapper : ISyntaxWrapper<CSharpSyntaxNode>
13+
{
14+
private const string WhenClauseSyntaxTypeName = "Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax";
15+
private static readonly Type WhenClauseSyntaxType;
16+
17+
private static readonly Func<CSharpSyntaxNode, SyntaxToken> WhenKeywordAccessor;
18+
private static readonly Func<CSharpSyntaxNode, ExpressionSyntax> ConditionAccessor;
19+
private static readonly Func<CSharpSyntaxNode, SyntaxToken, CSharpSyntaxNode> WithWhenKeywordAccessor;
20+
private static readonly Func<CSharpSyntaxNode, ExpressionSyntax, CSharpSyntaxNode> WithConditionAccessor;
21+
22+
private readonly CSharpSyntaxNode node;
23+
24+
static WhenClauseSyntaxWrapper()
25+
{
26+
WhenClauseSyntaxType = typeof(CSharpSyntaxNode).GetTypeInfo().Assembly.GetType(WhenClauseSyntaxTypeName);
27+
WhenKeywordAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<CSharpSyntaxNode, SyntaxToken>(WhenClauseSyntaxType, nameof(WhenKeyword));
28+
ConditionAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<CSharpSyntaxNode, ExpressionSyntax>(WhenClauseSyntaxType, nameof(Condition));
29+
WithWhenKeywordAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<CSharpSyntaxNode, SyntaxToken>(WhenClauseSyntaxType, nameof(WhenKeyword));
30+
WithConditionAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<CSharpSyntaxNode, ExpressionSyntax>(WhenClauseSyntaxType, nameof(Condition));
31+
}
32+
33+
private WhenClauseSyntaxWrapper(CSharpSyntaxNode node)
34+
{
35+
this.node = node;
36+
}
37+
38+
public CSharpSyntaxNode SyntaxNode => this.node;
39+
40+
public SyntaxToken WhenKeyword
41+
{
42+
get
43+
{
44+
return WhenKeywordAccessor(this.SyntaxNode);
45+
}
46+
}
47+
48+
public ExpressionSyntax Condition
49+
{
50+
get
51+
{
52+
return ConditionAccessor(this.SyntaxNode);
53+
}
54+
}
55+
56+
public static explicit operator WhenClauseSyntaxWrapper(SyntaxNode node)
57+
{
58+
if (node == null)
59+
{
60+
return default(WhenClauseSyntaxWrapper);
61+
}
62+
63+
if (!IsInstance(node))
64+
{
65+
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{WhenClauseSyntaxTypeName}'");
66+
}
67+
68+
return new WhenClauseSyntaxWrapper((CSharpSyntaxNode)node);
69+
}
70+
71+
public static implicit operator CSharpSyntaxNode(WhenClauseSyntaxWrapper wrapper)
72+
{
73+
return wrapper.node;
74+
}
75+
76+
public static bool IsInstance(SyntaxNode node)
77+
{
78+
return node != null && LightupHelpers.CanWrapNode(node, WhenClauseSyntaxType);
79+
}
80+
81+
public WhenClauseSyntaxWrapper WithWhenKeyword(SyntaxToken whenKeyword)
82+
{
83+
return new WhenClauseSyntaxWrapper(WithWhenKeywordAccessor(this.SyntaxNode, whenKeyword));
84+
}
85+
86+
public WhenClauseSyntaxWrapper WithCondition(ExpressionSyntax condition)
87+
{
88+
return new WhenClauseSyntaxWrapper(WithConditionAccessor(this.SyntaxNode, condition));
89+
}
90+
}
91+
}

StyleCop.Analyzers/StyleCop.Analyzers/StyleCop.Analyzers.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@
179179
<Compile Include="LightJson\Serialization\TextScanner.cs" />
180180
<Compile Include="Lightup\AccessorDeclarationSyntaxExtensions.cs" />
181181
<Compile Include="Lightup\BaseMethodDeclarationSyntaxExtensions.cs" />
182+
<Compile Include="Lightup\CasePatternSwitchLabelSyntaxWrapper.cs" />
182183
<Compile Include="Lightup\ConstantPatternSyntaxWrapper.cs" />
183184
<Compile Include="Lightup\ConstructorDeclarationSyntaxExtensions.cs" />
184185
<Compile Include="Lightup\DeclarationPatternSyntaxWrapper.cs" />
@@ -193,6 +194,7 @@
193194
<Compile Include="Lightup\SyntaxKindEx.cs" />
194195
<Compile Include="Lightup\SyntaxWrapper`1.cs" />
195196
<Compile Include="Lightup\VariableDesignationSyntaxWrapper.cs" />
197+
<Compile Include="Lightup\WhenClauseSyntaxWrapper.cs" />
196198
<Compile Include="LinqHelpers\SyntaxTriviaListEnumerable.cs" />
197199
<Compile Include="MaintainabilityRules\MaintainabilityResources.Designer.cs">
198200
<AutoGen>True</AutoGen>

0 commit comments

Comments
 (0)