mirror of
https://github.com/PowerShell/PowerShell
synced 2026-06-08 12:12:50 +00:00
Improve processing of the powershell built-in type data from 'types.ps1xml', 'typesV3.ps1xml' and 'GetEvent.types.ps1xml' (#10898)
This commit is contained in:
committed by
Aditya Patwardhan
parent
a3d73d751f
commit
8749db9b81
@@ -1,90 +0,0 @@
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Management.Automation;
|
||||
using System.Reflection;
|
||||
|
||||
namespace System.Management.Automation.Runspaces
|
||||
{
|
||||
internal sealed class GetEvent_Types_Ps1Xml
|
||||
{
|
||||
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
static MethodInfo GetMethodInfo(string typeName, string method)
|
||||
{
|
||||
var type = LanguagePrimitives.ConvertTo<Type>(typeName);
|
||||
return GetMethodInfo(type, method);
|
||||
}
|
||||
|
||||
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
static MethodInfo GetMethodInfo(Type type, string method)
|
||||
{
|
||||
return type.GetMethod(method, BindingFlags.Static | BindingFlags.Public | BindingFlags.IgnoreCase);
|
||||
}
|
||||
|
||||
static ScriptBlock GetScriptBlock(string s)
|
||||
{
|
||||
var sb = ScriptBlock.CreateDelayParsedScriptBlock(s, isProductCode: true);
|
||||
sb.LanguageMode = PSLanguageMode.FullLanguage;
|
||||
return sb;
|
||||
}
|
||||
|
||||
public static IEnumerable<TypeData> Get()
|
||||
{
|
||||
var td1 = new TypeData(@"System.Diagnostics.Eventing.Reader.EventLogConfiguration", true);
|
||||
td1.DefaultDisplayPropertySet =
|
||||
new PropertySetData(new[] { "LogName", "MaximumSizeInBytes", "RecordCount", "LogMode" }) { Name = "DefaultDisplayPropertySet" };
|
||||
yield return td1;
|
||||
|
||||
var td2 = new TypeData(@"System.Diagnostics.Eventing.Reader.EventLogRecord", true);
|
||||
td2.DefaultDisplayPropertySet =
|
||||
new PropertySetData(new[] { "TimeCreated", "ProviderName", "Id", "Message" }) { Name = "DefaultDisplayPropertySet" };
|
||||
yield return td2;
|
||||
|
||||
var td3 = new TypeData(@"System.Diagnostics.Eventing.Reader.ProviderMetadata", true);
|
||||
td3.Members.Add("ProviderName",
|
||||
new AliasPropertyData("ProviderName", "Name"));
|
||||
td3.DefaultDisplayPropertySet =
|
||||
new PropertySetData(new[] { "Name", "LogLinks" }) { Name = "DefaultDisplayPropertySet" };
|
||||
yield return td3;
|
||||
|
||||
#if !CORECLR
|
||||
var td4 = new TypeData(@"Microsoft.PowerShell.Commands.GetCounter.CounterSet", true);
|
||||
td4.Members.Add("Counter",
|
||||
new AliasPropertyData("Counter", "Paths"));
|
||||
yield return td4;
|
||||
|
||||
var td5 = new TypeData(@"Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSample", true);
|
||||
td5.DefaultDisplayPropertySet =
|
||||
new PropertySetData(new[] { "Path", "InstanceName", "CookedValue" }) { Name = "DefaultDisplayPropertySet" };
|
||||
yield return td5;
|
||||
|
||||
var td6 = new TypeData(@"Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet", true);
|
||||
td6.DefaultDisplayPropertySet =
|
||||
new PropertySetData(new[] { "Timestamp", "Readings" }) { Name = "DefaultDisplayPropertySet" };
|
||||
yield return td6;
|
||||
|
||||
var td7 = new TypeData(@"Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet", true);
|
||||
td7.Members.Add("Readings",
|
||||
new ScriptPropertyData(@"Readings", GetScriptBlock(@"$strPaths = """"
|
||||
foreach ($ctr in $this.CounterSamples)
|
||||
{
|
||||
$strPaths += ($ctr.Path + "" :"" + ""`n"")
|
||||
$strPaths += ($ctr.CookedValue.ToString() + ""`n`n"")
|
||||
}
|
||||
|
||||
return $strPaths"), null));
|
||||
yield return td7;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1211,26 +1211,6 @@ namespace System.Management.Automation.Runspaces
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Special add for TypeTable type entries that removes redundant file entries.
|
||||
/// </summary>
|
||||
internal void AddTypeTableTypesInfo(IEnumerable<T> items)
|
||||
{
|
||||
if (typeof(T) != typeof(SessionStateTypeEntry)) { throw new PSInvalidOperationException(); }
|
||||
|
||||
lock (_syncObject)
|
||||
{
|
||||
foreach (var element in items)
|
||||
{
|
||||
if (element is SessionStateTypeEntry typeEntry && typeEntry.TypeData != null)
|
||||
{
|
||||
// Skip type file entries.
|
||||
_internalCollection.Add(element);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get enumerator for this collection.
|
||||
/// </summary>
|
||||
@@ -3460,12 +3440,7 @@ namespace System.Management.Automation.Runspaces
|
||||
context.TypeTable = typeTable;
|
||||
|
||||
Types.Clear();
|
||||
|
||||
// A TypeTable contains types info along with type file references used to create the types info,
|
||||
// which is redundant information. When resused in a runspace the ISS unpacks the file types again
|
||||
// resulting in duplicate types and duplication errors when processed.
|
||||
// So use this special Add method to filter all types files found in the TypeTable.
|
||||
Types.AddTypeTableTypesInfo(typeTable.typesInfo);
|
||||
Types.Add(typeTable.typesInfo);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -3482,7 +3457,6 @@ namespace System.Management.Automation.Runspaces
|
||||
ConcurrentDictionary<string, string> filesProcessed
|
||||
= new ConcurrentDictionary<string, string>(/*concurrencyLevel*/3, /*capacity*/3, StringComparer.OrdinalIgnoreCase);
|
||||
Parallel.ForEach(Types, sste =>
|
||||
// foreach (var sste in Types)
|
||||
{
|
||||
if (sste.FileName != null)
|
||||
{
|
||||
@@ -3510,7 +3484,6 @@ namespace System.Management.Automation.Runspaces
|
||||
context.TypeTable.Update(sste.TypeData, errors, sste.IsRemove);
|
||||
}
|
||||
});
|
||||
// }
|
||||
|
||||
context.TypeTable.ClearConsolidatedMembers();
|
||||
|
||||
|
||||
@@ -3060,7 +3060,7 @@ namespace System.Management.Automation
|
||||
{
|
||||
if (string.IsNullOrEmpty(name))
|
||||
{
|
||||
throw PSTraceSource.NewArgumentException("name");
|
||||
throw PSTraceSource.NewArgumentException(nameof(name));
|
||||
}
|
||||
|
||||
this.name = name;
|
||||
@@ -3080,13 +3080,13 @@ namespace System.Management.Automation
|
||||
{
|
||||
if (string.IsNullOrEmpty(name))
|
||||
{
|
||||
throw PSTraceSource.NewArgumentException("name");
|
||||
throw PSTraceSource.NewArgumentException(nameof(name));
|
||||
}
|
||||
|
||||
this.name = name;
|
||||
if (members == null)
|
||||
{
|
||||
throw PSTraceSource.NewArgumentNullException("members");
|
||||
throw PSTraceSource.NewArgumentNullException(nameof(members));
|
||||
}
|
||||
|
||||
this.internalMembers = new PSMemberInfoInternalCollection<PSMemberInfo>();
|
||||
@@ -3094,7 +3094,7 @@ namespace System.Management.Automation
|
||||
{
|
||||
if (member == null)
|
||||
{
|
||||
throw PSTraceSource.NewArgumentNullException("members");
|
||||
throw PSTraceSource.NewArgumentNullException(nameof(members));
|
||||
}
|
||||
|
||||
this.internalMembers.Add(member.Copy());
|
||||
@@ -3105,6 +3105,26 @@ namespace System.Management.Automation
|
||||
_methods = new PSMemberInfoIntegratingCollection<PSMethodInfo>(this, s_emptyMethodCollection);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of PSMemberSet with all the initial members in <paramref name="members"/>.
|
||||
/// This constructor is supposed to be used in TypeTable to reuse the passed-in member collection.
|
||||
/// Null-argument check is skipped here, so callers need to check arguments before passing in.
|
||||
/// </summary>
|
||||
/// <param name="name">Name for the member set.</param>
|
||||
/// <param name="members">Members in the member set.</param>
|
||||
internal PSMemberSet(string name, PSMemberInfoInternalCollection<PSMemberInfo> members)
|
||||
{
|
||||
Diagnostics.Assert(!string.IsNullOrEmpty(name), "Caller needs to guarantee not null or empty.");
|
||||
Diagnostics.Assert(members != null, "Caller needs to guarantee not null.");
|
||||
|
||||
this.name = name;
|
||||
this.internalMembers = members;
|
||||
|
||||
_members = new PSMemberInfoIntegratingCollection<PSMemberInfo>(this, s_emptyMemberCollection);
|
||||
_properties = new PSMemberInfoIntegratingCollection<PSPropertyInfo>(this, s_emptyPropertyCollection);
|
||||
_methods = new PSMemberInfoIntegratingCollection<PSMethodInfo>(this, s_emptyMethodCollection);
|
||||
}
|
||||
|
||||
private static readonly Collection<CollectionEntry<PSMemberInfo>> s_typeMemberCollection = GetTypeMemberCollection();
|
||||
private static readonly Collection<CollectionEntry<PSMethodInfo>> s_typeMethodCollection = GetTypeMethodCollection();
|
||||
private static readonly Collection<CollectionEntry<PSPropertyInfo>> s_typePropertyCollection = GetTypePropertyCollection();
|
||||
@@ -3434,13 +3454,13 @@ namespace System.Management.Automation
|
||||
{
|
||||
if (string.IsNullOrEmpty(name))
|
||||
{
|
||||
throw PSTraceSource.NewArgumentException("name");
|
||||
throw PSTraceSource.NewArgumentException(nameof(name));
|
||||
}
|
||||
|
||||
this.name = name;
|
||||
if (referencedPropertyNames == null)
|
||||
{
|
||||
throw PSTraceSource.NewArgumentNullException("referencedPropertyNames");
|
||||
throw PSTraceSource.NewArgumentNullException(nameof(referencedPropertyNames));
|
||||
}
|
||||
|
||||
ReferencedPropertyNames = new Collection<string>();
|
||||
@@ -3448,13 +3468,31 @@ namespace System.Management.Automation
|
||||
{
|
||||
if (string.IsNullOrEmpty(referencedPropertyName))
|
||||
{
|
||||
throw PSTraceSource.NewArgumentException("referencedPropertyNames");
|
||||
throw PSTraceSource.NewArgumentException(nameof(referencedPropertyNames));
|
||||
}
|
||||
|
||||
ReferencedPropertyNames.Add(referencedPropertyName);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of PSPropertySet with a name and list of property names.
|
||||
/// This constructor is supposed to be used in TypeTable to reuse the passed-in property name list.
|
||||
/// Null-argument check is skipped here, so callers need to check arguments before passing in.
|
||||
/// </summary>
|
||||
/// <param name="name">Name of the set.</param>
|
||||
/// <param name="referencedPropertyNameList">Name of the properties in the set.</param>
|
||||
internal PSPropertySet(string name, List<string> referencedPropertyNameList)
|
||||
{
|
||||
Diagnostics.Assert(!string.IsNullOrEmpty(name), "Caller needs to guarantee not null or empty.");
|
||||
Diagnostics.Assert(referencedPropertyNameList != null, "Caller needs to guarantee not null.");
|
||||
|
||||
// We use the constructor 'public Collection(IList<T> list)' to create the collection,
|
||||
// so that the passed-in list is directly used as the backing store of the collection.
|
||||
this.name = name;
|
||||
ReferencedPropertyNames = new Collection<string>(referencedPropertyNameList);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the property names in this property set.
|
||||
/// </summary>
|
||||
|
||||
@@ -2405,7 +2405,6 @@ namespace System.Management.Automation.Runspaces
|
||||
/// ScriptMethodData represents a ScriptMethod definition.
|
||||
/// </summary>
|
||||
[DebuggerDisplay(@"ScriptMethod: {Name,nq}")]
|
||||
|
||||
public sealed class ScriptMethodData : TypeMemberData
|
||||
{
|
||||
/// <summary>
|
||||
@@ -2495,11 +2494,7 @@ namespace System.Management.Automation.Runspaces
|
||||
throw PSTraceSource.NewArgumentNullException("referencedProperties");
|
||||
}
|
||||
|
||||
ReferencedProperties = new Collection<string>();
|
||||
foreach (string property in referencedProperties)
|
||||
{
|
||||
ReferencedProperties.Add(property);
|
||||
}
|
||||
ReferencedProperties = new Collection<string>(new List<string>(referencedProperties));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -2591,7 +2586,7 @@ namespace System.Management.Automation.Runspaces
|
||||
/// <summary>
|
||||
/// A class that keeps the information from types.ps1xml files in a cache table.
|
||||
/// </summary>
|
||||
public sealed class TypeTable
|
||||
public sealed partial class TypeTable
|
||||
{
|
||||
#region private
|
||||
|
||||
@@ -2681,6 +2676,11 @@ namespace System.Management.Automation.Runspaces
|
||||
TargetTypeForDeserialization
|
||||
};
|
||||
|
||||
// Built-in type file paths.
|
||||
internal static readonly string TypesFilePath;
|
||||
internal static readonly string TypesV3FilePath;
|
||||
internal static readonly string GetEventTypesFilePath;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Update
|
||||
@@ -3135,7 +3135,7 @@ namespace System.Management.Automation.Runspaces
|
||||
}
|
||||
|
||||
// the node cardinality is OneToMany
|
||||
Collection<string> referencedProperties = new Collection<string>();
|
||||
var referencedProperties = new List<string>(propertySetData.ReferencedProperties.Count);
|
||||
foreach (string name in propertySetData.ReferencedProperties)
|
||||
{
|
||||
if (string.IsNullOrEmpty(name))
|
||||
@@ -3161,7 +3161,7 @@ namespace System.Management.Automation.Runspaces
|
||||
|
||||
internal static void ProcessMemberSetData(ConcurrentBag<string> errors, string typeName, MemberSetData memberSetData, PSMemberInfoInternalCollection<PSMemberInfo> membersCollection, bool isOverride)
|
||||
{
|
||||
var memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>();
|
||||
var memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(memberSetData.Members.Count);
|
||||
foreach (var m in memberSetData.Members)
|
||||
{
|
||||
m.Process(errors, typeName, memberSetMembers, isOverride);
|
||||
@@ -3175,12 +3175,19 @@ namespace System.Management.Automation.Runspaces
|
||||
AddMember(errors, typeName, memberSet, membersCollection, isOverride);
|
||||
}
|
||||
|
||||
private static void ProcessStandardMembers(ConcurrentBag<string> errors, string typeName, IEnumerable<TypeMemberData> standardMembers, IEnumerable<PropertySetData> propertySets, PSMemberInfoInternalCollection<PSMemberInfo> membersCollection, bool isOverride)
|
||||
private static void ProcessStandardMembers(
|
||||
ConcurrentBag<string> errors,
|
||||
string typeName,
|
||||
IEnumerable<TypeMemberData> standardMembers,
|
||||
IEnumerable<PropertySetData> propertySets,
|
||||
PSMemberInfoInternalCollection<PSMemberInfo> membersCollection,
|
||||
bool isOverride)
|
||||
{
|
||||
int newMemberCount = standardMembers.Count() + propertySets.Count();
|
||||
// If StandardMembers do not exists, we follow the original logic to create the StandardMembers
|
||||
if (membersCollection[PSStandardMembers] == null)
|
||||
{
|
||||
var memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>();
|
||||
var memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(newMemberCount);
|
||||
|
||||
ProcessMembersData(errors, typeName, standardMembers, memberSetMembers, false);
|
||||
foreach (PropertySetData propertySet in propertySets)
|
||||
@@ -3203,8 +3210,9 @@ namespace System.Management.Automation.Runspaces
|
||||
var psStandardMemberSet = (PSMemberSet)membersCollection[PSStandardMembers];
|
||||
|
||||
// Copy existing internal PSStandard members
|
||||
var existingMembers = new PSMemberInfoInternalCollection<PSMemberInfo>();
|
||||
var oldMembersCopy = new PSMemberInfoInternalCollection<PSMemberInfo>();
|
||||
int totalMemberCount = psStandardMemberSet.InternalMembers.Count + newMemberCount;
|
||||
var existingMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(totalMemberCount);
|
||||
var oldMembersCopy = new PSMemberInfoInternalCollection<PSMemberInfo>(totalMemberCount);
|
||||
foreach (var existingMember in psStandardMemberSet.InternalMembers)
|
||||
{
|
||||
existingMembers.Add(existingMember.Copy());
|
||||
@@ -3251,6 +3259,149 @@ namespace System.Management.Automation.Runspaces
|
||||
}
|
||||
}
|
||||
|
||||
private static void ProcessStandardMembers(
|
||||
ConcurrentBag<string> errors,
|
||||
string typeName,
|
||||
PSMemberInfoInternalCollection<PSMemberInfo> memberSetMembers,
|
||||
PSMemberInfoInternalCollection<PSMemberInfo> typeMemberCollection,
|
||||
bool isOverride)
|
||||
{
|
||||
// If StandardMembers do not exists, we follow the original logic to create the StandardMembers
|
||||
if (typeMemberCollection[PSStandardMembers] == null)
|
||||
{
|
||||
CheckStandardMembers(errors, typeName, memberSetMembers);
|
||||
PSMemberSet standardMemberSet = new PSMemberSet(PSStandardMembers, memberSetMembers)
|
||||
{
|
||||
inheritMembers = true,
|
||||
IsHidden = true,
|
||||
ShouldSerialize = false
|
||||
};
|
||||
AddMember(errors, typeName, standardMemberSet, typeMemberCollection, false);
|
||||
return;
|
||||
}
|
||||
|
||||
// StandardMembers exist
|
||||
var psStandardMemberSet = (PSMemberSet)typeMemberCollection[PSStandardMembers];
|
||||
|
||||
// Copy existing internal PSStandard members
|
||||
int totalMemberCount = psStandardMemberSet.InternalMembers.Count + memberSetMembers.Count;
|
||||
var existingMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(totalMemberCount);
|
||||
var oldMembersCopy = new PSMemberInfoInternalCollection<PSMemberInfo>(totalMemberCount);
|
||||
foreach (var existingMember in psStandardMemberSet.InternalMembers)
|
||||
{
|
||||
existingMembers.Add(existingMember.Copy());
|
||||
oldMembersCopy.Add(existingMember.Copy());
|
||||
}
|
||||
|
||||
// Process the Members directly into the 'existingMembers' collection
|
||||
foreach (PSMemberInfo member in memberSetMembers)
|
||||
{
|
||||
AddMember(errors, typeName, member, existingMembers, isOverride);
|
||||
}
|
||||
|
||||
if (CheckStandardMembers(errors, typeName, existingMembers))
|
||||
{
|
||||
// No conflict in serialization settings, replace the old StandardMembers with the new one
|
||||
PSMemberSet standardMemberSet = new PSMemberSet(PSStandardMembers, existingMembers)
|
||||
{
|
||||
inheritMembers = true,
|
||||
IsHidden = true,
|
||||
ShouldSerialize = false
|
||||
};
|
||||
AddMember(errors, typeName, standardMemberSet, typeMemberCollection, isOverride: true);
|
||||
}
|
||||
else
|
||||
{
|
||||
// There are conflicts in serialization settings, add non-serializationSetting configurations
|
||||
// into the original member collection. Replace the old StandardMembers with the new one
|
||||
foreach (PSMemberInfo member in existingMembers)
|
||||
{
|
||||
if (oldMembersCopy[member.name] == null)
|
||||
{
|
||||
oldMembersCopy.Add(member);
|
||||
}
|
||||
}
|
||||
|
||||
PSMemberSet standardMemberSet = new PSMemberSet(PSStandardMembers, oldMembersCopy)
|
||||
{
|
||||
inheritMembers = true,
|
||||
IsHidden = true,
|
||||
ShouldSerialize = false
|
||||
};
|
||||
AddMember(errors, typeName, standardMemberSet, typeMemberCollection, isOverride: true);
|
||||
}
|
||||
}
|
||||
|
||||
private static void ProcessTypeConverter(
|
||||
ConcurrentBag<string> errors,
|
||||
string typeName,
|
||||
Type converterType,
|
||||
ConcurrentDictionary<string, object> typeConverters,
|
||||
bool isOverride)
|
||||
{
|
||||
if (CreateInstance(errors, typeName, converterType, TypesXmlStrings.UnableToInstantiateTypeConverter, out object instance))
|
||||
{
|
||||
if ((instance is TypeConverter) || (instance is PSTypeConverter))
|
||||
{
|
||||
LanguagePrimitives.UpdateTypeConvertFromTypeTable(typeName);
|
||||
}
|
||||
else
|
||||
{
|
||||
AddError(errors, typeName, TypesXmlStrings.TypeIsNotTypeConverter, converterType.FullName);
|
||||
}
|
||||
}
|
||||
|
||||
if (instance != null && !typeConverters.TryAdd(typeName, instance))
|
||||
{
|
||||
if (!isOverride)
|
||||
{
|
||||
AddError(errors, typeName, TypesXmlStrings.TypeConverterAlreadyPresent);
|
||||
}
|
||||
|
||||
// If IsOverride == true, eat the TypeConverterAlreadyPresent failure.
|
||||
}
|
||||
}
|
||||
|
||||
private static void ProcessTypeAdapter(
|
||||
ConcurrentBag<string> errors,
|
||||
string typeName,
|
||||
Type adapterType,
|
||||
ConcurrentDictionary<string, PSObject.AdapterSet> typeAdapters,
|
||||
bool isOverride)
|
||||
{
|
||||
PSObject.AdapterSet adapterSet = null;
|
||||
if (CreateInstance(errors, typeName, adapterType, TypesXmlStrings.UnableToInstantiateTypeAdapter, out object instance))
|
||||
{
|
||||
PSPropertyAdapter psPropertyAdapter = instance as PSPropertyAdapter;
|
||||
|
||||
if (psPropertyAdapter == null)
|
||||
{
|
||||
AddError(errors, typeName, TypesXmlStrings.TypeIsNotTypeAdapter, adapterType.FullName);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LanguagePrimitives.TryConvertTo(typeName, out Type adaptedType))
|
||||
{
|
||||
adapterSet = PSObject.CreateThirdPartyAdapterSet(adaptedType, psPropertyAdapter);
|
||||
}
|
||||
else
|
||||
{
|
||||
AddError(errors, typeName, TypesXmlStrings.InvalidAdaptedType, typeName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (adapterSet != null && !typeAdapters.TryAdd(typeName, adapterSet))
|
||||
{
|
||||
if (!isOverride)
|
||||
{
|
||||
AddError(errors, typeName, TypesXmlStrings.TypeAdapterAlreadyPresent);
|
||||
}
|
||||
|
||||
// If IsOverride == true, eat the TypeConverterAlreadyPresent failure.
|
||||
}
|
||||
}
|
||||
|
||||
private void ProcessTypeDataToAdd(ConcurrentBag<string> errors, TypeData typeData)
|
||||
{
|
||||
string typeName = typeData.TypeName;
|
||||
@@ -3281,9 +3432,12 @@ namespace System.Management.Automation.Runspaces
|
||||
}
|
||||
|
||||
PSMemberInfoInternalCollection<PSMemberInfo> typeMembers = null;
|
||||
bool hasStandardMembers = typeData.StandardMembers.Count > 0 || propertySets.Count > 0;
|
||||
int collectionSize = typeData.Members.Count + (hasStandardMembers ? 1 : 0);
|
||||
|
||||
if (typeData.Members.Count > 0)
|
||||
{
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, k => new PSMemberInfoInternalCollection<PSMemberInfo>());
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(collectionSize));
|
||||
ProcessMembersData(errors, typeName, typeData.Members.Values, typeMembers, typeData.IsOverride);
|
||||
|
||||
foreach (var memberName in typeData.Members.Keys)
|
||||
@@ -3292,11 +3446,11 @@ namespace System.Management.Automation.Runspaces
|
||||
}
|
||||
}
|
||||
|
||||
if (typeData.StandardMembers.Count > 0 || propertySets.Count > 0)
|
||||
if (hasStandardMembers)
|
||||
{
|
||||
if (typeMembers == null)
|
||||
{
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, k => new PSMemberInfoInternalCollection<PSMemberInfo>());
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
|
||||
}
|
||||
|
||||
ProcessStandardMembers(errors, typeName, typeData.StandardMembers.Values, propertySets, typeMembers, typeData.IsOverride);
|
||||
@@ -3304,67 +3458,17 @@ namespace System.Management.Automation.Runspaces
|
||||
|
||||
if (typeData.TypeConverter != null)
|
||||
{
|
||||
object instance = null;
|
||||
if (CreateInstance(errors, typeName, typeData.TypeConverter, TypesXmlStrings.UnableToInstantiateTypeConverter, out instance))
|
||||
{
|
||||
if ((instance is TypeConverter) || (instance is PSTypeConverter))
|
||||
{
|
||||
LanguagePrimitives.UpdateTypeConvertFromTypeTable(typeName);
|
||||
}
|
||||
else
|
||||
{
|
||||
AddError(errors, typeName, TypesXmlStrings.TypeIsNotTypeConverter, typeData.TypeConverter.FullName);
|
||||
}
|
||||
}
|
||||
|
||||
if (instance != null && !_typeConverters.TryAdd(typeName, instance))
|
||||
{
|
||||
if (!typeData.IsOverride)
|
||||
{
|
||||
AddError(errors, typeName, TypesXmlStrings.TypeConverterAlreadyPresent);
|
||||
}
|
||||
// If IsOverride == true, eat the TypeConverterAlreadyPresent failure.
|
||||
}
|
||||
ProcessTypeConverter(errors, typeName, typeData.TypeConverter, _typeConverters, typeData.IsOverride);
|
||||
}
|
||||
|
||||
if (typeData.TypeAdapter != null)
|
||||
{
|
||||
object instance;
|
||||
PSObject.AdapterSet adapterSet = null;
|
||||
if (CreateInstance(errors, typeName, typeData.TypeAdapter, TypesXmlStrings.UnableToInstantiateTypeAdapter, out instance))
|
||||
{
|
||||
PSPropertyAdapter psPropertyAdapter = instance as PSPropertyAdapter;
|
||||
|
||||
if (psPropertyAdapter == null)
|
||||
{
|
||||
AddError(errors, typeName, TypesXmlStrings.TypeIsNotTypeAdapter, typeData.TypeAdapter.FullName);
|
||||
}
|
||||
else
|
||||
{
|
||||
Type adaptedType = null;
|
||||
if (LanguagePrimitives.TryConvertTo(typeName, out adaptedType))
|
||||
{
|
||||
adapterSet = PSObject.CreateThirdPartyAdapterSet(adaptedType, psPropertyAdapter);
|
||||
}
|
||||
else
|
||||
{
|
||||
AddError(errors, typeName, TypesXmlStrings.InvalidAdaptedType, typeName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (adapterSet != null && !_typeAdapters.TryAdd(typeName, adapterSet))
|
||||
{
|
||||
if (!typeData.IsOverride)
|
||||
{
|
||||
AddError(errors, typeName, TypesXmlStrings.TypeAdapterAlreadyPresent);
|
||||
}
|
||||
// If IsOverride == true, eat the TypeConverterAlreadyPresent failure.
|
||||
}
|
||||
ProcessTypeAdapter(errors, typeName, typeData.TypeAdapter, _typeAdapters, typeData.IsOverride);
|
||||
}
|
||||
|
||||
// Record the information that this typedata was removed from the typetable
|
||||
// The next time the typetable is updated, we will need to exclude this typedata from the typetable
|
||||
typesInfo.Add(new SessionStateTypeEntry(typeData, false));
|
||||
typesInfo.Add(new SessionStateTypeEntry(typeData, isRemove: false));
|
||||
}
|
||||
|
||||
#endregion add members from TypeData
|
||||
@@ -3389,15 +3493,13 @@ namespace System.Management.Automation.Runspaces
|
||||
}
|
||||
}
|
||||
|
||||
object unused1;
|
||||
if (_typeConverters.TryRemove(typeName, out unused1))
|
||||
if (_typeConverters.TryRemove(typeName, out _))
|
||||
{
|
||||
typeExist = true;
|
||||
LanguagePrimitives.UpdateTypeConvertFromTypeTable(typeName);
|
||||
}
|
||||
|
||||
PSObject.AdapterSet unused2;
|
||||
if (_typeAdapters.TryRemove(typeName, out unused2))
|
||||
if (_typeAdapters.TryRemove(typeName, out _))
|
||||
{
|
||||
typeExist = true;
|
||||
}
|
||||
@@ -3456,6 +3558,8 @@ namespace System.Management.Automation.Runspaces
|
||||
|
||||
static TypeTable()
|
||||
{
|
||||
s_valueFactoryCache = new Func<string, PSMemberInfoInternalCollection<PSMemberInfo>>[ValueFactoryCacheCount];
|
||||
|
||||
// Rather than set these members every time we process the standard members, do it
|
||||
// just once at startup.
|
||||
foreach (var sm in s_standardMembers)
|
||||
@@ -3464,6 +3568,12 @@ namespace System.Management.Automation.Runspaces
|
||||
}
|
||||
|
||||
PSGetMemberBinder.TypeTableMemberAdded(PSStandardMembers);
|
||||
|
||||
// Set the built-in type file paths.
|
||||
var psHome = Utils.DefaultPowerShellAppBase;
|
||||
TypesFilePath = Path.Combine(psHome, "types.ps1xml");
|
||||
TypesV3FilePath = Path.Combine(psHome, "typesv3.ps1xml");
|
||||
GetEventTypesFilePath = Path.Combine(psHome, "GetEvent.types.ps1xml");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -3514,17 +3624,7 @@ namespace System.Management.Automation.Runspaces
|
||||
/// <returns>List of type files.</returns>
|
||||
public static List<string> GetDefaultTypeFiles()
|
||||
{
|
||||
string typesFilePath = string.Empty;
|
||||
string typesV3FilePath = string.Empty;
|
||||
|
||||
var psHome = Utils.DefaultPowerShellAppBase;
|
||||
if (!string.IsNullOrEmpty(psHome))
|
||||
{
|
||||
typesFilePath = Path.Combine(psHome, "types.ps1xml");
|
||||
typesV3FilePath = Path.Combine(psHome, "typesv3.ps1xml");
|
||||
}
|
||||
|
||||
return new List<string>() { typesFilePath, typesV3FilePath };
|
||||
return new List<string>() { TypesFilePath, TypesV3FilePath };
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -4256,7 +4356,6 @@ namespace System.Management.Automation.Runspaces
|
||||
bool isProductCode,
|
||||
ConcurrentBag<string> errors)
|
||||
{
|
||||
typesInfo.Add(new SessionStateTypeEntry(fileToLoad));
|
||||
LoadContext loadContext = new LoadContext(moduleName, fileToLoad, errors)
|
||||
{
|
||||
IsFullyTrusted = isFullyTrusted,
|
||||
@@ -4272,20 +4371,6 @@ namespace System.Management.Automation.Runspaces
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes the <paramref name="typeFile"/> from the current TypeTable's type file list.
|
||||
/// The TypeTable will not reflect the change until Update is called.
|
||||
/// </summary>
|
||||
/// <param name="typeFile"></param>
|
||||
internal void Remove(string typeFile)
|
||||
{
|
||||
lock (_typeFileList)
|
||||
{
|
||||
_typeFileList.Remove(typeFile);
|
||||
typesInfo.Remove(typeFile, null);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update the TypeTable by adding a TypeData instance.
|
||||
/// </summary>
|
||||
@@ -4337,79 +4422,6 @@ namespace System.Management.Automation.Runspaces
|
||||
FormatAndTypeDataHelper.ThrowExceptionOnError("ErrorsUpdatingTypes", errors, FormatAndTypeDataHelper.Category.Types);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update typetable from psSnapinTypes, this method will always rebuild the typetable.
|
||||
/// The psSnapinTypes contain files and strong type data.
|
||||
/// </summary>
|
||||
/// <param name="psSnapinTypes"></param>
|
||||
/// <param name="authorizationManager">
|
||||
/// Authorization manager to perform signature checks before reading ps1xml files (or null of no checks are needed)
|
||||
/// </param>
|
||||
/// <param name="host">
|
||||
/// Host passed to <paramref name="authorizationManager"/>. Can be null if no interactive questions should be asked.
|
||||
/// </param>
|
||||
/// <exception cref="InvalidOperationException">
|
||||
/// 1. The TypeTable cannot be updated because the TypeTable might have
|
||||
/// been created outside of the Runspace.
|
||||
/// </exception>
|
||||
internal void Update(
|
||||
Collection<PSSnapInTypeAndFormatErrors> psSnapinTypes,
|
||||
AuthorizationManager authorizationManager,
|
||||
PSHost host
|
||||
)
|
||||
{
|
||||
if (isShared)
|
||||
{
|
||||
throw PSTraceSource.NewInvalidOperationException(TypesXmlStrings.SharedTypeTableCannotBeUpdated);
|
||||
}
|
||||
|
||||
// Always rebuild the whole TypeTable
|
||||
Clear();
|
||||
|
||||
foreach (PSSnapInTypeAndFormatErrors snapin in psSnapinTypes)
|
||||
{
|
||||
// FullPath is not null, then it is a type xml file
|
||||
if (snapin.FullPath != null)
|
||||
{
|
||||
Initialize(snapin.PSSnapinName, snapin.FullPath, snapin.Errors, authorizationManager, host,
|
||||
out snapin.FailToLoadFile);
|
||||
}
|
||||
// FullPath is null, then it is a TypeData
|
||||
else
|
||||
{
|
||||
Update(snapin.Errors, snapin.TypeData, snapin.IsRemove);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Entry created to make reflection-based test suites happy. DO NOT USE THIS ENTRY.
|
||||
/// </summary>
|
||||
/// <param name="filePath">The path to the file to load.</param>
|
||||
/// <param name="errors">A place to put the errors...</param>
|
||||
/// <param name="clearTable">If true, reset the table to empty...</param>
|
||||
/// <param name="authorizationManager">
|
||||
/// Authorization manager to perform signature checks before reading ps1xml files (or null of no checks are needed)
|
||||
/// </param>
|
||||
/// <param name="host">
|
||||
/// Host passed to <paramref name="authorizationManager"/>. Can be null if no interactive questions should be asked.
|
||||
/// </param>
|
||||
/// <param name="failToLoadFile">Indicate if the file cannot be loaded due to the security reason.</param>
|
||||
/// <exception cref="InvalidOperationException">
|
||||
/// 1. The TypeTable cannot be updated because the TypeTable might have
|
||||
/// been created outside of the Runspace.
|
||||
/// </exception>
|
||||
internal void Update(
|
||||
string filePath,
|
||||
ConcurrentBag<string> errors,
|
||||
bool clearTable,
|
||||
AuthorizationManager authorizationManager,
|
||||
PSHost host,
|
||||
out bool failToLoadFile)
|
||||
{
|
||||
Update(filePath, filePath, errors, authorizationManager, host, out failToLoadFile);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update type data from a specific file...
|
||||
/// </summary>
|
||||
@@ -4467,38 +4479,24 @@ namespace System.Management.Automation.Runspaces
|
||||
if (etwEnabled) RunspaceEventSource.Log.ProcessTypeFileStop(filePath);
|
||||
}
|
||||
|
||||
private void ProcessTypeData(string filePath, ConcurrentBag<string> errors, IEnumerable<TypeData> types)
|
||||
{
|
||||
typesInfo.Add(new SessionStateTypeEntry(filePath));
|
||||
|
||||
// TODO - use parallel foreach without causing any contention
|
||||
// Parallel.ForEach(types, typeData =>
|
||||
foreach (var typeData in types)
|
||||
{
|
||||
ProcessTypeDataToAdd(errors, typeData);
|
||||
}
|
||||
// });
|
||||
}
|
||||
|
||||
private bool ProcessIsBuiltIn(string filePath, ConcurrentBag<string> errors, out bool failToLoadFile)
|
||||
{
|
||||
var result = false;
|
||||
var errorCount = errors.Count;
|
||||
|
||||
var psHome = Utils.DefaultPowerShellAppBase;
|
||||
if (string.Equals(Path.Combine(psHome, "types.ps1xml"), filePath, StringComparison.OrdinalIgnoreCase))
|
||||
if (string.Equals(TypesFilePath, filePath, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
ProcessTypeData(filePath, errors, Types_Ps1Xml.Get());
|
||||
Process_Types_Ps1Xml(filePath, errors);
|
||||
result = true;
|
||||
}
|
||||
else if (string.Equals(Path.Combine(psHome, "typesv3.ps1xml"), filePath, StringComparison.OrdinalIgnoreCase))
|
||||
else if (string.Equals(TypesV3FilePath, filePath, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
ProcessTypeData(filePath, errors, TypesV3_Ps1Xml.Get());
|
||||
Process_TypesV3_Ps1Xml(filePath, errors);
|
||||
result = true;
|
||||
}
|
||||
else if (string.Equals(Path.Combine(psHome, "GetEvent.types.ps1xml"), filePath, StringComparison.OrdinalIgnoreCase))
|
||||
else if (string.Equals(GetEventTypesFilePath, filePath, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
ProcessTypeData(filePath, errors, GetEvent_Types_Ps1Xml.Get());
|
||||
Process_GetEvent_Types_Ps1Xml(filePath, errors);
|
||||
result = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,201 @@
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Management.Automation.Language;
|
||||
using System.Reflection;
|
||||
|
||||
namespace System.Management.Automation.Runspaces
|
||||
{
|
||||
public sealed partial class TypeTable
|
||||
{
|
||||
private void Process_GetEvent_Types_Ps1Xml(string filePath, ConcurrentBag<string> errors)
|
||||
{
|
||||
typesInfo.Add(new SessionStateTypeEntry(filePath));
|
||||
|
||||
string typeName = null;
|
||||
PSMemberInfoInternalCollection<PSMemberInfo> typeMembers = null;
|
||||
PSMemberInfoInternalCollection<PSMemberInfo> memberSetMembers = null;
|
||||
HashSet<string> newMembers = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
#region System.Diagnostics.Eventing.Reader.EventLogConfiguration
|
||||
|
||||
typeName = @"System.Diagnostics.Eventing.Reader.EventLogConfiguration";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
|
||||
|
||||
// Process standard members.
|
||||
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSPropertySet(
|
||||
@"DefaultDisplayPropertySet",
|
||||
new List<string> { "LogName", "MaximumSizeInBytes", "RecordCount", "LogMode" }),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
ProcessStandardMembers(
|
||||
errors,
|
||||
typeName,
|
||||
memberSetMembers,
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion System.Diagnostics.Eventing.Reader.EventLogConfiguration
|
||||
|
||||
#region System.Diagnostics.Eventing.Reader.EventLogRecord
|
||||
|
||||
typeName = @"System.Diagnostics.Eventing.Reader.EventLogRecord";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
|
||||
|
||||
// Process standard members.
|
||||
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSPropertySet(
|
||||
@"DefaultDisplayPropertySet",
|
||||
new List<string> { "TimeCreated", "ProviderName", "Id", "Message" }),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
ProcessStandardMembers(
|
||||
errors,
|
||||
typeName,
|
||||
memberSetMembers,
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion System.Diagnostics.Eventing.Reader.EventLogRecord
|
||||
|
||||
#region System.Diagnostics.Eventing.Reader.ProviderMetadata
|
||||
|
||||
typeName = @"System.Diagnostics.Eventing.Reader.ProviderMetadata";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 2));
|
||||
|
||||
// Process regular members.
|
||||
newMembers.Add(@"ProviderName");
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSAliasProperty(@"ProviderName", @"Name", conversionType: null),
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
// Process standard members.
|
||||
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSPropertySet(
|
||||
@"DefaultDisplayPropertySet",
|
||||
new List<string> { "Name", "LogLinks" }),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
ProcessStandardMembers(
|
||||
errors,
|
||||
typeName,
|
||||
memberSetMembers,
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion System.Diagnostics.Eventing.Reader.ProviderMetadata
|
||||
|
||||
#if !CORECLR
|
||||
#region Microsoft.PowerShell.Commands.GetCounter.CounterSet
|
||||
|
||||
typeName = @"Microsoft.PowerShell.Commands.GetCounter.CounterSet";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
|
||||
|
||||
// Process regular members.
|
||||
newMembers.Add(@"Counter");
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSAliasProperty(@"Counter", @"Paths", conversionType: null),
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion Microsoft.PowerShell.Commands.GetCounter.CounterSet
|
||||
|
||||
#region Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSample
|
||||
|
||||
typeName = @"Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSample";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
|
||||
|
||||
// Process standard members.
|
||||
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSPropertySet(
|
||||
@"DefaultDisplayPropertySet",
|
||||
new List<string> { "Path", "InstanceName", "CookedValue" }),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
ProcessStandardMembers(
|
||||
errors,
|
||||
typeName,
|
||||
memberSetMembers,
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSample
|
||||
|
||||
#region Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet
|
||||
|
||||
typeName = @"Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 2));
|
||||
|
||||
// Process regular members.
|
||||
newMembers.Add(@"Readings");
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSScriptProperty(
|
||||
@"Readings",
|
||||
GetScriptBlock(@"$strPaths = """"
|
||||
foreach ($ctr in $this.CounterSamples)
|
||||
{
|
||||
$strPaths += ($ctr.Path + "" :"" + ""`n"")
|
||||
$strPaths += ($ctr.CookedValue.ToString() + ""`n`n"")
|
||||
}
|
||||
|
||||
return $strPaths"),
|
||||
setterScript: null,
|
||||
shouldCloneOnAccess: true),
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
// Process standard members.
|
||||
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSPropertySet(
|
||||
@"DefaultDisplayPropertySet",
|
||||
new List<string> { "Timestamp", "Readings" }),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
ProcessStandardMembers(
|
||||
errors,
|
||||
typeName,
|
||||
memberSetMembers,
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet
|
||||
#endif
|
||||
|
||||
// Update binder version for newly added members.
|
||||
foreach (string memberName in newMembers)
|
||||
{
|
||||
PSGetMemberBinder.TypeTableMemberAdded(memberName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,436 @@
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Management.Automation.Language;
|
||||
using System.Reflection;
|
||||
|
||||
namespace System.Management.Automation.Runspaces
|
||||
{
|
||||
public sealed partial class TypeTable
|
||||
{
|
||||
private void Process_TypesV3_Ps1Xml(string filePath, ConcurrentBag<string> errors)
|
||||
{
|
||||
typesInfo.Add(new SessionStateTypeEntry(filePath));
|
||||
|
||||
string typeName = null;
|
||||
PSMemberInfoInternalCollection<PSMemberInfo> typeMembers = null;
|
||||
PSMemberInfoInternalCollection<PSMemberInfo> memberSetMembers = null;
|
||||
HashSet<string> newMembers = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
#region System.Security.Cryptography.X509Certificates.X509Certificate2
|
||||
|
||||
typeName = @"System.Security.Cryptography.X509Certificates.X509Certificate2";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 3));
|
||||
|
||||
// Process regular members.
|
||||
newMembers.Add(@"EnhancedKeyUsageList");
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSScriptProperty(
|
||||
@"EnhancedKeyUsageList",
|
||||
GetScriptBlock(@",(new-object Microsoft.Powershell.Commands.EnhancedKeyUsageProperty -argumentlist $this).EnhancedKeyUsageList;"),
|
||||
setterScript: null,
|
||||
shouldCloneOnAccess: true),
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
newMembers.Add(@"DnsNameList");
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSScriptProperty(
|
||||
@"DnsNameList",
|
||||
GetScriptBlock(@",(new-object Microsoft.Powershell.Commands.DnsNameProperty -argumentlist $this).DnsNameList;"),
|
||||
setterScript: null,
|
||||
shouldCloneOnAccess: true),
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
newMembers.Add(@"SendAsTrustedIssuer");
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSScriptProperty(
|
||||
@"SendAsTrustedIssuer",
|
||||
GetScriptBlock(@"[Microsoft.Powershell.Commands.SendAsTrustedIssuerProperty]::ReadSendAsTrustedIssuerProperty($this)"),
|
||||
GetScriptBlock(@"$sendAsTrustedIssuer = $args[0]
|
||||
[Microsoft.Powershell.Commands.SendAsTrustedIssuerProperty]::WriteSendAsTrustedIssuerProperty($this,$this.PsPath,$sendAsTrustedIssuer)"),
|
||||
shouldCloneOnAccess: true),
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion System.Security.Cryptography.X509Certificates.X509Certificate2
|
||||
|
||||
#region System.Management.Automation.Remoting.PSSenderInfo
|
||||
|
||||
typeName = @"System.Management.Automation.Remoting.PSSenderInfo";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 2));
|
||||
|
||||
// Process regular members.
|
||||
newMembers.Add(@"ConnectedUser");
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSScriptProperty(
|
||||
@"ConnectedUser",
|
||||
GetScriptBlock(@"$this.UserInfo.Identity.Name"),
|
||||
setterScript: null,
|
||||
shouldCloneOnAccess: true),
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
newMembers.Add(@"RunAsUser");
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSScriptProperty(
|
||||
@"RunAsUser",
|
||||
GetScriptBlock(@"if($null -ne $this.UserInfo.WindowsIdentity)
|
||||
{
|
||||
$this.UserInfo.WindowsIdentity.Name
|
||||
}"),
|
||||
setterScript: null,
|
||||
shouldCloneOnAccess: true),
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion System.Management.Automation.Remoting.PSSenderInfo
|
||||
|
||||
#region System.Management.Automation.CompletionResult
|
||||
|
||||
typeName = @"System.Management.Automation.CompletionResult";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
|
||||
|
||||
// Process standard members.
|
||||
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSNoteProperty(@"SerializationDepth", 1),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
ProcessStandardMembers(
|
||||
errors,
|
||||
typeName,
|
||||
memberSetMembers,
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion System.Management.Automation.CompletionResult
|
||||
|
||||
#region Deserialized.System.Management.Automation.CompletionResult
|
||||
|
||||
typeName = @"Deserialized.System.Management.Automation.CompletionResult";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
|
||||
|
||||
// Process standard members.
|
||||
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSNoteProperty(@"TargetTypeForDeserialization", typeof(Microsoft.PowerShell.DeserializingTypeConverter)),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
ProcessStandardMembers(
|
||||
errors,
|
||||
typeName,
|
||||
memberSetMembers,
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion Deserialized.System.Management.Automation.CompletionResult
|
||||
|
||||
#region System.Management.Automation.CommandCompletion
|
||||
|
||||
typeName = @"System.Management.Automation.CommandCompletion";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
|
||||
|
||||
// Process standard members.
|
||||
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSNoteProperty(@"SerializationDepth", 1),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
ProcessStandardMembers(
|
||||
errors,
|
||||
typeName,
|
||||
memberSetMembers,
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion System.Management.Automation.CommandCompletion
|
||||
|
||||
#region Deserialized.System.Management.Automation.CommandCompletion
|
||||
|
||||
typeName = @"Deserialized.System.Management.Automation.CommandCompletion";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
|
||||
|
||||
// Process standard members.
|
||||
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSNoteProperty(@"TargetTypeForDeserialization", typeof(Microsoft.PowerShell.DeserializingTypeConverter)),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
ProcessStandardMembers(
|
||||
errors,
|
||||
typeName,
|
||||
memberSetMembers,
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion Deserialized.System.Management.Automation.CommandCompletion
|
||||
|
||||
#region Microsoft.PowerShell.Commands.ModuleSpecification
|
||||
|
||||
typeName = @"Microsoft.PowerShell.Commands.ModuleSpecification";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
|
||||
|
||||
// Process standard members.
|
||||
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSNoteProperty(@"SerializationDepth", 1),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
ProcessStandardMembers(
|
||||
errors,
|
||||
typeName,
|
||||
memberSetMembers,
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion Microsoft.PowerShell.Commands.ModuleSpecification
|
||||
|
||||
#region Deserialized.Microsoft.PowerShell.Commands.ModuleSpecification
|
||||
|
||||
typeName = @"Deserialized.Microsoft.PowerShell.Commands.ModuleSpecification";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
|
||||
|
||||
// Process standard members.
|
||||
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSNoteProperty(@"TargetTypeForDeserialization", typeof(Microsoft.PowerShell.DeserializingTypeConverter)),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
ProcessStandardMembers(
|
||||
errors,
|
||||
typeName,
|
||||
memberSetMembers,
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion Deserialized.Microsoft.PowerShell.Commands.ModuleSpecification
|
||||
|
||||
#region System.Management.Automation.JobStateEventArgs
|
||||
|
||||
typeName = @"System.Management.Automation.JobStateEventArgs";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
|
||||
|
||||
// Process standard members.
|
||||
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSNoteProperty(@"SerializationDepth", 2),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
ProcessStandardMembers(
|
||||
errors,
|
||||
typeName,
|
||||
memberSetMembers,
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion System.Management.Automation.JobStateEventArgs
|
||||
|
||||
#region Deserialized.System.Management.Automation.JobStateEventArgs
|
||||
|
||||
typeName = @"Deserialized.System.Management.Automation.JobStateEventArgs";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
|
||||
|
||||
// Process standard members.
|
||||
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSNoteProperty(@"TargetTypeForDeserialization", typeof(Microsoft.PowerShell.DeserializingTypeConverter)),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
ProcessStandardMembers(
|
||||
errors,
|
||||
typeName,
|
||||
memberSetMembers,
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion Deserialized.System.Management.Automation.JobStateEventArgs
|
||||
|
||||
#region System.Exception
|
||||
|
||||
typeName = @"System.Exception";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
|
||||
|
||||
// Process standard members.
|
||||
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSNoteProperty(@"SerializationDepth", 1),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
ProcessStandardMembers(
|
||||
errors,
|
||||
typeName,
|
||||
memberSetMembers,
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion System.Exception
|
||||
|
||||
#region System.Management.Automation.Remoting.PSSessionOption
|
||||
|
||||
typeName = @"System.Management.Automation.Remoting.PSSessionOption";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
|
||||
|
||||
// Process standard members.
|
||||
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSNoteProperty(@"SerializationDepth", 1),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
ProcessStandardMembers(
|
||||
errors,
|
||||
typeName,
|
||||
memberSetMembers,
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion System.Management.Automation.Remoting.PSSessionOption
|
||||
|
||||
#region Deserialized.System.Management.Automation.Remoting.PSSessionOption
|
||||
|
||||
typeName = @"Deserialized.System.Management.Automation.Remoting.PSSessionOption";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
|
||||
|
||||
// Process standard members.
|
||||
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSNoteProperty(@"TargetTypeForDeserialization", typeof(Microsoft.PowerShell.DeserializingTypeConverter)),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
ProcessStandardMembers(
|
||||
errors,
|
||||
typeName,
|
||||
memberSetMembers,
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion Deserialized.System.Management.Automation.Remoting.PSSessionOption
|
||||
|
||||
#region System.Management.Automation.DebuggerStopEventArgs
|
||||
|
||||
typeName = @"System.Management.Automation.DebuggerStopEventArgs";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 2));
|
||||
|
||||
// Process regular members.
|
||||
newMembers.Add(@"SerializedInvocationInfo");
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSCodeProperty(
|
||||
@"SerializedInvocationInfo",
|
||||
GetMethodInfo(typeof(Microsoft.PowerShell.DeserializingTypeConverter), @"GetInvocationInfo"),
|
||||
setterCodeReference: null) { IsHidden = true },
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
// Process standard members.
|
||||
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 3);
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSNoteProperty(@"SerializationMethod", @"SpecificProperties"),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSNoteProperty(@"SerializationDepth", 2),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSPropertySet(
|
||||
@"PropertySerializationSet",
|
||||
new List<string> { "Breakpoints", "ResumeAction", "SerializedInvocationInfo" }),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
ProcessStandardMembers(
|
||||
errors,
|
||||
typeName,
|
||||
memberSetMembers,
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion System.Management.Automation.DebuggerStopEventArgs
|
||||
|
||||
#region Deserialized.System.Management.Automation.DebuggerStopEventArgs
|
||||
|
||||
typeName = @"Deserialized.System.Management.Automation.DebuggerStopEventArgs";
|
||||
typeMembers = _extendedMembers.GetOrAdd(typeName, GetValueFactoryBasedOnInitCapacity(capacity: 1));
|
||||
|
||||
// Process standard members.
|
||||
memberSetMembers = new PSMemberInfoInternalCollection<PSMemberInfo>(capacity: 1);
|
||||
AddMember(
|
||||
errors,
|
||||
typeName,
|
||||
new PSNoteProperty(@"TargetTypeForDeserialization", typeof(Microsoft.PowerShell.DeserializingTypeConverter)),
|
||||
memberSetMembers,
|
||||
isOverride: false);
|
||||
|
||||
ProcessStandardMembers(
|
||||
errors,
|
||||
typeName,
|
||||
memberSetMembers,
|
||||
typeMembers,
|
||||
isOverride: false);
|
||||
|
||||
#endregion Deserialized.System.Management.Automation.DebuggerStopEventArgs
|
||||
|
||||
// Update binder version for newly added members.
|
||||
foreach (string memberName in newMembers)
|
||||
{
|
||||
PSGetMemberBinder.TypeTableMemberAdded(memberName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,119 +0,0 @@
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Licensed under the MIT License.
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Management.Automation;
|
||||
using System.Reflection;
|
||||
|
||||
namespace System.Management.Automation.Runspaces
|
||||
{
|
||||
internal sealed class TypesV3_Ps1Xml
|
||||
{
|
||||
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
static MethodInfo GetMethodInfo(string typeName, string method)
|
||||
{
|
||||
var type = LanguagePrimitives.ConvertTo<Type>(typeName);
|
||||
return GetMethodInfo(type, method);
|
||||
}
|
||||
|
||||
static MethodInfo GetMethodInfo(Type type, string method)
|
||||
{
|
||||
return type.GetMethod(method, BindingFlags.Static | BindingFlags.Public | BindingFlags.IgnoreCase);
|
||||
}
|
||||
|
||||
static ScriptBlock GetScriptBlock(string s)
|
||||
{
|
||||
var sb = ScriptBlock.CreateDelayParsedScriptBlock(s, isProductCode: true);
|
||||
sb.LanguageMode = PSLanguageMode.FullLanguage;
|
||||
return sb;
|
||||
}
|
||||
|
||||
public static IEnumerable<TypeData> Get()
|
||||
{
|
||||
var td1 = new TypeData(@"System.Security.Cryptography.X509Certificates.X509Certificate2", true);
|
||||
td1.Members.Add("EnhancedKeyUsageList",
|
||||
new ScriptPropertyData(@"EnhancedKeyUsageList", GetScriptBlock(@",(new-object Microsoft.Powershell.Commands.EnhancedKeyUsageProperty -argumentlist $this).EnhancedKeyUsageList;"), null));
|
||||
td1.Members.Add("DnsNameList",
|
||||
new ScriptPropertyData(@"DnsNameList", GetScriptBlock(@",(new-object Microsoft.Powershell.Commands.DnsNameProperty -argumentlist $this).DnsNameList;"), null));
|
||||
td1.Members.Add("SendAsTrustedIssuer",
|
||||
new ScriptPropertyData(@"SendAsTrustedIssuer", GetScriptBlock(@"[Microsoft.Powershell.Commands.SendAsTrustedIssuerProperty]::ReadSendAsTrustedIssuerProperty($this)"), GetScriptBlock(@"$sendAsTrustedIssuer = $args[0]
|
||||
[Microsoft.Powershell.Commands.SendAsTrustedIssuerProperty]::WriteSendAsTrustedIssuerProperty($this,$this.PsPath,$sendAsTrustedIssuer)")));
|
||||
yield return td1;
|
||||
|
||||
var td2 = new TypeData(@"System.Management.Automation.Remoting.PSSenderInfo", true);
|
||||
td2.Members.Add("ConnectedUser",
|
||||
new ScriptPropertyData(@"ConnectedUser", GetScriptBlock(@"$this.UserInfo.Identity.Name"), null));
|
||||
td2.Members.Add("RunAsUser",
|
||||
new ScriptPropertyData(@"RunAsUser", GetScriptBlock(@"if($null -ne $this.UserInfo.WindowsIdentity)
|
||||
{
|
||||
$this.UserInfo.WindowsIdentity.Name
|
||||
}"), null));
|
||||
yield return td2;
|
||||
|
||||
var td3 = new TypeData(@"System.Management.Automation.CompletionResult", true);
|
||||
td3.SerializationDepth = 1;
|
||||
yield return td3;
|
||||
|
||||
var td4 = new TypeData(@"Deserialized.System.Management.Automation.CompletionResult", true);
|
||||
td4.TargetTypeForDeserialization = typeof(Microsoft.PowerShell.DeserializingTypeConverter);
|
||||
yield return td4;
|
||||
|
||||
var td5 = new TypeData(@"System.Management.Automation.CommandCompletion", true);
|
||||
td5.SerializationDepth = 1;
|
||||
yield return td5;
|
||||
|
||||
var td6 = new TypeData(@"Deserialized.System.Management.Automation.CommandCompletion", true);
|
||||
td6.TargetTypeForDeserialization = typeof(Microsoft.PowerShell.DeserializingTypeConverter);
|
||||
yield return td6;
|
||||
|
||||
var td7 = new TypeData(@"Microsoft.PowerShell.Commands.ModuleSpecification", true);
|
||||
td7.SerializationDepth = 1;
|
||||
yield return td7;
|
||||
|
||||
var td8 = new TypeData(@"Deserialized.Microsoft.PowerShell.Commands.ModuleSpecification", true);
|
||||
td8.TargetTypeForDeserialization = typeof(Microsoft.PowerShell.DeserializingTypeConverter);
|
||||
yield return td8;
|
||||
|
||||
var td9 = new TypeData(@"System.Management.Automation.JobStateEventArgs", true);
|
||||
td9.SerializationDepth = 2;
|
||||
yield return td9;
|
||||
|
||||
var td10 = new TypeData(@"Deserialized.System.Management.Automation.JobStateEventArgs", true);
|
||||
td10.TargetTypeForDeserialization = typeof(Microsoft.PowerShell.DeserializingTypeConverter);
|
||||
yield return td10;
|
||||
|
||||
var td11 = new TypeData(@"System.Exception", true);
|
||||
td11.SerializationDepth = 1;
|
||||
yield return td11;
|
||||
|
||||
var td12 = new TypeData(@"System.Management.Automation.Remoting.PSSessionOption", true);
|
||||
td12.SerializationDepth = 1;
|
||||
yield return td12;
|
||||
|
||||
var td13 = new TypeData(@"Deserialized.System.Management.Automation.Remoting.PSSessionOption", true);
|
||||
td13.TargetTypeForDeserialization = typeof(Microsoft.PowerShell.DeserializingTypeConverter);
|
||||
yield return td13;
|
||||
|
||||
var td14 = new TypeData(@"System.Management.Automation.DebuggerStopEventArgs", true);
|
||||
td14.Members.Add("SerializedInvocationInfo",
|
||||
new CodePropertyData("SerializedInvocationInfo", GetMethodInfo(typeof(Microsoft.PowerShell.DeserializingTypeConverter), "GetInvocationInfo"), null) { IsHidden = true });
|
||||
td14.SerializationMethod = "SpecificProperties";
|
||||
td14.SerializationDepth = 2;
|
||||
td14.PropertySerializationSet =
|
||||
new PropertySetData(new[] { "Breakpoints", "ResumeAction", "SerializedInvocationInfo" }) { Name = "PropertySerializationSet" };
|
||||
yield return td14;
|
||||
|
||||
var td15 = new TypeData(@"Deserialized.System.Management.Automation.DebuggerStopEventArgs", true);
|
||||
td15.TargetTypeForDeserialization = typeof(Microsoft.PowerShell.DeserializingTypeConverter);
|
||||
yield return td15;
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -8,6 +8,7 @@
|
||||
<OutputType>Exe</OutputType>
|
||||
<TieredCompilation>true</TieredCompilation>
|
||||
<TieredCompilationQuickJit>true</TieredCompilationQuickJit>
|
||||
<TieredCompilationQuickJitForLoops>true</TieredCompilationQuickJitForLoops>
|
||||
<RuntimeIdentifiers>linux-x64;osx-x64;</RuntimeIdentifiers>
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
<OutputType>Exe</OutputType>
|
||||
<TieredCompilation>true</TieredCompilation>
|
||||
<TieredCompilationQuickJit>true</TieredCompilationQuickJit>
|
||||
<TieredCompilationQuickJitForLoops>true</TieredCompilationQuickJitForLoops>
|
||||
<RuntimeIdentifiers>win7-x86;win7-x64</RuntimeIdentifiers>
|
||||
<RootNamespace>Microsoft.PowerShell</RootNamespace>
|
||||
<ApplicationManifest>..\..\assets\pwsh.manifest</ApplicationManifest>
|
||||
|
||||
@@ -0,0 +1,126 @@
|
||||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
# Licensed under the MIT License.
|
||||
|
||||
Describe "Built-in type information tests" -Tag "CI" {
|
||||
BeforeAll {
|
||||
$iss = [initialsessionstate]::CreateDefault2()
|
||||
$rs = [runspacefactory]::CreateRunspace($iss)
|
||||
$rs.Open()
|
||||
|
||||
$ps = [powershell]::Create()
|
||||
$ps.Runspace = $rs
|
||||
$types = $ps.AddCommand("Get-TypeData").Invoke()
|
||||
}
|
||||
|
||||
AfterAll {
|
||||
$ps.Dispose()
|
||||
$rs.Dispose()
|
||||
}
|
||||
|
||||
It "Should have correct number of built-in type items in type table" {
|
||||
$types.Count | Should -BeExactly ($IsWindows ? 273 : 271)
|
||||
}
|
||||
|
||||
It "Should have expected member info for 'System.Diagnostics.ProcessModule'" {
|
||||
$typeData = $types | Where-Object TypeName -eq "System.Diagnostics.ProcessModule"
|
||||
$typeData | Should -Not -BeNullOrEmpty
|
||||
|
||||
$typeData.Members.Count | Should -BeExactly 6
|
||||
$typeData.Members['Size'] | Should -BeOfType "System.Management.Automation.Runspaces.ScriptPropertyData"
|
||||
$typeData.Members['Size'].GetScriptBlock.ToString() | Should -BeExactly '$this.ModuleMemorySize / 1024'
|
||||
$typeData.Members['Size'].SetScriptBlock | Should -BeNullOrEmpty
|
||||
$typeData.Members['Size'].IsHidden | Should -BeFalse
|
||||
$typeData.Members['Size'].Name | Should -Be "Size"
|
||||
|
||||
$typeData.Members['Company'] | Should -BeOfType "System.Management.Automation.Runspaces.ScriptPropertyData"
|
||||
$typeData.Members['Company'].GetScriptBlock.ToString() | Should -BeExactly '$this.FileVersionInfo.CompanyName'
|
||||
$typeData.Members['Company'].SetScriptBlock | Should -BeNullOrEmpty
|
||||
$typeData.Members['Company'].IsHidden | Should -BeFalse
|
||||
$typeData.Members['Company'].Name | Should -Be "Company"
|
||||
|
||||
$typeData.Members['FileVersion'] | Should -BeOfType "System.Management.Automation.Runspaces.ScriptPropertyData"
|
||||
$typeData.Members['FileVersion'].GetScriptBlock.ToString() | Should -BeExactly '$this.FileVersionInfo.FileVersion'
|
||||
$typeData.Members['FileVersion'].SetScriptBlock | Should -BeNullOrEmpty
|
||||
$typeData.Members['FileVersion'].IsHidden | Should -BeFalse
|
||||
$typeData.Members['FileVersion'].Name | Should -Be "FileVersion"
|
||||
|
||||
$typeData.Members['ProductVersion'] | Should -BeOfType "System.Management.Automation.Runspaces.ScriptPropertyData"
|
||||
$typeData.Members['ProductVersion'].GetScriptBlock.ToString() | Should -BeExactly '$this.FileVersionInfo.ProductVersion'
|
||||
$typeData.Members['ProductVersion'].SetScriptBlock | Should -BeNullOrEmpty
|
||||
$typeData.Members['ProductVersion'].IsHidden | Should -BeFalse
|
||||
$typeData.Members['ProductVersion'].Name | Should -Be "ProductVersion"
|
||||
|
||||
$typeData.Members['Description'] | Should -BeOfType "System.Management.Automation.Runspaces.ScriptPropertyData"
|
||||
$typeData.Members['Description'].GetScriptBlock.ToString() | Should -BeExactly '$this.FileVersionInfo.FileDescription'
|
||||
$typeData.Members['Description'].SetScriptBlock | Should -BeNullOrEmpty
|
||||
$typeData.Members['Description'].IsHidden | Should -BeFalse
|
||||
$typeData.Members['Description'].Name | Should -Be "Description"
|
||||
|
||||
$typeData.Members['Product'] | Should -BeOfType "System.Management.Automation.Runspaces.ScriptPropertyData"
|
||||
$typeData.Members['Product'].GetScriptBlock.ToString() | Should -BeExactly '$this.FileVersionInfo.ProductName'
|
||||
$typeData.Members['Product'].SetScriptBlock | Should -BeNullOrEmpty
|
||||
$typeData.Members['Product'].IsHidden | Should -BeFalse
|
||||
$typeData.Members['Product'].Name | Should -Be "Product"
|
||||
|
||||
$typeData.TypeConverter | Should -BeNullOrEmpty
|
||||
$typeData.TypeAdapter | Should -BeNullOrEmpty
|
||||
$typeData.IsOverride | Should -BeFalse
|
||||
$typeData.SerializationMethod | Should -BeNullOrEmpty
|
||||
$typeData.TargetTypeForDeserialization | Should -BeNullOrEmpty
|
||||
$typeData.SerializationDepth | Should -Be 0
|
||||
$typeData.DefaultDisplayProperty | Should -BeNullOrEmpty
|
||||
$typeData.InheritPropertySerializationSet | Should -BeFalse
|
||||
$typeData.StringSerializationSource | Should -BeNullOrEmpty
|
||||
$typeData.StringSerializationSourceProperty | Should -BeNullOrEmpty
|
||||
$typeData.DefaultDisplayPropertySet | Should -BeNullOrEmpty
|
||||
$typeData.DefaultKeyPropertySet | Should -BeNullOrEmpty
|
||||
$typeData.PropertySerializationSet | Should -BeNullOrEmpty
|
||||
}
|
||||
|
||||
It "Should have expected member info for 'System.Management.Automation.ParameterSetMetadata'" {
|
||||
$typeData = $types | Where-Object TypeName -eq "System.Management.Automation.ParameterSetMetadata"
|
||||
$typeData | Should -Not -BeNullOrEmpty
|
||||
|
||||
$typeData.Members.Count | Should -BeExactly 1
|
||||
$typeData.Members['Flags'] | Should -BeOfType "System.Management.Automation.Runspaces.CodePropertyData"
|
||||
$typeData.Members['Flags'].IsHidden | Should -BeFalse
|
||||
$typeData.Members['Flags'].Name | Should -Be "Flags"
|
||||
|
||||
$typeData.TypeConverter | Should -BeNullOrEmpty
|
||||
$typeData.TypeAdapter | Should -BeNullOrEmpty
|
||||
$typeData.IsOverride | Should -BeFalse
|
||||
$typeData.TargetTypeForDeserialization | Should -BeNullOrEmpty
|
||||
$typeData.SerializationDepth | Should -Be 0
|
||||
$typeData.DefaultDisplayProperty | Should -BeNullOrEmpty
|
||||
$typeData.InheritPropertySerializationSet | Should -BeFalse
|
||||
$typeData.StringSerializationSource | Should -BeNullOrEmpty
|
||||
$typeData.StringSerializationSourceProperty | Should -BeNullOrEmpty
|
||||
$typeData.DefaultDisplayPropertySet | Should -BeNullOrEmpty
|
||||
$typeData.DefaultKeyPropertySet | Should -BeNullOrEmpty
|
||||
|
||||
$typeData.SerializationMethod | Should -BeExactly "SpecificProperties"
|
||||
$typeData.PropertySerializationSet | Should -BeOfType "System.Management.Automation.Runspaces.PropertySetData"
|
||||
[string]::Join(",", $typeData.PropertySerializationSet.ReferencedProperties) | Should -BeExactly "Position,Flags,HelpMessage"
|
||||
}
|
||||
|
||||
It "Should have expected member info for 'System.Management.Automation.JobStateEventArgs'" {
|
||||
$typeData = $types | Where-Object TypeName -eq "System.Management.Automation.JobStateEventArgs"
|
||||
$typeData | Should -Not -BeNullOrEmpty
|
||||
|
||||
$typeData.Members.Count | Should -BeExactly 0
|
||||
|
||||
$typeData.TypeConverter | Should -BeNullOrEmpty
|
||||
$typeData.TypeAdapter | Should -BeNullOrEmpty
|
||||
$typeData.IsOverride | Should -BeFalse
|
||||
$typeData.SerializationMethod | Should -BeNullOrEmpty
|
||||
$typeData.TargetTypeForDeserialization | Should -BeNullOrEmpty
|
||||
$typeData.DefaultDisplayProperty | Should -BeNullOrEmpty
|
||||
$typeData.InheritPropertySerializationSet | Should -BeFalse
|
||||
$typeData.StringSerializationSource | Should -BeNullOrEmpty
|
||||
$typeData.StringSerializationSourceProperty | Should -BeNullOrEmpty
|
||||
$typeData.DefaultDisplayPropertySet | Should -BeNullOrEmpty
|
||||
$typeData.DefaultKeyPropertySet | Should -BeNullOrEmpty
|
||||
|
||||
$typeData.SerializationDepth | Should -Be 2
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user