Skip to content

Commit ea7e825

Browse files
committed
Add light-up support for ThrowExpressionSyntax
1 parent 1cacccf commit ea7e825

3 files changed

Lines changed: 97 additions & 5 deletions

File tree

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -218,12 +218,12 @@
218218
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.SingleVariableDesignationSyntax.Identifier.get -> Microsoft.CodeAnalysis.SyntaxToken`
219219
* [x] ~~`Microsoft.CodeAnalysis.CSharp.Syntax.SingleVariableDesignationSyntax.Update(Microsoft.CodeAnalysis.SyntaxToken identifier) -> Microsoft.CodeAnalysis.CSharp.Syntax.SingleVariableDesignationSyntax`~~
220220
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.SingleVariableDesignationSyntax.WithIdentifier(Microsoft.CodeAnalysis.SyntaxToken identifier) -> Microsoft.CodeAnalysis.CSharp.Syntax.SingleVariableDesignationSyntax`
221-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax`
222-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax.Expression.get -> Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax`
223-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax.ThrowKeyword.get -> Microsoft.CodeAnalysis.SyntaxToken`
221+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax`
222+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax.Expression.get -> Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax`
223+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax.ThrowKeyword.get -> Microsoft.CodeAnalysis.SyntaxToken`
224224
* [x] ~~`Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax.Update(Microsoft.CodeAnalysis.SyntaxToken throwKeyword, Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax expression) -> Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax`~~
225-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax.WithExpression(Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax expression) -> Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax`
226-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax.WithThrowKeyword(Microsoft.CodeAnalysis.SyntaxToken throwKeyword) -> Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax`
225+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax.WithExpression(Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax expression) -> Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax`
226+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax.WithThrowKeyword(Microsoft.CodeAnalysis.SyntaxToken throwKeyword) -> Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax`
227227
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax`
228228
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax.Identifier.get -> Microsoft.CodeAnalysis.SyntaxToken`
229229
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax.Type.get -> Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax`
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 ThrowExpressionSyntaxWrapper : ISyntaxWrapper<ExpressionSyntax>
13+
{
14+
private const string ThrowExpressionSyntaxTypeName = "Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax";
15+
private static readonly Type ThrowExpressionSyntaxType;
16+
17+
private static readonly Func<ExpressionSyntax, SyntaxToken> ThrowKeywordAccessor;
18+
private static readonly Func<ExpressionSyntax, ExpressionSyntax> ExpressionAccessor;
19+
private static readonly Func<ExpressionSyntax, SyntaxToken, ExpressionSyntax> WithThrowKeywordAccessor;
20+
private static readonly Func<ExpressionSyntax, ExpressionSyntax, ExpressionSyntax> WithExpressionAccessor;
21+
22+
private readonly ExpressionSyntax node;
23+
24+
static ThrowExpressionSyntaxWrapper()
25+
{
26+
ThrowExpressionSyntaxType = typeof(CSharpSyntaxNode).GetTypeInfo().Assembly.GetType(ThrowExpressionSyntaxTypeName);
27+
ThrowKeywordAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<ExpressionSyntax, SyntaxToken>(ThrowExpressionSyntaxType, nameof(ThrowKeyword));
28+
ExpressionAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<ExpressionSyntax, ExpressionSyntax>(ThrowExpressionSyntaxType, nameof(Expression));
29+
WithThrowKeywordAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<ExpressionSyntax, SyntaxToken>(ThrowExpressionSyntaxType, nameof(ThrowKeyword));
30+
WithExpressionAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<ExpressionSyntax, ExpressionSyntax>(ThrowExpressionSyntaxType, nameof(Expression));
31+
}
32+
33+
private ThrowExpressionSyntaxWrapper(ExpressionSyntax node)
34+
{
35+
this.node = node;
36+
}
37+
38+
public ExpressionSyntax SyntaxNode => this.node;
39+
40+
public SyntaxToken ThrowKeyword
41+
{
42+
get
43+
{
44+
return ThrowKeywordAccessor(this.SyntaxNode);
45+
}
46+
}
47+
48+
public ExpressionSyntax Expression
49+
{
50+
get
51+
{
52+
return ExpressionAccessor(this.SyntaxNode);
53+
}
54+
}
55+
56+
public static explicit operator ThrowExpressionSyntaxWrapper(SyntaxNode node)
57+
{
58+
if (node == null)
59+
{
60+
return default(ThrowExpressionSyntaxWrapper);
61+
}
62+
63+
if (!IsInstance(node))
64+
{
65+
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{ThrowExpressionSyntaxTypeName}'");
66+
}
67+
68+
return new ThrowExpressionSyntaxWrapper((ExpressionSyntax)node);
69+
}
70+
71+
public static implicit operator ExpressionSyntax(ThrowExpressionSyntaxWrapper wrapper)
72+
{
73+
return wrapper.node;
74+
}
75+
76+
public static bool IsInstance(SyntaxNode node)
77+
{
78+
return node != null && LightupHelpers.CanWrapNode(node, ThrowExpressionSyntaxType);
79+
}
80+
81+
public ThrowExpressionSyntaxWrapper WithThrowKeyword(SyntaxToken throwKeyword)
82+
{
83+
return new ThrowExpressionSyntaxWrapper(WithThrowKeywordAccessor(this.SyntaxNode, throwKeyword));
84+
}
85+
86+
public ThrowExpressionSyntaxWrapper WithExpression(ExpressionSyntax expression)
87+
{
88+
return new ThrowExpressionSyntaxWrapper(WithExpressionAccessor(this.SyntaxNode, expression));
89+
}
90+
}
91+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@
195195
<Compile Include="Lightup\SingleVariableDesignationSyntaxWrapper.cs" />
196196
<Compile Include="Lightup\SyntaxKindEx.cs" />
197197
<Compile Include="Lightup\SyntaxWrapper`1.cs" />
198+
<Compile Include="Lightup\ThrowExpressionSyntaxWrapper.cs" />
198199
<Compile Include="Lightup\VariableDesignationSyntaxWrapper.cs" />
199200
<Compile Include="Lightup\WhenClauseSyntaxWrapper.cs" />
200201
<Compile Include="LinqHelpers\SyntaxTriviaListEnumerable.cs" />

0 commit comments

Comments
 (0)