Skip to content

Commit 6e95790

Browse files
authored
Handle cases where the Signature generator fails catastrophically (#1661)
1 parent 58c4423 commit 6e95790

File tree

2 files changed

+44
-11
lines changed

2 files changed

+44
-11
lines changed

PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,9 @@ private MemberData AssembleMembers(Type type, BindingFlags memberBinding)
347347
switch (member)
348348
{
349349
case ConstructorInfo constructor:
350-
constructors.Add(AssembleConstructor(constructor));
350+
if (TryAssembleConstructor(constructor, out string[] cInfo)) {
351+
constructors.Add(cInfo);
352+
}
351353
break;
352354

353355
case FieldInfo field:
@@ -400,7 +402,10 @@ private MemberData AssembleMembers(Type type, BindingFlags memberBinding)
400402
var methodDatas = new JsonDictionary<string, MethodData>();
401403
foreach (KeyValuePair<string, List<MethodInfo>> method in methods)
402404
{
403-
methodDatas[method.Key] = AssembleMethod(method.Value);
405+
if (TryAssembleMethod(method.Value, out MethodData md))
406+
{
407+
methodDatas[method.Key] = md;
408+
}
404409
}
405410

406411
return new MemberData()
@@ -457,35 +462,61 @@ private EventData AssembleEvent(EventInfo e)
457462
};
458463
}
459464

460-
private string[] AssembleConstructor(ConstructorInfo ctor)
465+
// private string[] AssembleConstructor(ConstructorInfo ctor)
466+
private bool TryAssembleConstructor(ConstructorInfo ctor, out string[] result)
461467
{
468+
bool success = false;
462469
var parameters = new List<string>();
463-
foreach (ParameterInfo param in ctor.GetParameters())
470+
try
471+
{
472+
foreach (ParameterInfo param in ctor.GetParameters())
473+
{
474+
parameters.Add(TypeNaming.GetFullTypeName(param.ParameterType));
475+
}
476+
477+
result = parameters.ToArray();
478+
success = true;
479+
}
480+
catch
464481
{
465-
parameters.Add(TypeNaming.GetFullTypeName(param.ParameterType));
482+
result = null;
466483
}
467484

468-
return parameters.ToArray();
485+
return success;
469486
}
470487

471-
private MethodData AssembleMethod(List<MethodInfo> methodOverloads)
488+
// private MethodData AssembleMethod(List<MethodInfo> methodOverloads)
489+
private bool TryAssembleMethod(List<MethodInfo> methodOverloads, out MethodData result)
472490
{
473491
var overloads = new List<string[]>();
474492
foreach (MethodInfo overload in methodOverloads)
475493
{
476494
var parameters = new List<string>();
477-
foreach (ParameterInfo param in overload.GetParameters())
495+
try
478496
{
479-
parameters.Add(TypeNaming.GetFullTypeName(param.ParameterType));
497+
foreach (ParameterInfo param in overload.GetParameters())
498+
{
499+
parameters.Add(TypeNaming.GetFullTypeName(param.ParameterType));
500+
}
501+
overloads.Add(parameters.ToArray());
480502
}
481-
overloads.Add(parameters.ToArray());
503+
catch
504+
{
505+
}
506+
}
507+
508+
if (overloads.Count == 0)
509+
{
510+
result = null;
511+
return false;
482512
}
483513

484-
return new MethodData()
514+
result = new MethodData()
485515
{
486516
ReturnType = TypeNaming.GetFullTypeName(methodOverloads[0].ReturnType),
487517
OverloadParameters = overloads.ToArray()
488518
};
519+
return true;
489520
}
490521

491522
private bool IsAssemblyPathExcluded(string path)

PSCompatibilityCollector/Tests/UtilityApi.Tests.ps1

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ Describe "Type name serialization" {
3838
@{ InputType = [System.Collections.Generic.Dictionary`2+Enumerator[string, object]]; ExpectedName = "System.Collections.Generic.Dictionary``2+Enumerator[System.String,System.Object]" }
3939
@{ InputType = [System.Collections.Concurrent.ConcurrentDictionary`2].GetMethod('ToArray').ReturnType; ExpectedName = "System.Collections.Generic.KeyValuePair``2[]" }
4040
) {
41+
param ( $InputType, $ExpectedName )
4142
$name = [Microsoft.PowerShell.CrossCompatibility.TypeNaming]::GetFullTypeName($InputType)
4243
$name | Should -BeExactly $ExpectedName
4344
}
@@ -81,6 +82,7 @@ Describe "Type accelerator expansion" {
8182
@{ Raw = "[object]"; Expanded = "System.Object" }
8283
) -Test {
8384

85+
param ( $Raw, $Expanded )
8486
$typeName = Get-TypeNameAstFromScript -Script $Raw
8587

8688
$canonicalName = [Microsoft.PowerShell.CrossCompatibility.TypeNaming]::GetCanonicalTypeName($typeAccelerators, $typeName)

0 commit comments

Comments
 (0)