Author: marek
Date: 2007-09-11 18:09:59 -0400 (Tue, 11 Sep 2007)
New Revision: 85665

Modified:
   trunk/mcs/gmcs/ChangeLog
   trunk/mcs/gmcs/cs-parser.jay
   trunk/mcs/gmcs/linq.cs
Log:
2007-09-11  Marek Safar  <[EMAIL PROTECTED]>
        
        * cs-parser.jay: Single join clause connected.
        
        * linq.cs: Moved argument creation into CreateSelector and renamed to
        CreateSelectorArguments.
        (ARangeVariableQueryClause.BuildQueryClause): Consider all lambda
        arguments to be implicit.
        (Join): Implemented single join clause.
        


Modified: trunk/mcs/gmcs/ChangeLog
===================================================================
--- trunk/mcs/gmcs/ChangeLog    2007-09-11 21:16:05 UTC (rev 85664)
+++ trunk/mcs/gmcs/ChangeLog    2007-09-11 22:09:59 UTC (rev 85665)
@@ -1,3 +1,13 @@
+2007-09-11  Marek Safar  <[EMAIL PROTECTED]>
+       
+       * cs-parser.jay: Single join clause connected.
+       
+       * linq.cs: Moved argument creation into CreateSelector and renamed to
+       CreateSelectorArguments.
+       (ARangeVariableQueryClause.BuildQueryClause): Consider all lambda
+       arguments to be implicit.
+       (Join): Implemented single join clause.
+       
 2007-09-10  Marek Safar  <[EMAIL PROTECTED]>
        
        * cs-parser.jay: Create QueryStartClause for the first implicit from.

Modified: trunk/mcs/gmcs/cs-parser.jay
===================================================================
--- trunk/mcs/gmcs/cs-parser.jay        2007-09-11 21:16:05 UTC (rev 85664)
+++ trunk/mcs/gmcs/cs-parser.jay        2007-09-11 22:09:59 UTC (rev 85665)
@@ -5391,7 +5391,7 @@
        ;
        
 from_clause
-       : FROM IDENTIFIER IN expression opt_join_clauses
+       : FROM IDENTIFIER IN expression
          {
                start_block (lexer.Location);
                LocatedToken lt = (LocatedToken) $2;
@@ -5399,7 +5399,7 @@
                current_block.AddVariable 
(Linq.ImplicitQueryParameter.ImplicitType.Instance, lt.Value, lt.Location);
                $$ = $4;
          }
-       | FROM type IDENTIFIER IN expression opt_join_clauses
+       | FROM type IDENTIFIER IN expression
          {
                start_block (GetLocation ($1));
                LocatedToken lt = (LocatedToken) $3;
@@ -5410,81 +5410,47 @@
          }
        ;
 
-opt_join_clauses
-       : /* empty */
-       | join_clauses
-       ;
-
-join_clauses
-       : join_clause
-       | join_clauses join_clause
-       ;
-       
-join_clause
-       : JOIN join_clause_body
-       | JOIN join_clause_body INTO IDENTIFIER
-       | JOIN type join_clause_body
-       | JOIN type join_clause_body INTO IDENTIFIER
-       ;
-       
-join_clause_body
-       : IDENTIFIER IN expression ON expression EQUALS expression
-       ;
-
 query_body
-       : opt_from_let_where_clauses opt_orderby_clause SELECT expression 
opt_query_continuation
+       : opt_query_body_clauses select_or_group_clause opt_query_continuation
          {
-               Linq.AQueryClause head = new Linq.Select ((Expression)$4, 
GetLocation ($3));
+               Linq.AQueryClause head = (Linq.AQueryClause)$2;
                
-               if ($2 != null) {
-                       Linq.AQueryClause clause = (Linq.AQueryClause)$2;
-                       clause.Tail.Next = head;
-                       head = clause;
-               }
-               
                if ($1 != null) {
                        Linq.AQueryClause clause = (Linq.AQueryClause)$1;
                        clause.Tail.Next = head;
                        head = clause;
-               }
-                                       
-               $$ = head;
-         }
-       | opt_from_let_where_clauses opt_orderby_clause group_clause 
opt_query_continuation
-         {
-               Linq.AQueryClause head = (Linq.AQueryClause)$3;
-
-               if ($2 != null) {
-                       Linq.AQueryClause clause = (Linq.AQueryClause)$2;
-                       clause.Tail.Next = head;
-                       head = clause;
-               }
-               
-               if ($1 != null) {
-                       Linq.AQueryClause clause = (Linq.AQueryClause)$1;
-                       clause.Tail.Next = head;
-                       head = clause;
                }               
                
                $$ = head;
          }
        ;
        
