Skip to content

Commit 147568c

Browse files
committed
Generate explicit downcast
1 parent b1a9705 commit 147568c

81 files changed

Lines changed: 838 additions & 450 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

StyleCop.Analyzers/StyleCop.Analyzers.CodeGeneration/SyntaxLightupGenerator.cs

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,94 @@ private void GenerateSyntaxWrapper(in GeneratorExecutionContext context, SyntaxD
126126
initializer: null,
127127
semicolonToken: SyntaxFactory.Token(SyntaxKind.SemicolonToken)));
128128

129+
// public static explicit operator WhenClauseSyntaxWrapper(SyntaxNode node)
130+
// {
131+
// if (node == null)
132+
// {
133+
// return default;
134+
// }
135+
//
136+
// if (!IsInstance(node))
137+
// {
138+
// throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{WrappedTypeName}'");
139+
// }
140+
//
141+
// return new WhenClauseSyntaxWrapper((CSharpSyntaxNode)node);
142+
// }
143+
members = members.Add(SyntaxFactory.ConversionOperatorDeclaration(
144+
attributeLists: default,
145+
modifiers: SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PublicKeyword), SyntaxFactory.Token(SyntaxKind.StaticKeyword)),
146+
implicitOrExplicitKeyword: SyntaxFactory.Token(SyntaxKind.ExplicitKeyword),
147+
operatorKeyword: SyntaxFactory.Token(SyntaxKind.OperatorKeyword),
148+
type: SyntaxFactory.IdentifierName(nodeData.WrapperName),
149+
parameterList: SyntaxFactory.ParameterList(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.Parameter(
150+
attributeLists: default,
151+
modifiers: default,
152+
type: SyntaxFactory.IdentifierName("SyntaxNode"),
153+
identifier: SyntaxFactory.Identifier("node"),
154+
@default: null))),
155+
body: SyntaxFactory.Block(
156+
SyntaxFactory.IfStatement(
157+
condition: SyntaxFactory.BinaryExpression(
158+
SyntaxKind.EqualsExpression,
159+
left: SyntaxFactory.IdentifierName("node"),
160+
right: SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression)),
161+
statement: SyntaxFactory.Block(
162+
SyntaxFactory.ReturnStatement(SyntaxFactory.LiteralExpression(SyntaxKind.DefaultLiteralExpression)))),
163+
SyntaxFactory.IfStatement(
164+
condition: SyntaxFactory.PrefixUnaryExpression(
165+
SyntaxKind.LogicalNotExpression,
166+
operand: SyntaxFactory.InvocationExpression(
167+
expression: SyntaxFactory.IdentifierName("IsInstance"),
168+
argumentList: SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.Argument(SyntaxFactory.IdentifierName("node")))))),
169+
statement: SyntaxFactory.Block(
170+
SyntaxFactory.ThrowStatement(SyntaxFactory.ObjectCreationExpression(
171+
type: SyntaxFactory.IdentifierName("InvalidCastException"),
172+
argumentList: SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.Argument(
173+
SyntaxFactory.InterpolatedStringExpression(
174+
SyntaxFactory.Token(SyntaxKind.InterpolatedStringStartToken),
175+
SyntaxFactory.List(new InterpolatedStringContentSyntax[]
176+
{
177+
SyntaxFactory.InterpolatedStringText(SyntaxFactory.Token(
178+
leading: default,
179+
SyntaxKind.InterpolatedStringTextToken,
180+
"Cannot cast '",
181+
"Cannot cast '",
182+
trailing: default)),
183+
SyntaxFactory.Interpolation(SyntaxFactory.MemberAccessExpression(
184+
SyntaxKind.SimpleMemberAccessExpression,
185+
expression: SyntaxFactory.InvocationExpression(
186+
expression: SyntaxFactory.MemberAccessExpression(
187+
SyntaxKind.SimpleMemberAccessExpression,
188+
expression: SyntaxFactory.IdentifierName("node"),
189+
name: SyntaxFactory.IdentifierName("GetType")),
190+
argumentList: SyntaxFactory.ArgumentList()),
191+
name: SyntaxFactory.IdentifierName("FullName"))),
192+
SyntaxFactory.InterpolatedStringText(SyntaxFactory.Token(
193+
leading: default,
194+
SyntaxKind.InterpolatedStringTextToken,
195+
"' to '",
196+
"' to '",
197+
trailing: default)),
198+
SyntaxFactory.Interpolation(SyntaxFactory.IdentifierName("WrappedTypeName")),
199+
SyntaxFactory.InterpolatedStringText(SyntaxFactory.Token(
200+
leading: default,
201+
SyntaxKind.InterpolatedStringTextToken,
202+
"'",
203+
"'",
204+
trailing: default)),
205+
}))))),
206+
initializer: null)))),
207+
SyntaxFactory.ReturnStatement(SyntaxFactory.ObjectCreationExpression(
208+
type: SyntaxFactory.IdentifierName(nodeData.WrapperName),
209+
argumentList: SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.Argument(
210+
SyntaxFactory.CastExpression(
211+
type: SyntaxFactory.IdentifierName(concreteBase),
212+
expression: SyntaxFactory.IdentifierName("node"))))),
213+
initializer: null))),
214+
expressionBody: null,
215+
semicolonToken: default));
216+
129217
// public static implicit operator CSharpSyntaxNode(SyntaxWrapper wrapper)
130218
// {
131219
// return wrapper.node;

