Skip to content

Commit 9473a4c

Browse files
committed
Fix handling of extension fields
1 parent f28124f commit 9473a4c

File tree

9 files changed

+76
-53
lines changed

9 files changed

+76
-53
lines changed

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

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ private void GenerateSyntaxWrapper(in GeneratorExecutionContext context, SyntaxD
215215
SyntaxFactory.Argument(SyntaxFactory.IdentifierName("WrappedType")),
216216
SyntaxFactory.Argument(SyntaxFactory.InvocationExpression(
217217
expression: SyntaxFactory.IdentifierName("nameof"),
218-
argumentList: SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.Argument(field.GetPropertyNameExpression(syntaxData)))))),
218+
argumentList: SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.Argument(SyntaxFactory.IdentifierName(field.Name)))))),
219219
}))))));
220220
}
221221

@@ -269,7 +269,7 @@ private void GenerateSyntaxWrapper(in GeneratorExecutionContext context, SyntaxD
269269
SyntaxFactory.Argument(SyntaxFactory.IdentifierName("WrappedType")),
270270
SyntaxFactory.Argument(SyntaxFactory.InvocationExpression(
271271
expression: SyntaxFactory.IdentifierName("nameof"),
272-
argumentList: SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.Argument(field.GetPropertyNameExpression(syntaxData)))))),
272+
argumentList: SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList(SyntaxFactory.Argument(SyntaxFactory.IdentifierName(field.Name)))))),
273273
}))))));
274274
}
275275

@@ -366,6 +366,14 @@ private void GenerateSyntaxWrapper(in GeneratorExecutionContext context, SyntaxD
366366
expression: SyntaxFactory.ThisExpression(),
367367
name: SyntaxFactory.IdentifierName("SyntaxNode")),
368368
name: SyntaxFactory.IdentifierName(field.Name));
369+
370+
if (declaringNode.TryGetField(field.Name) is { IsExtensionField: true })
371+
{
372+
// this.SyntaxNode.OpenParenToken()
373+
returnExpression = SyntaxFactory.InvocationExpression(
374+
expression: returnExpression,
375+
argumentList: SyntaxFactory.ArgumentList());
376+
}
369377
}
370378
}
371379
else if (field.IsWrappedSeparatedSyntaxList(syntaxData, out var elementNode))
@@ -1011,10 +1019,10 @@ public NodeData(in GeneratorExecutionContext context, XElement element)
10111019

10121020
this.Name = element.Attribute("Name").Value;
10131021

1014-
var existingType = context.Compilation.GetTypeByMetadataName($"Microsoft.CodeAnalysis.CSharp.Syntax.{this.Name}")
1022+
this.ExistingType = context.Compilation.GetTypeByMetadataName($"Microsoft.CodeAnalysis.CSharp.Syntax.{this.Name}")
10151023
?? context.Compilation.GetTypeByMetadataName($"Microsoft.CodeAnalysis.CSharp.{this.Name}")
10161024
?? context.Compilation.GetTypeByMetadataName($"Microsoft.CodeAnalysis.{this.Name}");
1017-
if (existingType?.DeclaredAccessibility == Accessibility.Public)
1025+
if (this.ExistingType?.DeclaredAccessibility == Accessibility.Public)
10181026
{
10191027
this.WrapperName = null;
10201028
}
@@ -1031,6 +1039,8 @@ public NodeData(in GeneratorExecutionContext context, XElement element)
10311039

10321040
public string Name { get; }
10331041

1042+
public INamedTypeSymbol? ExistingType { get; }
1043+
10341044
public string? WrapperName { get; }
10351045

10361046
public string BaseName { get; }
@@ -1078,6 +1088,18 @@ public FieldData(NodeData nodeData, XElement element)
10781088

10791089
public bool IsOverride { get; }
10801090

1091+
/// <summary>
1092+
/// Gets a value indicating whether this field is implemented as an extension method in the lightup layer.
1093+
/// </summary>
1094+
public bool IsExtensionField
1095+
{
1096+
get
1097+
{
1098+
return this.nodeData.ExistingType is not null
1099+
&& this.nodeData.ExistingType.GetMembers(this.Name).IsEmpty;
1100+
}
1101+
}
1102+
10811103
public NodeData GetDeclaringNode(SyntaxData syntaxData)
10821104
{
10831105
for (var current = this.nodeData; current is not null; current = syntaxData.TryGetNode(current.BaseName))
@@ -1092,21 +1114,6 @@ public NodeData GetDeclaringNode(SyntaxData syntaxData)
10921114
throw new NotSupportedException("Unable to find declaring node.");
10931115
}
10941116

