Skip to content

Commit 1cacccf

Browse files
committed
Add light-up support for RefExpressionSyntax and RefTypeSyntax
1 parent 9168ce9 commit 1cacccf

4 files changed

Lines changed: 194 additions & 10 deletions

File tree

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -202,18 +202,18 @@
202202
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.ParenthesizedVariableDesignationSyntax.WithOpenParenToken(Microsoft.CodeAnalysis.SyntaxToken openParenToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.ParenthesizedVariableDesignationSyntax`
203203
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.ParenthesizedVariableDesignationSyntax.WithVariables(Microsoft.CodeAnalysis.SeparatedSyntaxList<Microsoft.CodeAnalysis.CSharp.Syntax.VariableDesignationSyntax> variables) -> Microsoft.CodeAnalysis.CSharp.Syntax.ParenthesizedVariableDesignationSyntax`
204204
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.PatternSyntax`
205-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax`
206-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax.Expression.get -> Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax`
207-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax.RefKeyword.get -> Microsoft.CodeAnalysis.SyntaxToken`
205+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax`
206+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax.Expression.get -> Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax`
207+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax.RefKeyword.get -> Microsoft.CodeAnalysis.SyntaxToken`
208208
* [x] ~~`Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax.Update(Microsoft.CodeAnalysis.SyntaxToken refKeyword, Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax expression) -> Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax`~~
209-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax.WithExpression(Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax expression) -> Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax`
210-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax.WithRefKeyword(Microsoft.CodeAnalysis.SyntaxToken refKeyword) -> Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax`
211-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax`
212-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax.RefKeyword.get -> Microsoft.CodeAnalysis.SyntaxToken`
213-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax.Type.get -> Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax`
209+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax.WithExpression(Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax expression) -> Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax`
210+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax.WithRefKeyword(Microsoft.CodeAnalysis.SyntaxToken refKeyword) -> Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax`
211+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax`
212+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax.RefKeyword.get -> Microsoft.CodeAnalysis.SyntaxToken`
213+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax.Type.get -> Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax`
214214
* [x] ~~`Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax.Update(Microsoft.CodeAnalysis.SyntaxToken refKeyword, Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax type) -> Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax`~~
215-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax.WithRefKeyword(Microsoft.CodeAnalysis.SyntaxToken refKeyword) -> Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax`
216-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax.WithType(Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax type) -> Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax`
215+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax.WithRefKeyword(Microsoft.CodeAnalysis.SyntaxToken refKeyword) -> Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax`
216+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax.WithType(Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax type) -> Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax`
217217
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.SingleVariableDesignationSyntax`
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`~~
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 RefExpressionSyntaxWrapper : ISyntaxWrapper<ExpressionSyntax>
13+
{
14+
private const string RefExpressionSyntaxTypeName = "Microsoft.CodeAnalysis.CSharp.Syntax.RefExpressionSyntax";
15+
private static readonly Type RefExpressionSyntaxType;
16+
17+
private static readonly Func<ExpressionSyntax, SyntaxToken> RefKeywordAccessor;
18+
private static readonly Func<ExpressionSyntax, ExpressionSyntax> ExpressionAccessor;
19+
private static readonly Func<ExpressionSyntax, SyntaxToken, ExpressionSyntax> WithRefKeywordAccessor;
20+
private static readonly Func<ExpressionSyntax, ExpressionSyntax, ExpressionSyntax> WithExpressionAccessor;
21+
22+
private readonly ExpressionSyntax node;
23+
24+
static RefExpressionSyntaxWrapper()
25+
{
26+
RefExpressionSyntaxType = typeof(CSharpSyntaxNode).GetTypeInfo().Assembly.GetType(RefExpressionSyntaxTypeName);
27+
RefKeywordAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<ExpressionSyntax, SyntaxToken>(RefExpressionSyntaxType, nameof(RefKeyword));
28+
ExpressionAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<ExpressionSyntax, ExpressionSyntax>(RefExpressionSyntaxType, nameof(Expression));
29+
WithRefKeywordAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<ExpressionSyntax, SyntaxToken>(RefExpressionSyntaxType, nameof(RefKeyword));
30+
WithExpressionAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<ExpressionSyntax, ExpressionSyntax>(RefExpressionSyntaxType, nameof(Expression));
31+
}
32+
33+
private RefExpressionSyntaxWrapper(ExpressionSyntax node)
34+
{
35+
this.node = node;
36+
}
37+
38+
public ExpressionSyntax SyntaxNode => this.node;
39+
40+
public SyntaxToken RefKeyword
41+
{
42+
get
43+
{
44+
return RefKeywordAccessor(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 RefExpressionSyntaxWrapper(SyntaxNode node)
57+
{
58+
if (node == null)
59+
{
60+
return default(RefExpressionSyntaxWrapper);
61+
}
62+
63+
if (!IsInstance(node))
64+
{
65+
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{RefExpressionSyntaxTypeName}'");
66+
}
67+
68+
return new RefExpressionSyntaxWrapper((ExpressionSyntax)node);
69+
}
70+
71+
public static implicit operator ExpressionSyntax(RefExpressionSyntaxWrapper wrapper)
72+
{
73+
return wrapper.node;
74+
}
75+
76+
public static bool IsInstance(SyntaxNode node)
77+
{
78+
return node != null && LightupHelpers.CanWrapNode(node, RefExpressionSyntaxType);
79+
}
80+
81+
public RefExpressionSyntaxWrapper WithRefKeyword(SyntaxToken refKeyword)
82+
{
83+
return new RefExpressionSyntaxWrapper(WithRefKeywordAccessor(this.SyntaxNode, refKeyword));
84+
}
85+
86+
public RefExpressionSyntaxWrapper WithExpression(ExpressionSyntax expression)
87+
{
88+
return new RefExpressionSyntaxWrapper(WithExpressionAccessor(this.SyntaxNode, expression));
89+
}
90+
}
91+
}
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 RefTypeSyntaxWrapper : ISyntaxWrapper<TypeSyntax>
13+
{
14+
private const string RefTypeSyntaxTypeName = "Microsoft.CodeAnalysis.CSharp.Syntax.RefTypeSyntax";
15+
private static readonly Type RefTypeSyntaxType;
16+
17+
private static readonly Func<TypeSyntax, SyntaxToken> RefKeywordAccessor;
18+
private static readonly Func<TypeSyntax, TypeSyntax> TypeAccessor;
19+
private static readonly Func<TypeSyntax, SyntaxToken, TypeSyntax> WithRefKeywordAccessor;
20+
private static readonly Func<TypeSyntax, TypeSyntax, TypeSyntax> WithTypeAccessor;
21+
22+
private readonly TypeSyntax node;
23+
24+
static RefTypeSyntaxWrapper()
25+
{
26+
RefTypeSyntaxType = typeof(CSharpSyntaxNode).GetTypeInfo().Assembly.GetType(RefTypeSyntaxTypeName);
27+
RefKeywordAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<TypeSyntax, SyntaxToken>(RefTypeSyntaxType, nameof(RefKeyword));
28+
TypeAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<TypeSyntax, TypeSyntax>(RefTypeSyntaxType, nameof(Type));
29+
WithRefKeywordAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<TypeSyntax, SyntaxToken>(RefTypeSyntaxType, nameof(RefKeyword));
30+
WithTypeAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<TypeSyntax, TypeSyntax>(RefTypeSyntaxType, nameof(Type));
31+
}
32+
33+
private RefTypeSyntaxWrapper(TypeSyntax node)
34+
{
35+
this.node = node;
36+
}
37+
38+
public TypeSyntax SyntaxNode => this.node;
39+
40+
public SyntaxToken RefKeyword
41+
{
42+
get
43+
{
44+
return RefKeywordAccessor(this.SyntaxNode);
45+
}
46+
}
47+
48+
public TypeSyntax Type
49+
{
50+
get
51+
{
52+
return TypeAccessor(this.SyntaxNode);
53+
}
54+
}
55+
56+
public static explicit operator RefTypeSyntaxWrapper(SyntaxNode node)
57+
{
58+
if (node == null)
59+
{
60+
return default(RefTypeSyntaxWrapper);
61+
}
62+
63+
if (!IsInstance(node))
64+
{
65+
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{RefTypeSyntaxTypeName}'");
66+
}
67+
68+
return new RefTypeSyntaxWrapper((TypeSyntax)node);
69+
}
70+
71+
public static implicit operator TypeSyntax(RefTypeSyntaxWrapper wrapper)
72+
{
73+
return wrapper.node;
74+
}
75+
76+
public static bool IsInstance(SyntaxNode node)
77+
{
78+
return node != null && LightupHelpers.CanWrapNode(node, RefTypeSyntaxType);
79+
}
80+
81+
public RefTypeSyntaxWrapper WithRefKeyword(SyntaxToken refKeyword)
82+
{
83+
return new RefTypeSyntaxWrapper(WithRefKeywordAccessor(this.SyntaxNode, refKeyword));
84+
}
85+
86+
public RefTypeSyntaxWrapper WithType(TypeSyntax type)
87+
{
88+
return new RefTypeSyntaxWrapper(WithTypeAccessor(this.SyntaxNode, type));
89+
}
90+
}
91+
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,8 @@
189189
<Compile Include="Lightup\LightupHelpers.cs" />
190190
<Compile Include="Lightup\ParenthesizedVariableDesignationSyntaxWrapper.cs" />
191191
<Compile Include="Lightup\PatternSyntaxWrapper.cs" />
192+
<Compile Include="Lightup\RefExpressionSyntaxWrapper.cs" />
193+
<Compile Include="Lightup\RefTypeSyntaxWrapper.cs" />
192194
<Compile Include="Lightup\SeparatedSyntaxListWrapper`1.cs" />
193195
<Compile Include="Lightup\SingleVariableDesignationSyntaxWrapper.cs" />
194196
<Compile Include="Lightup\SyntaxKindEx.cs" />

0 commit comments

Comments
 (0)