Skip to content

Commit 419dd52

Browse files
committed
Add light up support for tuples
1 parent ea7e825 commit 419dd52

5 files changed

Lines changed: 341 additions & 21 deletions

File tree

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

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -224,30 +224,30 @@
224224
* [x] ~~`Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax.Update(Microsoft.CodeAnalysis.SyntaxToken throwKeyword, Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax expression) -> Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax`~~
225225
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax.WithExpression(Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax expression) -> Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax`
226226
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax.WithThrowKeyword(Microsoft.CodeAnalysis.SyntaxToken throwKeyword) -> Microsoft.CodeAnalysis.CSharp.Syntax.ThrowExpressionSyntax`
227-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax`
228-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax.Identifier.get -> Microsoft.CodeAnalysis.SyntaxToken`
229-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax.Type.get -> Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax`
227+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax`
228+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax.Identifier.get -> Microsoft.CodeAnalysis.SyntaxToken`
229+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax.Type.get -> Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax`
230230
* [x] ~~`Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax.Update(Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax type, Microsoft.CodeAnalysis.SyntaxToken identifier) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax`~~
231-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax.WithIdentifier(Microsoft.CodeAnalysis.SyntaxToken identifier) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax`
232-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax.WithType(Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax type) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax`
233-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax`
234-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax.AddArguments(params Microsoft.CodeAnalysis.CSharp.Syntax.ArgumentSyntax[] items) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax`
235-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax.Arguments.get -> Microsoft.CodeAnalysis.SeparatedSyntaxList<Microsoft.CodeAnalysis.CSharp.Syntax.ArgumentSyntax>`
236-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax.CloseParenToken.get -> Microsoft.CodeAnalysis.SyntaxToken`
237-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax.OpenParenToken.get -> Microsoft.CodeAnalysis.SyntaxToken`
231+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax.WithIdentifier(Microsoft.CodeAnalysis.SyntaxToken identifier) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax`
232+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax.WithType(Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax type) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax`
233+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax`
234+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax.AddArguments(params Microsoft.CodeAnalysis.CSharp.Syntax.ArgumentSyntax[] items) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax`
235+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax.Arguments.get -> Microsoft.CodeAnalysis.SeparatedSyntaxList<Microsoft.CodeAnalysis.CSharp.Syntax.ArgumentSyntax>`
236+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax.CloseParenToken.get -> Microsoft.CodeAnalysis.SyntaxToken`
237+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax.OpenParenToken.get -> Microsoft.CodeAnalysis.SyntaxToken`
238238
* [x] ~~`Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax.Update(Microsoft.CodeAnalysis.SyntaxToken openParenToken, Microsoft.CodeAnalysis.SeparatedSyntaxList<Microsoft.CodeAnalysis.CSharp.Syntax.ArgumentSyntax> arguments, Microsoft.CodeAnalysis.SyntaxToken closeParenToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax`~~
239-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax.WithArguments(Microsoft.CodeAnalysis.SeparatedSyntaxList<Microsoft.CodeAnalysis.CSharp.Syntax.ArgumentSyntax> arguments) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax`
240-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax.WithCloseParenToken(Microsoft.CodeAnalysis.SyntaxToken closeParenToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax`
241-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax.WithOpenParenToken(Microsoft.CodeAnalysis.SyntaxToken openParenToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax`
242-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax`
243-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax.AddElements(params Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax[] items) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax`
244-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax.CloseParenToken.get -> Microsoft.CodeAnalysis.SyntaxToken`
245-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax.Elements.get -> Microsoft.CodeAnalysis.SeparatedSyntaxList<Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax>`
246-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax.OpenParenToken.get -> Microsoft.CodeAnalysis.SyntaxToken`
239+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax.WithArguments(Microsoft.CodeAnalysis.SeparatedSyntaxList<Microsoft.CodeAnalysis.CSharp.Syntax.ArgumentSyntax> arguments) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax`
240+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax.WithCloseParenToken(Microsoft.CodeAnalysis.SyntaxToken closeParenToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax`
241+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax.WithOpenParenToken(Microsoft.CodeAnalysis.SyntaxToken openParenToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax`
242+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax`
243+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax.AddElements(params Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax[] items) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax`
244+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax.CloseParenToken.get -> Microsoft.CodeAnalysis.SyntaxToken`
245+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax.Elements.get -> Microsoft.CodeAnalysis.SeparatedSyntaxList<Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax>`
246+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax.OpenParenToken.get -> Microsoft.CodeAnalysis.SyntaxToken`
247247
* [x] ~~`Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax.Update(Microsoft.CodeAnalysis.SyntaxToken openParenToken, Microsoft.CodeAnalysis.SeparatedSyntaxList<Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax> elements, Microsoft.CodeAnalysis.SyntaxToken closeParenToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax`~~
248-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax.WithCloseParenToken(Microsoft.CodeAnalysis.SyntaxToken closeParenToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax`
249-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax.WithElements(Microsoft.CodeAnalysis.SeparatedSyntaxList<Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax> elements) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax`
250-
* [ ] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax.WithOpenParenToken(Microsoft.CodeAnalysis.SyntaxToken openParenToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax`
248+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax.WithCloseParenToken(Microsoft.CodeAnalysis.SyntaxToken closeParenToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax`
249+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax.WithElements(Microsoft.CodeAnalysis.SeparatedSyntaxList<Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax> elements) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax`
250+
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax.WithOpenParenToken(Microsoft.CodeAnalysis.SyntaxToken openParenToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.TupleTypeSyntax`
251251
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.VariableDesignationSyntax`
252252
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax`
253253
* [x] `Microsoft.CodeAnalysis.CSharp.Syntax.WhenClauseSyntax.Condition.get -> Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax`
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 TupleElementSyntaxWrapper : ISyntaxWrapper<CSharpSyntaxNode>
13+
{
14+
private const string TupleElementSyntaxTypeName = "Microsoft.CodeAnalysis.CSharp.Syntax.TupleElementSyntax";
15+
private static readonly Type TupleElementSyntaxType;
16+
17+
private static readonly Func<CSharpSyntaxNode, SyntaxToken> IdentifierAccessor;
18+
private static readonly Func<CSharpSyntaxNode, TypeSyntax> TypeAccessor;
19+
private static readonly Func<CSharpSyntaxNode, SyntaxToken, CSharpSyntaxNode> WithIdentifierAccessor;
20+
private static readonly Func<CSharpSyntaxNode, TypeSyntax, CSharpSyntaxNode> WithTypeAccessor;
21+
22+
private readonly CSharpSyntaxNode node;
23+
24+
static TupleElementSyntaxWrapper()
25+
{
26+
TupleElementSyntaxType = typeof(CSharpSyntaxNode).GetTypeInfo().Assembly.GetType(TupleElementSyntaxTypeName);
27+
IdentifierAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<CSharpSyntaxNode, SyntaxToken>(TupleElementSyntaxType, nameof(Identifier));
28+
TypeAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<CSharpSyntaxNode, TypeSyntax>(TupleElementSyntaxType, nameof(Type));
29+
WithIdentifierAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<CSharpSyntaxNode, SyntaxToken>(TupleElementSyntaxType, nameof(Identifier));
30+
WithTypeAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<CSharpSyntaxNode, TypeSyntax>(TupleElementSyntaxType, nameof(Type));
31+
}
32+
33+
private TupleElementSyntaxWrapper(CSharpSyntaxNode node)
34+
{
35+
this.node = node;
36+
}
37+
38+
public CSharpSyntaxNode SyntaxNode => this.node;
39+
40+
public SyntaxToken Identifier
41+
{
42+
get
43+
{
44+
return IdentifierAccessor(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 TupleElementSyntaxWrapper(SyntaxNode node)
57+
{
58+
if (node == null)
59+
{
60+
return default(TupleElementSyntaxWrapper);
61+
}
62+
63+
if (!IsInstance(node))
64+
{
65+
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{TupleElementSyntaxTypeName}'");
66+
}
67+
68+
return new TupleElementSyntaxWrapper((CSharpSyntaxNode)node);
69+
}
70+
71+
public static implicit operator CSharpSyntaxNode(TupleElementSyntaxWrapper wrapper)
72+
{
73+
return wrapper.node;
74+
}
75+
76+
public static bool IsInstance(SyntaxNode node)
77+
{
78+
return node != null && LightupHelpers.CanWrapNode(node, TupleElementSyntaxType);
79+
}
80+
81+
public TupleElementSyntaxWrapper WithIdentifier(SyntaxToken identifier)
82+
{
83+
return new TupleElementSyntaxWrapper(WithIdentifierAccessor(this.SyntaxNode, identifier));
84+
}
85+
86+
public TupleElementSyntaxWrapper WithType(TypeSyntax type)
87+
{
88+
return new TupleElementSyntaxWrapper(WithTypeAccessor(this.SyntaxNode, type));
89+
}
90+
}
91+
}
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
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 TupleExpressionSyntaxWrapper : ISyntaxWrapper<ExpressionSyntax>
13+
{
14+
private const string TupleExpressionSyntaxTypeName = "Microsoft.CodeAnalysis.CSharp.Syntax.TupleExpressionSyntax";
15+
private static readonly Type TupleExpressionSyntaxType;
16+
17+
private static readonly Func<ExpressionSyntax, SyntaxToken> OpenParenTokenAccessor;
18+
private static readonly Func<ExpressionSyntax, SeparatedSyntaxList<ArgumentSyntax>> ArgumentsAccessor;
19+
private static readonly Func<ExpressionSyntax, SyntaxToken> CloseParenTokenAccessor;
20+
private static readonly Func<ExpressionSyntax, SyntaxToken, ExpressionSyntax> WithOpenParenTokenAccessor;
21+
private static readonly Func<ExpressionSyntax, SeparatedSyntaxList<ArgumentSyntax>, ExpressionSyntax> WithArgumentsAccessor;
22+
private static readonly Func<ExpressionSyntax, SyntaxToken, ExpressionSyntax> WithCloseParenTokenAccessor;
23+
24+
private readonly ExpressionSyntax node;
25+
26+
static TupleExpressionSyntaxWrapper()
27+
{
28+
TupleExpressionSyntaxType = typeof(CSharpSyntaxNode).GetTypeInfo().Assembly.GetType(TupleExpressionSyntaxTypeName);
29+
OpenParenTokenAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<ExpressionSyntax, SyntaxToken>(TupleExpressionSyntaxType, nameof(OpenParenToken));
30+
ArgumentsAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<ExpressionSyntax, SeparatedSyntaxList<ArgumentSyntax>>(TupleExpressionSyntaxType, nameof(Arguments));
31+
CloseParenTokenAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<ExpressionSyntax, SyntaxToken>(TupleExpressionSyntaxType, nameof(CloseParenToken));
32+
WithOpenParenTokenAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<ExpressionSyntax, SyntaxToken>(TupleExpressionSyntaxType, nameof(OpenParenToken));
33+
WithArgumentsAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<ExpressionSyntax, SeparatedSyntaxList<ArgumentSyntax>>(TupleExpressionSyntaxType, nameof(Arguments));
34+
WithCloseParenTokenAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<ExpressionSyntax, SyntaxToken>(TupleExpressionSyntaxType, nameof(CloseParenToken));
35+
}
36+
37+
private TupleExpressionSyntaxWrapper(ExpressionSyntax node)
38+
{
39+
this.node = node;
40+
}
41+
42+
public ExpressionSyntax SyntaxNode => this.node;
43+
44+
public SyntaxToken OpenParenToken
45+
{
46+
get
47+
{
48+
return OpenParenTokenAccessor(this.SyntaxNode);
49+
}
50+
}
51+
52+
public SeparatedSyntaxList<ArgumentSyntax> Arguments
53+
{
54+
get
55+
{
56+
return ArgumentsAccessor(this.SyntaxNode);
57+
}
58+
}
59+
60+
public SyntaxToken CloseParenToken
61+
{
62+
get
63+
{
64+
return CloseParenTokenAccessor(this.SyntaxNode);
65+
}
66+
}
67+
68+
public static explicit operator TupleExpressionSyntaxWrapper(SyntaxNode node)
69+
{
70+
if (node == null)
71+
{
72+
return default(TupleExpressionSyntaxWrapper);
73+
}
74+
75+
if (!IsInstance(node))
76+
{
77+
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{TupleExpressionSyntaxTypeName}'");
78+
}
79+
80+
return new TupleExpressionSyntaxWrapper((ExpressionSyntax)node);
81+
}
82+
83+
public static implicit operator ExpressionSyntax(TupleExpressionSyntaxWrapper wrapper)
84+
{
85+
return wrapper.node;
86+
}
87+
88+
public static bool IsInstance(SyntaxNode node)
89+
{
90+
return node != null && LightupHelpers.CanWrapNode(node, TupleExpressionSyntaxType);
91+
}
92+
93+
public TupleExpressionSyntaxWrapper AddArguments(params ArgumentSyntax[] items)
94+
{
95+
return new TupleExpressionSyntaxWrapper(this.WithArguments(this.Arguments.AddRange(items)));
96+
}
97+
98+
public TupleExpressionSyntaxWrapper WithOpenParenToken(SyntaxToken openParenToken)
99+
{
100+
return new TupleExpressionSyntaxWrapper(WithOpenParenTokenAccessor(this.SyntaxNode, openParenToken));
101+
}
102+
103+
public TupleExpressionSyntaxWrapper WithArguments(SeparatedSyntaxList<ArgumentSyntax> arguments)
104+
{
105+
return new TupleExpressionSyntaxWrapper(WithArgumentsAccessor(this.SyntaxNode, arguments));
106+
}
107+
108+
public TupleExpressionSyntaxWrapper WithCloseParenToken(SyntaxToken closeParenToken)
109+
{
110+
return new TupleExpressionSyntaxWrapper(WithCloseParenTokenAccessor(this.SyntaxNode, closeParenToken));
111+
}
112+
}
113+
}

0 commit comments

Comments
 (0)