-opt_from_let_where_clauses
+select_or_group_clause
+       : SELECT expression
+         {
+               $$ = new Linq.Select ((Expression)$2, GetLocation ($1));
+         }
+       | GROUP expression BY expression
+         {
+           $$ = new Linq.GroupBy ((Expression)$2, (Expression)$4, GetLocation 
($1));
+         }
+       ;
+       
+opt_query_body_clauses
        : /* empty */
-       | from_let_where_clauses
+       | query_body_clauses
        ;
        
-from_let_where_clauses
-       : from_let_where_clause
-       | from_let_where_clauses from_let_where_clause
+query_body_clauses
+       : query_body_clause
+       | query_body_clauses query_body_clause
          {
                ((Linq.AQueryClause)$1).Tail.Next = (Linq.AQueryClause)$2;
                $$ = $1;
          }
        ;
        
-from_let_where_clause
+query_body_clause
        : from_clause
          {
                $$ = new Linq.SelectMany (current_block, (Expression)$1);
@@ -5492,16 +5458,18 @@
          }
        | let_clause
        | where_clause
+       | join_clause
+       | orderby_clause
        ;
        
 let_clause
        : LET IDENTIFIER ASSIGN expression
          {
-               start_block (lexer.Location);
+               start_block (GetLocation ($1));
                LocatedToken lt = (LocatedToken) $2;
                current_block.AddVariable 
(Linq.ImplicitQueryParameter.ImplicitType.Instance,
                        lt.Value, lt.Location);   
-               $$ = new Linq.Let (current_block, (Expression)$4);
+               $$ = new Linq.Let (current_block, (Expression)$4, GetLocation 
($1));
                end_block (lexer.Location);
          }
        ;
@@ -5513,10 +5481,40 @@
          }
        ;
        
-opt_orderby_clause
-       : /* empty */
-       | ORDERBY orderings
+join_clause
+       : JOIN IDENTIFIER IN expression ON expression EQUALS expression
          {
+               start_block (GetLocation ($1));
+               LocatedToken lt = (LocatedToken) $2;
+               current_block.AddVariable 
(Linq.ImplicitQueryParameter.ImplicitType.Instance,
+                       lt.Value, lt.Location);
+               
+               $$ = new Linq.Join (current_block, (Expression)$4, 
(Expression)$6, (Expression)$8, GetLocation ($1));
+               end_block (lexer.Location);
+         }
+       | JOIN type IDENTIFIER IN expression ON expression EQUALS expression
+         {
+               start_block (GetLocation ($1));
+               LocatedToken lt = (LocatedToken) $3;
+               current_block.AddVariable ((Expression)$2, lt.Value, 
lt.Location);
+               
+               $$ = new Linq.Join (current_block, new Linq.Cast 
((Expression)$2, (Expression)$5),
+                       (Expression)$7, (Expression)$9, GetLocation ($1));
+               end_block (lexer.Location);             
+         }
+       | JOIN join_clause_body INTO IDENTIFIER
+       | JOIN type join_clause_body INTO IDENTIFIER
+       ;
+       
+join_clause_body
+       : IDENTIFIER IN expression ON expression EQUALS expression
+         {
+         }
+       ;       
+       
+orderby_clause
+       : ORDERBY orderings
+         {
                $$ = $2;
          }
        ;