1095-
public NameSyntax GetPropertyNameExpression(SyntaxData syntaxData)
1096-
{
1097-
var declaringNode = this.GetDeclaringNode(syntaxData);
1098-
if (declaringNode == this.nodeData)
1099-
{
1100-
return SyntaxFactory.IdentifierName(this.Name);
1101-
}
1102-
else
1103-
{
1104-
return SyntaxFactory.QualifiedName(
1105-
SyntaxFactory.IdentifierName(declaringNode.WrapperName ?? declaringNode.Name),
1106-
SyntaxFactory.IdentifierName(this.Name));
1107-
}
1108-
}
1109-
11101117
public bool IsWrappedSeparatedSyntaxList(SyntaxData syntaxData, [NotNullWhen(true)] out NodeData? element)
11111118
{
11121119
if (this.Type.StartsWith("SeparatedSyntaxList<") && this.Type.EndsWith(">"))

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ static CasePatternSwitchLabelSyntaxWrapper()
2525
WrappedType = SyntaxWrapperHelper.GetWrappedType(typeof(CasePatternSwitchLabelSyntaxWrapper));
2626
PatternAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<SwitchLabelSyntax, CSharpSyntaxNode>(WrappedType, nameof(Pattern));
2727
WhenClauseAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<SwitchLabelSyntax, CSharpSyntaxNode>(WrappedType, nameof(WhenClause));
28-
WithKeywordAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<SwitchLabelSyntax, SyntaxToken>(WrappedType, nameof(SwitchLabelSyntax.Keyword));
28+
WithKeywordAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<SwitchLabelSyntax, SyntaxToken>(WrappedType, nameof(Keyword));
2929
WithPatternAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<SwitchLabelSyntax, CSharpSyntaxNode>(WrappedType, nameof(Pattern));
3030
WithWhenClauseAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<SwitchLabelSyntax, CSharpSyntaxNode>(WrappedType, nameof(WhenClause));
31-
WithColonTokenAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<SwitchLabelSyntax, SyntaxToken>(WrappedType, nameof(SwitchLabelSyntax.ColonToken));
31+
WithColonTokenAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<SwitchLabelSyntax, SyntaxToken>(WrappedType, nameof(ColonToken));
3232
}
3333

3434
private CasePatternSwitchLabelSyntaxWrapper(SwitchLabelSyntax node)

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

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,15 @@ static ForEachVariableStatementSyntaxWrapper()
2828
{
2929
WrappedType = SyntaxWrapperHelper.GetWrappedType(typeof(ForEachVariableStatementSyntaxWrapper));
3030
VariableAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<StatementSyntax, ExpressionSyntax>(WrappedType, nameof(Variable));
31-
WithAttributeListsAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, SyntaxList<AttributeListSyntax>>(WrappedType, nameof(StatementSyntax.AttributeLists));
32-
WithAwaitKeywordAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, SyntaxToken>(WrappedType, nameof(CommonForEachStatementSyntaxWrapper.AwaitKeyword));
33-
WithForEachKeywordAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, SyntaxToken>(WrappedType, nameof(CommonForEachStatementSyntaxWrapper.ForEachKeyword));
34-
WithOpenParenTokenAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, SyntaxToken>(WrappedType, nameof(CommonForEachStatementSyntaxWrapper.OpenParenToken));
31+
WithAttributeListsAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, SyntaxList<AttributeListSyntax>>(WrappedType, nameof(AttributeLists));
32+
WithAwaitKeywordAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, SyntaxToken>(WrappedType, nameof(AwaitKeyword));
33+
WithForEachKeywordAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, SyntaxToken>(WrappedType, nameof(ForEachKeyword));
34+
WithOpenParenTokenAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, SyntaxToken>(WrappedType, nameof(OpenParenToken));
3535
WithVariableAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, ExpressionSyntax>(WrappedType, nameof(Variable));
36-
WithInKeywordAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, SyntaxToken>(WrappedType, nameof(CommonForEachStatementSyntaxWrapper.InKeyword));
37-
WithExpressionAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, ExpressionSyntax>(WrappedType, nameof(CommonForEachStatementSyntaxWrapper.Expression));
38-
WithCloseParenTokenAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, SyntaxToken>(WrappedType, nameof(CommonForEachStatementSyntaxWrapper.CloseParenToken));
39-
WithStatementAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, StatementSyntax>(WrappedType, nameof(CommonForEachStatementSyntaxWrapper.Statement));
36+
WithInKeywordAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, SyntaxToken>(WrappedType, nameof(InKeyword));
37+
WithExpressionAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, ExpressionSyntax>(WrappedType, nameof(Expression));
38+
WithCloseParenTokenAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, SyntaxToken>(WrappedType, nameof(CloseParenToken));
39+
WithStatementAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, StatementSyntax>(WrappedType, nameof(Statement));
4040
}
4141

