diff --git a/src/System.Management.Automation/FormatAndOutput/common/FormattingObjects.cs b/src/System.Management.Automation/FormatAndOutput/common/FormattingObjects.cs index bc9cc0565a0..ce6c13575d7 100644 --- a/src/System.Management.Automation/FormatAndOutput/common/FormattingObjects.cs +++ b/src/System.Management.Automation/FormatAndOutput/common/FormattingObjects.cs @@ -23,7 +23,6 @@ // using System.Collections.Generic; -using System.Management.Automation; namespace Microsoft.PowerShell.Commands.Internal.Format { diff --git a/src/System.Management.Automation/engine/COM/ComAdapter.cs b/src/System.Management.Automation/engine/COM/ComAdapter.cs index b6d8f8af5ff..b4548246fbf 100644 --- a/src/System.Management.Automation/engine/COM/ComAdapter.cs +++ b/src/System.Management.Automation/engine/COM/ComAdapter.cs @@ -97,12 +97,12 @@ protected override T GetFirstMemberOrDefault(object obj, MemberNamePredicate { if (prop.IsParameterized && lookingForParameterizedProperties - && predicate.Invoke(prop.Name)) + && predicate(prop.Name)) { return new PSParameterizedProperty(prop.Name, this, obj, prop) as T; } - if (lookingForProperties && predicate.Invoke(prop.Name)) + if (lookingForProperties && predicate(prop.Name)) { return new PSProperty(prop.Name, this, obj, prop) as T; } @@ -115,7 +115,7 @@ protected override T GetFirstMemberOrDefault(object obj, MemberNamePredicate { foreach (ComMethod method in _comTypeInfo.Methods.Values) { - if (predicate.Invoke(method.Name)) + if (predicate(method.Name)) { var mshMethod = new PSMethod(method.Name, this, obj, method); return mshMethod as T; diff --git a/src/System.Management.Automation/engine/MshMemberInfo.cs b/src/System.Management.Automation/engine/MshMemberInfo.cs index 754a15eab27..368ed2106fa 100644 --- a/src/System.Management.Automation/engine/MshMemberInfo.cs +++ b/src/System.Management.Automation/engine/MshMemberInfo.cs @@ -3115,7 +3115,7 @@ private static Collection> GetTypeMemberCollection returnValue.Add(new CollectionEntry( PSObject.TypeTableGetMembersDelegate, PSObject.TypeTableGetMemberDelegate, - PSObject.TypeTableGetFirstOrDefaultMemberDelegate, + PSObject.TypeTableGetFirstMemberOrDefaultDelegate, true, true, "type table members")); return returnValue; } @@ -3126,7 +3126,7 @@ private static Collection> GetTypeMethodCollection returnValue.Add(new CollectionEntry( PSObject.TypeTableGetMembersDelegate, PSObject.TypeTableGetMemberDelegate, - PSObject.TypeTableGetFirstOrDefaultMemberDelegate, + PSObject.TypeTableGetFirstMemberOrDefaultDelegate, true, true, "type table members")); return returnValue; } @@ -3137,7 +3137,7 @@ private static Collection> GetTypePropertyCollec returnValue.Add(new CollectionEntry( PSObject.TypeTableGetMembersDelegate, PSObject.TypeTableGetMemberDelegate, - PSObject.TypeTableGetFirstOrDefaultMemberDelegate, + PSObject.TypeTableGetFirstMemberOrDefaultDelegate, true, true, "type table members")); return returnValue; } @@ -3823,7 +3823,7 @@ IEnumerator IEnumerable.GetEnumerator() #endregion IEnumerable - internal abstract T GetFirstOrDefault(MemberNamePredicate predicate); + internal abstract T FirstOrDefault(MemberNamePredicate predicate); } /// @@ -4274,15 +4274,19 @@ public override IEnumerator GetEnumerator() } } - internal override T GetFirstOrDefault(MemberNamePredicate predicate) + /// + /// Returns the first member that matches the specified . + /// + internal override T FirstOrDefault(MemberNamePredicate predicate) { - var enumerator = _members.GetEnumerator(); - while (enumerator.MoveNext()) + lock (_members) { - var key = (string)enumerator.Key; - if (predicate(key)) + foreach (DictionaryEntry entry in _members) { - return (T)enumerator.Value; + if (predicate((string)entry.Key)) + { + return entry.Value as T; + } } } @@ -4311,8 +4315,8 @@ internal CollectionEntry( GetMembers = getMembers; GetMember = getMember; GetFirstOrDefault = getFirstOrDefault; - ShouldReplicateWhenReturning = shouldReplicateWhenReturning; - ShouldCloneWhenReturning = shouldCloneWhenReturning; + _shouldReplicateWhenReturning = shouldReplicateWhenReturning; + _shouldCloneWhenReturning = shouldCloneWhenReturning; CollectionNameForTracing = collectionNameForTracing; } @@ -4324,20 +4328,19 @@ internal CollectionEntry( internal string CollectionNameForTracing { get; } - private bool ShouldReplicateWhenReturning { get; } + private readonly bool _shouldReplicateWhenReturning; - private bool ShouldCloneWhenReturning { get; } + private readonly bool _shouldCloneWhenReturning; internal T CloneOrReplicateObject(object owner, T member) { - if (ShouldCloneWhenReturning) + if (_shouldCloneWhenReturning) { member = (T)member.Copy(); } - if (ShouldReplicateWhenReturning) + if (_shouldReplicateWhenReturning) { - owner = owner is PSMemberSet memberSet ? memberSet.instance : owner; member.ReplicateInstance(owner); } @@ -4931,15 +4934,46 @@ public override IEnumerator GetEnumerator() return new Enumerator(this); } - internal override T GetFirstOrDefault(MemberNamePredicate predicate) + internal override T FirstOrDefault(MemberNamePredicate predicate) { + object delegateOwner; + if (_mshOwner != null) + { + delegateOwner = _mshOwner; + foreach (PSMemberInfo member in _mshOwner.InstanceMembers) + { + if (member is T memberAsT && predicate(memberAsT.Name)) + { + return memberAsT; + } + } + } + else + { + delegateOwner = _memberSetOwner.instance; + foreach (PSMemberInfo member in _memberSetOwner.InternalMembers) + { + if (member is T memberAsT && predicate(memberAsT.Name)) + { + memberAsT.ReplicateInstance(delegateOwner); + return memberAsT; + } + } + } + + if (delegateOwner == null) + { + return null; + } + + var ownerAsPSObj = PSObject.AsPSObject(delegateOwner); for (int i = 0; i < Collections.Count; i++) { var collectionEntry = Collections[i]; - var res = collectionEntry.GetFirstOrDefault(_mshOwner, predicate); - if (res != null) + var member = collectionEntry.GetFirstOrDefault(ownerAsPSObj, predicate); + if (member != null) { - return collectionEntry.CloneOrReplicateObject(_mshOwner, res); + return collectionEntry.CloneOrReplicateObject(ownerAsPSObj, member); } } diff --git a/src/System.Management.Automation/engine/MshObject.cs b/src/System.Management.Automation/engine/MshObject.cs index 23ff209a055..edf41c7e34c 100644 --- a/src/System.Management.Automation/engine/MshObject.cs +++ b/src/System.Management.Automation/engine/MshObject.cs @@ -111,7 +111,7 @@ internal static PSMemberInfoInternalCollection TypeTableGetMembersDelegate return members; } - internal static T TypeTableGetFirstOrDefaultMemberDelegate(PSObject msjObj, MemberNamePredicate predicate) where T : PSMemberInfo + internal static T TypeTableGetFirstMemberOrDefaultDelegate(PSObject msjObj, MemberNamePredicate predicate) where T : PSMemberInfo { TypeTable table = msjObj.GetTypeTable(); return TypeTableGetFirstOrDefaultMemberDelegate(msjObj, table, predicate); @@ -119,7 +119,7 @@ internal static T TypeTableGetFirstOrDefaultMemberDelegate(PSObject msjObj, M internal static T TypeTableGetFirstOrDefaultMemberDelegate(PSObject msjObj, TypeTable typeTableToUse, MemberNamePredicate predicate) where T : PSMemberInfo { - return typeTableToUse?.GetFirstOrDefaultMember(msjObj.InternalTypeNames, predicate); + return typeTableToUse?.GetFirstMemberOrDefault(msjObj.InternalTypeNames, predicate); } private static T AdapterGetMemberDelegate(PSObject msjObj, string name) where T : PSMemberInfo @@ -141,9 +141,9 @@ private static T AdapterGetMemberDelegate(PSObject msjObj, string name) where return retValue; } - private static T AdapterGetFirstOrDefaultMemberDelegate(PSObject msjObj, MemberNamePredicate predicate) where T : PSMemberInfo + private static T AdapterGetFirstMemberOrDefaultDelegate(PSObject msjObj, MemberNamePredicate predicate) where T : PSMemberInfo { - if (msjObj.IsDeserialized && typeof(PSPropertyInfo).IsAssignableFrom(typeof(T))) + if (msjObj.IsDeserialized && typeof(T).IsAssignableFrom(typeof(PSPropertyInfo))) { if (msjObj.AdaptedMembers == null) { @@ -227,13 +227,12 @@ private static T DotNetGetMemberDelegate(PSObject msjObj, string name) where return null; } - private static T DotNetGetFirstOrDefaultMemberDelegate(PSObject msjObj, MemberNamePredicate predicate) where T : PSMemberInfo + private static T DotNetGetFirstMemberOrDefaultDelegate(PSObject msjObj, MemberNamePredicate predicate) where T : PSMemberInfo { // Don't lookup dotnet member if the object doesn't insist. return msjObj.InternalBaseDotNetAdapter?.BaseGetFirstMemberOrDefault(msjObj._immediateBaseObject, predicate); } - /// /// A collection of delegates to get Extended/Adapted/Dotnet members based on the /// @@ -270,7 +269,7 @@ internal static Collection> GetMemberCollection( returnValue.Add(new CollectionEntry( PSObject.TypeTableGetMembersDelegate, PSObject.TypeTableGetMemberDelegate, - PSObject.TypeTableGetFirstOrDefaultMemberDelegate, + PSObject.TypeTableGetFirstMemberOrDefaultDelegate, true, true, "type table members")); } else @@ -288,7 +287,7 @@ internal static Collection> GetMemberCollection( returnValue.Add(new CollectionEntry( PSObject.AdapterGetMembersDelegate, PSObject.AdapterGetMemberDelegate, - PSObject.AdapterGetFirstOrDefaultMemberDelegate, + PSObject.AdapterGetFirstMemberOrDefaultDelegate, shouldReplicateWhenReturning: false, shouldCloneWhenReturning: false, collectionNameForTracing: "adapted members")); @@ -299,7 +298,7 @@ internal static Collection> GetMemberCollection( returnValue.Add(new CollectionEntry( PSObject.DotNetGetMembersDelegate, PSObject.DotNetGetMemberDelegate, - PSObject.DotNetGetFirstOrDefaultMemberDelegate, + PSObject.DotNetGetFirstMemberOrDefaultDelegate, shouldReplicateWhenReturning: false, shouldCloneWhenReturning: false, collectionNameForTracing: "clr members")); @@ -315,21 +314,21 @@ private static Collection> GetMethodCollection() new CollectionEntry( PSObject.TypeTableGetMembersDelegate, PSObject.TypeTableGetMemberDelegate, - PSObject.TypeTableGetFirstOrDefaultMemberDelegate, + PSObject.TypeTableGetFirstMemberOrDefaultDelegate, shouldReplicateWhenReturning: true, shouldCloneWhenReturning: true, collectionNameForTracing: "type table members"), new CollectionEntry( PSObject.AdapterGetMembersDelegate, PSObject.AdapterGetMemberDelegate, - PSObject.AdapterGetFirstOrDefaultMemberDelegate, + PSObject.AdapterGetFirstMemberOrDefaultDelegate, shouldReplicateWhenReturning: false, shouldCloneWhenReturning: false, collectionNameForTracing: "adapted members"), new CollectionEntry( PSObject.DotNetGetMembersDelegate, PSObject.DotNetGetMemberDelegate, - PSObject.DotNetGetFirstOrDefaultMemberDelegate, + PSObject.DotNetGetFirstMemberOrDefaultDelegate, shouldReplicateWhenReturning: false, shouldCloneWhenReturning: false, collectionNameForTracing: "clr members") @@ -374,7 +373,7 @@ internal static Collection> GetPropertyCollectio returnValue.Add(new CollectionEntry( PSObject.TypeTableGetMembersDelegate, PSObject.TypeTableGetMemberDelegate, - PSObject.TypeTableGetFirstOrDefaultMemberDelegate, + PSObject.TypeTableGetFirstMemberOrDefaultDelegate, true, true, "type table members")); } else @@ -382,7 +381,7 @@ internal static Collection> GetPropertyCollectio returnValue.Add(new CollectionEntry( msjObj => TypeTableGetMembersDelegate(msjObj, backupTypeTable), (msjObj, name) => TypeTableGetMemberDelegate(msjObj, backupTypeTable, name), - PSObject.TypeTableGetFirstOrDefaultMemberDelegate, + PSObject.TypeTableGetFirstMemberOrDefaultDelegate, true, true, "type table members")); } } @@ -392,7 +391,7 @@ internal static Collection> GetPropertyCollectio returnValue.Add(new CollectionEntry( PSObject.AdapterGetMembersDelegate, PSObject.AdapterGetMemberDelegate, - PSObject.AdapterGetFirstOrDefaultMemberDelegate, + PSObject.AdapterGetFirstMemberOrDefaultDelegate, false, false, "adapted members")); } @@ -401,7 +400,7 @@ internal static Collection> GetPropertyCollectio returnValue.Add(new CollectionEntry( PSObject.DotNetGetMembersDelegate, PSObject.DotNetGetMemberDelegate, - PSObject.DotNetGetFirstOrDefaultMemberDelegate, + PSObject.DotNetGetFirstMemberOrDefaultDelegate, false, false, "clr members")); } @@ -630,31 +629,6 @@ internal static PSObject ConstructPSObjectFromSerializationInfo(SerializationInf private PSObjectFlags _flags; - /// - /// This field contains a stream type used by the formatting system. - /// - private WriteStreamType _writeStream; - - /// - /// Members from the adapter of the object before it was serialized - /// Null for live objects but not null for deserialized objects. - /// - private PSMemberInfoInternalCollection _adaptedMembers; - - /// - /// Members from the adapter of the object before it was serialized - /// Null for live objects but not null for deserialized objects. - /// - private PSMemberInfoInternalCollection _clrMembers; - - // This is toString value set on deserialization - private string _toStringFromDeserialization; - - /// - /// If this is non-null return this string as the ToString() for this wrapped object. - /// - private string _tokenText; - #endregion instance fields private static readonly PSTraceSource s_memberResolution = PSTraceSource.GetTracer("MemberResolution", "Traces the resolution from member name to the member. A member can be a property, method, etc.", false); @@ -943,8 +917,7 @@ internal static bool HasInstanceMembers(object obj, out PSMemberInfoInternalColl { if (psobj._instanceMembers == null) { - s_instanceMembersResurrectionTable.TryGetValue(GetKeyForResurrectionTables(psobj), - out psobj._instanceMembers); + s_instanceMembersResurrectionTable.TryGetValue(GetKeyForResurrectionTables(psobj), out psobj._instanceMembers); } } @@ -1536,9 +1509,9 @@ public override string ToString() { // If ToString value from deserialization is available, // simply return it. - if (_toStringFromDeserialization != null) + if (ToStringFromDeserialization != null) { - return _toStringFromDeserialization; + return ToStringFromDeserialization; } return PSObject.ToString(null, this, null, null, null, true, false); @@ -1557,9 +1530,9 @@ public string ToString(string format, IFormatProvider formatProvider) { // If ToString value from deserialization is available, // simply return it. - if (_toStringFromDeserialization != null) + if (ToStringFromDeserialization != null) { - return _toStringFromDeserialization; + return ToStringFromDeserialization; } return PSObject.ToString(null, this, null, format, formatProvider, true, false); @@ -1648,7 +1621,7 @@ public virtual PSObject Copy() } } - returnValue._writeStream = _writeStream; + returnValue.WriteStream = WriteStream; returnValue.HasGeneratedReservedMembers = false; return returnValue; @@ -2051,23 +2024,17 @@ internal static void CopyDeserializerFields(PSObject source, PSObject target) if (!target.IsDeserialized) { target.IsDeserialized = source.IsDeserialized; - target._adaptedMembers = source.AdaptedMembers; - target._clrMembers = source.ClrMembers; + target.AdaptedMembers = source.AdaptedMembers; + target.ClrMembers = source.ClrMembers; } - if (target._toStringFromDeserialization == null) + if (target.ToStringFromDeserialization == null) { - target._toStringFromDeserialization = source._toStringFromDeserialization; - target._tokenText = source.TokenText; + target.ToStringFromDeserialization = source.ToStringFromDeserialization; + target.TokenText = source.TokenText; } } - internal string TokenText - { - get => _tokenText; - set => _tokenText = value; - } - /// /// Set base object. /// @@ -2087,16 +2054,6 @@ internal void SetCoreOnDeserialization(object value, bool overrideTypeInfo) } } - - /// - /// Sets the to string value on deserialization. - /// - internal string ToStringFromDeserialization - { - get => _toStringFromDeserialization; - set => _toStringFromDeserialization = value; - } - #endregion serialization /// @@ -2399,22 +2356,26 @@ internal bool ImmediateBaseObjectIsEmpty } } + /// + /// If 'this' is non-null, return this string as the ToString() for this wrapped object. + /// + internal string TokenText { get; set; } - internal WriteStreamType WriteStream - { - get => _writeStream; - set => _writeStream = value; - } + /// + /// Sets the 'ToString' value on deserialization. + /// + internal string ToStringFromDeserialization { get; set; } + + /// + /// This property contains a stream type used by the formatting system. + /// + internal WriteStreamType WriteStream { get; set; } /// /// Members from the adapter of the object before it was serialized /// Null for live objects but not null for deserialized objects. /// - internal PSMemberInfoInternalCollection AdaptedMembers - { - get => _adaptedMembers; - set => _adaptedMembers = value; - } + internal PSMemberInfoInternalCollection AdaptedMembers { get; set; } internal static DotNetAdapter DotNetStaticAdapter => s_dotNetStaticAdapter; @@ -2424,11 +2385,7 @@ internal PSMemberInfoInternalCollection AdaptedMembers /// Members from the adapter of the object before it was serialized /// Null for live objects but not null for deserialized objects. /// - internal PSMemberInfoInternalCollection ClrMembers - { - get => _clrMembers; - set => _clrMembers = value; - } + internal PSMemberInfoInternalCollection ClrMembers { get; set; } internal static DotNetAdapter DotNetInstanceAdapter => s_dotNetInstanceAdapter; @@ -2437,19 +2394,7 @@ internal PSMemberInfoInternalCollection ClrMembers /// internal PSPropertyInfo GetFirstPropertyOrDefault(MemberNamePredicate predicate) { - if (_instanceMembers != null) - { - foreach (var instanceMember in _instanceMembers) - { - if (instanceMember is PSPropertyInfo propInfo - && predicate.Invoke(propInfo.Name)) - { - return propInfo; - } - } - } - - return Properties.GetFirstOrDefault(predicate) as PSPropertyInfo; + return Properties.FirstOrDefault(predicate); } [Flags] diff --git a/src/System.Management.Automation/engine/ThirdPartyAdapter.cs b/src/System.Management.Automation/engine/ThirdPartyAdapter.cs index c12a56003cc..8c2d4855469 100644 --- a/src/System.Management.Automation/engine/ThirdPartyAdapter.cs +++ b/src/System.Management.Automation/engine/ThirdPartyAdapter.cs @@ -141,7 +141,7 @@ protected override PSProperty DoGetFirstPropertyOrDefault(object obj, MemberName throw new ExtendedTypeSystemException( "PSPropertyAdapter.GetProperty", exception, - ExtendedTypeSystem.GetProperty, "predicate", obj.ToString()); + ExtendedTypeSystem.GetProperty, nameof(predicate), obj.ToString()); } if (property != null) diff --git a/src/System.Management.Automation/engine/TypeTable.cs b/src/System.Management.Automation/engine/TypeTable.cs index 1a4fa39feea..881dcca85a6 100644 --- a/src/System.Management.Automation/engine/TypeTable.cs +++ b/src/System.Management.Automation/engine/TypeTable.cs @@ -3633,9 +3633,9 @@ internal PSMemberInfoInternalCollection GetMembers(ConsolidatedString type return PSObject.TransformMemberInfoCollection(GetMembers(types)); } - internal T GetFirstOrDefaultMember(ConsolidatedString types, MemberNamePredicate predicate) where T : PSMemberInfo + internal T GetFirstMemberOrDefault(ConsolidatedString types, MemberNamePredicate predicate) where T : PSMemberInfo { - return GetMembers(types).FirstOrDefault(t => t is T && predicate.Invoke(t.Name)) as T; + return GetMembers(types).FirstOrDefault(member => member is T && predicate(member.Name)) as T; } internal PSMemberInfoInternalCollection GetMembers(ConsolidatedString types) @@ -3645,8 +3645,7 @@ internal PSMemberInfoInternalCollection GetMembers(ConsolidatedStr return new PSMemberInfoInternalCollection(); } - PSMemberInfoInternalCollection result = _consolidatedMembers.GetOrAdd(types.Key, _memberFactoryFunc, types); - return result; + return _consolidatedMembers.GetOrAdd(types.Key, _memberFactoryFunc, types); } private PSMemberInfoInternalCollection MemberFactory(string k, ConsolidatedString types)