diff --git a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs index 8ec0d0f03..19710dde6 100644 --- a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs +++ b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs @@ -347,7 +347,9 @@ private MemberData AssembleMembers(Type type, BindingFlags memberBinding) switch (member) { case ConstructorInfo constructor: - constructors.Add(AssembleConstructor(constructor)); + if (TryAssembleConstructor(constructor, out string[] cInfo)) { + constructors.Add(cInfo); + } break; case FieldInfo field: @@ -400,7 +402,10 @@ private MemberData AssembleMembers(Type type, BindingFlags memberBinding) var methodDatas = new JsonDictionary<string, MethodData>(); foreach (KeyValuePair<string, List<MethodInfo>> method in methods) { - methodDatas[method.Key] = AssembleMethod(method.Value); + if (TryAssembleMethod(method.Value, out MethodData md)) + { + methodDatas[method.Key] = md; + } } return new MemberData() @@ -457,35 +462,61 @@ private EventData AssembleEvent(EventInfo e) }; } - private string[] AssembleConstructor(ConstructorInfo ctor) + // private string[] AssembleConstructor(ConstructorInfo ctor) + private bool TryAssembleConstructor(ConstructorInfo ctor, out string[] result) { + bool success = false; var parameters = new List<string>(); - foreach (ParameterInfo param in ctor.GetParameters()) + try + { + foreach (ParameterInfo param in ctor.GetParameters()) + { + parameters.Add(TypeNaming.GetFullTypeName(param.ParameterType)); + } + + result = parameters.ToArray(); + success = true; + } + catch { - parameters.Add(TypeNaming.GetFullTypeName(param.ParameterType)); + result = null; } - return parameters.ToArray(); + return success; } - private MethodData AssembleMethod(List<MethodInfo> methodOverloads) + // private MethodData AssembleMethod(List<MethodInfo> methodOverloads) + private bool TryAssembleMethod(List<MethodInfo> methodOverloads, out MethodData result) { var overloads = new List<string[]>(); foreach (MethodInfo overload in methodOverloads) { var parameters = new List<string>(); - foreach (ParameterInfo param in overload.GetParameters()) + try { - parameters.Add(TypeNaming.GetFullTypeName(param.ParameterType)); + foreach (ParameterInfo param in overload.GetParameters()) + { + parameters.Add(TypeNaming.GetFullTypeName(param.ParameterType)); + } + overloads.Add(parameters.ToArray()); } - overloads.Add(parameters.ToArray()); + catch + { + } + } + + if (overloads.Count == 0) + { + result = null; + return false; } - return new MethodData() + result = new MethodData() { ReturnType = TypeNaming.GetFullTypeName(methodOverloads[0].ReturnType), OverloadParameters = overloads.ToArray() }; + return true; } private bool IsAssemblyPathExcluded(string path) diff --git a/PSCompatibilityCollector/Tests/UtilityApi.Tests.ps1 b/PSCompatibilityCollector/Tests/UtilityApi.Tests.ps1 index 444adffc5..0ebcec746 100644 --- a/PSCompatibilityCollector/Tests/UtilityApi.Tests.ps1 +++ b/PSCompatibilityCollector/Tests/UtilityApi.Tests.ps1 @@ -38,6 +38,7 @@ Describe "Type name serialization" { @{ InputType = [System.Collections.Generic.Dictionary`2+Enumerator[string, object]]; ExpectedName = "System.Collections.Generic.Dictionary``2+Enumerator[System.String,System.Object]" } @{ InputType = [System.Collections.Concurrent.ConcurrentDictionary`2].GetMethod('ToArray').ReturnType; ExpectedName = "System.Collections.Generic.KeyValuePair``2[]" } ) { + param ( $InputType, $ExpectedName ) $name = [Microsoft.PowerShell.CrossCompatibility.TypeNaming]::GetFullTypeName($InputType) $name | Should -BeExactly $ExpectedName } @@ -81,6 +82,7 @@ Describe "Type accelerator expansion" { @{ Raw = "[object]"; Expanded = "System.Object" } ) -Test { + param ( $Raw, $Expanded ) $typeName = Get-TypeNameAstFromScript -Script $Raw $canonicalName = [Microsoft.PowerShell.CrossCompatibility.TypeNaming]::GetCanonicalTypeName($typeAccelerators, $typeName)