StyleCop.Analyzers/StyleCop.Analyzers/Lightup/.generated/StyleCop.Analyzers.CodeGeneration/StyleCop.Analyzers.CodeGeneration.SyntaxLightupGenerator/BaseObjectCreationExpressionSyntaxWrapper.g.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,21 @@ private BaseObjectCreationExpressionSyntaxWrapper(ExpressionSyntax node)
2020
}
2121

2222
public ExpressionSyntax SyntaxNode => this.node;
23+
public static explicit operator BaseObjectCreationExpressionSyntaxWrapper(SyntaxNode node)
24+
{
25+
if (node == null)
26+
{
27+
return default;
28+
}
29+
30+
if (!IsInstance(node))
31+
{
32+
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{WrappedTypeName}'");
33+
}
34+
35+
return new BaseObjectCreationExpressionSyntaxWrapper((ExpressionSyntax)node);
36+
}
37+
2338
public static implicit operator ExpressionSyntax(BaseObjectCreationExpressionSyntaxWrapper wrapper)
2439
{
2540
return wrapper.node;

StyleCop.Analyzers/StyleCop.Analyzers/Lightup/.generated/StyleCop.Analyzers.CodeGeneration/StyleCop.Analyzers.CodeGeneration.SyntaxLightupGenerator/BaseParameterSyntaxWrapper.g.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,21 @@ private BaseParameterSyntaxWrapper(CSharpSyntaxNode node)
2020
}
2121

2222
public CSharpSyntaxNode SyntaxNode => this.node;
23+
public static explicit operator BaseParameterSyntaxWrapper(SyntaxNode node)
24+
{
25+
if (node == null)
26+
{
27+
return default;
28+
}
29+
30+
if (!IsInstance(node))
31+
{
32+
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{WrappedTypeName}'");
33+
}
34+
35+
return new BaseParameterSyntaxWrapper((CSharpSyntaxNode)node);
36+
}
37+
2338
public static implicit operator CSharpSyntaxNode(BaseParameterSyntaxWrapper wrapper)
2439
{
2540
return wrapper.node;

StyleCop.Analyzers/StyleCop.Analyzers/Lightup/.generated/StyleCop.Analyzers.CodeGeneration/StyleCop.Analyzers.CodeGeneration.SyntaxLightupGenerator/BinaryPatternSyntaxWrapper.g.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,21 @@ private BinaryPatternSyntaxWrapper(CSharpSyntaxNode node)
2020
}
2121

2222
public CSharpSyntaxNode SyntaxNode => this.node;
23+
public static explicit operator BinaryPatternSyntaxWrapper(SyntaxNode node)
24+
{
25+
if (node == null)
26+
{
27+
return default;
28+
}
29+
30+
if (!IsInstance(node))
31+
{
32+
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{WrappedTypeName}'");
33+
}
34+
35+
return new BinaryPatternSyntaxWrapper((CSharpSyntaxNode)node);
36+
}
37+
2338
public static implicit operator CSharpSyntaxNode(BinaryPatternSyntaxWrapper wrapper)
2439
{
2540
return wrapper.node;

StyleCop.Analyzers/StyleCop.Analyzers/Lightup/.generated/StyleCop.Analyzers.CodeGeneration/StyleCop.Analyzers.CodeGeneration.SyntaxLightupGenerator/CasePatternSwitchLabelSyntaxWrapper.g.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,21 @@ private CasePatternSwitchLabelSyntaxWrapper(SwitchLabelSyntax node)
2020
}
2121

2222
public SwitchLabelSyntax SyntaxNode => this.node;
23+
public static explicit operator CasePatternSwitchLabelSyntaxWrapper(SyntaxNode node)
24+
{
25+
if (node == null)
26+
{
27+
return default;
28+
}
29+
30+
if (!IsInstance(node))
31+
{
32+
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{WrappedTypeName}'");
33+
}
34+
35+
return new CasePatternSwitchLabelSyntaxWrapper((SwitchLabelSyntax)node);
36+
}
37+
2338
public static implicit operator SwitchLabelSyntax(CasePatternSwitchLabelSyntaxWrapper wrapper)
2439
{
2540
return wrapper.node;

StyleCop.Analyzers/StyleCop.Analyzers/Lightup/.generated/StyleCop.Analyzers.CodeGeneration/StyleCop.Analyzers.CodeGeneration.SyntaxLightupGenerator/CommonForEachStatementSyntaxWrapper.g.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,21 @@ private CommonForEachStatementSyntaxWrapper(StatementSyntax node)
2020
}
2121

