public static bool Applicable(SemanticModel semanticModel, ArgumentSyntax argument, IEnumerable <ParameterSyntax> parameters)
        {
            var method = argument.AncestorAndSelf <BaseMethodDeclarationSyntax>();

            if (method == null ||
                method.Body == null)
            {
                return(false);
            }

            if (argument.RefOrOutKeyword.Kind() == SyntaxKind.RefKeyword)
            {
                return(true);
            }

            Debug.Assert(argument.RefOrOutKeyword.Kind() == SyntaxKind.OutKeyword);

            var symbolInfo = semanticModel.GetSymbolInfo(argument.Expression);

            if (!(symbolInfo.Symbol != null && symbolInfo.Symbol.Kind == SymbolKind.Local))
            {
                return(true);
            }

            // for local, make sure it is definitely assigned before removing "out" keyword
            var invocation = argument.AncestorAndSelf <InvocationExpressionSyntax>();

            if (invocation == null)
            {
                return(false);
            }

            var range    = GetStatementRangeForFlowAnalysis <StatementSyntax>(method.Body, TextSpan.FromBounds(method.Body.OpenBraceToken.Span.End, invocation.Span.Start));
            var dataFlow = semanticModel.AnalyzeDataFlow(range.Item1, range.Item2);

            foreach (var symbol in dataFlow.AlwaysAssigned)
            {
                if (symbolInfo.Symbol == symbol)
                {
                    return(true);
                }
            }

            return(false);
        }