Browse Source

[VB9]

- Updated AST to definition of FromClause
- Updated parser
- Added Unit Tests for QueryExpressionVB

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5700 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Siegfried Pammer 15 years ago
parent
commit
dd93e8bf9a
  1. 5
      src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitor.cs
  2. 25
      src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Expressions.cs
  3. 185
      src/Libraries/NRefactory/Project/Src/Ast/Generated.cs
  4. 2
      src/Libraries/NRefactory/Project/Src/IAstVisitor.cs
  5. 195
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs
  6. 38
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG
  7. 1250
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs
  8. 70
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG
  9. 26
      src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs
  10. 44
      src/Libraries/NRefactory/Project/Src/PrettyPrinter/VBNet/VBNetOutputVisitor.cs
  11. 30
      src/Libraries/NRefactory/Project/Src/Visitors/AbstractASTVisitor.cs
  12. 55
      src/Libraries/NRefactory/Project/Src/Visitors/AbstractAstTransformer.cs
  13. 29
      src/Libraries/NRefactory/Project/Src/Visitors/LookupTableVisitor.cs
  14. 11
      src/Libraries/NRefactory/Project/Src/Visitors/NodeTrackingAstVisitor.cs
  15. 4
      src/Libraries/NRefactory/Project/Src/Visitors/NotImplementedAstVisitor.cs
  16. 36
      src/Libraries/NRefactory/Test/Parser/Expressions/QueryExpressionTests.cs
  17. 381
      src/Libraries/NRefactory/Test/Parser/Expressions/QueryExpressionVBTests.cs
  18. 4
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/ResolveVisitor.cs

5
src/AddIns/BackendBindings/Boo/NRefactoryToBooConverter/Project/ConvertVisitor.cs

@ -266,5 +266,10 @@ namespace NRefactoryToBooConverter @@ -266,5 +266,10 @@ namespace NRefactoryToBooConverter
{
return ConvertTypeReference(typeReference);
}
public object VisitCollectionRangeVariable(CollectionRangeVariable collectionRangeVariable, object data)
{
throw new NotImplementedException();
}
}
}

25
src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Expressions.cs

