Skip to content

Commit e66dcfb

Browse files
Add ExtensionDeclaration syntax node
1 parent f27066c commit e66dcfb

File tree

6 files changed

+120
-1
lines changed

6 files changed

+120
-1
lines changed

ICSharpCode.Decompiler/CSharp/OutputVisitor/CSharpOutputVisitor.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2417,6 +2417,36 @@ public virtual void VisitEnumMemberDeclaration(EnumMemberDeclaration enumMemberD
24172417
EndNode(enumMemberDeclaration);
24182418
}
24192419

2420+
public virtual void VisitExtensionDeclaration(ExtensionDeclaration extensionDeclaration)
2421+
{
2422+
StartNode(extensionDeclaration);
2423+
WriteAttributes(extensionDeclaration.Attributes);
2424+
WriteModifiers(extensionDeclaration.ModifierTokens);
2425+
WriteKeyword(ExtensionDeclaration.ExtensionKeywordRole);
2426+
WriteTypeParameters(extensionDeclaration.TypeParameters);
2427+
Space(policy.SpaceBeforeMethodDeclarationParentheses);
2428+
WriteCommaSeparatedListInParenthesis(extensionDeclaration.ReceiverParameters, policy.SpaceWithinMethodDeclarationParentheses);
2429+
foreach (Constraint constraint in extensionDeclaration.Constraints)
2430+
{
2431+
constraint.AcceptVisitor(this);
2432+
}
2433+
OpenBrace(policy.ClassBraceStyle);
2434+
bool first = true;
2435+
foreach (var member in extensionDeclaration.Members)
2436+
{
2437+
if (!first)
2438+
{
2439+
for (int i = 0; i < policy.MinimumBlankLinesBetweenMembers; i++)
2440+
NewLine();
2441+
}
2442+
first = false;
2443+
member.AcceptVisitor(this);
2444+
}
2445+
CloseBrace(policy.ClassBraceStyle);
2446+
NewLine();
2447+
EndNode(extensionDeclaration);
2448+
}
2449+
24202450
public virtual void VisitEventDeclaration(EventDeclaration eventDeclaration)
24212451
{
24222452
StartNode(eventDeclaration);

ICSharpCode.Decompiler/CSharp/Syntax/DepthFirstAstVisitor.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,11 @@ public virtual void VisitEnumMemberDeclaration(EnumMemberDeclaration enumMemberD
157157
VisitChildren(enumMemberDeclaration);
158158
}
159159

160+
public virtual void VisitExtensionDeclaration(ExtensionDeclaration extensionDeclaration)
161+
{
162+
VisitChildren(extensionDeclaration);
163+
}
164+
160165
public virtual void VisitUsingDeclaration(UsingDeclaration usingDeclaration)
161166
{
162167
VisitChildren(usingDeclaration);
@@ -840,6 +845,11 @@ public virtual T VisitEnumMemberDeclaration(EnumMemberDeclaration enumMemberDecl
840845
return VisitChildren(enumMemberDeclaration);
841846
}
842847

848+
public virtual T VisitExtensionDeclaration(ExtensionDeclaration extensionDeclaration)
849+
{
850+
return VisitChildren(extensionDeclaration);
851+
}
852+
843853
public virtual T VisitUsingDeclaration(UsingDeclaration usingDeclaration)
844854
{
845855
return VisitChildren(usingDeclaration);
@@ -1523,6 +1533,11 @@ public virtual S VisitEnumMemberDeclaration(EnumMemberDeclaration enumMemberDecl
15231533
return VisitChildren(enumMemberDeclaration, data);
15241534
}
15251535

1536+
public virtual S VisitExtensionDeclaration(ExtensionDeclaration extensionDeclaration, T data)
1537+
{
1538+
return VisitChildren(extensionDeclaration, data);
1539+
}
1540+
15261541
public virtual S VisitUsingDeclaration(UsingDeclaration usingDeclaration, T data)
15271542
{
15281543
return VisitChildren(usingDeclaration, data);

ICSharpCode.Decompiler/CSharp/Syntax/IAstVisitor.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1717
// DEALINGS IN THE SOFTWARE.
1818

19-
2019
namespace ICSharpCode.Decompiler.CSharp.Syntax
2120
{
2221
/// <summary>
@@ -136,6 +135,7 @@ public interface IAstVisitor
136135
void VisitVariableInitializer(VariableInitializer variableInitializer);
137136
void VisitFixedFieldDeclaration(FixedFieldDeclaration fixedFieldDeclaration);
138137
void VisitFixedVariableInitializer(FixedVariableInitializer fixedVariableInitializer);
138+
void VisitExtensionDeclaration(ExtensionDeclaration extensionDeclaration);
139139

140140
void VisitSyntaxTree(SyntaxTree syntaxTree);
141141
void VisitSimpleType(SimpleType simpleType);
@@ -285,6 +285,7 @@ public interface IAstVisitor<out S>
285285
S VisitVariableInitializer(VariableInitializer variableInitializer);
286286
S VisitFixedFieldDeclaration(FixedFieldDeclaration fixedFieldDeclaration);
287287
S VisitFixedVariableInitializer(FixedVariableInitializer fixedVariableInitializer);
288+
S VisitExtensionDeclaration(ExtensionDeclaration extensionDeclaration);
288289

289290
S VisitSyntaxTree(SyntaxTree syntaxTree);
290291
S VisitSimpleType(SimpleType simpleType);
@@ -434,6 +435,7 @@ public interface IAstVisitor<in T, out S>
434435
S VisitVariableInitializer(VariableInitializer variableInitializer, T data);
435436
S VisitFixedFieldDeclaration(FixedFieldDeclaration fixedFieldDeclaration, T data);
436437
S VisitFixedVariableInitializer(FixedVariableInitializer fixedVariableInitializer, T data);
438+
S VisitExtensionDeclaration(ExtensionDeclaration extensionDeclaration, T data);
437439

438440
S VisitSyntaxTree(SyntaxTree syntaxTree, T data);
439441
S VisitSimpleType(SimpleType simpleType, T data);
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Copyright (c) 2025 Siegfried Pammer
2+
//
3+
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
4+
// software and associated documentation files (the "Software"), to deal in the Software
5+
// without restriction, including without limitation the rights to use, copy, modify, merge,
6+
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
7+
// to whom the Software is furnished to do so, subject to the following conditions:
8+
//
9+
// The above copyright notice and this permission notice shall be included in all copies or
10+
// substantial portions of the Software.
11+
//
12+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
13+
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14+
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
15+
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
16+
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
17+
// DEALINGS IN THE SOFTWARE.
18+
19+
using ICSharpCode.Decompiler.TypeSystem;
20+
21+
namespace ICSharpCode.Decompiler.CSharp.Syntax
22+
{
23+
public class ExtensionDeclaration : EntityDeclaration
24+
{
25+
public readonly static TokenRole ExtensionKeywordRole = new TokenRole("extension");
26+
27+
public override SymbolKind SymbolKind => throw new System.NotImplementedException();
28+
29+
public AstNodeCollection<TypeParameterDeclaration> TypeParameters {
30+
get { return GetChildrenByRole(Roles.TypeParameter); }
31+
}
32+
33+
public AstNodeCollection<ParameterDeclaration> ReceiverParameters {
34+
get { return GetChildrenByRole(Roles.Parameter); }
35+
}
36+
37+
public AstNodeCollection<Constraint> Constraints {
38+
get { return GetChildrenByRole(Roles.Constraint); }
39+
}
40+
41+
public AstNodeCollection<EntityDeclaration> Members {
42+
get { return GetChildrenByRole(Roles.TypeMemberRole); }
43+
}
44+
45+
public ExtensionDeclaration()
46+
{
47+
}
48+
49+
public override void AcceptVisitor(IAstVisitor visitor)
50+
{
51+
visitor.VisitExtensionDeclaration(this);
52+
}
53+
54+
public override T AcceptVisitor<T>(IAstVisitor<T> visitor)
55+
{
56+
return visitor.VisitExtensionDeclaration(this);
57+
}
58+
59+
public override S AcceptVisitor<T, S>(IAstVisitor<T, S> visitor, T data)
60+
{
61+
return visitor.VisitExtensionDeclaration(this, data);
62+
}
63+
64+
protected internal override bool DoMatch(AstNode other, PatternMatching.Match match)
65+
{
66+
var o = other as ExtensionDeclaration;
67+
return o != null;
68+
}
69+
}
70+
}

ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
<Compile Include="CSharp\CallBuilder.cs" />
105105
<Compile Include="CSharp\CSharpLanguageVersion.cs" />
106106
<Compile Include="CSharp\Syntax\Expressions\RecursivePatternExpression.cs" />
107+
<Compile Include="CSharp\Syntax\TypeMembers\ExtensionDeclaration.cs" />
107108
<Compile Include="DecompilationProgress.cs" />
108109
<Compile Include="Disassembler\IEntityProcessor.cs" />
109110
<Compile Include="Disassembler\SortByNameProcessor.cs" />

ILSpy/Languages/CSharpHighlightingTokenWriter.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ public override void WriteKeyword(Role role, string keyword)
242242
case "class":
243243
case "interface":
244244
case "delegate":
245+
case "extension":
245246
color = referenceTypeKeywordsColor;
246247
break;
247248
case "record":

0 commit comments

Comments
 (0)