Skip to content

Commit 0096cc0

Browse files
committed
Special case GetAsFrozen
Fix #354
1 parent 9b82d4e commit 0096cc0

2 files changed

Lines changed: 39 additions & 3 deletions

File tree

WpfAnalyzers.Test/WPF0010DefaultValueMustMatchRegisteredTypeTests/Valid.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,40 @@ internal static object Box(bool value)
522522
RoslynAssert.Valid(Analyzer, code);
523523
}
524524

525+
[Test]
526+
public static void FrozenGeometry()
527+
{
528+
var code = @"
529+
namespace N
530+
{
531+
using System.Windows;
532+
using System.Windows.Controls;
533+
using System.Windows.Media;
534+
535+
public class C : Control
536+
{
537+
public static readonly DependencyProperty GeometryProperty = DependencyProperty.Register(
538+
nameof(Geometry),
539+
typeof(Geometry),
540+
typeof(C),
541+
new PropertyMetadata(Default()));
542+
543+
public Geometry? Geometry
544+
{
545+
get => (Geometry?)this.GetValue(GeometryProperty);
546+
set => this.SetValue(GeometryProperty, value);
547+
}
548+
549+
private static Freezable Default()
550+
{
551+
var geometry = new EllipseGeometry(default, 5, 5);
552+
return geometry.GetAsFrozen();
553+
}
554+
}
555+
}";
556+
RoslynAssert.Valid(Analyzer, code);
557+
}
558+
525559
[Test]
526560
public static void EnumIssue211()
527561
{

WpfAnalyzers/Helpers/PropertyMetaData.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ internal ArgumentSyntax? CoerceValueArgument
8383
{
8484
if (objectCreation is { ArgumentList: { } })
8585
{
86-
if (semanticModel.TryGetSymbol(objectCreation, KnownSymbols.PropertyMetadata, cancellationToken, out var constructor) ||
87-
semanticModel.TryGetSymbol(objectCreation, KnownSymbols.UIPropertyMetadata, cancellationToken, out constructor) ||
86+
if (semanticModel.TryGetSymbol(objectCreation, KnownSymbols.PropertyMetadata, cancellationToken, out var constructor) ||
87+
semanticModel.TryGetSymbol(objectCreation, KnownSymbols.UIPropertyMetadata, cancellationToken, out constructor) ||
8888
semanticModel.TryGetSymbol(objectCreation, KnownSymbols.FrameworkPropertyMetadata, cancellationToken, out constructor))
8989
{
9090
return new PropertyMetadata(objectCreation, constructor);
@@ -152,7 +152,7 @@ static bool IsValueValidForRegisteredType(ExpressionSyntax value, ITypeSymbol re
152152
switch (value)
153153
{
154154
case ConditionalExpressionSyntax { WhenTrue: { } whenTrue, WhenFalse: { } whenFalse }:
155-
return IsValueValidForRegisteredType(whenTrue, registeredType, recursion) &&
155+
return IsValueValidForRegisteredType(whenTrue, registeredType, recursion) &&
156156
IsValueValidForRegisteredType(whenFalse, registeredType, recursion);
157157

158158
case BinaryExpressionSyntax { Left: { }, Right: { } right } binary
@@ -201,6 +201,8 @@ when binary.IsKind(SyntaxKind.CoalesceExpression):
201201
return IsAssignedValueOfRegisteredType(property, declaration);
202202
case { Symbol: IMethodSymbol _, Declaration: MethodDeclarationSyntax declaration }:
203203
return IsReturnValueOfRegisteredType(declaration);
204+
case { Symbol: IMethodSymbol { MetadataName: "GetAsFrozen" }, Source: InvocationExpressionSyntax { Expression: MemberAccessExpressionSyntax { Expression: { } expression } } }:
205+
return recursion.SemanticModel.IsRepresentationPreservingConversion(expression, registeredType);
204206
case { Symbol: IFieldSymbol { Type: { SpecialType: SpecialType.System_Object } } }:
205207
return true;
206208
case { Symbol: IPropertySymbol { Type: { SpecialType: SpecialType.System_Object } } }:

0 commit comments

Comments
 (0)