internal static bool TryGetRegisterField(PropertyDeclarationSyntax property, SemanticModel semanticModel, CancellationToken cancellationToken, out BackingFieldOrProperty result) { result = default(BackingFieldOrProperty); if (TryGetBackingFields(property, semanticModel, cancellationToken, out var getter, out var setter)) { if (DependencyProperty.TryGetDependencyPropertyKeyField(getter, semanticModel, cancellationToken, out var keyField)) { getter = keyField; } if (ReferenceEquals(setter.Symbol, getter.Symbol)) { result = setter; return(true); } } return(false); }
private static void Handle(SyntaxNodeAnalysisContext context) { if (!context.IsExcludedFromAnalysis() && context.Node is InvocationExpressionSyntax invocation && TryGetArgs(context, out var target, out var propertyArg, out var valueArg) && context.SemanticModel.TryGetSymbol(propertyArg.Expression, context.CancellationToken, out ISymbol symbol) && BackingFieldOrProperty.TryCreateForDependencyProperty(symbol, out var fieldOrProperty)) { if (IsWrongType(fieldOrProperty, valueArg, context, out var registeredType)) { context.ReportDiagnostic( Diagnostic.Create( WPF0014SetValueMustUseRegisteredType.Descriptor, valueArg.GetLocation(), target.Name, registeredType)); } if (fieldOrProperty.Type == KnownSymbol.DependencyProperty && DependencyProperty.TryGetDependencyPropertyKeyField(fieldOrProperty, context.SemanticModel, context.CancellationToken, out var keyField)) { context.ReportDiagnostic( Diagnostic.Create( WPF0040SetUsingDependencyPropertyKey.Descriptor, propertyArg.GetLocation(), propertyArg, keyField.CreateArgument(context.SemanticModel, propertyArg.SpanStart))); } if (target == KnownSymbol.DependencyObject.SetCurrentValue && fieldOrProperty.Symbol is IFieldSymbol setField && setField == KnownSymbol.FrameworkElement.DataContextProperty) { context.ReportDiagnostic( Diagnostic.Create( WPF0043DontUseSetCurrentValueForDataContext.Descriptor, invocation.GetLocation(), setField.Name, invocation.ArgumentList.Arguments[1])); } } }
public override async Task RegisterCodeFixesAsync(CodeFixContext context) { var document = context.Document; var syntaxRoot = await document.GetSyntaxRootAsync(context.CancellationToken) .ConfigureAwait(false); var semanticModel = await document.GetSemanticModelAsync(context.CancellationToken) .ConfigureAwait(false); foreach (var diagnostic in context.Diagnostics) { var token = syntaxRoot.FindToken(diagnostic.Location.SourceSpan.Start); if (string.IsNullOrEmpty(token.ValueText)) { continue; } var invocation = syntaxRoot.FindNode(diagnostic.Location.SourceSpan) .FirstAncestorOrSelf <InvocationExpressionSyntax>(); if (invocation == null || invocation.IsMissing) { continue; } if (DependencyObject.TryGetSetValueCall(invocation, semanticModel, context.CancellationToken, out _) && BackingFieldOrProperty.TryCreateForDependencyProperty(semanticModel.GetSymbolSafe(invocation.ArgumentList.Arguments[0].Expression, context.CancellationToken), out var fieldOrProperty)) { if (DependencyProperty.TryGetDependencyPropertyKeyField( fieldOrProperty, semanticModel, context.CancellationToken, out var keyField)) { context.RegisterCodeFix( CodeAction.Create( invocation.ToString(), cancellationToken => ApplyFixAsync( context.Document, invocation, null, keyField.CreateArgument(semanticModel, token.SpanStart), cancellationToken), this.GetType().FullName), diagnostic); } continue; } if (DependencyObject.TryGetSetCurrentValueCall(invocation, semanticModel, context.CancellationToken, out _) && BackingFieldOrProperty.TryCreateForDependencyProperty(semanticModel.GetSymbolSafe(invocation.ArgumentList.Arguments[0].Expression, context.CancellationToken), out fieldOrProperty)) { if (DependencyProperty.TryGetDependencyPropertyKeyField( fieldOrProperty, semanticModel, context.CancellationToken, out var keyField)) { context.RegisterCodeFix( CodeAction.Create( invocation.ToString(), cancellationToken => ApplyFixAsync( context.Document, invocation, SetValueExpression(invocation.Expression), keyField.CreateArgument(semanticModel, token.SpanStart), cancellationToken), this.GetType().FullName), diagnostic); } } } }
private static void Handle(SyntaxNodeAnalysisContext context) { if (!context.IsExcludedFromAnalysis() && context.Node is MemberDeclarationSyntax memberDeclaration) { if (BackingFieldOrProperty.TryCreateForDependencyProperty(context.ContainingSymbol, out var backingMember)) { if (DependencyProperty.TryGetRegisteredName(backingMember, context.SemanticModel, context.CancellationToken, out var registeredName)) { if (backingMember.Type == KnownSymbol.DependencyProperty && !backingMember.Name.IsParts(registeredName, "Property")) { context.ReportDiagnostic( Diagnostic.Create( WPF0001BackingFieldShouldMatchRegisteredName.Descriptor, BackingFieldOrProperty.FindIdentifier(memberDeclaration).GetLocation(), ImmutableDictionary <string, string> .Empty.Add("ExpectedName", registeredName + "Property"), backingMember.Name, registeredName)); } if (backingMember.Type == KnownSymbol.DependencyPropertyKey && !backingMember.Name.IsParts(registeredName, "PropertyKey")) { context.ReportDiagnostic( Diagnostic.Create( WPF0002BackingFieldShouldMatchRegisteredName.Descriptor, BackingFieldOrProperty.FindIdentifier(memberDeclaration).GetLocation(), ImmutableDictionary <string, string> .Empty.Add("ExpectedName", registeredName + "PropertyKey"), backingMember.Name, registeredName)); } if (context.ContainingSymbol.DeclaredAccessibility.IsEither( Accessibility.Protected, Accessibility.Internal, Accessibility.Public) && context.ContainingSymbol.ContainingType.TryFindProperty(registeredName, out _) && !HasStandardText(memberDeclaration, registeredName, out var comment)) { context.ReportDiagnostic( Diagnostic.Create( WPF0060DocumentDependencyPropertyBackingMember.Descriptor, comment == null ? BackingFieldOrProperty.FindIdentifier(memberDeclaration).GetLocation() : comment.GetLocation())); } } if (context.Node is FieldDeclarationSyntax fieldDeclaration && DependencyProperty.TryGetDependencyPropertyKeyField( backingMember, context.SemanticModel, context.CancellationToken, out var keyField) && Equals(backingMember.ContainingType, keyField.ContainingType) && keyField.TryGetSyntaxReference(out var reference)) { var keyNode = reference.GetSyntax(context.CancellationToken); if (ReferenceEquals(fieldDeclaration.SyntaxTree, keyNode.SyntaxTree) && fieldDeclaration.SpanStart < keyNode.SpanStart) { context.ReportDiagnostic( Diagnostic.Create( WPF0031FieldOrder.Descriptor, fieldDeclaration.GetLocation(), keyField.Name, backingMember.Name)); } } } if (BackingFieldOrProperty.TryCreateCandidate(context.ContainingSymbol, out var candidate) && DependencyProperty.TryGetRegisterInvocationRecursive(candidate, context.SemanticModel, context.CancellationToken, out _, out _) && !candidate.FieldOrProperty.IsStaticReadOnly()) { context.ReportDiagnostic( Diagnostic.Create( WPF0030BackingFieldShouldBeStaticReadonly.Descriptor, BackingFieldOrProperty.FindIdentifier(memberDeclaration).GetLocation(), candidate.Name, candidate.Type.Name)); } } }