@ -285,18 +285,13 @@ namespace NRefactoryASTGenerator.Ast @@ -285,18 +285,13 @@ namespace NRefactoryASTGenerator.Ast
Expression expression;
}
abstract class QueryExpressionFromOrJoinClause : QueryExpressionClause {
TypeReference type;
[QuestionMarkDefault]
string identifier;
Expression inExpression;
}
[ImplementNullable(NullableImplementation.Shadow)]
class QueryExpressionFromClause : QueryExpressionFromOrJoinClause { }
class QueryExpressionFromClause : QueryExpressionClause {
List<CollectionRangeVariable> sources;
}
class QueryExpressionAggregateClause : QueryExpressionClause {
QueryExpressionFromClause fromClause;
CollectionRangeVariable source;
List<QueryExpressionClause> middleClauses;
List<ExpressionRangeVariable> intoVariables;
}
@ -308,16 +303,24 @@ namespace NRefactoryASTGenerator.Ast @@ -308,16 +303,24 @@ namespace NRefactoryASTGenerator.Ast
TypeReference type;
}
class QueryExpressionJoinClause : QueryExpressionFromOrJoinClause {
[ImplementNullable]
class CollectionRangeVariable : AbstractNode, INullable {
string identifier;
Expression expression;
TypeReference type;
}
class QueryExpressionJoinClause : QueryExpressionClause {
Expression onExpression;
Expression equalsExpression;
CollectionRangeVariable source;
string intoIdentifier;
}
[ImplementNullable(NullableImplementation.Shadow)]
class QueryExpressionJoinVBClause : QueryExpressionClause {
QueryExpressionFromClause joinVariable;
CollectionRangeVariable joinVariable;
QueryExpressionJoinVBClause subJoin;
List<QueryExpressionJoinConditionVB> conditions;
}

185
src/Libraries/NRefactory/Project/Src/Ast/Generated.cs

@ -802,6 +802,89 @@ namespace ICSharpCode.NRefactory.Ast { @@ -802,6 +802,89 @@ namespace ICSharpCode.NRefactory.Ast {
}
}
public class CollectionRangeVariable : AbstractNode, INullable {
string identifier;
Expression expression;
TypeReference type;
public string Identifier {
get {
return identifier;
}
set {
identifier = value ?? "";
}
}
public Expression Expression {
get {
return expression;
}
set {
expression = value ?? Expression.Null;
if (!expression.IsNull) expression.Parent = this;
}
}
public TypeReference Type {
get {
return type;
}
set {
type = value ?? TypeReference.Null;
if (!type.IsNull) type.Parent = this;
}
}
public CollectionRangeVariable() {
identifier = "";
expression = Expression.Null;
type = TypeReference.Null;
}
public virtual bool IsNull {
get {
return false;
}
}
public static CollectionRangeVariable Null {
get {
return NullCollectionRangeVariable.Instance;
}
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
return visitor.VisitCollectionRangeVariable(this, data);
}
public override string ToString() {
return string.Format("[CollectionRangeVariable Identifier={0} Expression={1} Type={2}]", Identifier, Expression, Type);
}
}
internal sealed class NullCollectionRangeVariable : CollectionRangeVariable {
internal static NullCollectionRangeVariable Instance = new NullCollectionRangeVariable();
public override bool IsNull {
get {
return true;
}
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
return null;
}
public override string ToString() {
return "[NullCollectionRangeVariable]";
}
}
public class ConditionalExpression : Expression {
Expression condition;
@ -3670,19 +3753,19 @@ public Location ExtendedEndLocation { get; set; } @@ -3670,19 +3753,19 @@ public Location ExtendedEndLocation { get; set; }
public class QueryExpressionAggregateClause : QueryExpressionClause {
QueryExpressionFromClause fromClause;
CollectionRangeVariable source;
List<QueryExpressionClause> middleClauses;
List<ExpressionRangeVariable> intoVariables;
public QueryExpressionFromClause FromClause {
public CollectionRangeVariable Source {
get {
return fromClause;
return source;
}
set {
fromClause = value ?? QueryExpressionFromClause.Null;
if (!fromClause.IsNull) fromClause.Parent = this;
source = value ?? CollectionRangeVariable.Null;
if (!source.IsNull) source.Parent = this;
}
}
@ -3705,7 +3788,7 @@ public Location ExtendedEndLocation { get; set; } @@ -3705,7 +3788,7 @@ public Location ExtendedEndLocation { get; set; }
}
public QueryExpressionAggregateClause() {
fromClause = QueryExpressionFromClause.Null;
source = CollectionRangeVariable.Null;
middleClauses = new List<QueryExpressionClause>();
intoVariables = new List<ExpressionRangeVariable>();
}
@ -3715,8 +3798,7 @@ public Location ExtendedEndLocation { get; set; } @@ -3715,8 +3798,7 @@ public Location ExtendedEndLocation { get; set; }
}
public override string ToString() {
return string.Format("[QueryExpressionAggregateClause FromClause={0} MiddleClauses={1} IntoVariables={2" +
"}]", FromClause, GetCollectionString(MiddleClauses), GetCollectionString(IntoVariables));
return string.Format("[QueryExpressionAggregateClause Source={0} MiddleClauses={1} IntoVariables={2}]", Source, GetCollectionString(MiddleClauses), GetCollectionString(IntoVariables));
}
}
@ -3771,9 +3853,21 @@ public Location ExtendedEndLocation { get; set; } @@ -3771,9 +3853,21 @@ public Location ExtendedEndLocation { get; set; }
}
}
public class QueryExpressionFromClause : QueryExpressionFromOrJoinClause {
public class QueryExpressionFromClause : QueryExpressionClause {
List<CollectionRangeVariable> sources;
public List<CollectionRangeVariable> Sources {
get {
return sources;
}
set {
sources = value ?? new List<CollectionRangeVariable>();
}
}
public QueryExpressionFromClause() {
sources = new List<CollectionRangeVariable>();
}
public new static QueryExpressionFromClause Null {
@ -3787,7 +3881,7 @@ public Location ExtendedEndLocation { get; set; } @@ -3787,7 +3881,7 @@ public Location ExtendedEndLocation { get; set; }
}
public override string ToString() {
return string.Format("[QueryExpressionFromClause Type={0} Identifier={1} InExpression={2}]", Type, Identifier, InExpression);
return string.Format("[QueryExpressionFromClause Sources={0}]", GetCollectionString(Sources));
}
}
@ -3810,50 +3904,6 @@ public Location ExtendedEndLocation { get; set; } @@ -3810,50 +3904,6 @@ public Location ExtendedEndLocation { get; set; }
}
}
public abstract class QueryExpressionFromOrJoinClause : QueryExpressionClause {
TypeReference type;
string identifier;
Expression inExpression;
public TypeReference Type {
get {
return type;
}
set {
type = value ?? TypeReference.Null;
if (!type.IsNull) type.Parent = this;
}
}
public string Identifier {
get {
return identifier;
}
set {
identifier = string.IsNullOrEmpty(value) ? "?" : value;
}
}
public Expression InExpression {
get {
return inExpression;
}
set {
inExpression = value ?? Expression.Null;
if (!inExpression.IsNull) inExpression.Parent = this;
}
}
protected QueryExpressionFromOrJoinClause() {
type = TypeReference.Null;
identifier = "?";
inExpression = Expression.Null;
}
}
public class QueryExpressionGroupClause : QueryExpressionClause {
Expression projection;
@ -3984,12 +4034,14 @@ public Location ExtendedEndLocation { get; set; } @@ -3984,12 +4034,14 @@ public Location ExtendedEndLocation { get; set; }
}
}
public class QueryExpressionJoinClause : QueryExpressionFromOrJoinClause {
public class QueryExpressionJoinClause : QueryExpressionClause {
Expression onExpression;
Expression equalsExpression;
CollectionRangeVariable source;
string intoIdentifier;
public Expression OnExpression {
@ -4012,6 +4064,16 @@ public Location ExtendedEndLocation { get; set; } @@ -4012,6 +4064,16 @@ public Location ExtendedEndLocation { get; set; }
}
}
public CollectionRangeVariable Source {
get {
return source;
}
set {
source = value ?? CollectionRangeVariable.Null;
if (!source.IsNull) source.Parent = this;
}
}
public string IntoIdentifier {
get {
return intoIdentifier;
@ -4024,6 +4086,7 @@ public Location ExtendedEndLocation { get; set; } @@ -4024,6 +4086,7 @@ public Location ExtendedEndLocation { get; set; }
public QueryExpressionJoinClause() {
onExpression = Expression.Null;
equalsExpression = Expression.Null;
source = CollectionRangeVariable.Null;
intoIdentifier = "";
}
@ -4032,8 +4095,8 @@ public Location ExtendedEndLocation { get; set; } @@ -4032,8 +4095,8 @@ public Location ExtendedEndLocation { get; set; }
}
public override string ToString() {
return string.Format("[QueryExpressionJoinClause OnExpression={0} EqualsExpression={1} IntoIdentifier={" +
"2} Type={3} Identifier={4} InExpression={5}]", OnExpression, EqualsExpression, IntoIdentifier, Type, Identifier, InExpression);
return string.Format("[QueryExpressionJoinClause OnExpression={0} EqualsExpression={1} Source={2} IntoI" +
"dentifier={3}]", OnExpression, EqualsExpression, Source, IntoIdentifier);
}
}
@ -4079,18 +4142,18 @@ public Location ExtendedEndLocation { get; set; } @@ -4079,18 +4142,18 @@ public Location ExtendedEndLocation { get; set; }
public class QueryExpressionJoinVBClause : QueryExpressionClause {
QueryExpressionFromClause joinVariable;
CollectionRangeVariable joinVariable;
QueryExpressionJoinVBClause subJoin;
List<QueryExpressionJoinConditionVB> conditions;
public QueryExpressionFromClause JoinVariable {
public CollectionRangeVariable JoinVariable {
get {
return joinVariable;
}
set {
joinVariable = value ?? QueryExpressionFromClause.Null;
joinVariable = value ?? CollectionRangeVariable.Null;
if (!joinVariable.IsNull) joinVariable.Parent = this;
}
}
@ -4115,7 +4178,7 @@ public Location ExtendedEndLocation { get; set; } @@ -4115,7 +4178,7 @@ public Location ExtendedEndLocation { get; set; }
}
public QueryExpressionJoinVBClause() {
joinVariable = QueryExpressionFromClause.Null;
joinVariable = CollectionRangeVariable.Null;
subJoin = QueryExpressionJoinVBClause.Null;
conditions = new List<QueryExpressionJoinConditionVB>();
}

2
src/Libraries/NRefactory/Project/Src/IAstVisitor.cs

@ -51,6 +51,8 @@ namespace ICSharpCode.NRefactory { @@ -51,6 +51,8 @@ namespace ICSharpCode.NRefactory {
object VisitCollectionInitializerExpression(CollectionInitializerExpression collectionInitializerExpression, object data);
object VisitCollectionRangeVariable(CollectionRangeVariable collectionRangeVariable, object data);
object VisitCompilationUnit(CompilationUnit compilationUnit, object data);
object VisitConditionalExpression(ConditionalExpression conditionalExpression, object data);

195
src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs

@ -5572,22 +5572,26 @@ out t); @@ -5572,22 +5572,26 @@ out t);
out QueryExpressionFromClause fc) {
#line 2427 "cs.ATG"
fc = new QueryExpressionFromClause(); fc.StartLocation = la.Location;
fc = new QueryExpressionFromClause();
fc.StartLocation = la.Location;
CollectionRangeVariable variable;
Expect(137);
QueryExpressionFromOrJoinClause(
#line 2431 "cs.ATG"
fc);
#line 2433 "cs.ATG"
out variable);
#line 2432 "cs.ATG"
fc.EndLocation = t.EndLocation;
#line 2434 "cs.ATG"
fc.EndLocation = t.EndLocation;
fc.Sources.Add(variable);
}
void QueryExpressionBody(
#line 2462 "cs.ATG"
#line 2470 "cs.ATG"
ref QueryExpression q) {
#line 2463 "cs.ATG"
#line 2471 "cs.ATG"
QueryExpressionFromClause fromClause; QueryExpressionWhereClause whereClause;
QueryExpressionLetClause letClause; QueryExpressionJoinClause joinClause;
QueryExpressionOrderClause orderClause;
@ -5596,300 +5600,305 @@ ref QueryExpression q) { @@ -5596,300 +5600,305 @@ ref QueryExpression q) {
while (StartOf(39)) {
if (la.kind == 137) {
QueryExpressionFromClause(
#line 2469 "cs.ATG"
#line 2477 "cs.ATG"
out fromClause);
#line 2469 "cs.ATG"
#line 2477 "cs.ATG"
SafeAdd<QueryExpressionClause>(q, q.MiddleClauses, fromClause);
} else if (la.kind == 127) {
QueryExpressionWhereClause(
#line 2470 "cs.ATG"
#line 2478 "cs.ATG"
out whereClause);
#line 2470 "cs.ATG"
#line 2478 "cs.ATG"
SafeAdd<QueryExpressionClause>(q, q.MiddleClauses, whereClause);
} else if (la.kind == 141) {
QueryExpressionLetClause(
#line 2471 "cs.ATG"
#line 2479 "cs.ATG"
out letClause);
#line 2471 "cs.ATG"
#line 2479 "cs.ATG"
SafeAdd<QueryExpressionClause>(q, q.MiddleClauses, letClause);
} else if (la.kind == 142) {
QueryExpressionJoinClause(
#line 2472 "cs.ATG"
#line 2480 "cs.ATG"
out joinClause);
#line 2472 "cs.ATG"
#line 2480 "cs.ATG"
SafeAdd<QueryExpressionClause>(q, q.MiddleClauses, joinClause);
} else {
QueryExpressionOrderByClause(
#line 2473 "cs.ATG"
#line 2481 "cs.ATG"
out orderClause);
#line 2473 "cs.ATG"
#line 2481 "cs.ATG"
SafeAdd<QueryExpressionClause>(q, q.MiddleClauses, orderClause);
}
}
if (la.kind == 133) {
QueryExpressionSelectClause(
#line 2475 "cs.ATG"
#line 2483 "cs.ATG"
out selectClause);
#line 2475 "cs.ATG"
#line 2483 "cs.ATG"
q.SelectOrGroupClause = selectClause;
} else if (la.kind == 134) {
QueryExpressionGroupClause(
#line 2476 "cs.ATG"
#line 2484 "cs.ATG"
out groupClause);
#line 2476 "cs.ATG"
#line 2484 "cs.ATG"
q.SelectOrGroupClause = groupClause;
} else SynErr(216);
if (la.kind == 136) {
QueryExpressionIntoClause(
#line 2478 "cs.ATG"
#line 2486 "cs.ATG"
ref q);
}
}
void QueryExpressionFromOrJoinClause(
#line 2452 "cs.ATG"
QueryExpressionFromOrJoinClause fjc) {
#line 2460 "cs.ATG"
out CollectionRangeVariable variable) {
#line 2453 "cs.ATG"
TypeReference type; Expression expr;
#line 2461 "cs.ATG"
TypeReference type; Expression expr; variable = new CollectionRangeVariable();
#line 2455 "cs.ATG"
fjc.Type = null;
#line 2463 "cs.ATG"
variable.Type = null;
if (
#line 2456 "cs.ATG"
#line 2464 "cs.ATG"
IsLocalVarDecl()) {
Type(
#line 2456 "cs.ATG"
#line 2464 "cs.ATG"
out type);
#line 2456 "cs.ATG"
fjc.Type = type;
#line 2464 "cs.ATG"
variable.Type = type;
}
Identifier();
#line 2457 "cs.ATG"
fjc.Identifier = t.val;
#line 2465 "cs.ATG"
variable.Identifier = t.val;
Expect(81);
Expr(
#line 2459 "cs.ATG"
#line 2467 "cs.ATG"
out expr);
#line 2459 "cs.ATG"
fjc.InExpression = expr;
#line 2467 "cs.ATG"
variable.Expression = expr;
}
void QueryExpressionJoinClause(
#line 2435 "cs.ATG"
#line 2439 "cs.ATG"
out QueryExpressionJoinClause jc) {
#line 2436 "cs.ATG"
#line 2440 "cs.ATG"
jc = new QueryExpressionJoinClause(); jc.StartLocation = la.Location;
Expression expr;
CollectionRangeVariable variable;
Expect(142);
QueryExpressionFromOrJoinClause(
#line 2441 "cs.ATG"
jc);
#line 2446 "cs.ATG"
out variable);
Expect(143);
Expr(
#line 2443 "cs.ATG"
#line 2448 "cs.ATG"
out expr);
#line 2443 "cs.ATG"
#line 2448 "cs.ATG"
jc.OnExpression = expr;
Expect(144);
Expr(
#line 2445 "cs.ATG"
#line 2450 "cs.ATG"
out expr);
#line 2445 "cs.ATG"
#line 2450 "cs.ATG"
jc.EqualsExpression = expr;
if (la.kind == 136) {
lexer.NextToken();
Identifier();
#line 2447 "cs.ATG"
#line 2452 "cs.ATG"
jc.IntoIdentifier = t.val;
}
#line 2449 "cs.ATG"
jc.EndLocation = t.EndLocation;
#line 2455 "cs.ATG"
jc.EndLocation = t.EndLocation;
jc.Source = variable;
}
void QueryExpressionWhereClause(
#line 2481 "cs.ATG"
#line 2489 "cs.ATG"
out QueryExpressionWhereClause wc) {
#line 2482 "cs.ATG"
#line 2490 "cs.ATG"
Expression expr; wc = new QueryExpressionWhereClause(); wc.StartLocation = la.Location;
Expect(127);
Expr(
#line 2485 "cs.ATG"
#line 2493 "cs.ATG"
out expr);
#line 2485 "cs.ATG"
#line 2493 "cs.ATG"
wc.Condition = expr;
#line 2486 "cs.ATG"
#line 2494 "cs.ATG"
wc.EndLocation = t.EndLocation;
}
void QueryExpressionLetClause(
#line 2489 "cs.ATG"
#line 2497 "cs.ATG"
out QueryExpressionLetClause wc) {
#line 2490 "cs.ATG"
#line 2498 "cs.ATG"
Expression expr; wc = new QueryExpressionLetClause(); wc.StartLocation = la.Location;
Expect(141);
Identifier();
#line 2493 "cs.ATG"
#line 2501 "cs.ATG"
wc.Identifier = t.val;
Expect(3);
Expr(
#line 2495 "cs.ATG"
#line 2503 "cs.ATG"
out expr);
#line 2495 "cs.ATG"
#line 2503 "cs.ATG"
wc.Expression = expr;
#line 2496 "cs.ATG"
#line 2504 "cs.ATG"
wc.EndLocation = t.EndLocation;
}
void QueryExpressionOrderByClause(
#line 2499 "cs.ATG"
#line 2507 "cs.ATG"
out QueryExpressionOrderClause oc) {
#line 2500 "cs.ATG"
#line 2508 "cs.ATG"
QueryExpressionOrdering ordering; oc = new QueryExpressionOrderClause(); oc.StartLocation = la.Location;
Expect(140);
QueryExpressionOrdering(
#line 2503 "cs.ATG"
#line 2511 "cs.ATG"
out ordering);
#line 2503 "cs.ATG"
#line 2511 "cs.ATG"
SafeAdd(oc, oc.Orderings, ordering);
while (la.kind == 14) {
lexer.NextToken();
QueryExpressionOrdering(
#line 2505 "cs.ATG"
#line 2513 "cs.ATG"
out ordering);
#line 2505 "cs.ATG"
#line 2513 "cs.ATG"
SafeAdd(oc, oc.Orderings, ordering);
}
#line 2507 "cs.ATG"
#line 2515 "cs.ATG"
oc.EndLocation = t.EndLocation;
}
void QueryExpressionSelectClause(
#line 2520 "cs.ATG"
#line 2528 "cs.ATG"
out QueryExpressionSelectClause sc) {
#line 2521 "cs.ATG"
#line 2529 "cs.ATG"
Expression expr; sc = new QueryExpressionSelectClause(); sc.StartLocation = la.Location;
Expect(133);
Expr(
#line 2524 "cs.ATG"
#line 2532 "cs.ATG"
out expr);
#line 2524 "cs.ATG"
#line 2532 "cs.ATG"
sc.Projection = expr;
#line 2525 "cs.ATG"
#line 2533 "cs.ATG"
sc.EndLocation = t.EndLocation;
}
void QueryExpressionGroupClause(
#line 2528 "cs.ATG"
#line 2536 "cs.ATG"
out QueryExpressionGroupClause gc) {
#line 2529 "cs.ATG"
#line 2537 "cs.ATG"
Expression expr; gc = new QueryExpressionGroupClause(); gc.StartLocation = la.Location;
Expect(134);
Expr(
#line 2532 "cs.ATG"
#line 2540 "cs.ATG"
out expr);
#line 2532 "cs.ATG"
#line 2540 "cs.ATG"
gc.Projection = expr;
Expect(135);
Expr(
#line 2534 "cs.ATG"
#line 2542 "cs.ATG"
out expr);
#line 2534 "cs.ATG"
#line 2542 "cs.ATG"
gc.GroupBy = expr;
#line 2535 "cs.ATG"
#line 2543 "cs.ATG"
gc.EndLocation = t.EndLocation;
}
void QueryExpressionIntoClause(
#line 2538 "cs.ATG"
#line 2546 "cs.ATG"
ref QueryExpression q) {
#line 2539 "cs.ATG"
#line 2547 "cs.ATG"
QueryExpression firstQuery = q;
QueryExpression continuedQuery = new QueryExpression();
continuedQuery.StartLocation = q.StartLocation;
firstQuery.EndLocation = la.Location;
continuedQuery.FromClause = new QueryExpressionFromClause();
continuedQuery.FromClause.StartLocation = la.Location;
CollectionRangeVariable fromVariable = new CollectionRangeVariable();
continuedQuery.FromClause.Sources.Add(fromVariable);
fromVariable.StartLocation = la.Location;
// nest firstQuery inside continuedQuery.
continuedQuery.FromClause.InExpression = firstQuery;
fromVariable.Expression = firstQuery;
continuedQuery.IsQueryContinuation = true;
q = continuedQuery;
Expect(136);
Identifier();
#line 2552 "cs.ATG"
continuedQuery.FromClause.Identifier = t.val;
#line 2562 "cs.ATG"
fromVariable.Identifier = t.val;
#line 2553 "cs.ATG"
#line 2563 "cs.ATG"
continuedQuery.FromClause.EndLocation = t.EndLocation;
QueryExpressionBody(
#line 2554 "cs.ATG"
#line 2564 "cs.ATG"
ref q);
}
void QueryExpressionOrdering(
#line 2510 "cs.ATG"
#line 2518 "cs.ATG"
out QueryExpressionOrdering ordering) {
#line 2511 "cs.ATG"
#line 2519 "cs.ATG"
Expression expr; ordering = new QueryExpressionOrdering(); ordering.StartLocation = la.Location;
Expr(
#line 2513 "cs.ATG"
#line 2521 "cs.ATG"
out expr);
#line 2513 "cs.ATG"
#line 2521 "cs.ATG"
ordering.Criteria = expr;
if (la.kind == 138 || la.kind == 139) {
if (la.kind == 138) {
lexer.NextToken();
#line 2514 "cs.ATG"
#line 2522 "cs.ATG"
ordering.Direction = QueryExpressionOrderingDirection.Ascending;
} else {
lexer.NextToken();
#line 2515 "cs.ATG"
#line 2523 "cs.ATG"
ordering.Direction = QueryExpressionOrderingDirection.Descending;
}
}
#line 2517 "cs.ATG"
#line 2525 "cs.ATG"
ordering.EndLocation = t.EndLocation;
}