4242
private ForEachVariableStatementSyntaxWrapper(StatementSyntax node)
@@ -45,6 +45,14 @@ private ForEachVariableStatementSyntaxWrapper(StatementSyntax node)
4545
}
4646

4747
public StatementSyntax SyntaxNode => this.node;
48+
public SyntaxList<AttributeListSyntax> AttributeLists
49+
{
50+
get
51+
{
52+
return this.SyntaxNode.AttributeLists();
53+
}
54+
}
55+
4856
public SyntaxToken AwaitKeyword
4957
{
5058
get

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ namespace StyleCop.Analyzers.Lightup
2020
static FunctionPointerParameterSyntaxWrapper()
2121
{
2222
WrappedType = SyntaxWrapperHelper.GetWrappedType(typeof(FunctionPointerParameterSyntaxWrapper));
23-
WithAttributeListsAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<CSharpSyntaxNode, SyntaxList<AttributeListSyntax>>(WrappedType, nameof(BaseParameterSyntaxWrapper.AttributeLists));
24-
WithModifiersAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<CSharpSyntaxNode, SyntaxTokenList>(WrappedType, nameof(BaseParameterSyntaxWrapper.Modifiers));
25-
WithTypeAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<CSharpSyntaxNode, TypeSyntax>(WrappedType, nameof(BaseParameterSyntaxWrapper.Type));
23+
WithAttributeListsAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<CSharpSyntaxNode, SyntaxList<AttributeListSyntax>>(WrappedType, nameof(AttributeLists));
24+
WithModifiersAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<CSharpSyntaxNode, SyntaxTokenList>(WrappedType, nameof(Modifiers));
25+
WithTypeAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<CSharpSyntaxNode, TypeSyntax>(WrappedType, nameof(Type));
2626
}
2727

2828
private FunctionPointerParameterSyntaxWrapper(CSharpSyntaxNode node)

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ namespace StyleCop.Analyzers.Lightup
2020
static ImplicitObjectCreationExpressionSyntaxWrapper()
2121
{
2222
WrappedType = SyntaxWrapperHelper.GetWrappedType(typeof(ImplicitObjectCreationExpressionSyntaxWrapper));
23-
WithNewKeywordAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<ExpressionSyntax, SyntaxToken>(WrappedType, nameof(BaseObjectCreationExpressionSyntaxWrapper.NewKeyword));
24-
WithArgumentListAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<ExpressionSyntax, ArgumentListSyntax>(WrappedType, nameof(BaseObjectCreationExpressionSyntaxWrapper.ArgumentList));
25-
WithInitializerAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<ExpressionSyntax, InitializerExpressionSyntax>(WrappedType, nameof(BaseObjectCreationExpressionSyntaxWrapper.Initializer));
23+
WithNewKeywordAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<ExpressionSyntax, SyntaxToken>(WrappedType, nameof(NewKeyword));
24+
WithArgumentListAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<ExpressionSyntax, ArgumentListSyntax>(WrappedType, nameof(ArgumentList));
25+
WithInitializerAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<ExpressionSyntax, InitializerExpressionSyntax>(WrappedType, nameof(Initializer));
2626
}
2727

2828
private ImplicitObjectCreationExpressionSyntaxWrapper(ExpressionSyntax node)

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ static LocalFunctionStatementSyntaxWrapper()
4545
BodyAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<StatementSyntax, BlockSyntax>(WrappedType, nameof(Body));
4646
ExpressionBodyAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<StatementSyntax, ArrowExpressionClauseSyntax>(WrappedType, nameof(ExpressionBody));
4747
SemicolonTokenAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<StatementSyntax, SyntaxToken>(WrappedType, nameof(SemicolonToken));
48-
WithAttributeListsAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, SyntaxList<AttributeListSyntax>>(WrappedType, nameof(StatementSyntax.AttributeLists));
48+
WithAttributeListsAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, SyntaxList<AttributeListSyntax>>(WrappedType, nameof(AttributeLists));
4949
WithModifiersAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, SyntaxTokenList>(WrappedType, nameof(Modifiers));
5050
WithReturnTypeAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, TypeSyntax>(WrappedType, nameof(ReturnType));
5151
WithIdentifierAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<StatementSyntax, SyntaxToken>(WrappedType, nameof(Identifier));
@@ -63,6 +63,14 @@ private LocalFunctionStatementSyntaxWrapper(StatementSyntax node)
6363
}
6464

