private static void Handle(SyntaxNodeAnalysisContext context) { if (context.IsExcludedFromAnalysis()) { return; } if (context.Node is InvocationExpressionSyntax invocation && context.ContainingSymbol.IsStatic) { if (invocation.TryGetArgumentAtIndex(2, out var argument) && (DependencyProperty.TryGetRegisterCall(invocation, context.SemanticModel, context.CancellationToken, out _) || DependencyProperty.TryGetRegisterReadOnlyCall(invocation, context.SemanticModel, context.CancellationToken, out _) || DependencyProperty.TryGetRegisterAttachedCall(invocation, context.SemanticModel, context.CancellationToken, out _) || DependencyProperty.TryGetRegisterAttachedReadOnlyCall(invocation, context.SemanticModel, context.CancellationToken, out _))) { HandleArgument(context, argument); } else if (invocation.TryGetArgumentAtIndex(0, out argument)) { if (DependencyProperty.TryGetAddOwnerCall(invocation, context.SemanticModel, context.CancellationToken, out _)) { HandleArgument(context, argument); } else if (DependencyProperty.TryGetOverrideMetadataCall(invocation, context.SemanticModel, context.CancellationToken, out _) && invocation.Expression is MemberAccessExpressionSyntax memberAccess && BackingFieldOrProperty.TryCreateForDependencyProperty(context.SemanticModel.GetSymbolSafe(memberAccess.Expression, context.CancellationToken), out var fieldOrProperty) && context.ContainingSymbol.ContainingType.IsAssignableTo(fieldOrProperty.ContainingType, context.Compilation)) { HandleArgument(context, argument); } } } }
private static bool TryGetAnyRegisterCall(InvocationExpressionSyntax registerCall, SyntaxNodeAnalysisContext context, out IMethodSymbol method) { return(DependencyProperty.TryGetRegisterCall(registerCall, context.SemanticModel, context.CancellationToken, out method) || DependencyProperty.TryGetRegisterReadOnlyCall(registerCall, context.SemanticModel, context.CancellationToken, out method) || DependencyProperty.TryGetRegisterAttachedCall(registerCall, context.SemanticModel, context.CancellationToken, out method) || DependencyProperty.TryGetRegisterAttachedReadOnlyCall(registerCall, context.SemanticModel, context.CancellationToken, out method)); }
private static void Handle(SyntaxNodeAnalysisContext context) { if (!context.IsExcludedFromAnalysis() && context.Node is InvocationExpressionSyntax invocation && DependencyProperty.TryGetOverrideMetadataCall(invocation, context.SemanticModel, context.CancellationToken, out var method) && invocation.Expression is MemberAccessExpressionSyntax memberAccess && context.SemanticModel.TryGetSymbol(memberAccess.Expression, context.CancellationToken, out ISymbol candidate) && BackingFieldOrProperty.TryCreateForDependencyProperty(candidate, out var fieldOrProperty) && method.TryFindParameter(KnownSymbols.PropertyMetadata, out var parameter) && invocation.TryFindArgument(parameter, out var metadataArg)) { if (fieldOrProperty.TryGetAssignedValue(context.CancellationToken, out var value) && value is InvocationExpressionSyntax registerInvocation) { if (DependencyProperty.TryGetRegisterCall(registerInvocation, context.SemanticModel, context.CancellationToken, out var registerMethod) || DependencyProperty.TryGetRegisterReadOnlyCall(registerInvocation, context.SemanticModel, context.CancellationToken, out registerMethod) || DependencyProperty.TryGetRegisterAttachedCall(registerInvocation, context.SemanticModel, context.CancellationToken, out registerMethod) || DependencyProperty.TryGetRegisterAttachedReadOnlyCall(registerInvocation, context.SemanticModel, context.CancellationToken, out registerMethod)) { if (registerMethod.TryFindParameter(KnownSymbols.PropertyMetadata, out var registerParameter) && registerInvocation.TryFindArgument(registerParameter, out var registeredMetadataArg) && context.SemanticModel.TryGetType(metadataArg.Expression, context.CancellationToken, out var type) && context.SemanticModel.TryGetType(registeredMetadataArg.Expression, context.CancellationToken, out var registeredType) && !type.IsAssignableTo(registeredType, context.Compilation)) { context.ReportDiagnostic(Diagnostic.Create(Descriptors.WPF0017MetadataMustBeAssignable, metadataArg.GetLocation())); } } } else if (fieldOrProperty.Symbol == KnownSymbols.FrameworkElement.DefaultStyleKeyProperty && metadataArg.Expression is ObjectCreationExpressionSyntax metadataCreation) { if (!context.SemanticModel.TryGetSymbol(metadataCreation, KnownSymbols.FrameworkPropertyMetadata, context.CancellationToken, out _)) { context.ReportDiagnostic(Diagnostic.Create(Descriptors.WPF0017MetadataMustBeAssignable, metadataArg.GetLocation())); } else if (metadataCreation.TrySingleArgument(out var typeArg) && typeArg.Expression is TypeOfExpressionSyntax typeOf && typeOf.Type is IdentifierNameSyntax typeName && typeName.Identifier.ValueText != context.ContainingSymbol.ContainingType.MetadataName) { context.ReportDiagnostic(Diagnostic.Create(Descriptors.WPF0018DefaultStyleKeyPropertyOverrideMetadataArgument, typeArg.GetLocation())); } } } }
internal static bool TryGetDependencyProperty(ObjectCreationExpressionSyntax objectCreation, SemanticModel semanticModel, CancellationToken cancellationToken, out BackingFieldOrProperty fieldOrProperty) { fieldOrProperty = default; var invocation = objectCreation.FirstAncestorOrSelf <InvocationExpressionSyntax>(); if (invocation == null) { return(false); } if (DependencyProperty.TryGetRegisterCall(invocation, semanticModel, cancellationToken, out _) || DependencyProperty.TryGetRegisterReadOnlyCall(invocation, semanticModel, cancellationToken, out _) || DependencyProperty.TryGetRegisterAttachedCall(invocation, semanticModel, cancellationToken, out _) || DependencyProperty.TryGetRegisterAttachedReadOnlyCall(invocation, semanticModel, cancellationToken, out _)) { if (objectCreation.TryFirstAncestor <FieldDeclarationSyntax>(out var fieldDeclaration) && semanticModel.TryGetSymbol(fieldDeclaration, cancellationToken, out var field)) { return(BackingFieldOrProperty.TryCreateForDependencyProperty(field, out fieldOrProperty)); } if (objectCreation.TryFirstAncestor <PropertyDeclarationSyntax>(out var propertyDeclaration) && semanticModel.TryGetSymbol(propertyDeclaration, cancellationToken, out var property)) { return(BackingFieldOrProperty.TryCreateForDependencyProperty(property, out fieldOrProperty)); } return(false); } if (invocation.Expression is MemberAccessExpressionSyntax memberAccess && (DependencyProperty.TryGetAddOwnerCall(invocation, semanticModel, cancellationToken, out _) || DependencyProperty.TryGetOverrideMetadataCall(invocation, semanticModel, cancellationToken, out _)) && semanticModel.TryGetSymbol(memberAccess.Expression, cancellationToken, out ISymbol? candidate)) { return(BackingFieldOrProperty.TryCreateForDependencyProperty(candidate, out fieldOrProperty)); } return(false); }
private static void Handle(SyntaxNodeAnalysisContext context) { if (context.IsExcludedFromAnalysis()) { return; } if (context.Node is InvocationExpressionSyntax invocation) { if ((DependencyProperty.TryGetOverrideMetadataCall(invocation, context.SemanticModel, context.CancellationToken, out _) || DependencyProperty.TryGetAddOwnerCall(invocation, context.SemanticModel, context.CancellationToken, out _)) && invocation.TryGetArgumentAtIndex(0, out var argument)) { HandleArgument(context, argument); } if ((DependencyProperty.TryGetRegisterCall(invocation, context.SemanticModel, context.CancellationToken, out _) || DependencyProperty.TryGetRegisterReadOnlyCall(invocation, context.SemanticModel, context.CancellationToken, out _)) && invocation.TryGetArgumentAtIndex(2, out argument)) { HandleArgument(context, argument); } } }
private static void Handle(SyntaxNodeAnalysisContext context) { if (!context.IsExcludedFromAnalysis() && context.Node is InvocationExpressionSyntax invocation && context.ContainingSymbol.IsStatic) { if (invocation.TryGetArgumentAtIndex(2, out var argument) && (DependencyProperty.TryGetRegisterCall(invocation, context.SemanticModel, context.CancellationToken, out _) || DependencyProperty.TryGetRegisterReadOnlyCall(invocation, context.SemanticModel, context.CancellationToken, out _) || DependencyProperty.TryGetRegisterAttachedCall(invocation, context.SemanticModel, context.CancellationToken, out _) || DependencyProperty.TryGetRegisterAttachedReadOnlyCall(invocation, context.SemanticModel, context.CancellationToken, out _))) { HandleArgument(context, argument); } else if (invocation.TryGetArgumentAtIndex(0, out argument)) { if (DependencyProperty.TryGetAddOwnerCall(invocation, context.SemanticModel, context.CancellationToken, out _)) { HandleArgument(context, argument); } else if (DependencyProperty.TryGetOverrideMetadataCall(invocation, context.SemanticModel, context.CancellationToken, out _) && invocation.Expression is MemberAccessExpressionSyntax { Expression : { } expression } &&