Skip to content

Commit 847bf63

Browse files
Add -Extension parameter for extension methods (#35)
1 parent cc01dcb commit 847bf63

File tree

5 files changed

+47
-2
lines changed

5 files changed

+47
-2
lines changed

docs/en-US/Find-Member.md

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ Find properties, methods, fields, etc that fit specific criteria.
1616

1717
```powershell
1818
19-
Find-Member [[-FilterScript] <scriptblock>] [-ParameterType <ScriptBlockStringOrType>] [-GenericParameter <ScriptBlockStringOrType>] [-ParameterCount <RangeExpression[]>] [-GenericParameterCount <RangeExpression[]>] [-ReturnType <ScriptBlockStringOrType>] [-IncludeSpecialName] [-Decoration <ScriptBlockStringOrType>] [-MemberType <MemberTypes>] [-Static] [-Instance] [-Abstract] [-Virtual] [-Declared] [-IncludeObject] [-RecurseNestedType] [-Name <string>] [-Force] [-RegularExpression] [-InputObject <psobject>] [-Not] [-ResolutionMap <hashtable>] [-AccessView <AccessView>] [<CommonParameters>]
19+
Find-Member [[-FilterScript] <scriptblock>] [-ParameterType <ScriptBlockStringOrType>] [-GenericParameter <ScriptBlockStringOrType>] [-ParameterCount <RangeExpression[]>] [-GenericParameterCount <RangeExpression[]>] [-ReturnType <ScriptBlockStringOrType>] [-IncludeSpecialName] [-Decoration <ScriptBlockStringOrType>] [-MemberType <MemberTypes>] [-Static] [-Instance] [-Abstract] [-Virtual] [-Declared] [-IncludeObject] [-RecurseNestedType] [-Extension] [-Name <string>] [-Force] [-RegularExpression] [-InputObject <psobject>] [-Not] [-ResolutionMap <hashtable>] [-AccessView <AccessView>] [<CommonParameters>]
2020
```
2121

2222
### ByName
2323

2424
```powershell
25-
Find-Member [[-Name] <string>] [-ParameterType <ScriptBlockStringOrType>] [-GenericParameter <ScriptBlockStringOrType>] [-ParameterCount <RangeExpression[]>] [-GenericParameterCount <RangeExpression[]>] [-ReturnType <ScriptBlockStringOrType>] [-IncludeSpecialName] [-Decoration <ScriptBlockStringOrType>] [-MemberType <MemberTypes>] [-Static] [-Instance] [-Abstract] [-Virtual] [-Declared] [-IncludeObject] [-RecurseNestedType] [-FilterScript <scriptblock>] [-Force] [-RegularExpression] [-InputObject <psobject>] [-Not] [-ResolutionMap <hashtable>] [-AccessView <AccessView>] [<CommonParameters>]
25+
Find-Member [[-Name] <string>] [-ParameterType <ScriptBlockStringOrType>] [-GenericParameter <ScriptBlockStringOrType>] [-ParameterCount <RangeExpression[]>] [-GenericParameterCount <RangeExpression[]>] [-ReturnType <ScriptBlockStringOrType>] [-IncludeSpecialName] [-Decoration <ScriptBlockStringOrType>] [-MemberType <MemberTypes>] [-Static] [-Instance] [-Abstract] [-Virtual] [-Declared] [-IncludeObject] [-RecurseNestedType] [-Extension] [-FilterScript <scriptblock>] [-Force] [-RegularExpression] [-InputObject <psobject>] [-Not] [-ResolutionMap <hashtable>] [-AccessView <AccessView>] [<CommonParameters>]
2626
```
2727

2828
## DESCRIPTION
@@ -604,6 +604,23 @@ Accept pipeline input: False
604604
Accept wildcard characters: False
605605
```
606606

607+
### -Extension
608+
609+
When specified, members must be decorated with `ExtensionAttribute` to match. This
610+
is how the C# compiler marks extension methods like those found in `System.Linq.Enumerable`.
611+
612+
```yaml
613+
Type: SwitchParameter
614+
Parameter Sets: (All)
615+
Aliases: ext
616+
617+
Required: False
618+
Position: Named
619+
Default value: None
620+
Accept pipeline input: False
621+
Accept wildcard characters: False
622+
```
623+
607624
### -ResolutionMap
608625

609626
Specifies a hashtable of `name` to `ScriptBlockStringOrType` to create your own keywords and/or override type resolution for any signature in this command.

src/ClassExplorer/Commands/FindMemberCommand.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,14 @@ public SwitchParameter RecurseNestedType
181181
set => _options.RecurseNestedType = value;
182182
}
183183

184+
[Parameter]
185+
[Alias("ext")]
186+
public SwitchParameter Extension
187+
{
188+
get => _options.Extension;
189+
set => _options.Extension = value;
190+
}
191+
184192
private MemberSearch<PipelineEmitter<MemberInfo>> _search = null!;
185193

186194
private protected override void OnNoInput()

src/ClassExplorer/MemberSearch.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,11 @@ private static bool IsStatic(MemberInfo member)
138138

139139
private void SearchSingleType(Type type)
140140
{
141+
if (_options.Extension && !_options.Not && !type.IsDefined(typeof(ExtensionAttribute)))
142+
{
143+
return;
144+
}
145+
141146
type.FindMembers(
142147
_options.MemberType,
143148
_flags,
@@ -211,6 +216,11 @@ protected override void InitializeFastFilters(List<Filter<MemberInfo>> filters,
211216
filters.AddFilter(static (member, _) => member.DeclaringType == member.ReflectedType);
212217
}
213218

219+
if (_options.Extension)
220+
{
221+
filters.AddFilter(static (member, _) => member.IsDefined(typeof(ExtensionAttribute)));
222+
}
223+
214224
if (!_options.IncludeObject)
215225
{
216226
filters.AddFilter(

src/ClassExplorer/MemberSearchOptions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,6 @@ internal class MemberSearchOptions : ReflectionSearchOptions
3333
public bool IncludeObject { get; set; }
3434

3535
public bool RecurseNestedType { get; set; }
36+
37+
public bool Extension { get; set; }
3638
}

src/ClassExplorer/SignatureWriter.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,14 @@ public SignatureWriter TypeInfo(ParameterInfo parameter)
710710
{
711711
RefModifier(parameter);
712712

713+
if (parameter.Position is 0
714+
&& parameter.Member is MethodInfo method
715+
&& method.IsStatic
716+
&& method.IsDefined(typeof(ExtensionAttribute)))
717+
{
718+
Keyword("this").Space();
719+
}
720+
713721
if (parameter.IsDefined(typeof(ParamArrayAttribute), inherit: false))
714722
{
715723
Keyword("params").Space();

0 commit comments

Comments
 (0)