@@ -5572,13 +5570,6 @@
          }     
        ;
 
-       
-group_clause
-       : GROUP expression BY expression
-         {
-           $$ = new Linq.GroupBy ((Expression)$2, (Expression)$4, GetLocation 
($1));
-         }
-       ;
 
 opt_query_continuation
        : /* empty */
@@ -5586,7 +5577,7 @@
        ;
        
 query_continuation
-       : INTO IDENTIFIER opt_join_clauses query_body
+       : INTO IDENTIFIER query_body
        ;
 
 %%

Modified: trunk/mcs/gmcs/linq.cs
===================================================================
--- trunk/mcs/gmcs/linq.cs      2007-09-11 21:16:05 UTC (rev 85664)
+++ trunk/mcs/gmcs/linq.cs      2007-09-11 22:09:59 UTC (rev 85665)
@@ -102,7 +102,7 @@
                public virtual Expression BuildQueryClause (EmitContext ec, 
Expression lSide, Parameter parameter, TransparentIdentifiersScope ti)
                {
                        ArrayList args = new ArrayList (1);
-                       args.Add (new Argument (CreateSelector (ec, expr, 
parameter, ti)));
+                       args.Add (CreateSelectorArgument (ec, expr, parameter, 
ti));
                        lSide = CreateQueryExpression (lSide, args);
                        if (next != null) {
                                Select s = next as Select;
@@ -125,12 +125,12 @@
                                new QueryExpressionAccess (lSide, MethodName, 
typeArguments, loc), arguments);
                }
 
-               protected LambdaExpression CreateSelector (EmitContext ec, 
Expression expr, Parameter parameter, TransparentIdentifiersScope ti)
+               protected Argument CreateSelectorArgument (EmitContext ec, 
Expression expr, Parameter parameter, TransparentIdentifiersScope ti)
                {
-                       return CreateSelector (ec, expr, new Parameter [] { 
parameter }, ti);
+                       return CreateSelectorArgument (ec, expr, new Parameter 
[] { parameter }, ti);
                }
 
-               protected LambdaExpression CreateSelector (EmitContext ec, 
Expression expr, Parameter[] parameters, TransparentIdentifiersScope ti)
+               protected Argument CreateSelectorArgument (EmitContext ec, 
Expression expr, Parameter[] parameters, TransparentIdentifiersScope ti)
                {
                        Parameters p = new Parameters (parameters);
 
@@ -142,7 +142,7 @@
                        selector.CreateAnonymousHelpers ();
                        selector.RootScope.DefineType ();
 
-                       return selector;
+                       return new Argument (selector);
                }
 
                public override void Emit (EmitContext ec)
@@ -182,9 +182,9 @@
                protected virtual void AddSelectorArguments (EmitContext ec, 
ArrayList args, Parameter parentParameter,
                        Parameter parameter, TransparentIdentifiersScope ti)
                {
-                       args.Add (new Argument (CreateSelector (ec, expr, 
parentParameter, null)));
-                       args.Add (new Argument (CreateSelector (ec, 
element_selector,
-                               new Parameter [] { parentParameter, parameter 
}, ti)));
+                       args.Add (CreateSelectorArgument (ec, expr, 
parentParameter, null));
+                       args.Add (CreateSelectorArgument (ec, element_selector,
+                               new Parameter [] { parentParameter, parameter 
}, ti));
                }
 
                //
@@ -201,13 +201,7 @@
                        enumerator.MoveNext ();
                        LocalInfo li = (LocalInfo) enumerator.Current;
 
-                       Parameter parameter;
-                       if (li.Type == 
ImplicitQueryParameter.ImplicitType.Instance) {
-                               parameter = new ImplicitQueryParameter (li);
-                       } else {
-                               parameter = new Parameter (li.Type, li.Name, 
Parameter.Modifier.NONE, null, li.Location);
-                       }
-
+                       Parameter parameter = new ImplicitQueryParameter (li);
                        if (parentParameter == null)
                                return next.BuildQueryClause (ec, expr, 
parameter, ti);
 
