예제 #1
0
            public static ValueWalker Create(SyntaxToken value, SyntaxNode expression)
            {
                ValueWalker walker;

                if (!Cache.TryDequeue(out walker))
                {
                    walker = new ValueWalker();
                }

                walker.UsesValue = false;
                walker.value     = value;
                if (expression != null)
                {
                    walker.Visit(expression);
                }

                return(walker);
            }
예제 #2
0
        private static bool IsAttachedSetMethod(MethodDeclarationSyntax method, SemanticModel semanticModel, CancellationToken cancellationToken, out IFieldSymbol setField)
        {
            setField = null;
            if (method == null ||
                method.ParameterList.Parameters.Count != 2 ||
                !method.ReturnType.IsVoid() ||
                !method.Modifiers.Any(SyntaxKind.StaticKeyword))
            {
                return(false);
            }

            using (var walker = ClrSetterWalker.Create(semanticModel, cancellationToken, method))
            {
                if (!walker.IsSuccess)
                {
                    return(false);
                }

                var memberAccess = (walker.SetValue?.Expression ?? walker.SetCurrentValue?.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);
                }

                using (var valueWalker = ValueWalker.Create(method.ParameterList.Parameters[1].Identifier, memberAccess.Parent))
                {
                    if (!valueWalker.UsesValue)
                    {
                        return(false);
                    }
                }

                return(walker.Property.TryGetSymbol(semanticModel, cancellationToken, out setField));
            }
        }