38
src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG

@ -2424,21 +2424,26 @@ QueryExpression<out Expression outExpr> @@ -2424,21 +2424,26 @@ QueryExpression<out Expression outExpr>
.
QueryExpressionFromClause<out QueryExpressionFromClause fc>
(. fc = new QueryExpressionFromClause(); fc.StartLocation = la.Location;
(. fc = new QueryExpressionFromClause();
fc.StartLocation = la.Location;
CollectionRangeVariable variable;
.)
=
"from"
QueryExpressionFromOrJoinClause<fc>
(. fc.EndLocation = t.EndLocation; .)
QueryExpressionFromOrJoinClause<out variable>
(. fc.EndLocation = t.EndLocation;
fc.Sources.Add(variable);
.)
.
QueryExpressionJoinClause<out QueryExpressionJoinClause jc>
(. jc = new QueryExpressionJoinClause(); jc.StartLocation = la.Location;
Expression expr;
CollectionRangeVariable variable;
.)
=
"join"
QueryExpressionFromOrJoinClause<jc>
QueryExpressionFromOrJoinClause<out variable>
"on"
Expr<out expr> (. jc.OnExpression = expr; .)
"equals"
@ -2446,17 +2451,20 @@ QueryExpressionJoinClause<out QueryExpressionJoinClause jc> @@ -2446,17 +2451,20 @@ QueryExpressionJoinClause<out QueryExpressionJoinClause jc>
[ "into"
Identifier (. jc.IntoIdentifier = t.val; .)
]
(. jc.EndLocation = t.EndLocation; .)
(.
jc.EndLocation = t.EndLocation;
jc.Source = variable;
.)
.
QueryExpressionFromOrJoinClause<QueryExpressionFromOrJoinClause fjc>
(. TypeReference type; Expression expr; .)
QueryExpressionFromOrJoinClause<out CollectionRangeVariable variable>
(. TypeReference type; Expression expr; variable = new CollectionRangeVariable(); .)
=
(. fjc.Type = null; .)
[ IF (IsLocalVarDecl()) Type<out type> (. fjc.Type = type; .) ]
Identifier (. fjc.Identifier = t.val; .)
(. variable.Type = null; .)
[ IF (IsLocalVarDecl()) Type<out type> (. variable.Type = type; .) ]
Identifier (. variable.Identifier = t.val; .)
"in"
Expr<out expr> (. fjc.InExpression = expr; .)
Expr<out expr> (. variable.Expression = expr; .)
.
QueryExpressionBody<ref QueryExpression q>
@ -2541,15 +2549,17 @@ QueryExpressionIntoClause<ref QueryExpression q> @@ -2541,15 +2549,17 @@ QueryExpressionIntoClause<ref QueryExpression q>
continuedQuery.StartLocation = q.StartLocation;
firstQuery.EndLocation = la.Location;
continuedQuery.FromClause = new QueryExpressionFromClause();
continuedQuery.FromClause.StartLocation = la.Location;
CollectionRangeVariable fromVariable = new CollectionRangeVariable();
continuedQuery.FromClause.Sources.Add(fromVariable);
fromVariable.StartLocation = la.Location;
// nest firstQuery inside continuedQuery.
continuedQuery.FromClause.InExpression = firstQuery;
fromVariable.Expression = firstQuery;
continuedQuery.IsQueryContinuation = true;
q = continuedQuery;
.)
=
"into"
Identifier (. continuedQuery.FromClause.Identifier = t.val; .)
Identifier (. fromVariable.Identifier = t.val; .)
(. continuedQuery.FromClause.EndLocation = t.EndLocation; .)
QueryExpressionBody<ref q>
.

1250
src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs

File diff suppressed because it is too large Load Diff

70
src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG

@ -2025,9 +2025,14 @@ QueryExpr<out Expression expr> @@ -2025,9 +2025,14 @@ QueryExpr<out Expression expr>
.
FromOrAggregateQueryOperator<List<QueryExpressionClause> middleClauses>
(. .) =
FromQueryOperator<middleClauses>
| AggregateQueryOperator<middleClauses>
(.
QueryExpressionFromClause fromClause = null;
QueryExpressionAggregateClause aggregateClause = null;
.) =
FromQueryOperator<out fromClause>
(. middleClauses.Add(fromClause); .)
| AggregateQueryOperator<out aggregateClause>
(. middleClauses.Add(aggregateClause); .)
.
QueryOperator<List<QueryExpressionClause> middleClauses>
@ -2036,10 +2041,14 @@ QueryOperator<List<QueryExpressionClause> middleClauses> @@ -2036,10 +2041,14 @@ QueryOperator<List<QueryExpressionClause> middleClauses>
QueryExpressionGroupVBClause groupByClause = null;
QueryExpressionPartitionVBClause partitionClause = null;
QueryExpressionGroupJoinVBClause groupJoinClause = null;
QueryExpressionFromClause fromClause = null;
QueryExpressionAggregateClause aggregateClause = null;
.) =
FromQueryOperator<middleClauses>
| AggregateQueryOperator<middleClauses>
| SelectQueryOperator<middleClauses>
FromQueryOperator<out fromClause>
(. middleClauses.Add(fromClause); .)
| AggregateQueryOperator<out aggregateClause>
(. middleClauses.Add(aggregateClause); .)
| SelectQueryOperator<middleClauses>
| DistinctQueryOperator<middleClauses>
| WhereQueryOperator<middleClauses>
| OrderByQueryOperator<middleClauses>
@ -2126,10 +2135,15 @@ GroupJoinQueryOperator<out QueryExpressionGroupJoinVBClause groupJoinClause> @@ -2126,10 +2135,15 @@ GroupJoinQueryOperator<out QueryExpressionGroupJoinVBClause groupJoinClause>
.)
.
FromQueryOperator<List<QueryExpressionClause> middleClauses>
FromQueryOperator<out QueryExpressionFromClause fromClause>
(.
fromClause = new QueryExpressionFromClause();
fromClause.StartLocation = la.Location;
.) =
"From" CollectionRangeVariableDeclarationList<middleClauses>
"From" CollectionRangeVariableDeclarationList<fromClause.Sources>
(.
fromClause.EndLocation = t.EndLocation;
.)
.
SelectQueryOperator<List<QueryExpressionClause> middleClauses>
@ -2190,16 +2204,16 @@ PartitionQueryOperator<out QueryExpressionPartitionVBClause partitionClause> @@ -2190,16 +2204,16 @@ PartitionQueryOperator<out QueryExpressionPartitionVBClause partitionClause>
.)
.
AggregateQueryOperator<List<QueryExpressionClause> middleClauses>
AggregateQueryOperator<out QueryExpressionAggregateClause aggregateClause>
(.
QueryExpressionFromClause fromClause = null;
QueryExpressionAggregateClause aggregateClause = new QueryExpressionAggregateClause();
aggregateClause = new QueryExpressionAggregateClause();
aggregateClause.IntoVariables = new List<ExpressionRangeVariable>();
aggregateClause.StartLocation = la.Location;
CollectionRangeVariable source;
.) =
"Aggregate" CollectionRangeVariableDeclaration<out fromClause>
"Aggregate" CollectionRangeVariableDeclaration<out source>
(.
aggregateClause.FromClause = fromClause;
aggregateClause.Source = source;
.)
{
QueryOperator<aggregateClause.MiddleClauses>
@ -2207,7 +2221,6 @@ AggregateQueryOperator<List<QueryExpressionClause> middleClauses> @@ -2207,7 +2221,6 @@ AggregateQueryOperator<List<QueryExpressionClause> middleClauses>
"Into" ExpressionRangeVariableDeclarationList<aggregateClause.IntoVariables>
(.
aggregateClause.EndLocation = t.EndLocation;
middleClauses.Add(aggregateClause);
.)
.
@ -2259,7 +2272,7 @@ JoinQueryOperator<out QueryExpressionJoinVBClause joinClause> @@ -2259,7 +2272,7 @@ JoinQueryOperator<out QueryExpressionJoinVBClause joinClause>
(.
joinClause = new QueryExpressionJoinVBClause();
joinClause.StartLocation = la.Location;
QueryExpressionFromClause joinVariable = null;
CollectionRangeVariable joinVariable = null;
QueryExpressionJoinVBClause subJoin = null;
QueryExpressionJoinConditionVB condition = null;
@ -2282,28 +2295,27 @@ JoinQueryOperator<out QueryExpressionJoinVBClause joinClause> @@ -2282,28 +2295,27 @@ JoinQueryOperator<out QueryExpressionJoinVBClause joinClause>
.)
.
CollectionRangeVariableDeclarationList<List<QueryExpressionClause> middleClauses>
(.
QueryExpressionFromClause fromClause = null;
.) =
CollectionRangeVariableDeclaration<out fromClause>
(. middleClauses.Add(fromClause); .)
{ "," CollectionRangeVariableDeclaration<out fromClause> (. middleClauses.Add(fromClause); .) }
CollectionRangeVariableDeclarationList<List<CollectionRangeVariable> rangeVariables>
(. CollectionRangeVariable variableDeclaration; .)
=
CollectionRangeVariableDeclaration<out variableDeclaration>
(. rangeVariables.Add(variableDeclaration); .)
{ "," CollectionRangeVariableDeclaration<out variableDeclaration> (. rangeVariables.Add(variableDeclaration); .) }
.
CollectionRangeVariableDeclaration<out QueryExpressionFromClause fromClause>
CollectionRangeVariableDeclaration<out CollectionRangeVariable rangeVariable>
(.
fromClause = new QueryExpressionFromClause();
fromClause.StartLocation = la.Location;
rangeVariable = new CollectionRangeVariable();
rangeVariable.StartLocation = la.Location;
TypeReference typeName = null;
Expression inExpr = null;
.) =
Identifier (. fromClause.Identifier = t.val; .)
[ "As" TypeName<out typeName> (. fromClause.Type = typeName; .) ]
Identifier (. rangeVariable.Identifier = t.val; .)
[ "As" TypeName<out typeName> (. rangeVariable.Type = typeName; .) ]
"In" Expr<out inExpr>
(.
fromClause.InExpression = inExpr;
fromClause.EndLocation = t.EndLocation;
rangeVariable.Expression = inExpr;
rangeVariable.EndLocation = t.EndLocation;
.)
.

26
src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs

@ -3046,14 +3046,14 @@ namespace ICSharpCode.NRefactory.PrettyPrinter @@ -3046,14 +3046,14 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
public override object TrackedVisitQueryExpression(QueryExpression queryExpression, object data)
{
if (queryExpression.IsQueryContinuation) {
queryExpression.FromClause.InExpression.AcceptVisitor(this, data);
queryExpression.FromClause.Sources.First().AcceptVisitor(this, data);
}
outputFormatter.IndentationLevel++;
if (queryExpression.IsQueryContinuation) {
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Into);
outputFormatter.Space();
outputFormatter.PrintIdentifier(queryExpression.FromClause.Identifier);
outputFormatter.PrintIdentifier(queryExpression.FromClause.Sources.First().Identifier);
} else {
queryExpression.FromClause.AcceptVisitor(this, data);
}
@ -3074,9 +3074,14 @@ namespace ICSharpCode.NRefactory.PrettyPrinter @@ -3074,9 +3074,14 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
public override object TrackedVisitQueryExpressionFromClause(QueryExpressionFromClause fromClause, object data)
{
CollectionRangeVariable variable = fromClause.Sources.Single();
outputFormatter.PrintToken(Tokens.From);
outputFormatter.Space();
VisitQueryExpressionFromOrJoinClause(fromClause, data);
outputFormatter.PrintIdentifier(variable.Identifier);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.In);
outputFormatter.Space();
variable.Expression.AcceptVisitor(this, data);
return null;
}
@ -3084,7 +3089,11 @@ namespace ICSharpCode.NRefactory.PrettyPrinter @@ -3084,7 +3089,11 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
{
outputFormatter.PrintToken(Tokens.Join);
outputFormatter.Space();
VisitQueryExpressionFromOrJoinClause(joinClause, data);
outputFormatter.PrintIdentifier(joinClause.Source.Identifier);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.In);
outputFormatter.Space();
joinClause.Source.Expression.AcceptVisitor(this, data);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.On);
outputFormatter.Space();
@ -3102,15 +3111,6 @@ namespace ICSharpCode.NRefactory.PrettyPrinter @@ -3102,15 +3111,6 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
return null;
}
void VisitQueryExpressionFromOrJoinClause(QueryExpressionFromOrJoinClause clause, object data)
{
outputFormatter.PrintIdentifier(clause.Identifier);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.In);
outputFormatter.Space();
clause.InExpression.AcceptVisitor(this, data);
}
public override object TrackedVisitQueryExpressionLetClause(QueryExpressionLetClause letClause, object data)
{
outputFormatter.PrintToken(Tokens.Let);

44
src/Libraries/NRefactory/Project/Src/PrettyPrinter/VBNet/VBNetOutputVisitor.cs

@ -2977,18 +2977,8 @@ namespace ICSharpCode.NRefactory.PrettyPrinter @@ -2977,18 +2977,8 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
public override object TrackedVisitQueryExpression(QueryExpression queryExpression, object data)
{
if (queryExpression.IsQueryContinuation) {
queryExpression.FromClause.InExpression.AcceptVisitor(this, data);
}
outputFormatter.IndentationLevel++;
if (queryExpression.IsQueryContinuation) {
outputFormatter.PrintToken(Tokens.Into);
outputFormatter.PrintIdentifier(queryExpression.FromClause.Identifier);
} else {
queryExpression.FromClause.AcceptVisitor(this, data);
}
queryExpression.MiddleClauses.ForEach(PrintClause);
PrintClause(queryExpression.SelectOrGroupClause);
outputFormatter.IndentationLevel--;
return null;
}
@ -3006,7 +2996,16 @@ namespace ICSharpCode.NRefactory.PrettyPrinter @@ -3006,7 +2996,16 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
{
outputFormatter.PrintText("From");
outputFormatter.Space();
VisitQueryExpressionFromOrJoinClause(fromClause, data);
for (int i = 0; i < fromClause.Sources.Count; i++) {
CollectionRangeVariable clause = fromClause.Sources[i];
outputFormatter.PrintIdentifier(clause.Identifier);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.In);
outputFormatter.Space();
clause.Expression.AcceptVisitor(this, data);
if (i < fromClause.Sources.Count - 1)
outputFormatter.PrintToken(Tokens.Comma);
}
return null;
}
@ -3014,7 +3013,12 @@ namespace ICSharpCode.NRefactory.PrettyPrinter @@ -3014,7 +3013,12 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
{
outputFormatter.PrintText("Join");
outputFormatter.Space();
VisitQueryExpressionFromOrJoinClause(joinClause, data);
CollectionRangeVariable clause = joinClause.Source;
outputFormatter.PrintIdentifier(clause.Identifier);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.In);
outputFormatter.Space();
clause.Expression.AcceptVisitor(this, data);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.On);
outputFormatter.Space();
@ -3032,14 +3036,14 @@ namespace ICSharpCode.NRefactory.PrettyPrinter @@ -3032,14 +3036,14 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
return null;
}
void VisitQueryExpressionFromOrJoinClause(QueryExpressionFromOrJoinClause clause, object data)
{
outputFormatter.PrintIdentifier(clause.Identifier);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.In);
outputFormatter.Space();
clause.InExpression.AcceptVisitor(this, data);
}
// void VisitQueryExpressionFromOrJoinClause(QueryExpressionFromOrJoinClause clause, object data)
// {
// outputFormatter.PrintIdentifier(clause.Identifier);
// outputFormatter.Space();
// outputFormatter.PrintToken(Tokens.In);
// outputFormatter.Space();
// clause.InExpression.AcceptVisitor(this, data);
// }
public override object TrackedVisitQueryExpressionLetClause(QueryExpressionLetClause letClause, object data)
{

30
src/Libraries/NRefactory/Project/Src/Visitors/AbstractASTVisitor.cs

@ -164,6 +164,14 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -164,6 +164,14 @@ namespace ICSharpCode.NRefactory.Visitors {
return null;
}
public virtual object VisitCollectionRangeVariable(CollectionRangeVariable collectionRangeVariable, object data) {
Debug.Assert((collectionRangeVariable != null));
Debug.Assert((collectionRangeVariable.Expression != null));
Debug.Assert((collectionRangeVariable.Type != null));
collectionRangeVariable.Expression.AcceptVisitor(this, data);
return collectionRangeVariable.Type.AcceptVisitor(this, data);
}
public virtual object VisitCompilationUnit(CompilationUnit compilationUnit, object data) {
Debug.Assert((compilationUnit != null));
return compilationUnit.AcceptChildren(this, data);
@ -856,10 +864,10 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -856,10 +864,10 @@ namespace ICSharpCode.NRefactory.Visitors {
public virtual object VisitQueryExpressionAggregateClause(QueryExpressionAggregateClause queryExpressionAggregateClause, object data) {
Debug.Assert((queryExpressionAggregateClause != null));
Debug.Assert((queryExpressionAggregateClause.FromClause != null));
Debug.Assert((queryExpressionAggregateClause.Source != null));
Debug.Assert((queryExpressionAggregateClause.MiddleClauses != null));
Debug.Assert((queryExpressionAggregateClause.IntoVariables != null));
queryExpressionAggregateClause.FromClause.AcceptVisitor(this, data);
queryExpressionAggregateClause.Source.AcceptVisitor(this, data);
foreach (QueryExpressionClause o in queryExpressionAggregateClause.MiddleClauses) {
Debug.Assert(o != null);
o.AcceptVisitor(this, data);
@ -878,10 +886,12 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -878,10 +886,12 @@ namespace ICSharpCode.NRefactory.Visitors {
public virtual object VisitQueryExpressionFromClause(QueryExpressionFromClause queryExpressionFromClause, object data) {
Debug.Assert((queryExpressionFromClause != null));
Debug.Assert((queryExpressionFromClause.Type != null));
Debug.Assert((queryExpressionFromClause.InExpression != null));
queryExpressionFromClause.Type.AcceptVisitor(this, data);
return queryExpressionFromClause.InExpression.AcceptVisitor(this, data);
Debug.Assert((queryExpressionFromClause.Sources != null));
foreach (CollectionRangeVariable o in queryExpressionFromClause.Sources) {
Debug.Assert(o != null);
o.AcceptVisitor(this, data);
}
return null;
}
public virtual object VisitQueryExpressionGroupClause(QueryExpressionGroupClause queryExpressionGroupClause, object data) {
@ -926,14 +936,12 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -926,14 +936,12 @@ namespace ICSharpCode.NRefactory.Visitors {
public virtual object VisitQueryExpressionJoinClause(QueryExpressionJoinClause queryExpressionJoinClause, object data) {
Debug.Assert((queryExpressionJoinClause != null));
Debug.Assert((queryExpressionJoinClause.Type != null));
Debug.Assert((queryExpressionJoinClause.InExpression != null));
Debug.Assert((queryExpressionJoinClause.OnExpression != null));
Debug.Assert((queryExpressionJoinClause.EqualsExpression != null));
queryExpressionJoinClause.Type.AcceptVisitor(this, data);
queryExpressionJoinClause.InExpression.AcceptVisitor(this, data);
Debug.Assert((queryExpressionJoinClause.Source != null));
queryExpressionJoinClause.OnExpression.AcceptVisitor(this, data);
return queryExpressionJoinClause.EqualsExpression.AcceptVisitor(this, data);
queryExpressionJoinClause.EqualsExpression.AcceptVisitor(this, data);
return queryExpressionJoinClause.Source.AcceptVisitor(this, data);
}
public virtual object VisitQueryExpressionJoinConditionVB(QueryExpressionJoinConditionVB queryExpressionJoinConditionVB, object data) {

55
src/Libraries/NRefactory/Project/Src/Visitors/AbstractAstTransformer.cs

@ -287,6 +287,19 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -287,6 +287,19 @@ namespace ICSharpCode.NRefactory.Visitors {
return null;
}
public virtual object VisitCollectionRangeVariable(CollectionRangeVariable collectionRangeVariable, object data) {
Debug.Assert((collectionRangeVariable != null));
Debug.Assert((collectionRangeVariable.Expression != null));
Debug.Assert((collectionRangeVariable.Type != null));
nodeStack.Push(collectionRangeVariable.Expression);
collectionRangeVariable.Expression.AcceptVisitor(this, data);
collectionRangeVariable.Expression = ((Expression)(nodeStack.Pop()));
nodeStack.Push(collectionRangeVariable.Type);
collectionRangeVariable.Type.AcceptVisitor(this, data);
collectionRangeVariable.Type = ((TypeReference)(nodeStack.Pop()));
return null;
}
public virtual object VisitCompilationUnit(CompilationUnit compilationUnit, object data) {
Debug.Assert((compilationUnit != null));
for (int i = 0; i < compilationUnit.Children.Count; i++) {
@ -1573,12 +1586,12 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -1573,12 +1586,12 @@ namespace ICSharpCode.NRefactory.Visitors {
public virtual object VisitQueryExpressionAggregateClause(QueryExpressionAggregateClause queryExpressionAggregateClause, object data) {
Debug.Assert((queryExpressionAggregateClause != null));
Debug.Assert((queryExpressionAggregateClause.FromClause != null));
Debug.Assert((queryExpressionAggregateClause.Source != null));
Debug.Assert((queryExpressionAggregateClause.MiddleClauses != null));
Debug.Assert((queryExpressionAggregateClause.IntoVariables != null));
nodeStack.Push(queryExpressionAggregateClause.FromClause);
queryExpressionAggregateClause.FromClause.AcceptVisitor(this, data);
queryExpressionAggregateClause.FromClause = ((QueryExpressionFromClause)(nodeStack.Pop()));
nodeStack.Push(queryExpressionAggregateClause.Source);
queryExpressionAggregateClause.Source.AcceptVisitor(this, data);
queryExpressionAggregateClause.Source = ((CollectionRangeVariable)(nodeStack.Pop()));
for (int i = 0; i < queryExpressionAggregateClause.MiddleClauses.Count; i++) {
QueryExpressionClause o = queryExpressionAggregateClause.MiddleClauses[i];
Debug.Assert(o != null);
@ -1611,14 +1624,18 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -1611,14 +1624,18 @@ namespace ICSharpCode.NRefactory.Visitors {
public virtual object VisitQueryExpressionFromClause(QueryExpressionFromClause queryExpressionFromClause, object data) {
Debug.Assert((queryExpressionFromClause != null));
Debug.Assert((queryExpressionFromClause.Type != null));
Debug.Assert((queryExpressionFromClause.InExpression != null));
nodeStack.Push(queryExpressionFromClause.Type);
queryExpressionFromClause.Type.AcceptVisitor(this, data);
queryExpressionFromClause.Type = ((TypeReference)(nodeStack.Pop()));
nodeStack.Push(queryExpressionFromClause.InExpression);
queryExpressionFromClause.InExpression.AcceptVisitor(this, data);
queryExpressionFromClause.InExpression = ((Expression)(nodeStack.Pop()));
Debug.Assert((queryExpressionFromClause.Sources != null));
for (int i = 0; i < queryExpressionFromClause.Sources.Count; i++) {
CollectionRangeVariable o = queryExpressionFromClause.Sources[i];
Debug.Assert(o != null);
nodeStack.Push(o);
o.AcceptVisitor(this, data);
o = (CollectionRangeVariable)nodeStack.Pop();
if (o == null)
queryExpressionFromClause.Sources.RemoveAt(i--);
else
queryExpressionFromClause.Sources[i] = o;
}
return null;
}
@ -1699,22 +1716,18 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -1699,22 +1716,18 @@ namespace ICSharpCode.NRefactory.Visitors {
public virtual object VisitQueryExpressionJoinClause(QueryExpressionJoinClause queryExpressionJoinClause, object data) {
Debug.Assert((queryExpressionJoinClause != null));
Debug.Assert((queryExpressionJoinClause.Type != null));
Debug.Assert((queryExpressionJoinClause.InExpression != null));
Debug.Assert((queryExpressionJoinClause.OnExpression != null));
Debug.Assert((queryExpressionJoinClause.EqualsExpression != null));
nodeStack.Push(queryExpressionJoinClause.Type);
queryExpressionJoinClause.Type.AcceptVisitor(this, data);
queryExpressionJoinClause.Type = ((TypeReference)(nodeStack.Pop()));
nodeStack.Push(queryExpressionJoinClause.InExpression);
queryExpressionJoinClause.InExpression.AcceptVisitor(this, data);
queryExpressionJoinClause.InExpression = ((Expression)(nodeStack.Pop()));
Debug.Assert((queryExpressionJoinClause.Source != null));
nodeStack.Push(queryExpressionJoinClause.OnExpression);
queryExpressionJoinClause.OnExpression.AcceptVisitor(this, data);
queryExpressionJoinClause.OnExpression = ((Expression)(nodeStack.Pop()));
nodeStack.Push(queryExpressionJoinClause.EqualsExpression);
queryExpressionJoinClause.EqualsExpression.AcceptVisitor(this, data);
queryExpressionJoinClause.EqualsExpression = ((Expression)(nodeStack.Pop()));
nodeStack.Push(queryExpressionJoinClause.Source);
queryExpressionJoinClause.Source.AcceptVisitor(this, data);
queryExpressionJoinClause.Source = ((CollectionRangeVariable)(nodeStack.Pop()));
return null;
}
@ -1738,7 +1751,7 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -1738,7 +1751,7 @@ namespace ICSharpCode.NRefactory.Visitors {
Debug.Assert((queryExpressionJoinVBClause.Conditions != null));
nodeStack.Push(queryExpressionJoinVBClause.JoinVariable);
queryExpressionJoinVBClause.JoinVariable.AcceptVisitor(this, data);
queryExpressionJoinVBClause.JoinVariable = ((QueryExpressionFromClause)(nodeStack.Pop()));
queryExpressionJoinVBClause.JoinVariable = ((CollectionRangeVariable)(nodeStack.Pop()));
nodeStack.Push(queryExpressionJoinVBClause.SubJoin);
queryExpressionJoinVBClause.SubJoin.AcceptVisitor(this, data);
queryExpressionJoinVBClause.SubJoin = ((QueryExpressionJoinVBClause)(nodeStack.Pop()));

29
src/Libraries/NRefactory/Project/Src/Visitors/LookupTableVisitor.cs

@ -166,26 +166,29 @@ namespace ICSharpCode.NRefactory.Visitors @@ -166,26 +166,29 @@ namespace ICSharpCode.NRefactory.Visitors
public override object VisitQueryExpressionFromClause(QueryExpressionFromClause fromClause, object data)
{
QueryExpression parent = fromClause.Parent as QueryExpression;
AddVariable(fromClause.Type, fromClause.Identifier,
fromClause.StartLocation, CurrentEndLocation,
false, true, fromClause.InExpression, null, parent != null && parent.IsQueryContinuation);
foreach (CollectionRangeVariable variable in fromClause.Sources) {
AddVariable(variable.Type, variable.Identifier,
variable.StartLocation, CurrentEndLocation,
false, true, variable.Expression, null, parent != null && parent.IsQueryContinuation);
}
return base.VisitQueryExpressionFromClause(fromClause, data);
}
public override object VisitQueryExpressionJoinClause(QueryExpressionJoinClause joinClause, object data)
{
if (string.IsNullOrEmpty(joinClause.IntoIdentifier)) {
AddVariable(joinClause.Type, joinClause.Identifier,
joinClause.StartLocation, CurrentEndLocation,
false, true, joinClause.InExpression, null, false);
AddVariable(joinClause.Source.Type, joinClause.Source.Identifier,
joinClause.Source.StartLocation, CurrentEndLocation,
false, true, joinClause.Source.Expression, null, false);
} else {
AddVariable(joinClause.Type, joinClause.Identifier,
joinClause.StartLocation, joinClause.EndLocation,
false, true, joinClause.InExpression, null, false);
AddVariable(joinClause.Source.Type, joinClause.Source.Identifier,
joinClause.Source.StartLocation, joinClause.Source.EndLocation,
false, true, joinClause.Source.Expression, null, false);
AddVariable(joinClause.Type, joinClause.IntoIdentifier,
joinClause.StartLocation, CurrentEndLocation,
false, false, joinClause.InExpression, null, false);
AddVariable(joinClause.Source.Type, joinClause.IntoIdentifier,
joinClause.Source.StartLocation, CurrentEndLocation,
false, false, joinClause.Source.Expression, null, false);
}
return base.VisitQueryExpressionJoinClause(joinClause, data);
}
@ -210,7 +213,7 @@ namespace ICSharpCode.NRefactory.Visitors @@ -210,7 +213,7 @@ namespace ICSharpCode.NRefactory.Visitors
forNextStatement.EndLocation,
false, false,
forNextStatement.Start,
null,
null,
false);
base.VisitForNextStatement(forNextStatement, data);

11
src/Libraries/NRefactory/Project/Src/Visitors/NodeTrackingAstVisitor.cs

@ -157,6 +157,13 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -157,6 +157,13 @@ namespace ICSharpCode.NRefactory.Visitors {
return result;
}
public sealed override object VisitCollectionRangeVariable(CollectionRangeVariable collectionRangeVariable, object data) {
this.BeginVisit(collectionRangeVariable);
object result = this.TrackedVisitCollectionRangeVariable(collectionRangeVariable, data);
this.EndVisit(collectionRangeVariable);
return result;
}
public sealed override object VisitCompilationUnit(CompilationUnit compilationUnit, object data) {
this.BeginVisit(compilationUnit);
object result = this.TrackedVisitCompilationUnit(compilationUnit, data);
@ -964,6 +971,10 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -964,6 +971,10 @@ namespace ICSharpCode.NRefactory.Visitors {
return base.VisitCollectionInitializerExpression(collectionInitializerExpression, data);
}
public virtual object TrackedVisitCollectionRangeVariable(CollectionRangeVariable collectionRangeVariable, object data) {
return base.VisitCollectionRangeVariable(collectionRangeVariable, data);
}
public virtual object TrackedVisitCompilationUnit(CompilationUnit compilationUnit, object data) {
return base.VisitCompilationUnit(compilationUnit, data);
}

4
src/Libraries/NRefactory/Project/Src/Visitors/NotImplementedAstVisitor.cs

@ -90,6 +90,10 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -90,6 +90,10 @@ namespace ICSharpCode.NRefactory.Visitors {
throw new global::System.NotImplementedException("CollectionInitializerExpression");
}
public virtual object VisitCollectionRangeVariable(CollectionRangeVariable collectionRangeVariable, object data) {
throw new global::System.NotImplementedException("CollectionRangeVariable");
}
public virtual object VisitCompilationUnit(CompilationUnit compilationUnit, object data) {
throw new global::System.NotImplementedException("CompilationUnit");
}

36
src/Libraries/NRefactory/Test/Parser/Expressions/QueryExpressionTests.cs

@ -7,9 +7,11 @@ @@ -7,9 +7,11 @@
using System;
using System.IO;
using NUnit.Framework;
using ICSharpCode.NRefactory.Parser;
using System.Linq;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.NRefactory.Parser;
using NUnit.Framework;
namespace ICSharpCode.NRefactory.Tests.Ast
{
@ -22,8 +24,8 @@ namespace ICSharpCode.NRefactory.Tests.Ast @@ -22,8 +24,8 @@ namespace ICSharpCode.NRefactory.Tests.Ast
QueryExpression qe = ParseUtilCSharp.ParseExpression<QueryExpression>(
"from c in customers where c.City == \"London\" select c"
);
Assert.AreEqual("c", qe.FromClause.Identifier);
Assert.AreEqual("customers", ((IdentifierExpression)qe.FromClause.InExpression).Identifier);
Assert.AreEqual("c", qe.FromClause.Sources.First().Identifier);
Assert.AreEqual("customers", ((IdentifierExpression)qe.FromClause.Sources.First().Expression).Identifier);
Assert.AreEqual(1, qe.MiddleClauses.Count);
Assert.IsInstanceOf(typeof(QueryExpressionWhereClause), qe.MiddleClauses[0]);
QueryExpressionWhereClause wc = (QueryExpressionWhereClause)qe.MiddleClauses[0];
@ -37,9 +39,9 @@ namespace ICSharpCode.NRefactory.Tests.Ast @@ -37,9 +39,9 @@ namespace ICSharpCode.NRefactory.Tests.Ast
QueryExpression qe = ParseUtilCSharp.ParseExpression<QueryExpression>(
"from Customer c in customers select c"
);
Assert.AreEqual("c", qe.FromClause.Identifier);
Assert.AreEqual("Customer", qe.FromClause.Type.ToString());
Assert.AreEqual("customers", ((IdentifierExpression)qe.FromClause.InExpression).Identifier);
Assert.AreEqual("c", qe.FromClause.Sources.First().Identifier);
Assert.AreEqual("Customer", qe.FromClause.Sources.First().Type.ToString());
Assert.AreEqual("customers", ((IdentifierExpression)qe.FromClause.Sources.First().Expression).Identifier);
Assert.IsInstanceOf(typeof(QueryExpressionSelectClause), qe.SelectOrGroupClause);
}
@ -49,9 +51,9 @@ namespace ICSharpCode.NRefactory.Tests.Ast @@ -49,9 +51,9 @@ namespace ICSharpCode.NRefactory.Tests.Ast
QueryExpression qe = ParseUtilCSharp.ParseExpression<QueryExpression>(
"from int c in customers select c"
);
Assert.AreEqual("c", qe.FromClause.Identifier);
Assert.AreEqual("System.Int32", qe.FromClause.Type.Type);
Assert.AreEqual("customers", ((IdentifierExpression)qe.FromClause.InExpression).Identifier);
Assert.AreEqual("c", qe.FromClause.Sources.First().Identifier);
Assert.AreEqual("System.Int32", qe.FromClause.Sources.First().Type.Type);
Assert.AreEqual("customers", ((IdentifierExpression)qe.FromClause.Sources.First().Expression).Identifier);
Assert.IsInstanceOf(typeof(QueryExpressionSelectClause), qe.SelectOrGroupClause);
}
@ -62,9 +64,9 @@ namespace ICSharpCode.NRefactory.Tests.Ast @@ -62,9 +64,9 @@ namespace ICSharpCode.NRefactory.Tests.Ast
QueryExpression qe = ParseUtilCSharp.ParseExpression<QueryExpression>(
"from S<int[]>? c in customers select c"
);
Assert.AreEqual("c", qe.FromClause.Identifier);
Assert.AreEqual("System.Nullable<S<System.Int32[]>>", qe.FromClause.Type.ToString());
Assert.AreEqual("customers", ((IdentifierExpression)qe.FromClause.InExpression).Identifier);
Assert.AreEqual("c", qe.FromClause.Sources.First().Identifier);
Assert.AreEqual("System.Nullable<S<System.Int32[]>>", qe.FromClause.Sources.First().Type.ToString());
Assert.AreEqual("customers", ((IdentifierExpression)qe.FromClause.Sources.First().Expression).Identifier);
Assert.IsInstanceOf(typeof(QueryExpressionSelectClause), qe.SelectOrGroupClause);
}
@ -91,8 +93,8 @@ select new { c.Name, o.OrderID, o.Total }"); @@ -91,8 +93,8 @@ select new { c.Name, o.OrderID, o.Total }");
QueryExpression qe = ParseUtilCSharp.ParseExpression<QueryExpression>(
"from c in customers orderby c.Name select c"
);
Assert.AreEqual("c", qe.FromClause.Identifier);
Assert.AreEqual("customers", ((IdentifierExpression)qe.FromClause.InExpression).Identifier);
Assert.AreEqual("c", qe.FromClause.Sources.First().Identifier);
Assert.AreEqual("customers", ((IdentifierExpression)qe.FromClause.Sources.First().Expression).Identifier);
Assert.IsInstanceOf(typeof(QueryExpressionOrderClause), qe.MiddleClauses[0]);
Assert.IsInstanceOf(typeof(QueryExpressionSelectClause), qe.SelectOrGroupClause);
}
@ -103,8 +105,8 @@ select new { c.Name, o.OrderID, o.Total }"); @@ -103,8 +105,8 @@ select new { c.Name, o.OrderID, o.Total }");
QueryExpression qe = ParseUtilCSharp.ParseExpression<QueryExpression>(
"from c in customers orderby c.Name let x = c select x"
);
Assert.AreEqual("c", qe.FromClause.Identifier);
Assert.AreEqual("customers", ((IdentifierExpression)qe.FromClause.InExpression).Identifier);
Assert.AreEqual("c", qe.FromClause.Sources.First().Identifier);
Assert.AreEqual("customers", ((IdentifierExpression)qe.FromClause.Sources.First().Expression).Identifier);
Assert.IsInstanceOf(typeof(QueryExpressionOrderClause), qe.MiddleClauses[0]);
Assert.IsInstanceOf(typeof(QueryExpressionLetClause), qe.MiddleClauses[1]);
Assert.IsInstanceOf(typeof(QueryExpressionSelectClause), qe.SelectOrGroupClause);

381
src/Libraries/NRefactory/Test/Parser/Expressions/QueryExpressionVBTests.cs

@ -37,9 +37,13 @@ namespace ICSharpCode.NRefactory.Tests.Ast @@ -37,9 +37,13 @@ namespace ICSharpCode.NRefactory.Tests.Ast
var fromClause = expr.Clauses[0] as QueryExpressionFromClause;
var selectClause = expr.Clauses[1] as QueryExpressionSelectVBClause;
Assert.AreEqual("o", fromClause.Identifier);
Assert.IsTrue(fromClause.InExpression is MemberReferenceExpression);
var inExpr = fromClause.InExpression as MemberReferenceExpression;
Assert.AreEqual(1, fromClause.Sources.Count);
var var1 = fromClause.Sources.First();
Assert.AreEqual("o", var1.Identifier);
Assert.IsTrue(var1.Expression is MemberReferenceExpression);
var inExpr = var1.Expression as MemberReferenceExpression;
Assert.IsTrue(inExpr.MemberName == "Orders" && inExpr.TargetObject is IdentifierExpression && (inExpr.TargetObject as IdentifierExpression).Identifier == "db");
Assert.AreEqual(1, selectClause.Variables.Count);
@ -62,9 +66,13 @@ namespace ICSharpCode.NRefactory.Tests.Ast @@ -62,9 +66,13 @@ namespace ICSharpCode.NRefactory.Tests.Ast
var skipClause = expr.Clauses[2] as QueryExpressionPartitionVBClause;
var takeClause = expr.Clauses[3] as QueryExpressionPartitionVBClause;
Assert.AreEqual("o", fromClause.Identifier);
Assert.IsTrue(fromClause.InExpression is MemberReferenceExpression);
var inExpr = fromClause.InExpression as MemberReferenceExpression;
Assert.AreEqual(1, fromClause.Sources.Count);
var var1 = fromClause.Sources.First();
Assert.AreEqual("o", var1.Identifier);
Assert.IsTrue(var1.Expression is MemberReferenceExpression);
var inExpr = var1.Expression as MemberReferenceExpression;
Assert.IsTrue(inExpr.MemberName == "Orders" && inExpr.TargetObject is IdentifierExpression && (inExpr.TargetObject as IdentifierExpression).Identifier == "db");
Assert.AreEqual(1, selectClause.Variables.Count);
@ -87,16 +95,20 @@ namespace ICSharpCode.NRefactory.Tests.Ast @@ -87,16 +95,20 @@ namespace ICSharpCode.NRefactory.Tests.Ast
}
[Test]
public void MultipleValuesSelect()
public void MultipleValuesSelectTest()
{
RunTest(@"From i In list Select i, x2 = i^2",
2, expr => {
var fromClause = expr.Clauses[0] as QueryExpressionFromClause;
var selectClause = expr.Clauses[1] as QueryExpressionSelectVBClause;
Assert.AreEqual("i", fromClause.Identifier);
Assert.IsTrue(fromClause.InExpression is IdentifierExpression);
Assert.IsTrue((fromClause.InExpression as IdentifierExpression).Identifier == "list");
Assert.AreEqual(1, fromClause.Sources.Count);
var var1 = fromClause.Sources.First();
Assert.AreEqual("i", var1.Identifier);
Assert.IsTrue(var1.Expression is IdentifierExpression);
Assert.IsTrue((var1.Expression as IdentifierExpression).Identifier == "list");
Assert.AreEqual(2, selectClause.Variables.Count);
@ -129,9 +141,13 @@ namespace ICSharpCode.NRefactory.Tests.Ast @@ -129,9 +141,13 @@ namespace ICSharpCode.NRefactory.Tests.Ast
var groupClause = expr.Clauses[1] as QueryExpressionGroupVBClause;
var selectClause = expr.Clauses[2] as QueryExpressionSelectVBClause;
Assert.AreEqual("p", fromClause.Identifier);
Assert.IsTrue(fromClause.InExpression is IdentifierExpression);
Assert.IsTrue((fromClause.InExpression as IdentifierExpression).Identifier == "products");
Assert.AreEqual(1, fromClause.Sources.Count);
var fromVar1 = fromClause.Sources.First();
Assert.AreEqual("p", fromVar1.Identifier);
Assert.IsTrue(fromVar1.Expression is IdentifierExpression);
Assert.IsTrue((fromVar1.Expression as IdentifierExpression).Identifier == "products");
Assert.AreEqual(1, groupClause.GroupVariables.Count);
Assert.AreEqual(1, groupClause.ByVariables.Count);
@ -168,5 +184,344 @@ namespace ICSharpCode.NRefactory.Tests.Ast @@ -168,5 +184,344 @@ namespace ICSharpCode.NRefactory.Tests.Ast
Select Category, AveragePrice = Group.Average(Function(p) p.UnitPrice)", 3, constraint,
typeof(QueryExpressionFromClause), typeof(QueryExpressionGroupVBClause), typeof(QueryExpressionSelectVBClause));
}
[Test]
public void LetTest()
{
Action<QueryExpressionVB> constraint = expr => {
var fromClause = expr.Clauses[0] as QueryExpressionFromClause;
var groupClause = expr.Clauses[1] as QueryExpressionGroupVBClause;
var letClause = expr.Clauses[2] as QueryExpressionLetVBClause;
var selectClause = expr.Clauses[3] as QueryExpressionSelectVBClause;
// From
Assert.AreEqual(1, fromClause.Sources.Count);
var fromVar1 = fromClause.Sources.First();
Assert.AreEqual("p", fromVar1.Identifier);
Assert.IsTrue(fromVar1.Expression is IdentifierExpression);
Assert.IsTrue((fromVar1.Expression as IdentifierExpression).Identifier == "products");
// Group By Into
Assert.AreEqual(1, groupClause.GroupVariables.Count);
Assert.AreEqual(1, groupClause.ByVariables.Count);
Assert.AreEqual(1, groupClause.IntoVariables.Count);
var gv = groupClause.GroupVariables.First();
var bv = groupClause.ByVariables.First();
var iv = groupClause.IntoVariables.First();
Assert.IsTrue(gv.Expression is IdentifierExpression && (gv.Expression as IdentifierExpression).Identifier == "p");
Assert.IsTrue(bv.Expression is MemberReferenceExpression &&
(bv.Expression as MemberReferenceExpression).MemberName == "Category");
Assert.IsTrue((bv.Expression as MemberReferenceExpression).TargetObject is IdentifierExpression &&
((bv.Expression as MemberReferenceExpression).TargetObject as IdentifierExpression).Identifier == "p");
Assert.IsTrue(iv.Expression is IdentifierExpression &&
(iv.Expression as IdentifierExpression).Identifier == "Group");
// Let
Assert.AreEqual(1, letClause.Variables.Count);
var letVariable = letClause.Variables.First();
Assert.AreEqual("minPrice", letVariable.Identifier);
Assert.IsTrue(letVariable.Expression is InvocationExpression &&
(letVariable.Expression as InvocationExpression).TargetObject is MemberReferenceExpression &&
((letVariable.Expression as InvocationExpression).TargetObject as MemberReferenceExpression).MemberName == "Min" &&
((letVariable.Expression as InvocationExpression).TargetObject as MemberReferenceExpression).TargetObject is IdentifierExpression &&
(((letVariable.Expression as InvocationExpression).TargetObject as MemberReferenceExpression).TargetObject as IdentifierExpression).Identifier == "Group");
// Select
Assert.AreEqual(2, selectClause.Variables.Count);
var var1 = selectClause.Variables.First();
var var2 = selectClause.Variables.Skip(1).First();
Assert.IsTrue(var1.Expression is IdentifierExpression &&
(var1.Expression as IdentifierExpression).Identifier == "Category");
Assert.IsTrue(var2.Expression is InvocationExpression &&
(var2.Expression as InvocationExpression).TargetObject is MemberReferenceExpression &&
((var2.Expression as InvocationExpression).TargetObject as MemberReferenceExpression).MemberName == "Where" &&
((var2.Expression as InvocationExpression).TargetObject as MemberReferenceExpression).TargetObject is IdentifierExpression &&
(((var2.Expression as InvocationExpression).TargetObject as MemberReferenceExpression).TargetObject as IdentifierExpression).Identifier == "Group");
};
RunTest(@"From p In products _
Group p By p.Category Into Group _
Let minPrice = Group.Min(Function(p) p.UnitPrice) _
Select Category, CheapestProducts = Group.Where(Function(p) p.UnitPrice = minPrice)", 4, constraint,
typeof(QueryExpressionFromClause), typeof(QueryExpressionGroupVBClause), typeof(QueryExpressionLetVBClause), typeof(QueryExpressionSelectVBClause));
}
[Test]
public void CrossJoinTest()
{
Action<QueryExpressionVB> constraint = expr => {
var fromClause = expr.Clauses[0] as QueryExpressionFromClause;
var joinClause = expr.Clauses[1] as QueryExpressionJoinVBClause;
var selectClause = expr.Clauses[2] as QueryExpressionSelectVBClause;
// From
Assert.AreEqual(1, fromClause.Sources.Count);
var fromVar1 = fromClause.Sources.First();
Assert.AreEqual("c", fromVar1.Identifier);
Assert.IsTrue(fromVar1.Expression is IdentifierExpression);
Assert.IsTrue((fromVar1.Expression as IdentifierExpression).Identifier == "categories");
// Join In On Equals
var inClause = joinClause.JoinVariable as CollectionRangeVariable;
Assert.AreEqual("p", inClause.Identifier);
Assert.IsTrue(inClause.Expression is IdentifierExpression &&
(inClause.Expression as IdentifierExpression).Identifier == "products");
Assert.IsTrue(joinClause.SubJoin.IsNull);
Assert.AreEqual(1, joinClause.Conditions.Count);
var condition1 = joinClause.Conditions.First();
Assert.IsTrue(condition1.LeftSide is IdentifierExpression && (condition1.LeftSide as IdentifierExpression).Identifier == "c");
Assert.IsTrue(condition1.RightSide is MemberReferenceExpression &&
((condition1.RightSide as MemberReferenceExpression).TargetObject is IdentifierExpression) &&
((condition1.RightSide as MemberReferenceExpression).TargetObject as IdentifierExpression).Identifier == "p" &&
(condition1.RightSide as MemberReferenceExpression).MemberName == "Category");
// Select
Assert.AreEqual(2, selectClause.Variables.Count);
var var1 = selectClause.Variables.First();
var var2 = selectClause.Variables.Skip(1).First();
Assert.AreEqual("Category", var1.Identifier);
Assert.IsEmpty(var2.Identifier);
Assert.IsTrue(var1.Expression is IdentifierExpression &&
(var1.Expression as IdentifierExpression).Identifier == "c");
Assert.IsTrue(var2.Expression is MemberReferenceExpression &&
(var2.Expression as MemberReferenceExpression).MemberName == "ProductName" &&
(var2.Expression as MemberReferenceExpression).TargetObject is IdentifierExpression &&
((var2.Expression as MemberReferenceExpression).TargetObject as IdentifierExpression).Identifier == "p");
};
RunTest(@"From c In categories _
Join p In products On c Equals p.Category _
Select Category = c, p.ProductName", 3, constraint,
typeof(QueryExpressionFromClause), typeof(QueryExpressionJoinVBClause), typeof(QueryExpressionSelectVBClause));
}
[Test]
public void OrderByTest()
{
Action<QueryExpressionVB> constraint = expr => {
var fromClause = expr.Clauses[0] as QueryExpressionFromClause;
var orderClause = expr.Clauses[1] as QueryExpressionOrderClause;
// From
Assert.AreEqual(1, fromClause.Sources.Count);
var var1 = fromClause.Sources.First();
Assert.AreEqual("i", var1.Identifier);
Assert.IsTrue(var1.Expression is IdentifierExpression);
Assert.IsTrue((var1.Expression as IdentifierExpression).Identifier == "list");
// Order By
Assert.AreEqual(1, orderClause.Orderings.Count);
var ordering1 = orderClause.Orderings.First();
Assert.IsTrue(ordering1.Criteria is IdentifierExpression &&
(ordering1.Criteria as IdentifierExpression).Identifier == "i");
Assert.AreEqual(QueryExpressionOrderingDirection.None, ordering1.Direction);
};
RunTest(@"From i In list Order By i", 2, constraint, typeof(QueryExpressionFromClause), typeof(QueryExpressionOrderClause));
}
[Test]
public void OrderByTest2()
{
Action<QueryExpressionVB> constraint = expr => {
var fromClause = expr.Clauses[0] as QueryExpressionFromClause;
var orderClause = expr.Clauses[1] as QueryExpressionOrderClause;
// From
Assert.AreEqual(1, fromClause.Sources.Count);
var var1 = fromClause.Sources.First();
Assert.AreEqual("i", var1.Identifier);
Assert.IsTrue(var1.Expression is IdentifierExpression);
Assert.IsTrue((var1.Expression as IdentifierExpression).Identifier == "list");
// Order By
Assert.AreEqual(1, orderClause.Orderings.Count);
var ordering1 = orderClause.Orderings.First();
Assert.IsTrue(ordering1.Criteria is IdentifierExpression &&
(ordering1.Criteria as IdentifierExpression).Identifier == "i");
Assert.AreEqual(QueryExpressionOrderingDirection.Ascending, ordering1.Direction);
};
RunTest(@"From i In list Order By i Ascending", 2, constraint, typeof(QueryExpressionFromClause), typeof(QueryExpressionOrderClause));
}
[Test]
public void OrderByTest3()
{
Action<QueryExpressionVB> constraint = expr => {
var fromClause = expr.Clauses[0] as QueryExpressionFromClause;
var orderClause = expr.Clauses[1] as QueryExpressionOrderClause;
// From
Assert.AreEqual(1, fromClause.Sources.Count);
var var1 = fromClause.Sources.First();
Assert.AreEqual("i", var1.Identifier);
Assert.IsTrue(var1.Expression is IdentifierExpression);
Assert.IsTrue((var1.Expression as IdentifierExpression).Identifier == "list");
// Order By
Assert.AreEqual(1, orderClause.Orderings.Count);
var ordering1 = orderClause.Orderings.First();
Assert.IsTrue(ordering1.Criteria is IdentifierExpression &&
(ordering1.Criteria as IdentifierExpression).Identifier == "i");
Assert.AreEqual(QueryExpressionOrderingDirection.Descending, ordering1.Direction);
};
RunTest(@"From i In list Order By i Descending", 2, constraint, typeof(QueryExpressionFromClause), typeof(QueryExpressionOrderClause));
}
[Test]
public void OrderByThenByTest()
{
Action<QueryExpressionVB> constraint = expr => {
var fromClause = expr.Clauses[0] as QueryExpressionFromClause;
var orderClause = expr.Clauses[1] as QueryExpressionOrderClause;
// From
Assert.AreEqual(1, fromClause.Sources.Count);
var var1 = fromClause.Sources.First();
Assert.AreEqual("d", var1.Identifier);
Assert.IsTrue(var1.Expression is IdentifierExpression);
Assert.IsTrue((var1.Expression as IdentifierExpression).Identifier == "digits");
// Order By
Assert.AreEqual(2, orderClause.Orderings.Count);
var ordering1 = orderClause.Orderings.First();
var ordering2 = orderClause.Orderings.Skip(1).First();
Assert.IsTrue(ordering1.Criteria is MemberReferenceExpression);
Assert.IsTrue((ordering1.Criteria as MemberReferenceExpression).MemberName == "Length");
Assert.IsTrue((ordering1.Criteria as MemberReferenceExpression).TargetObject is IdentifierExpression);
Assert.IsTrue(((ordering1.Criteria as MemberReferenceExpression).TargetObject as IdentifierExpression).Identifier == "d");
Assert.IsTrue(ordering2.Criteria is IdentifierExpression &&
(ordering2.Criteria as IdentifierExpression).Identifier == "d");
Assert.AreEqual(QueryExpressionOrderingDirection.None, ordering1.Direction);
Assert.AreEqual(QueryExpressionOrderingDirection.None, ordering2.Direction);
};
RunTest(@"From d In digits _
Order By d.Length, d", 2, constraint,
typeof(QueryExpressionFromClause), typeof(QueryExpressionOrderClause));
}
[Test]
public void DistinctTest()
{
Action<QueryExpressionVB> constraint = expr => {
var fromClause = expr.Clauses[0] as QueryExpressionFromClause;
// From
Assert.AreEqual(1, fromClause.Sources.Count);
var var1 = fromClause.Sources.First();
Assert.AreEqual("d", var1.Identifier);
Assert.IsTrue(var1.Expression is IdentifierExpression);
Assert.IsTrue((var1.Expression as IdentifierExpression).Identifier == "digits");
};
RunTest(@"From d In digits Distinct", 2, constraint,
typeof(QueryExpressionFromClause), typeof(QueryExpressionDistinctClause));
}
[Test]
public void GroupJoinTest()
{
}
[Test]
public void SelectManyTest()
{
Action<QueryExpressionVB> constraint = expr => {
var fromClause = expr.Clauses[0] as QueryExpressionFromClause;
var whereClause = expr.Clauses[1] as QueryExpressionWhereClause;
var selectClause = expr.Clauses[2] as QueryExpressionSelectVBClause;
// From
Assert.AreEqual(2, fromClause.Sources.Count);
var fromVar1 = fromClause.Sources.First();
var fromVar2 = fromClause.Sources.Skip(1).First();
Assert.AreEqual("c", fromVar1.Identifier);
Assert.IsTrue(fromVar1.Expression is IdentifierExpression);
Assert.IsTrue((fromVar1.Expression as IdentifierExpression).Identifier == "customers");
Assert.AreEqual("o", fromVar2.Identifier);
Assert.IsTrue(fromVar2.Expression is MemberReferenceExpression);
Assert.IsTrue((fromVar2.Expression as MemberReferenceExpression).MemberName == "Orders");
Assert.IsTrue((fromVar2.Expression as MemberReferenceExpression).TargetObject is IdentifierExpression);
Assert.IsTrue(((fromVar2.Expression as MemberReferenceExpression).TargetObject as IdentifierExpression).Identifier == "c");
// Where
Assert.IsTrue(whereClause.Condition is BinaryOperatorExpression);
Assert.IsTrue((whereClause.Condition as BinaryOperatorExpression).Op == BinaryOperatorType.LessThan);
Assert.IsTrue((whereClause.Condition as BinaryOperatorExpression).Left is MemberReferenceExpression);
Assert.IsTrue(((whereClause.Condition as BinaryOperatorExpression).Left as MemberReferenceExpression).MemberName == "Total");
Assert.IsTrue(((whereClause.Condition as BinaryOperatorExpression).Left as MemberReferenceExpression).TargetObject is IdentifierExpression);
Assert.IsTrue((((whereClause.Condition as BinaryOperatorExpression).Left as MemberReferenceExpression).TargetObject as IdentifierExpression).Identifier == "o");
Assert.IsTrue((whereClause.Condition as BinaryOperatorExpression).Right is PrimitiveExpression);
Assert.IsTrue((double)((whereClause.Condition as BinaryOperatorExpression).Right as PrimitiveExpression).Value == 500.0);
// Select
foreach (var v in selectClause.Variables) {
Assert.IsEmpty(v.Identifier);
}
var var1 = selectClause.Variables.First();
var var2 = selectClause.Variables.Skip(1).First();
var var3 = selectClause.Variables.Skip(2).First();
Assert.IsTrue(var1.Expression is MemberReferenceExpression);
Assert.IsTrue((var1.Expression as MemberReferenceExpression).MemberName == "CustomerID" &&
(var1.Expression as MemberReferenceExpression).TargetObject is IdentifierExpression &&
((var1.Expression as MemberReferenceExpression).TargetObject as IdentifierExpression).Identifier == "c");
CheckMemberReferenceExpression("CustomerID", "c");
};
RunTest(@"From c In customers, o In c.Orders _
Where o.Total < 500.0 _
Select c.CustomerID, o.OrderID, o.Total", 3, constraint, typeof(QueryExpressionFromClause), typeof(QueryExpressionWhereClause), typeof(QueryExpressionSelectVBClause));
}
void CheckMemberReferenceExpression(string member, string target)
{
}
}
}

4
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/ResolveVisitor.cs

@ -549,7 +549,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -549,7 +549,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
if (selectClause != null) {
// Fake a call to 'Select'
var fakeInvocation = new InvocationExpression(new MemberReferenceExpression(
queryExpression.FromClause.InExpression, "Select"));
queryExpression.FromClause.Sources.First().Expression, "Select"));
var selector = new LambdaExpression();
selector.Parameters.Add(new ParameterDeclarationExpression(null, "__rangeVariable"));
@ -562,7 +562,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -562,7 +562,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
} else if (groupClause != null) {
// Fake a call to 'GroupBy'
var fakeInvocation = new InvocationExpression(new MemberReferenceExpression(
queryExpression.FromClause.InExpression, "GroupBy"));
queryExpression.FromClause.Sources.First().Expression, "GroupBy"));
var keySelector = new LambdaExpression();
keySelector.Parameters.Add(new ParameterDeclarationExpression(null, "__rangeVariable"));

Loading…
Cancel
Save