/// <summary> /// Get the backing fields for the <paramref name="propertyDeclaration"/> these are different for readonly dependency properties where the setter returns the DependencyPropertyKey field. /// </summary> internal static bool TryGetBackingFields(PropertyDeclarationSyntax propertyDeclaration, SemanticModel semanticModel, CancellationToken cancellationToken, out BackingFieldOrProperty getField, out BackingFieldOrProperty setField) { getField = default; setField = default; if (propertyDeclaration.TryGetGetter(out var getAccessor) && propertyDeclaration.TryGetSetter(out var setAccessor)) { using (var getterWalker = ClrGetterWalker.Borrow(semanticModel, cancellationToken, getAccessor)) { using (var setterWalker = ClrSetterWalker.Borrow(semanticModel, cancellationToken, setAccessor)) { if (getterWalker.HasError || setterWalker.HasError) { return(false); } if (getterWalker.IsSuccess && BackingFieldOrProperty.TryCreateForDependencyProperty(semanticModel.GetSymbolSafe(getterWalker.Property.Expression, cancellationToken), out getField) && setterWalker.IsSuccess && BackingFieldOrProperty.TryCreateForDependencyProperty(semanticModel.GetSymbolSafe(setterWalker.Property.Expression, cancellationToken), out setField)) { return(true); } var property = semanticModel.GetSymbolSafe(propertyDeclaration, cancellationToken) as IPropertySymbol; return(TryGetBackingFieldsByName(property, semanticModel.Compilation, out getField, out setField)); } } } return(false); }
internal static bool IsAttachedGet(MethodDeclarationSyntax method, SemanticModel semanticModel, CancellationToken cancellationToken, out InvocationExpressionSyntax call, out BackingFieldOrProperty getField) { call = null; getField = default(BackingFieldOrProperty); if (method == null || method.ParameterList.Parameters.Count != 1 || method.ReturnType.IsVoid() || !method.Modifiers.Any(SyntaxKind.StaticKeyword)) { return(false); } using (var walker = ClrGetterWalker.Borrow(semanticModel, cancellationToken, method)) { call = walker.GetValue; var memberAccess = walker.GetValue?.Expression as MemberAccessExpressionSyntax; var member = memberAccess?.Expression as IdentifierNameSyntax; if (memberAccess == null || member == null || !memberAccess.IsKind(SyntaxKind.SimpleMemberAccessExpression)) { return(false); } if (method.ParameterList.Parameters[0].Identifier.ValueText != member.Identifier.ValueText) { return(false); } return(BackingFieldOrProperty.TryCreateForDependencyProperty(semanticModel.GetSymbolSafe(walker.Property.Expression, cancellationToken), out getField)); } }