Example #1
0
        internal static bool IsInAnonymousFunctionOrQuery(
            int position,
            SyntaxNode lambdaExpressionOrQueryNode
            )
        {
            Debug.Assert(
                lambdaExpressionOrQueryNode.IsAnonymousFunction() ||
                lambdaExpressionOrQueryNode.IsQuery()
                );

            SyntaxToken      firstIncluded;
            CSharpSyntaxNode body;

            switch (lambdaExpressionOrQueryNode.Kind())
            {
            case SyntaxKind.SimpleLambdaExpression:
                SimpleLambdaExpressionSyntax simple =
                    (SimpleLambdaExpressionSyntax)lambdaExpressionOrQueryNode;
                firstIncluded = simple.ArrowToken;
                body          = simple.Body;
                break;

            case SyntaxKind.ParenthesizedLambdaExpression:
                ParenthesizedLambdaExpressionSyntax parenthesized =
                    (ParenthesizedLambdaExpressionSyntax)lambdaExpressionOrQueryNode;
                firstIncluded = parenthesized.ArrowToken;
                body          = parenthesized.Body;
                break;

            case SyntaxKind.AnonymousMethodExpression:
                AnonymousMethodExpressionSyntax anon =
                    (AnonymousMethodExpressionSyntax)lambdaExpressionOrQueryNode;
                body          = anon.Block;
                firstIncluded = body.GetFirstToken(includeZeroWidth: true);
                break;

            default:
                // OK, so we have some kind of query clause.  They all start with a keyword token, so we'll skip that.
                firstIncluded = lambdaExpressionOrQueryNode.GetFirstToken().GetNextToken();
                return(IsBetweenTokens(
                           position,
                           firstIncluded,
                           lambdaExpressionOrQueryNode.GetLastToken().GetNextToken()
                           ));
            }

            var bodyStatement = body as StatementSyntax;
            var firstExcluded =
                bodyStatement != null
                    ? GetFirstExcludedToken(bodyStatement)
                    : (SyntaxToken)SyntaxNavigator.Instance.GetNextToken(
                    body,
                    predicate: null,
                    stepInto: null
                    );

            return(IsBetweenTokens(position, firstIncluded, firstExcluded));
        }
        // We have a lambda; we want to find a syntax node or statement which can be bound such that
        // we can get the type of the lambda, if there is one. For example if given
        //
        // A().B(x=>M(x)).C();  then we want to find  A().B(x=>M())
        // object d = (D)(x=>M(x)); then we want to find (D)(x=>M(x))
        // D d = x=>M(x); then we want to find the whole thing.
        // 
        protected virtual SyntaxNode GetBindableSyntaxNodeOfLambdaOrQuery(SyntaxNode node)
        {
            Debug.Assert(node != null);
            Debug.Assert(node != this.Root);
            Debug.Assert(node.IsAnonymousFunction() || node.IsQuery());

            SyntaxNode current = node.Parent;
            for (; current != this.Root; current = current.Parent)
            {
                Debug.Assert(current != null, "How did we get outside the root?");

                if (current is StatementSyntax)
                {
                    return current;
                }

                if (current.Kind == SyntaxKind.ParenthesizedExpression)
                {
                    continue;
                }

                if (current is ExpressionSyntax)
                {
                    return GetBindableSyntaxNode(current);
                }
            }

            // We made it up to the root without finding a viable expression or statement. Just bind
            // the lambda and hope for the best.
            return node;
        }
        private static bool NodeIsExplicitType(SyntaxNode node, SyntaxNode lambda)
        {
            Debug.Assert(node != null);
            Debug.Assert(lambda != null);
            Debug.Assert(lambda.IsAnonymousFunction() || lambda.IsQuery());

            // UNDONE;
            return false;
        }
Example #4
0
        internal static bool IsInAnonymousFunctionOrQuery(int position, SyntaxNode lambdaExpressionOrQueryNode)
        {
            Debug.Assert(lambdaExpressionOrQueryNode.IsAnonymousFunction() || lambdaExpressionOrQueryNode.IsQuery());

            SyntaxToken firstIncluded;
            CSharpSyntaxNode body;

            switch (lambdaExpressionOrQueryNode.Kind())
            {
                case SyntaxKind.SimpleLambdaExpression:
                    SimpleLambdaExpressionSyntax simple = (SimpleLambdaExpressionSyntax)lambdaExpressionOrQueryNode;
                    firstIncluded = simple.Parameter.Identifier;
                    body = simple.Body;
                    break;

                case SyntaxKind.ParenthesizedLambdaExpression:
                    ParenthesizedLambdaExpressionSyntax parenthesized = (ParenthesizedLambdaExpressionSyntax)lambdaExpressionOrQueryNode;
                    firstIncluded = parenthesized.ParameterList.OpenParenToken;
                    body = parenthesized.Body;
                    break;

                case SyntaxKind.AnonymousMethodExpression:
                    AnonymousMethodExpressionSyntax anon = (AnonymousMethodExpressionSyntax)lambdaExpressionOrQueryNode;
                    firstIncluded = anon.DelegateKeyword;
                    body = anon.Block;
                    break;

                default:
                    // OK, so we have some kind of query clause.  They all start with a keyword token, so we'll skip that.
                    firstIncluded = lambdaExpressionOrQueryNode.GetFirstToken().GetNextToken();
                    return IsBetweenTokens(position, firstIncluded, lambdaExpressionOrQueryNode.GetLastToken().GetNextToken());
            }

            var bodyStatement = body as StatementSyntax;
            var firstExcluded = bodyStatement != null ?
                GetFirstExcludedToken(bodyStatement) :
                (SyntaxToken)SyntaxNavigator.Instance.GetNextToken(body, predicate: null, stepInto: null);

            return IsBetweenTokens(position, firstIncluded, firstExcluded);
        }