internal static bool TryGetDependencyPropertyKeyFieldOrProperty(BackingFieldOrProperty backing, SemanticModel semanticModel, CancellationToken cancellationToken, out BackingFieldOrProperty result) { result = default; if (backing.TryGetAssignedValue(cancellationToken, out var value) && semanticModel.TryGetSymbol(value, cancellationToken, out ISymbol symbol)) { if (symbol is IMethodSymbol method) { return(method == KnownSymbols.DependencyProperty.AddOwner && value is InvocationExpressionSyntax invocation && invocation.Expression is MemberAccessExpressionSyntax member && semanticModel.TryGetSymbol(member.Expression, cancellationToken, out ISymbol candidate) && BackingFieldOrProperty.TryCreateForDependencyProperty(candidate, out result) && TryGetDependencyPropertyKeyFieldOrProperty(result, semanticModel, cancellationToken, out result)); } else { return(symbol is IPropertySymbol property && property == KnownSymbols.DependencyPropertyKey.DependencyProperty && value is MemberAccessExpressionSyntax memberAccess && semanticModel.TryGetSymbol(memberAccess.Expression, cancellationToken, out ISymbol candidate) && BackingFieldOrProperty.TryCreateForDependencyProperty(candidate, out result)); } } return(false); }
internal static bool TryGetDependencyPropertyKeyFieldOrProperty(BackingFieldOrProperty backing, SemanticModel semanticModel, CancellationToken cancellationToken, out BackingFieldOrProperty result) { result = default; if (backing.TryGetAssignedValue(cancellationToken, out var value) && semanticModel.TryGetSymbol(value, cancellationToken, out var symbol)) { if (symbol is IMethodSymbol method) { return(method == KnownSymbols.DependencyProperty.AddOwner && value is InvocationExpressionSyntax { Expression : MemberAccessExpressionSyntax { Expression : { } expression } } &&
internal static bool TryGetDependencyAddOwnerSourceField(BackingFieldOrProperty fieldOrProperty, SemanticModel semanticModel, CancellationToken cancellationToken, out BackingFieldOrProperty result) { result = default; if (fieldOrProperty.TryGetAssignedValue(cancellationToken, out var value) && value is InvocationExpressionSyntax invocation && semanticModel.TryGetSymbol(invocation, KnownSymbols.DependencyProperty.AddOwner, cancellationToken, out _)) { var addOwner = (MemberAccessExpressionSyntax)invocation.Expression; return(BackingFieldOrProperty.TryCreateForDependencyProperty( semanticModel.GetSymbolSafe(addOwner.Expression, cancellationToken), out result)); } return(false); }
internal static bool TryGetRegisterInvocation(BackingFieldOrProperty fieldOrProperty, SemanticModel semanticModel, CancellationToken cancellationToken, out InvocationExpressionSyntax result, out IMethodSymbol symbol) { symbol = null; result = null; if (fieldOrProperty.TryGetAssignedValue(cancellationToken, out var value) && value is InvocationExpressionSyntax invocation) { if (TryGetRegisterCall(invocation, semanticModel, cancellationToken, out symbol) || TryGetRegisterReadOnlyCall(invocation, semanticModel, cancellationToken, out symbol) || TryGetRegisterAttachedCall(invocation, semanticModel, cancellationToken, out symbol) || TryGetRegisterAttachedReadOnlyCall(invocation, semanticModel, cancellationToken, out symbol)) { result = invocation; return(true); } } return(false); }