6565
public StatementSyntax SyntaxNode => this.node;
66+
public SyntaxList<AttributeListSyntax> AttributeLists
67+
{
68+
get
69+
{
70+
return this.SyntaxNode.AttributeLists();
71+
}
72+
}
73+
6674
public SyntaxTokenList Modifiers
6775
{
6876
get

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ static NullableDirectiveTriviaSyntaxWrapper()
2929
NullableKeywordAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<DirectiveTriviaSyntax, SyntaxToken>(WrappedType, nameof(NullableKeyword));
3030
SettingTokenAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<DirectiveTriviaSyntax, SyntaxToken>(WrappedType, nameof(SettingToken));
3131
TargetTokenAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<DirectiveTriviaSyntax, SyntaxToken>(WrappedType, nameof(TargetToken));
32-
WithHashTokenAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<DirectiveTriviaSyntax, SyntaxToken>(WrappedType, nameof(DirectiveTriviaSyntax.HashToken));
32+
WithHashTokenAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<DirectiveTriviaSyntax, SyntaxToken>(WrappedType, nameof(HashToken));
3333
WithNullableKeywordAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<DirectiveTriviaSyntax, SyntaxToken>(WrappedType, nameof(NullableKeyword));
3434
WithSettingTokenAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<DirectiveTriviaSyntax, SyntaxToken>(WrappedType, nameof(SettingToken));
3535
WithTargetTokenAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<DirectiveTriviaSyntax, SyntaxToken>(WrappedType, nameof(TargetToken));
36-
WithEndOfDirectiveTokenAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<DirectiveTriviaSyntax, SyntaxToken>(WrappedType, nameof(DirectiveTriviaSyntax.EndOfDirectiveToken));
37-
WithIsActiveAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<DirectiveTriviaSyntax, bool>(WrappedType, nameof(DirectiveTriviaSyntax.IsActive));
36+
WithEndOfDirectiveTokenAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<DirectiveTriviaSyntax, SyntaxToken>(WrappedType, nameof(EndOfDirectiveToken));
37+
WithIsActiveAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<DirectiveTriviaSyntax, bool>(WrappedType, nameof(IsActive));
3838
}
3939

4040
private NullableDirectiveTriviaSyntaxWrapper(DirectiveTriviaSyntax node)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ static PrimaryConstructorBaseTypeSyntaxWrapper()
2121
{
2222
WrappedType = SyntaxWrapperHelper.GetWrappedType(typeof(PrimaryConstructorBaseTypeSyntaxWrapper));
2323
ArgumentListAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<BaseTypeSyntax, ArgumentListSyntax>(WrappedType, nameof(ArgumentList));
24-
WithTypeAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<BaseTypeSyntax, TypeSyntax>(WrappedType, nameof(BaseTypeSyntax.Type));
24+
WithTypeAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<BaseTypeSyntax, TypeSyntax>(WrappedType, nameof(Type));
2525
WithArgumentListAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<BaseTypeSyntax, ArgumentListSyntax>(WrappedType, nameof(ArgumentList));
2626
}
2727

0 commit comments

Comments
 (0)