@@ -223,7 +217,7 @@
                                element_selector = new AnonymousTypeDeclaration 
(transp_args, (TypeContainer) ec.DeclContainer, loc);
                        }
 
-                       ArrayList args = new ArrayList (2);
+                       ArrayList args = new ArrayList ();
                        AddSelectorArguments (ec, args, parentParameter, 
parameter, ti);
 
                        lSide = CreateQueryExpression (lSide, args);
@@ -322,11 +316,11 @@
                public override Expression BuildQueryClause (EmitContext ec, 
Expression lSide, Parameter parameter, TransparentIdentifiersScope ti)
                {
                        ArrayList args = new ArrayList (2);
-                       args.Add (new Argument (CreateSelector (ec, expr, 
parameter, ti)));
+                       args.Add (CreateSelectorArgument (ec, expr, parameter, 
ti));
 
                        // A query can be optimized when selector is not group 
by specific
                        if (!element_selector.Equals (lSide))
-                               args.Add (new Argument (CreateSelector (ec, 
element_selector, parameter, ti)));
+                               args.Add (CreateSelectorArgument (ec, 
element_selector, parameter, ti));
 
                        lSide = CreateQueryExpression (lSide, args);
                        if (next != null)
@@ -340,6 +334,53 @@
                }
        }
 
+       public class Join : ARangeVariableQueryClause
+       {
+               Expression projection;
+               Expression inner_selector, outer_selector;
+
+               public Join (Block block, Expression inner, Expression 
outerSelector, Expression innerSelector, Location loc)
+                       : base (block, inner, loc)
+               {
+                       this.outer_selector = outerSelector;
+                       this.inner_selector = innerSelector;
+               }
+
+               protected override void AddSelectorArguments (EmitContext ec, 
ArrayList args, Parameter parentParameter,
+                       Parameter parameter, TransparentIdentifiersScope ti)
+               {
+                       args.Add (new Argument (expr));
+                       args.Add (CreateSelectorArgument (ec, outer_selector, 
parentParameter, ti));
+                       args.Add (CreateSelectorArgument (ec, inner_selector, 
parameter, ti));
+
+                       if (projection == null) {
+                               ArrayList join_args = new ArrayList (2);
+                               join_args.Add (new AnonymousTypeParameter 
(parentParameter));
+                               join_args.Add (new AnonymousTypeParameter 
(parameter));
+                               projection = new AnonymousTypeDeclaration 
(join_args, (TypeContainer) ec.DeclContainer, loc);
+                       }
+
+                       args.Add (CreateSelectorArgument (ec, projection, new 
Parameter [] { parentParameter, parameter }, ti));
+               }
+
+               public override AQueryClause Next {
+                       set {
+                               // Use select as join projection
+                               if (value is Select) {
+                                       projection = value.expr;
+                                       next = value.next;
+                                       return;
+                               }
+
+                               base.Next = value;
+                       }
+               }
+
+               protected override string MethodName {
+                       get { return "Join"; }
+               }
+       }
+
        public class Let : ARangeVariableQueryClause
        {
                class RangeAnonymousTypeParameter : AnonymousTypeParameter
@@ -367,15 +408,15 @@
                        }
                }
 
-               public Let (Block block, Expression expr)
-                       : base (block, expr, expr.Location)
+               public Let (Block block, Expression expr, Location loc)
+                       : base (block, expr, loc)
                {
                }
 
                protected override void AddSelectorArguments (EmitContext ec, 
ArrayList args, Parameter parentParameter, Parameter parameter,
                        TransparentIdentifiersScope ti)
                {
-                       args.Add (new Argument (CreateSelector (ec, 
element_selector, parentParameter, ti)));
+                       args.Add (CreateSelectorArgument (ec, element_selector, 
parentParameter, ti));
                }
 
                protected override AnonymousTypeParameter 
CreateAnonymousTypeVariable (Parameter parameter)

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to