Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Open
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 @@ -85,5 +85,66 @@ public Q() { }
Verify(evalResult,
EvalResult("new C()", "{C}", "C", "new C()", flags: DkmEvaluationResultFlags.Expandable, customUIVisualizerInfo: customUIVisualizerInfo));
}

/// <summary>
/// Tests that an Evaluation result does not contain duplicate DebuggerVisualizer attributes.
/// </summary>
[Fact]
public void DuplicateVisualizer()
{
var source =
@"using System.Diagnostics;
[DebuggerVisualizer(typeof(Q), Description = ""Q Visualizer"")]
class C
{
public object F = 1;
public object P { get { return 3; } }
}
[DebuggerVisualizer(typeof(Q), Description = ""Q Visualizer"")]
class D : C
{
}
class P
{
public P() { }
}
class Q
{
public Q() { }
}";
var assembly = GetAssembly(source);
var type = assembly.GetType("D");
var value = CreateDkmClrValue(
value: type.Instantiate(),
type: new DkmClrType((TypeImpl)type),
evalFlags: DkmEvaluationResultFlags.None);
var evalResult = FormatResult("new D()", value);

var typeQ = assembly.GetType("Q");

string defaultDebuggeeSideVisualizerTypeName = "Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource";
var vsVersion = Environment.GetEnvironmentVariable("VisualStudioVersion") ?? "14.0";
string defaultDebuggeeSideVisualizerAssemblyName = $"Microsoft.VisualStudio.DebuggerVisualizers, Version={vsVersion}.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a";

DkmCustomUIVisualizerInfo[] customUIVisualizerInfo =
[
new DkmCustomUIVisualizerInfo
{
Id = 0,
Description = "Q Visualizer",
MenuName = "Q Visualizer",
Metric = "ClrCustomVisualizerVSHost",
UISideVisualizerTypeName = typeQ.FullName,
UISideVisualizerAssemblyName = typeQ.Assembly.FullName,
UISideVisualizerAssemblyLocation = DkmClrCustomVisualizerAssemblyLocation.Unknown,
DebuggeeSideVisualizerTypeName = defaultDebuggeeSideVisualizerTypeName,
DebuggeeSideVisualizerAssemblyName = defaultDebuggeeSideVisualizerAssemblyName,
ExtensionPartId = Guid.Empty
}
];

Verify(evalResult,
EvalResult("new D()", "{D}", "D", "new D()", flags: DkmEvaluationResultFlags.Expandable, customUIVisualizerInfo: customUIVisualizerInfo));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System.Collections.Generic;
using Microsoft.VisualStudio.Debugger.Evaluation;

#nullable enable
namespace Microsoft.CodeAnalysis.ExpressionEvaluator;

/// <summary>
/// Allows filtering of duplicate <see cref="DkmCustomUIVisualizerInfo"/> instances that could be
/// placed in the same Success Evaluation Result so that the debugger UI does not show duplicates.
/// </summary>
internal class DkmCustomUIVisualizerInfoComparer : IEqualityComparer<DkmCustomUIVisualizerInfo>
{
public static DkmCustomUIVisualizerInfoComparer Instance { get; } = new DkmCustomUIVisualizerInfoComparer();

private DkmCustomUIVisualizerInfoComparer()
{
}

// IEqualityComparer<DkmCustomUIVisualizerInfo> Members

public bool Equals(DkmCustomUIVisualizerInfo? x, DkmCustomUIVisualizerInfo? y)
{
if (x is null || y is null)
{
return ReferenceEquals(x, y);
}

return string.Equals(x.UISideVisualizerAssemblyName, y.UISideVisualizerAssemblyName) &&
string.Equals(x.UISideVisualizerTypeName, y.UISideVisualizerTypeName) &&
string.Equals(x.DebuggeeSideVisualizerAssemblyName, y.DebuggeeSideVisualizerAssemblyName) &&
string.Equals(x.DebuggeeSideVisualizerTypeName, y.DebuggeeSideVisualizerTypeName) &&
string.Equals(x.Description, y.Description) &&
x.ExtensionPartId == y.ExtensionPartId;
}

public int GetHashCode(DkmCustomUIVisualizerInfo obj)
{
int hash = 7;
hash = 31 * hash + obj.UISideVisualizerAssemblyName.GetHashCode();
hash = 31 * hash + obj.UISideVisualizerTypeName.GetHashCode();
hash = 31 * hash + obj.DebuggeeSideVisualizerAssemblyName.GetHashCode();
hash = 31 * hash + obj.DebuggeeSideVisualizerTypeName.GetHashCode();
hash = 31 * hash + obj.Description.GetHashCode();
hash = 31 * hash + obj.ExtensionPartId.GetHashCode();

return hash;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -628,7 +628,8 @@ internal static bool TryGetDebuggerDisplayInfo(this DkmClrValue value, out Debug
/// </summary>
internal static DkmCustomUIVisualizerInfo[] GetDebuggerCustomUIVisualizerInfo(this DkmClrType type)
{
var builder = ArrayBuilder<DkmCustomUIVisualizerInfo>.GetInstance();
// NOTE: Using a Dictionary since Hashset is not available in .net 2.0
var uniqueVisualizers = new Dictionary<DkmCustomUIVisualizerInfo, object>(DkmCustomUIVisualizerInfoComparer.Instance);

var appDomain = type.AppDomain;
var underlyingType = type.GetLmrType();
Expand All @@ -642,7 +643,7 @@ internal static DkmCustomUIVisualizerInfo[] GetDebuggerCustomUIVisualizerInfo(th
continue;
}

builder.Add(DkmCustomUIVisualizerInfo.Create((uint)builder.Count,
DkmCustomUIVisualizerInfo visualizerInfo = DkmCustomUIVisualizerInfo.Create((uint)uniqueVisualizers.Count,
visualizerAttribute.VisualizerDescription,
visualizerAttribute.VisualizerDescription,
// ClrCustomVisualizerVSHost is a registry entry that specifies the CLSID of the
Expand All @@ -653,14 +654,18 @@ internal static DkmCustomUIVisualizerInfo[] GetDebuggerCustomUIVisualizerInfo(th
visualizerAttribute.UISideVisualizerAssemblyLocation,
visualizerAttribute.DebuggeeSideVisualizerTypeName,
visualizerAttribute.DebuggeeSideVisualizerAssemblyName,
visualizerAttribute.ExtensionPartId));
visualizerAttribute.ExtensionPartId);

if (!uniqueVisualizers.ContainsKey(visualizerInfo))
{
uniqueVisualizers.Add(visualizerInfo, null);
}
}

underlyingType = underlyingType.GetBaseTypeOrNull(appDomain, out type);
}

var result = (builder.Count > 0) ? builder.ToArray() : null;
builder.Free();
var result = (uniqueVisualizers.Count > 0) ? uniqueVisualizers.Keys.ToArray() : null;
return result;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Formatter.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Formatter.TypeNames.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Formatter.Values.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Helpers\DkmCustomUIVisualizerInfoComparer.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Helpers\FavoritesDataItem.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Helpers\InlineArrayHelpers.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Helpers\TypeAndCustomInfo.cs" />
Expand Down
Loading