Skip to content

Commit de9da19

Browse files
committed
Add light-up support for IsPatternExpressionSyntax
1 parent 2f9db03 commit de9da19

3 files changed

Lines changed: 116 additions & 7 deletions

File tree

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -159,14 +159,14 @@
159159
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.ForEachVariableStatementSyntax.WithOpenParenToken(Microsoft.CodeAnalysis.SyntaxToken openParenToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.ForEachVariableStatementSyntax`
160160
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.ForEachVariableStatementSyntax.WithStatement(Microsoft.CodeAnalysis.CSharp.Syntax.StatementSyntax statement) -> Microsoft.CodeAnalysis.CSharp.Syntax.ForEachVariableStatementSyntax`
161161
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.ForEachVariableStatementSyntax.WithVariable(Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax variable) -> Microsoft.CodeAnalysis.CSharp.Syntax.ForEachVariableStatementSyntax`
162-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax`
163-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax.Expression.get -> Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax`
164-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax.IsKeyword.get -> Microsoft.CodeAnalysis.SyntaxToken`
165-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax.Pattern.get -> Microsoft.CodeAnalysis.CSharp.Syntax.PatternSyntax`
162+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax`
163+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax.Expression.get -> Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax`
164+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax.IsKeyword.get -> Microsoft.CodeAnalysis.SyntaxToken`
165+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax.Pattern.get -> Microsoft.CodeAnalysis.CSharp.Syntax.PatternSyntax`
166166
* [x] ~~`Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax.Update(Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax expression, Microsoft.CodeAnalysis.SyntaxToken isKeyword, Microsoft.CodeAnalysis.CSharp.Syntax.PatternSyntax pattern) -> Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax`~~
167-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax.WithExpression(Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax expression) -> Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax`
168-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax.WithIsKeyword(Microsoft.CodeAnalysis.SyntaxToken isKeyword) -> Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax`
169-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax.WithPattern(Microsoft.CodeAnalysis.CSharp.Syntax.PatternSyntax pattern) -> Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax`
167+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax.WithExpression(Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax expression) -> Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax`
168+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax.WithIsKeyword(Microsoft.CodeAnalysis.SyntaxToken isKeyword) -> Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax`
169+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax.WithPattern(Microsoft.CodeAnalysis.CSharp.Syntax.PatternSyntax pattern) -> Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax`
170170
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.LocalFunctionStatementSyntax`
171171
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.LocalFunctionStatementSyntax.AddBodyStatements(params Microsoft.CodeAnalysis.CSharp.Syntax.StatementSyntax[] items) -> Microsoft.CodeAnalysis.CSharp.Syntax.LocalFunctionStatementSyntax`
172172
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.LocalFunctionStatementSyntax.AddConstraintClauses(params Microsoft.CodeAnalysis.CSharp.Syntax.TypeParameterConstraintClauseSyntax[] items) -> Microsoft.CodeAnalysis.CSharp.Syntax.LocalFunctionStatementSyntax`
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
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 IsPatternExpressionSyntaxWrapper : ISyntaxWrapper<ExpressionSyntax>
13+
{
14+
private const string IsPatternExpressionSyntaxTypeName = "Microsoft.CodeAnalysis.CSharp.Syntax.IsPatternExpressionSyntax";
15+
private static readonly Type IsPatternExpressionSyntaxType;
16+
17+
private static readonly Func<ExpressionSyntax, ExpressionSyntax> ExpressionAccessor;
18+
private static readonly Func<ExpressionSyntax, SyntaxToken> IsKeywordAccessor;
19+
private static readonly Func<ExpressionSyntax, CSharpSyntaxNode> PatternAccessor;
20+
private static readonly Func<ExpressionSyntax, ExpressionSyntax, ExpressionSyntax> WithExpressionAccessor;
21+
private static readonly Func<ExpressionSyntax, SyntaxToken, ExpressionSyntax> WithIsKeywordAccessor;
22+
private static readonly Func<ExpressionSyntax, CSharpSyntaxNode, ExpressionSyntax> WithPatternAccessor;
23+
24+
private readonly ExpressionSyntax node;
25+
26+
static IsPatternExpressionSyntaxWrapper()
27+
{
28+
IsPatternExpressionSyntaxType = typeof(CSharpSyntaxNode).GetTypeInfo().Assembly.GetType(IsPatternExpressionSyntaxTypeName);
29+
ExpressionAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<ExpressionSyntax, ExpressionSyntax>(IsPatternExpressionSyntaxType, nameof(Expression));
30+
IsKeywordAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<ExpressionSyntax, SyntaxToken>(IsPatternExpressionSyntaxType, nameof(IsKeyword));
31+
PatternAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<ExpressionSyntax, CSharpSyntaxNode>(IsPatternExpressionSyntaxType, nameof(Pattern));
32+
WithExpressionAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<ExpressionSyntax, ExpressionSyntax>(IsPatternExpressionSyntaxType, nameof(Expression));
33+
WithIsKeywordAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<ExpressionSyntax, SyntaxToken>(IsPatternExpressionSyntaxType, nameof(IsKeyword));
34+
WithPatternAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<ExpressionSyntax, CSharpSyntaxNode>(IsPatternExpressionSyntaxType, nameof(Pattern));
35+
}
36+
37+
private IsPatternExpressionSyntaxWrapper(ExpressionSyntax node)
38+
{
39+
this.node = node;
40+
}
41+
42+
public ExpressionSyntax SyntaxNode => this.node;
43+
44+
public ExpressionSyntax Expression
45+
{
46+
get
47+
{
48+
return ExpressionAccessor(this.SyntaxNode);
49+
}
50+
}
51+
52+
public SyntaxToken IsKeyword
53+
{
54+
get
55+
{
56+
return IsKeywordAccessor(this.SyntaxNode);
57+
}
58+
}
59+
60+
public PatternSyntaxWrapper Pattern
61+
{
62+
get
63+
{
64+
return (PatternSyntaxWrapper)PatternAccessor(this.SyntaxNode);
65+
}
66+
}
67+
68+
public static explicit operator IsPatternExpressionSyntaxWrapper(SyntaxNode node)
69+
{
70+
if (node == null)
71+
{
72+
return default(IsPatternExpressionSyntaxWrapper);
73+
}
74+
75+
if (!IsInstance(node))
76+
{
77+
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{IsPatternExpressionSyntaxTypeName}'");
78+
}
79+
80+
return new IsPatternExpressionSyntaxWrapper((ExpressionSyntax)node);
81+
}
82+
83+
public static implicit operator ExpressionSyntax(IsPatternExpressionSyntaxWrapper wrapper)
84+
{
85+
return wrapper.node;
86+
}
87+
88+
public static bool IsInstance(SyntaxNode node)
89+
{
90+
return node != null && LightupHelpers.CanWrapNode(node, IsPatternExpressionSyntaxType);
91+
}
92+
93+
public IsPatternExpressionSyntaxWrapper WithExpression(ExpressionSyntax expression)
94+
{
95+
return new IsPatternExpressionSyntaxWrapper(WithExpressionAccessor(this.SyntaxNode, expression));
96+
}
97+
98+
public IsPatternExpressionSyntaxWrapper WithIsKeyword(SyntaxToken isKeyword)
99+
{
100+
return new IsPatternExpressionSyntaxWrapper(WithIsKeywordAccessor(this.SyntaxNode, isKeyword));
101+
}
102+
103+
public IsPatternExpressionSyntaxWrapper WithPattern(PatternSyntaxWrapper pattern)
104+
{
105+
return new IsPatternExpressionSyntaxWrapper(WithPatternAccessor(this.SyntaxNode, pattern.SyntaxNode));
106+
}
107+
}
108+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@
188188
<Compile Include="Lightup\DestructorDeclarationSyntaxExtensions.cs" />
189189
<Compile Include="Lightup\DiscardDesignationSyntaxWrapper.cs" />
190190
<Compile Include="Lightup\ForEachVariableStatementSyntaxWrapper.cs" />
191+
<Compile Include="Lightup\IsPatternExpressionSyntaxWrapper.cs" />
191192
<Compile Include="Lightup\ISyntaxWrapper`1.cs" />
192193
<Compile Include="Lightup\LightupHelpers.cs" />
193194
<Compile Include="Lightup\ParenthesizedVariableDesignationSyntaxWrapper.cs" />

0 commit comments

Comments
 (0)