From d25cc1490dc96dfcd3a3e4c26305f928b9b49476 Mon Sep 17 00:00:00 2001 From: James Truher Date: Mon, 12 Apr 2021 10:34:15 -0700 Subject: [PATCH 1/9] Changes needed to handle those cases where the Signature generator fails catastrophically --- .../Collection/TypeDataCollector.cs | 55 +++++++++++++++---- .../Tests/UtilityApi.Tests.ps1 | 6 +- 2 files changed, 47 insertions(+), 14 deletions(-) diff --git a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs index 8ec0d0f03..44c6bdec4 100644 --- a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs +++ b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs @@ -347,7 +347,10 @@ private MemberData AssembleMembers(Type type, BindingFlags memberBinding) switch (member) { case ConstructorInfo constructor: - constructors.Add(AssembleConstructor(constructor)); + string[] cInfo = null; + if (TryAssembleConstructor(constructor, out cInfo)) { + constructors.Add(cInfo); + } break; case FieldInfo field: @@ -400,7 +403,11 @@ private MemberData AssembleMembers(Type type, BindingFlags memberBinding) var methodDatas = new JsonDictionary(); foreach (KeyValuePair> method in methods) { - methodDatas[method.Key] = AssembleMethod(method.Value); + MethodData md = null; + if (TryAssembleMethod(method.Value, out md)) + { + methodDatas[method.Key] = md; + } } return new MemberData() @@ -457,35 +464,59 @@ 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(); - foreach (ParameterInfo param in ctor.GetParameters()) - { - parameters.Add(TypeNaming.GetFullTypeName(param.ParameterType)); + try { + foreach (ParameterInfo param in ctor.GetParameters()) + { + parameters.Add(TypeNaming.GetFullTypeName(param.ParameterType)); + } + + result = parameters.ToArray(); + success = true; + } + catch { + result = null; } - return parameters.ToArray(); + return success; } - private MethodData AssembleMethod(List methodOverloads) + // private MethodData AssembleMethod(List methodOverloads) + private bool TryAssembleMethod(List methodOverloads, out MethodData result) { var overloads = new List(); foreach (MethodInfo overload in methodOverloads) { var parameters = new List(); - foreach (ParameterInfo param in overload.GetParameters()) + try { + foreach (ParameterInfo param in overload.GetParameters()) + { + parameters.Add(TypeNaming.GetFullTypeName(param.ParameterType)); + } + overloads.Add(parameters.ToArray()); + } + catch { - parameters.Add(TypeNaming.GetFullTypeName(param.ParameterType)); + ; } - overloads.Add(parameters.ToArray()); } - return new MethodData() + if (overloads.Count == 0) + { + result = null; + return false; + } + + 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..30c37df98 100644 --- a/PSCompatibilityCollector/Tests/UtilityApi.Tests.ps1 +++ b/PSCompatibilityCollector/Tests/UtilityApi.Tests.ps1 @@ -1,7 +1,7 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -BeforeAll { +#BeforeAll { function Get-TypeNameAstFromScript { param([string]$Script) @@ -18,7 +18,7 @@ BeforeAll { { [psobject].Assembly.GetType('System.Management.Automation.TypeAccelerators', 'nonpublic')::Get.GetEnumerator() } -} +#} Describe "Type name serialization" { @@ -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) From 4ad6788c394dd0fa5069cf6a5bfa30cfe93bf143 Mon Sep 17 00:00:00 2001 From: James Truher Date: Mon, 12 Apr 2021 11:00:12 -0700 Subject: [PATCH 2/9] add back beforeall for tests --- PSCompatibilityCollector/Tests/UtilityApi.Tests.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PSCompatibilityCollector/Tests/UtilityApi.Tests.ps1 b/PSCompatibilityCollector/Tests/UtilityApi.Tests.ps1 index 30c37df98..0ebcec746 100644 --- a/PSCompatibilityCollector/Tests/UtilityApi.Tests.ps1 +++ b/PSCompatibilityCollector/Tests/UtilityApi.Tests.ps1 @@ -1,7 +1,7 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -#BeforeAll { +BeforeAll { function Get-TypeNameAstFromScript { param([string]$Script) @@ -18,7 +18,7 @@ { [psobject].Assembly.GetType('System.Management.Automation.TypeAccelerators', 'nonpublic')::Get.GetEnumerator() } -#} +} Describe "Type name serialization" { From 9e5d7415397006c2dc9d0a8ba2997a0ecbd2f115 Mon Sep 17 00:00:00 2001 From: "James Truher [MSFT]" Date: Mon, 12 Apr 2021 11:05:37 -0700 Subject: [PATCH 3/9] Update PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs Co-authored-by: Robert Holt --- .../Collection/TypeDataCollector.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs index 44c6bdec4..9dea05f54 100644 --- a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs +++ b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs @@ -501,7 +501,6 @@ private bool TryAssembleMethod(List methodOverloads, out MethodData } catch { - ; } } From b07b94780cebbc2dc23e05043772b73cc6584f6e Mon Sep 17 00:00:00 2001 From: "James Truher [MSFT]" Date: Mon, 12 Apr 2021 11:05:44 -0700 Subject: [PATCH 4/9] Update PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs Co-authored-by: Robert Holt --- .../Collection/TypeDataCollector.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs index 9dea05f54..766882caa 100644 --- a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs +++ b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs @@ -492,7 +492,8 @@ private bool TryAssembleMethod(List methodOverloads, out MethodData foreach (MethodInfo overload in methodOverloads) { var parameters = new List(); - try { + try + { foreach (ParameterInfo param in overload.GetParameters()) { parameters.Add(TypeNaming.GetFullTypeName(param.ParameterType)); From 908d85e8bb6751fd1ae4e7830a60a541e3a81e24 Mon Sep 17 00:00:00 2001 From: "James Truher [MSFT]" Date: Mon, 12 Apr 2021 11:05:49 -0700 Subject: [PATCH 5/9] Update PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs Co-authored-by: Robert Holt --- .../Collection/TypeDataCollector.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs index 766882caa..512deb182 100644 --- a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs +++ b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs @@ -478,7 +478,8 @@ private bool TryAssembleConstructor(ConstructorInfo ctor, out string[] result) result = parameters.ToArray(); success = true; } - catch { + catch + { result = null; } From 4ec4233b45a09234bd001c2b756c4f9c0bc26e44 Mon Sep 17 00:00:00 2001 From: "James Truher [MSFT]" Date: Mon, 12 Apr 2021 11:05:54 -0700 Subject: [PATCH 6/9] Update PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs Co-authored-by: Robert Holt --- .../Collection/TypeDataCollector.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs index 512deb182..fee5a3781 100644 --- a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs +++ b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs @@ -469,7 +469,8 @@ private bool TryAssembleConstructor(ConstructorInfo ctor, out string[] result) { bool success = false; var parameters = new List(); - try { + try + { foreach (ParameterInfo param in ctor.GetParameters()) { parameters.Add(TypeNaming.GetFullTypeName(param.ParameterType)); From b275b3ac2e8d526eee7b558a4103639090e54123 Mon Sep 17 00:00:00 2001 From: "James Truher [MSFT]" Date: Mon, 12 Apr 2021 11:06:00 -0700 Subject: [PATCH 7/9] Update PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs Co-authored-by: Robert Holt --- .../Collection/TypeDataCollector.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs index fee5a3781..b073bf23f 100644 --- a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs +++ b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs @@ -403,8 +403,7 @@ private MemberData AssembleMembers(Type type, BindingFlags memberBinding) var methodDatas = new JsonDictionary(); foreach (KeyValuePair> method in methods) { - MethodData md = null; - if (TryAssembleMethod(method.Value, out md)) + if (TryAssembleMethod(method.Value, out MethodInfo md)) { methodDatas[method.Key] = md; } From 7a092a09cf293bd74991a7a19579ae5df1f5fc9b Mon Sep 17 00:00:00 2001 From: "James Truher [MSFT]" Date: Mon, 12 Apr 2021 11:06:07 -0700 Subject: [PATCH 8/9] Update PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs Co-authored-by: Robert Holt --- .../Collection/TypeDataCollector.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs index b073bf23f..081933707 100644 --- a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs +++ b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs @@ -347,8 +347,7 @@ private MemberData AssembleMembers(Type type, BindingFlags memberBinding) switch (member) { case ConstructorInfo constructor: - string[] cInfo = null; - if (TryAssembleConstructor(constructor, out cInfo)) { + if (TryAssembleConstructor(constructor, out string[] cInfo)) { constructors.Add(cInfo); } break; From 2b1332fa79b469616b3b796784e7eb275ee46cd8 Mon Sep 17 00:00:00 2001 From: James Truher Date: Mon, 12 Apr 2021 11:23:05 -0700 Subject: [PATCH 9/9] MethodInfo should be MethodData --- .../Collection/TypeDataCollector.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs index 081933707..19710dde6 100644 --- a/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs +++ b/PSCompatibilityCollector/Microsoft.PowerShell.CrossCompatibility/Collection/TypeDataCollector.cs @@ -402,7 +402,7 @@ private MemberData AssembleMembers(Type type, BindingFlags memberBinding) var methodDatas = new JsonDictionary(); foreach (KeyValuePair> method in methods) { - if (TryAssembleMethod(method.Value, out MethodInfo md)) + if (TryAssembleMethod(method.Value, out MethodData md)) { methodDatas[method.Key] = md; }