Skip to content

Commit 2f9db03

Browse files
committed
Add light-up support for DeclarationExpressionSyntax
1 parent e6cb406 commit 2f9db03

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
@@ -131,12 +131,12 @@
131131
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.ConstantPatternSyntax.WithExpression(Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax expression) -> Microsoft.CodeAnalysis.CSharp.Syntax.ConstantPatternSyntax`
132132
* [x] ~~`Microsoft.CodeAnalysis.CSharp.Syntax.ConstructorDeclarationSyntax.Update(Microsoft.CodeAnalysis.SyntaxList<Microsoft.CodeAnalysis.CSharp.Syntax.AttributeListSyntax> attributeLists, Microsoft.CodeAnalysis.SyntaxTokenList modifiers, Microsoft.CodeAnalysis.SyntaxToken identifier, Microsoft.CodeAnalysis.CSharp.Syntax.ParameterListSyntax parameterList, Microsoft.CodeAnalysis.CSharp.Syntax.ConstructorInitializerSyntax initializer, Microsoft.CodeAnalysis.CSharp.Syntax.BlockSyntax body, Microsoft.CodeAnalysis.CSharp.Syntax.ArrowExpressionClauseSyntax expressionBody, Microsoft.CodeAnalysis.SyntaxToken semicolonToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.ConstructorDeclarationSyntax`~~
133133
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.ConstructorDeclarationSyntax.WithExpressionBody(Microsoft.CodeAnalysis.CSharp.Syntax.ArrowExpressionClauseSyntax expressionBody) -> Microsoft.CodeAnalysis.CSharp.Syntax.ConstructorDeclarationSyntax`
134-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax`
135-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax.Designation.get -> Microsoft.CodeAnalysis.CSharp.Syntax.VariableDesignationSyntax`
136-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax.Type.get -> Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax`
134+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax`
135+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax.Designation.get -> Microsoft.CodeAnalysis.CSharp.Syntax.VariableDesignationSyntax`
136+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax.Type.get -> Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax`
137137
* [x] ~~`Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax.Update(Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax type, Microsoft.CodeAnalysis.CSharp.Syntax.VariableDesignationSyntax designation) -> Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax`~~
138-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax.WithDesignation(Microsoft.CodeAnalysis.CSharp.Syntax.VariableDesignationSyntax designation) -> Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax`
139-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax.WithType(Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax type) -> Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax`
138+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax.WithDesignation(Microsoft.CodeAnalysis.CSharp.Syntax.VariableDesignationSyntax designation) -> Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax`
139+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax.WithType(Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax type) -> Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax`
140140
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationPatternSyntax`
141141
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationPatternSyntax.Designation.get -> Microsoft.CodeAnalysis.CSharp.Syntax.VariableDesignationSyntax`
142142
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationPatternSyntax.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 DeclarationExpressionSyntaxWrapper : ISyntaxWrapper<ExpressionSyntax>
13+
{
14+
private const string DeclarationExpressionSyntaxTypeName = "Microsoft.CodeAnalysis.CSharp.Syntax.DeclarationExpressionSyntax";
15+
private static readonly Type DeclarationExpressionSyntaxType;
16+
17+
private static readonly Func<ExpressionSyntax, TypeSyntax> TypeAccessor;
18+
private static readonly Func<ExpressionSyntax, CSharpSyntaxNode> DesignationAccessor;
19+
private static readonly Func<ExpressionSyntax, TypeSyntax, ExpressionSyntax> WithTypeAccessor;
20+
private static readonly Func<ExpressionSyntax, CSharpSyntaxNode, ExpressionSyntax> WithDesignationAccessor;
21+
22+
private readonly ExpressionSyntax node;
23+
24+
static DeclarationExpressionSyntaxWrapper()
25+
{
26+
DeclarationExpressionSyntaxType = typeof(CSharpSyntaxNode).GetTypeInfo().Assembly.GetType(DeclarationExpressionSyntaxTypeName);
27+
TypeAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<ExpressionSyntax, TypeSyntax>(DeclarationExpressionSyntaxType, nameof(Type));
28+
DesignationAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<ExpressionSyntax, CSharpSyntaxNode>(DeclarationExpressionSyntaxType, nameof(Designation));
29+
WithTypeAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<ExpressionSyntax, TypeSyntax>(DeclarationExpressionSyntaxType, nameof(Type));
30+
WithDesignationAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<ExpressionSyntax, CSharpSyntaxNode>(DeclarationExpressionSyntaxType, nameof(Designation));
31+
}
32+
33+
private DeclarationExpressionSyntaxWrapper(ExpressionSyntax node)
34+
{
35+
this.node = node;
36+
}
37+
38+
public ExpressionSyntax SyntaxNode => this.node;
39+
40+
public TypeSyntax Type
41+
{
42+
get
43+
{
44+
return TypeAccessor(this.SyntaxNode);
45+
}
46+
}
47+
48+
public VariableDesignationSyntaxWrapper Designation
49+
{
50+
get
51+
{
52+
return (VariableDesignationSyntaxWrapper)DesignationAccessor(this.SyntaxNode);
53+
}
54+
}
55+
56+
public static explicit operator DeclarationExpressionSyntaxWrapper(SyntaxNode node)
57+
{
58+
if (node == null)
59+
{
60+
return default(DeclarationExpressionSyntaxWrapper);
61+
}
62+
63+
if (!IsInstance(node))
64+
{
65+
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{DeclarationExpressionSyntaxTypeName}'");
66+
}
67+
68+
return new DeclarationExpressionSyntaxWrapper((ExpressionSyntax)node);
69+
}
70+
71+
public static implicit operator ExpressionSyntax(DeclarationExpressionSyntaxWrapper wrapper)
72+
{
73+
return wrapper.node;
74+
}
75+
76+
public static bool IsInstance(SyntaxNode node)
77+
{
78+
return node != null && LightupHelpers.CanWrapNode(node, DeclarationExpressionSyntaxType);
79+
}
80+
81+
public DeclarationExpressionSyntaxWrapper WithType(TypeSyntax type)
82+
{
83+
return new DeclarationExpressionSyntaxWrapper(WithTypeAccessor(this.SyntaxNode, type));
84+
}
85+
86+
public DeclarationExpressionSyntaxWrapper WithDesignation(VariableDesignationSyntaxWrapper designation)
87+
{
88+
return new DeclarationExpressionSyntaxWrapper(WithDesignationAccessor(this.SyntaxNode, designation.SyntaxNode));
89+
}
90+
}
91+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@
183183
<Compile Include="Lightup\CommonForEachStatementSyntaxWrapper.cs" />
184184
<Compile Include="Lightup\ConstantPatternSyntaxWrapper.cs" />
185185
<Compile Include="Lightup\ConstructorDeclarationSyntaxExtensions.cs" />
186+
<Compile Include="Lightup\DeclarationExpressionSyntaxWrapper.cs" />
186187
<Compile Include="Lightup\DeclarationPatternSyntaxWrapper.cs" />
187188
<Compile Include="Lightup\DestructorDeclarationSyntaxExtensions.cs" />
188189
<Compile Include="Lightup\DiscardDesignationSyntaxWrapper.cs" />

0 commit comments

Comments
 (0)