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