2222
public StatementSyntax SyntaxNode => this.node;
23+
public static explicit operator CommonForEachStatementSyntaxWrapper(SyntaxNode node)
24+
{
25+
if (node == null)
26+
{
27+
return default;
28+
}
29+
30+
if (!IsInstance(node))
31+
{
32+
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{WrappedTypeName}'");
33+
}
34+
35+
return new CommonForEachStatementSyntaxWrapper((StatementSyntax)node);
36+
}
37+
2338
public static implicit operator StatementSyntax(CommonForEachStatementSyntaxWrapper wrapper)
2439
{
2540
return wrapper.node;

StyleCop.Analyzers/StyleCop.Analyzers/Lightup/.generated/StyleCop.Analyzers.CodeGeneration/StyleCop.Analyzers.CodeGeneration.SyntaxLightupGenerator/ConstantPatternSyntaxWrapper.g.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,21 @@ private ConstantPatternSyntaxWrapper(CSharpSyntaxNode node)
2020
}
2121

2222
public CSharpSyntaxNode SyntaxNode => this.node;
23+
public static explicit operator ConstantPatternSyntaxWrapper(SyntaxNode node)
24+
{
25+
if (node == null)
26+
{
27+
return default;
28+
}
29+
30+
if (!IsInstance(node))
31+
{
32+
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{WrappedTypeName}'");
33+
}
34+
35+
return new ConstantPatternSyntaxWrapper((CSharpSyntaxNode)node);
36+
}
37+
2338
public static implicit operator CSharpSyntaxNode(ConstantPatternSyntaxWrapper wrapper)
2439
{
2540
return wrapper.node;

StyleCop.Analyzers/StyleCop.Analyzers/Lightup/.generated/StyleCop.Analyzers.CodeGeneration/StyleCop.Analyzers.CodeGeneration.SyntaxLightupGenerator/DeclarationExpressionSyntaxWrapper.g.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,21 @@ private DeclarationExpressionSyntaxWrapper(ExpressionSyntax node)
2020
}
2121

2222
public ExpressionSyntax SyntaxNode => this.node;
23+
public static explicit operator DeclarationExpressionSyntaxWrapper(SyntaxNode node)
24+
{
25+
if (node == null)
26+
{
27+
return default;
28+
}
29+
30+
if (!IsInstance(node))
31+
{
32+
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{WrappedTypeName}'");
33+
}
34+
35+
return new DeclarationExpressionSyntaxWrapper((ExpressionSyntax)node);
36+
}
37+
2338
public static implicit operator ExpressionSyntax(DeclarationExpressionSyntaxWrapper wrapper)
2439
{
2540
return wrapper.node;

StyleCop.Analyzers/StyleCop.Analyzers/Lightup/.generated/StyleCop.Analyzers.CodeGeneration/StyleCop.Analyzers.CodeGeneration.SyntaxLightupGenerator/DeclarationPatternSyntaxWrapper.g.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,21 @@ private DeclarationPatternSyntaxWrapper(CSharpSyntaxNode node)
2020
}
2121

2222
public CSharpSyntaxNode SyntaxNode => this.node;
23+
public static explicit operator DeclarationPatternSyntaxWrapper(SyntaxNode node)
24+
{
25+
if (node == null)
26+
{
27+
return default;
28+
}
29+
30+
if (!IsInstance(node))
31+
{
32+
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{WrappedTypeName}'");
33+
}
34+
35+
return new DeclarationPatternSyntaxWrapper((CSharpSyntaxNode)node);
36+
}
37+
2338
public static implicit operator CSharpSyntaxNode(DeclarationPatternSyntaxWrapper wrapper)
2439
{
2540
return wrapper.node;

StyleCop.Analyzers/StyleCop.Analyzers/Lightup/.generated/StyleCop.Analyzers.CodeGeneration/StyleCop.Analyzers.CodeGeneration.SyntaxLightupGenerator/DefaultConstraintSyntaxWrapper.g.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,21 @@ private DefaultConstraintSyntaxWrapper(TypeParameterConstraintSyntax node)
2020
}
2121

2222
public TypeParameterConstraintSyntax SyntaxNode => this.node;
23+
public static explicit operator DefaultConstraintSyntaxWrapper(SyntaxNode node)
24+
{
25+
if (node == null)
26+
{
27+
return default;
28+
}
29+
30+
if (!IsInstance(node))
31+
{
32+
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{WrappedTypeName}'");
33+
}
34+
35+
return new DefaultConstraintSyntaxWrapper((TypeParameterConstraintSyntax)node);
36+
}
37+
2338
public static implicit operator TypeParameterConstraintSyntax(DefaultConstraintSyntaxWrapper wrapper)
2439
{
2540
return wrapper.node;

0 commit comments

Comments
 (0)