Skip to content

Commit 8631dba

Browse files
Add index signature keyword (#36)
1 parent 847bf63 commit 8631dba

File tree

4 files changed

+334
-1
lines changed

4 files changed

+334
-1
lines changed

docs/en-US/about_Type_Signatures.help.md

Lines changed: 256 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ Type signatures are a custom query language built into PowerShell type expressio
2828
* [`interface`](#interface)
2929
* [`abstract`](#abstract)
3030
* [`concrete`](#concrete)
31+
* [`index`](#index)
3132
* [`number`](#number)
3233
* [`decoration`, `hasattr`](#decoration-hasattr)
3334
* [`generic`](#generic)
@@ -2734,6 +2735,261 @@ void Example(FileInfo value);
27342735
</tr>
27352736
</table>
27362737

2738+
## `index`
2739+
2740+
<sup>([Back to Top](#keywords))</sup>
2741+
2742+
Matches only parameters in at a specific index in the method.
2743+
2744+
<table>
2745+
<tr>
2746+
<td colspan="2" width="1000">
2747+
2748+
```powershell
2749+
Find-Member -ParameterType { [allof[index0, string]] }
2750+
```
2751+
2752+
</td>
2753+
</tr>
2754+
<tr>
2755+
<th width="1">
2756+
2757+
</th>
2758+
<th>
2759+
2760+
Signature
2761+
2762+
</th>
2763+
</tr>
2764+
<tr>
2765+
<td width="1">
2766+
2767+
:x:
2768+
2769+
</td>
2770+
<td>
2771+
2772+
```csharp
2773+
void Example(IDisposable disposable);
2774+
```
2775+
2776+
</td>
2777+
</tr>
2778+
<tr>
2779+
<td width="1">
2780+
2781+
:heavy_check_mark:
2782+
2783+
</td>
2784+
<td>
2785+
2786+
```csharp
2787+
void Example(string str);
2788+
```
2789+
2790+
</td>
2791+
</tr>
2792+
<tr>
2793+
<td width="1">
2794+
2795+
:x:
2796+
2797+
</td>
2798+
<td>
2799+
2800+
```csharp
2801+
void Example(int value, string str);
2802+
```
2803+
2804+
</td>
2805+
</tr>
2806+
</table>
2807+
2808+
<table>
2809+
<tr>
2810+
<td colspan="2" width="1000">
2811+
2812+
```powershell
2813+
Find-Member -ParameterType { [allof[index1.., string]] }
2814+
```
2815+
2816+
</td>
2817+
</tr>
2818+
<tr>
2819+
<th width="1">
2820+
2821+
</th>
2822+
<th>
2823+
2824+
Signature
2825+
2826+
</th>
2827+
</tr>
2828+
<tr>
2829+
<td width="1">
2830+
2831+
:x:
2832+
2833+
</td>
2834+
<td>
2835+
2836+
```csharp
2837+
void Example(IDisposable disposable);
2838+
```
2839+
2840+
</td>
2841+
</tr>
2842+
<tr>
2843+
<td width="1">
2844+
2845+
:x:
2846+
2847+
</td>
2848+
<td>
2849+
2850+
```csharp
2851+
void Example(string str);
2852+
```
2853+
2854+
</td>
2855+
</tr>
2856+
<tr>
2857+
<td width="1">
2858+
2859+
:heavy_check_mark:
2860+
2861+
</td>
2862+
<td>
2863+
2864+
```csharp
2865+
void Example(int value, string str);
2866+
```
2867+
2868+
</td>
2869+
</tr>
2870+
<tr>
2871+
<td width="1">
2872+
2873+
:heavy_check_mark:
2874+
2875+
</td>
2876+
<td>
2877+
2878+
```csharp
2879+
void Example(int value, object obj, string str);
2880+
```
2881+
2882+
</td>
2883+
</tr>
2884+
<tr>
2885+
<td width="1">
2886+
2887+
:heavy_check_mark:
2888+
2889+
</td>
2890+
<td>
2891+
2892+
```csharp
2893+
void Example(string value, object obj, string str);
2894+
```
2895+
2896+
</td>
2897+
</tr>
2898+
</table>
2899+
2900+
<table>
2901+
<tr>
2902+
<td colspan="2" width="1000">
2903+
2904+
```powershell
2905+
# You can also use `i`
2906+
Find-Member -ParameterType { [allof[i0..1, string]] }
2907+
```
2908+
2909+
</td>
2910+
</tr>
2911+
<tr>
2912+
<th width="1">
2913+
2914+
</th>
2915+
<th>
2916+
2917+
Signature
2918+
2919+
</th>
2920+
</tr>
2921+
<tr>
2922+
<td width="1">
2923+
2924+
:x:
2925+
2926+
</td>
2927+
<td>
2928+
2929+
```csharp
2930+
void Example(IDisposable disposable);
2931+
```
2932+
2933+
</td>
2934+
</tr>
2935+
<tr>
2936+
<td width="1">
2937+
2938+
:heavy_check_mark:
2939+
2940+
</td>
2941+
<td>
2942+
2943+
```csharp
2944+
void Example(string str);
2945+
```
2946+
2947+
</td>
2948+
</tr>
2949+
<tr>
2950+
<td width="1">
2951+
2952+
:heavy_check_mark:
2953+
2954+
</td>
2955+
<td>
2956+
2957+
```csharp
2958+
void Example(int value, string str);
2959+
```
2960+
2961+
</td>
2962+
</tr>
2963+
<tr>
2964+
<td width="1">
2965+
2966+
:x:
2967+
2968+
</td>
2969+
<td>
2970+
2971+
```csharp
2972+
void Example(int value, object obj, string str);
2973+
```
2974+
2975+
</td>
2976+
</tr>
2977+
<tr>
2978+
<td width="1">
2979+
2980+
:heavy_check_mark:
2981+
2982+
</td>
2983+
<td>
2984+
2985+
```csharp
2986+
void Example(string value, object obj, string str);
2987+
```
2988+
2989+
</td>
2990+
</tr>
2991+
</table>
2992+
27372993
## `number`
27382994

27392995
<sup>([Back to Top](#keywords))</sup>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System;
2+
using System.Reflection;
3+
4+
namespace ClassExplorer.Signatures;
5+
6+
internal sealed class ParameterIndexSignature : TypeSignature
7+
{
8+
public ParameterIndexSignature(RangeExpression range)
9+
{
10+
Poly.Assert(range is not null);
11+
Range = range;
12+
}
13+
14+
public RangeExpression Range { get; }
15+
16+
public override bool IsMatch(Type type) => false;
17+
18+
public override bool IsMatch(ParameterInfo parameter) => Range.IsInRange(parameter.Position);
19+
}

src/ClassExplorer/Signatures/SignatureParser.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using System.Collections.ObjectModel;
55
using System.Diagnostics.CodeAnalysis;
66
using System.Linq;
7-
using System.Linq.Expressions;
87
using System.Management.Automation;
98
using System.Management.Automation.Language;
109
using System.Reflection;
@@ -195,6 +194,12 @@ public ITypeSignature ParseDefinition(
195194
return CreateGenericSignature(kind, position, args);
196195
}
197196

197+
if (IsIndex(nameAsLower.AsSpan(), out RangeExpression? indexRange))
198+
{
199+
argsConsumed = false;
200+
return new ParameterIndexSignature(indexRange);
201+
}
202+
198203
argsConsumed = false;
199204
return nameAsLower switch
200205
{
@@ -638,6 +643,22 @@ private static ITypeSignature ThrowSignatureParseException(IScriptExtent extent,
638643
throw new SignatureParseException(message, extent);
639644
}
640645

646+
private static bool IsIndex(ReadOnlySpan<char> typeName, [NotNullWhen(true)] out RangeExpression? range)
647+
{
648+
if (typeName is ['i', ..ReadOnlySpan<char> rest])
649+
{
650+
if (rest is ['n', 'd', 'e', 'x', ..ReadOnlySpan<char> afterIndex])
651+
{
652+
rest = afterIndex;
653+
}
654+
655+
return RangeExpression.TryParse(rest, out range);
656+
}
657+
658+
range = null;
659+
return false;
660+
}
661+
641662
private static bool IsGenericParameter(TypeName typeName, out GenericParameterKind kind, out int position)
642663
{
643664
string name = typeName.Name;

tools/Signatures.yaml

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,43 @@ keywords:
470470
- match: true
471471
sig: void Example(FileInfo value);
472472

473+
- header: "`index`"
474+
description: Matches only parameters in at a specific index in the method.
475+
examples:
476+
- syntax: Find-Member -ParameterType { [allof[index0, string]] }
477+
signatures:
478+
- match: false
479+
sig: void Example(IDisposable disposable);
480+
- match: true
481+
sig: void Example(string str);
482+
- match: false
483+
sig: void Example(int value, string str);
484+
- syntax: Find-Member -ParameterType { [allof[index1.., string]] }
485+
signatures:
486+
- match: false
487+
sig: void Example(IDisposable disposable);
488+
- match: false
489+
sig: void Example(string str);
490+
- match: true
491+
sig: void Example(int value, string str);
492+
- match: true
493+
sig: void Example(int value, object obj, string str);
494+
- match: true
495+
sig: void Example(string value, object obj, string str);
496+
- syntax: "# You can also use `i`\n
497+
Find-Member -ParameterType { [allof[i0..1, string]] }"
498+
signatures:
499+
- match: false
500+
sig: void Example(IDisposable disposable);
501+
- match: true
502+
sig: void Example(string str);
503+
- match: true
504+
sig: void Example(int value, string str);
505+
- match: false
506+
sig: void Example(int value, object obj, string str);
507+
- match: true
508+
sig: void Example(string value, object obj, string str);
509+
473510
- header: "`number`"
474511
description: Matches a hard coded list of types representing numbers.
475512
examples:

0 commit comments

Comments
 (0)