8000 Some more fixes and refactor by daxian-dbw · Pull Request #2 · powercode/PowerShell · GitHub
[go: up one dir, main page]

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
//

using System.Collections.Generic;
using System.Management.Automation;

namespace Microsoft.PowerShell.Commands.Internal.Format
{
Expand Down
6 changes: 3 additions & 3 deletions src/System.Management.Automation/engine/COM/ComAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -97,12 +97,12 @@ protected override T GetFirstMemberOrDefault<T>(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;
}
Expand All @@ -115,7 +115,7 @@ protected override T GetFirstMemberOrDefault<T>(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;
Expand Down
76 changes: 55 additions & 21 deletions src/System.Management.Automation/engine/MshMemberInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3115,7 +3115,7 @@ private static Collection<CollectionEntry<PSMemberInfo>> GetTypeMemberCollection
returnValue.Add(new CollectionEntry<PSMemberInfo>(
PSObject.TypeTableGetMembersDelegate<PSMemberInfo>,
PSObject.TypeTableGetMemberDelegate<PSMemberInfo>,
PSObject.TypeTableGetFirstOrDefaultMemberDelegate<PSMemberInfo>,
PSObject.TypeTableGetFirstMemberOrDefaultDelegate<PSMemberInfo>,
true, true, "type table members"));
return returnValue;
}
Expand All @@ -3126,7 +3126,7 @@ private static Collection<CollectionEntry<PSMethodInfo>> GetTypeMethodCollection
returnValue.Add(new CollectionEntry<PSMethodInfo>(
PSObject.TypeTableGetMembersDelegate<PSMethodInfo>,
PSObject.TypeTableGetMemberDelegate<PSMethodInfo>,
PSObject.TypeTableGetFirstOrDefaultMemberDelegate<PSMethodInfo>,
PSObject.TypeTableGetFirstMemberOrDefaultDelegate<PSMethodInfo>,
true, true, "type table members"));
return returnValue;
}
Expand All @@ -3137,7 +3137,7 @@ private static Collection<CollectionEntry<PSPropertyInfo>> GetTypePropertyCollec
returnValue.Add(new CollectionEntry<PSPropertyInfo>(
PSObject.TypeTableGetMembersDelegate<PSPropertyInfo>,
PSObject.TypeTableGetMemberDelegate<PSPropertyInfo>,
PSObject.TypeTableGetFirstOrDefaultMemberDelegate<PSPropertyInfo>,
PSObject.TypeTableGetFirstMemberOrDefaultDelegate<PSPropertyInfo>,
true, true, "type table members"));
return returnValue;
}
Expand Down Expand Up @@ -3823,7 +3823,7 @@ IEnumerator IEnumerable.GetEnumerator()

#endregion IEnumerable

internal abstract T GetFirstOrDefault(MemberNamePredicate predicate);
internal abstract T FirstOrDefault(MemberNamePredicate predicate);
}

/// <summary>
Expand Down Expand Up @@ -4274,15 +4274,19 @@ public override IEnumerator<T> GetEnumerator()
}
}

internal override T GetFirstOrDefault(MemberNamePredicate predicate)
/// <summary>
/// Returns the first member that matches the specified <see cref="MemberNamePredicate"/>.
/// </summary>
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)
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here, simply the code using foreach loop.

{
return (T)enumerator.Value;
if (predicate((string)entry.Key))
{
return entry.Value as T;
}
}
}

Expand Down Expand Up @@ -4311,8 +4315,8 @@ internal CollectionEntry(
GetMembers = getMembers;
GetMember = getMember;
GetFirstOrDefault = getFirstOrDefault;
ShouldReplicateWhenReturning = shouldReplicateWhenReturning;
ShouldCloneWhenReturning = shouldCloneWhenReturning;
_shouldReplicateWhenReturning = shouldReplicateWhenReturning;
_shouldCloneWhenReturning = shouldCloneWhenReturning;
CollectionNameForTracing = collectionNameForTracing;
}

Expand All @@ -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);
}

Expand Down Expand Up @@ -4931,15 +4934,46 @@ public override IEnumerator<T> GetEnumerator()
return new Enumerator<T>(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;
}
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Handle PSObject instance members and PSMemberSet internal members here.
Your original implementation in PSObject.GetFirstPropertyOrDefault handles instance members, but that doesn't cover the PSMemberSet case in this method. So it's probably better to handle both here.


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);
}
}

Expand Down
Loading
0