Browse Source

finished AST generation for VB.NET query expressions

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@3403 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Markus Palme 17 years ago
parent
commit
585c7519f4
  1. 59
      src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Expressions.cs
  2. 12
      src/Libraries/NRefactory/Project/Src/Ast/Enums.cs
  3. 495
      src/Libraries/NRefactory/Project/Src/Ast/Generated.cs
  4. 20
      src/Libraries/NRefactory/Project/Src/IAstVisitor.cs
  5. 1434
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/Parser.cs
  6. 313
      src/Libraries/NRefactory/Project/Src/Parser/VBNet/VBNET.ATG
  7. 110
      src/Libraries/NRefactory/Project/Src/Visitors/AbstractASTVisitor.cs
  8. 194
      src/Libraries/NRefactory/Project/Src/Visitors/AbstractAstTransformer.cs
  9. 110
      src/Libraries/NRefactory/Project/Src/Visitors/NodeTrackingAstVisitor.cs
  10. 3
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs

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

@ -17,6 +17,7 @@ namespace NRefactoryASTGenerator.Ast @@ -17,6 +17,7 @@ namespace NRefactoryASTGenerator.Ast
class PrimitiveExpression : Expression {}
enum ParameterModifiers { In }
enum QueryExpressionPartitionType { }
class ParameterDeclarationExpression : Expression {
List<AttributeSection> attributes;
@ -259,11 +260,6 @@ namespace NRefactoryASTGenerator.Ast @@ -259,11 +260,6 @@ namespace NRefactoryASTGenerator.Ast
/// </remarks>
QueryExpressionFromClause fromClause;
/// <remarks>
/// VB.NET only.
/// </remarks>
QueryExpressionAggregateClause aggregateClause;
List<QueryExpressionClause> middleClauses;
/// <remarks>
@ -299,6 +295,19 @@ namespace NRefactoryASTGenerator.Ast @@ -299,6 +295,19 @@ namespace NRefactoryASTGenerator.Ast
[ImplementNullable(NullableImplementation.Shadow)]
class QueryExpressionFromClause : QueryExpressionFromOrJoinClause { }
class QueryExpressionAggregateClause : QueryExpressionClause {
QueryExpressionFromClause fromClause;
List<QueryExpressionClause> middleClauses;
List<ExpressionRangeVariable> intoVariables;
}
[ImplementNullable]
class ExpressionRangeVariable : AbstractNode, INullable {
string identifier;
Expression expression;
TypeReference type;
}
class QueryExpressionJoinClause : QueryExpressionFromOrJoinClause {
Expression onExpression;
@ -307,6 +316,23 @@ namespace NRefactoryASTGenerator.Ast @@ -307,6 +316,23 @@ namespace NRefactoryASTGenerator.Ast
string intoIdentifier;
}
[ImplementNullable(NullableImplementation.Shadow)]
class QueryExpressionJoinVBClause : QueryExpressionClause {
QueryExpressionFromClause joinVariable;
QueryExpressionJoinVBClause subJoin;
List<QueryExpressionJoinConditionVB> conditions;
}
class QueryExpressionPartitionVBClause : QueryExpressionClause {
Expression expression;
QueryExpressionPartitionType partitionType;
}
class QueryExpressionJoinConditionVB : AbstractNode {
Expression leftSide;
Expression rightSide;
}
class QueryExpressionOrderClause : QueryExpressionClause {
List<QueryExpressionOrdering> orderings;
}
@ -323,12 +349,35 @@ namespace NRefactoryASTGenerator.Ast @@ -323,12 +349,35 @@ namespace NRefactoryASTGenerator.Ast
class QueryExpressionSelectClause : QueryExpressionClause {
Expression projection;
}
class QueryExpressionSelectVBClause : QueryExpressionClause {
List<ExpressionRangeVariable> variables;
}
class QueryExpressionLetVBClause : QueryExpressionClause {
List<ExpressionRangeVariable> variables;
}
class QueryExpressionDistinctClause : QueryExpressionClause {
}
class QueryExpressionGroupClause : QueryExpressionClause {
Expression projection;
Expression groupBy;
}
class QueryExpressionGroupVBClause : QueryExpressionClause {
List<ExpressionRangeVariable> groupVariables;
List<ExpressionRangeVariable> byVariables;
List<ExpressionRangeVariable> intoVariables;
}
class QueryExpressionGroupJoinVBClause : QueryExpressionClause {
QueryExpressionJoinVBClause joinClause;
List<ExpressionRangeVariable> intoVariables;
}
[ImplementNullable(NullableImplementation.Shadow)]
class QueryExpressionIntoClause : QueryExpressionClause {
[QuestionMarkDefault]

12
src/Libraries/NRefactory/Project/Src/Ast/Enums.cs

@ -375,4 +375,16 @@ namespace ICSharpCode.NRefactory.Ast @@ -375,4 +375,16 @@ namespace ICSharpCode.NRefactory.Ast
Ascending,
Descending
}
/// <summary>
/// Specifies the partition type for a VB.NET
/// query expression.
/// </summary>
public enum QueryExpressionPartitionType
{
Take,
TakeWhile,
Skip,
SkipWhile
}
}

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

@ -1573,12 +1573,6 @@ namespace ICSharpCode.NRefactory.Ast { @@ -1573,12 +1573,6 @@ namespace ICSharpCode.NRefactory.Ast {
initializer = Expression.Null;
}
public bool HasRemoveRegion {
get {
return !removeRegion.IsNull;
}
}
public bool HasAddRegion {
get {
return !addRegion.IsNull;
@ -1591,6 +1585,12 @@ namespace ICSharpCode.NRefactory.Ast { @@ -1591,6 +1585,12 @@ namespace ICSharpCode.NRefactory.Ast {
}
}
public bool HasRemoveRegion {
get {
return !removeRegion.IsNull;
}
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
return visitor.VisitEventDeclaration(this, data);
}
@ -1716,6 +1716,88 @@ namespace ICSharpCode.NRefactory.Ast { @@ -1716,6 +1716,88 @@ namespace ICSharpCode.NRefactory.Ast {
}
}
public class ExpressionRangeVariable : 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;
}
}
public ExpressionRangeVariable() {
identifier = "";
expression = Expression.Null;
type = TypeReference.Null;
}
public virtual bool IsNull {
get {
return false;
}
}
public static ExpressionRangeVariable Null {
get {
return NullExpressionRangeVariable.Instance;
}
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
return visitor.VisitExpressionRangeVariable(this, data);
}
public override string ToString() {
return string.Format("[ExpressionRangeVariable Identifier={0} Expression={1} Type={2}]", Identifier, Expression, Type);
}
}
internal sealed class NullExpressionRangeVariable : ExpressionRangeVariable {
internal static NullExpressionRangeVariable Instance = new NullExpressionRangeVariable();
public override bool IsNull {
get {
return true;
}
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
return null;
}
public override string ToString() {
return "[NullExpressionRangeVariable]";
}
}
public class ExpressionStatement : Statement {
Expression expression;
@ -2205,11 +2287,12 @@ namespace ICSharpCode.NRefactory.Ast { @@ -2205,11 +2287,12 @@ namespace ICSharpCode.NRefactory.Ast {
elseIfSections = new List<ElseIfSection>();
}
public bool HasElseIfSections {
get {
return elseIfSections.Count > 0;
public IfElseStatement(Expression condition, Statement trueStatement)
: this(condition) {
this.trueStatement.Add(Statement.CheckNull(trueStatement));
if (trueStatement != null) trueStatement.Parent = this;
}
}
public bool HasElseStatements {
get {
@ -2217,12 +2300,11 @@ namespace ICSharpCode.NRefactory.Ast { @@ -2217,12 +2300,11 @@ namespace ICSharpCode.NRefactory.Ast {
}
}
public IfElseStatement(Expression condition, Statement trueStatement)
: this(condition) {
this.trueStatement.Add(Statement.CheckNull(trueStatement));
if (trueStatement != null) trueStatement.Parent = this;
public bool HasElseIfSections {
get {
return elseIfSections.Count > 0;
}
}
public IfElseStatement(Expression condition, Statement trueStatement, Statement falseStatement)
@ -2346,9 +2428,9 @@ namespace ICSharpCode.NRefactory.Ast { @@ -2346,9 +2428,9 @@ namespace ICSharpCode.NRefactory.Ast {
setRegion = PropertySetRegion.Null;
}
public bool IsWriteOnly {
public bool IsReadOnly {
get {
return !HasGetRegion && HasSetRegion;
return HasGetRegion && !HasSetRegion;
}
}
@ -2364,9 +2446,9 @@ namespace ICSharpCode.NRefactory.Ast { @@ -2364,9 +2446,9 @@ namespace ICSharpCode.NRefactory.Ast {
}
}
public bool IsReadOnly {
public bool IsWriteOnly {
get {
return HasGetRegion && !HasSetRegion;
return !HasGetRegion && HasSetRegion;
}
}
@ -3272,12 +3354,6 @@ public Location ExtendedEndLocation { get; set; } @@ -3272,12 +3354,6 @@ public Location ExtendedEndLocation { get; set; }
}
}
public bool IsWriteOnly {
get {
return !HasGetRegion && HasSetRegion;
}
}
public bool HasSetRegion {
get {
return !setRegion.IsNull;
@ -3302,6 +3378,12 @@ public Location ExtendedEndLocation { get; set; } @@ -3302,6 +3378,12 @@ public Location ExtendedEndLocation { get; set; }
}
}
public bool IsWriteOnly {
get {
return !HasGetRegion && HasSetRegion;
}
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
return visitor.VisitPropertyDeclaration(this, data);
}
@ -3530,6 +3612,58 @@ public Location ExtendedEndLocation { get; set; } @@ -3530,6 +3612,58 @@ public Location ExtendedEndLocation { get; set; }
}
}
public class QueryExpressionAggregateClause : QueryExpressionClause {
QueryExpressionFromClause fromClause;
List<QueryExpressionClause> middleClauses;
List<ExpressionRangeVariable> intoVariables;
public QueryExpressionFromClause FromClause {
get {
return fromClause;
}
set {
fromClause = value ?? QueryExpressionFromClause.Null;
if (!fromClause.IsNull) fromClause.Parent = this;
}
}
public List<QueryExpressionClause> MiddleClauses {
get {
return middleClauses;
}
set {
middleClauses = value ?? new List<QueryExpressionClause>();
}
}
public List<ExpressionRangeVariable> IntoVariables {
get {
return intoVariables;
}
set {
intoVariables = value ?? new List<ExpressionRangeVariable>();
}
}
public QueryExpressionAggregateClause() {
fromClause = QueryExpressionFromClause.Null;
middleClauses = new List<QueryExpressionClause>();
intoVariables = new List<ExpressionRangeVariable>();
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
return visitor.VisitQueryExpressionAggregateClause(this, data);
}
public override string ToString() {
return string.Format("[QueryExpressionAggregateClause FromClause={0} MiddleClauses={1} IntoVariables={2" +
"}]", FromClause, GetCollectionString(MiddleClauses), GetCollectionString(IntoVariables));
}
}
public abstract class QueryExpressionClause : AbstractNode, INullable {
public virtual bool IsNull {
@ -3564,6 +3698,20 @@ public Location ExtendedEndLocation { get; set; } @@ -3564,6 +3698,20 @@ public Location ExtendedEndLocation { get; set; }
}
}
public class QueryExpressionDistinctClause : QueryExpressionClause {
public QueryExpressionDistinctClause() {
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
return visitor.VisitQueryExpressionDistinctClause(this, data);
}
public override string ToString() {
return "[QueryExpressionDistinctClause]";
}
}
public class QueryExpressionFromClause : QueryExpressionFromOrJoinClause {
public QueryExpressionFromClause() {
@ -3680,6 +3828,96 @@ public Location ExtendedEndLocation { get; set; } @@ -3680,6 +3828,96 @@ public Location ExtendedEndLocation { get; set; }
}
}
public class QueryExpressionGroupJoinVBClause : QueryExpressionClause {
QueryExpressionJoinVBClause joinClause;
List<ExpressionRangeVariable> intoVariables;
public QueryExpressionJoinVBClause JoinClause {
get {
return joinClause;
}
set {
joinClause = value ?? QueryExpressionJoinVBClause.Null;
if (!joinClause.IsNull) joinClause.Parent = this;
}
}
public List<ExpressionRangeVariable> IntoVariables {
get {
return intoVariables;
}
set {
intoVariables = value ?? new List<ExpressionRangeVariable>();
}
}
public QueryExpressionGroupJoinVBClause() {
joinClause = QueryExpressionJoinVBClause.Null;
intoVariables = new List<ExpressionRangeVariable>();
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
return visitor.VisitQueryExpressionGroupJoinVBClause(this, data);
}
public override string ToString() {
return string.Format("[QueryExpressionGroupJoinVBClause JoinClause={0} IntoVariables={1}]", JoinClause, GetCollectionString(IntoVariables));
}
}
public class QueryExpressionGroupVBClause : QueryExpressionClause {
List<ExpressionRangeVariable> groupVariables;
List<ExpressionRangeVariable> byVariables;
List<ExpressionRangeVariable> intoVariables;
public List<ExpressionRangeVariable> GroupVariables {
get {
return groupVariables;
}
set {
groupVariables = value ?? new List<ExpressionRangeVariable>();
}
}
public List<ExpressionRangeVariable> ByVariables {
get {
return byVariables;
}
set {
byVariables = value ?? new List<ExpressionRangeVariable>();
}
}
public List<ExpressionRangeVariable> IntoVariables {
get {
return intoVariables;
}
set {
intoVariables = value ?? new List<ExpressionRangeVariable>();
}
}
public QueryExpressionGroupVBClause() {
groupVariables = new List<ExpressionRangeVariable>();
byVariables = new List<ExpressionRangeVariable>();
intoVariables = new List<ExpressionRangeVariable>();
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
return visitor.VisitQueryExpressionGroupVBClause(this, data);
}
public override string ToString() {
return string.Format("[QueryExpressionGroupVBClause GroupVariables={0} ByVariables={1} IntoVariables={2" +
"}]", GetCollectionString(GroupVariables), GetCollectionString(ByVariables), GetCollectionString(IntoVariables));
}
}
public class QueryExpressionIntoClause : QueryExpressionClause {
string intoIdentifier;
@ -3797,6 +4035,123 @@ public Location ExtendedEndLocation { get; set; } @@ -3797,6 +4035,123 @@ public Location ExtendedEndLocation { get; set; }
}
}
public class QueryExpressionJoinConditionVB : AbstractNode {
Expression leftSide;
Expression rightSide;
public Expression LeftSide {
get {
return leftSide;
}
set {
leftSide = value ?? Expression.Null;
if (!leftSide.IsNull) leftSide.Parent = this;
}
}
public Expression RightSide {
get {
return rightSide;
}
set {
rightSide = value ?? Expression.Null;
if (!rightSide.IsNull) rightSide.Parent = this;
}
}
public QueryExpressionJoinConditionVB() {
leftSide = Expression.Null;
rightSide = Expression.Null;
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
return visitor.VisitQueryExpressionJoinConditionVB(this, data);
}
public override string ToString() {
return string.Format("[QueryExpressionJoinConditionVB LeftSide={0} RightSide={1}]", LeftSide, RightSide);
}
}
public class QueryExpressionJoinVBClause : QueryExpressionClause {
QueryExpressionFromClause joinVariable;
QueryExpressionJoinVBClause subJoin;
List<QueryExpressionJoinConditionVB> conditions;
public QueryExpressionFromClause JoinVariable {
get {
return joinVariable;
}
set {
joinVariable = value ?? QueryExpressionFromClause.Null;
if (!joinVariable.IsNull) joinVariable.Parent = this;
}
}
public QueryExpressionJoinVBClause SubJoin {
get {
return subJoin;
}
set {
subJoin = value ?? QueryExpressionJoinVBClause.Null;
if (!subJoin.IsNull) subJoin.Parent = this;
}
}
public List<QueryExpressionJoinConditionVB> Conditions {
get {
return conditions;
}
set {
conditions = value ?? new List<QueryExpressionJoinConditionVB>();
}
}
public QueryExpressionJoinVBClause() {
joinVariable = QueryExpressionFromClause.Null;
subJoin = QueryExpressionJoinVBClause.Null;
conditions = new List<QueryExpressionJoinConditionVB>();
}
public new static QueryExpressionJoinVBClause Null {
get {
return NullQueryExpressionJoinVBClause.Instance;
}
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
return visitor.VisitQueryExpressionJoinVBClause(this, data);
}
public override string ToString() {
return string.Format("[QueryExpressionJoinVBClause JoinVariable={0} SubJoin={1} Conditions={2}]", JoinVariable, SubJoin, GetCollectionString(Conditions));
}
}
internal sealed class NullQueryExpressionJoinVBClause : QueryExpressionJoinVBClause {
internal static NullQueryExpressionJoinVBClause Instance = new NullQueryExpressionJoinVBClause();
public override bool IsNull {
get {
return true;
}
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
return null;
}
public override string ToString() {
return "[NullQueryExpressionJoinVBClause]";
}
}
public class QueryExpressionLetClause : QueryExpressionClause {
string identifier;
@ -3836,6 +4191,32 @@ public Location ExtendedEndLocation { get; set; } @@ -3836,6 +4191,32 @@ public Location ExtendedEndLocation { get; set; }
}
}
public class QueryExpressionLetVBClause : QueryExpressionClause {
List<ExpressionRangeVariable> variables;
public List<ExpressionRangeVariable> Variables {
get {
return variables;
}
set {
variables = value ?? new List<ExpressionRangeVariable>();
}
}
public QueryExpressionLetVBClause() {
variables = new List<ExpressionRangeVariable>();
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
return visitor.VisitQueryExpressionLetVBClause(this, data);
}
public override string ToString() {
return string.Format("[QueryExpressionLetVBClause Variables={0}]", GetCollectionString(Variables));
}
}
public class QueryExpressionOrderClause : QueryExpressionClause {
List<QueryExpressionOrdering> orderings;
@ -3900,6 +4281,44 @@ public Location ExtendedEndLocation { get; set; } @@ -3900,6 +4281,44 @@ public Location ExtendedEndLocation { get; set; }
}
}
public class QueryExpressionPartitionVBClause : QueryExpressionClause {
Expression expression;
QueryExpressionPartitionType partitionType;
public Expression Expression {
get {
return expression;
}
set {
expression = value ?? Expression.Null;
if (!expression.IsNull) expression.Parent = this;
}
}
public QueryExpressionPartitionType PartitionType {
get {
return partitionType;
}
set {
partitionType = value;
}
}
public QueryExpressionPartitionVBClause() {
expression = Expression.Null;
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
return visitor.VisitQueryExpressionPartitionVBClause(this, data);
}
public override string ToString() {
return string.Format("[QueryExpressionPartitionVBClause Expression={0} PartitionType={1}]", Expression, PartitionType);
}
}
public class QueryExpressionSelectClause : QueryExpressionClause {
Expression projection;
@ -3927,6 +4346,32 @@ public Location ExtendedEndLocation { get; set; } @@ -3927,6 +4346,32 @@ public Location ExtendedEndLocation { get; set; }
}
}
public class QueryExpressionSelectVBClause : QueryExpressionClause {
List<ExpressionRangeVariable> variables;
public List<ExpressionRangeVariable> Variables {
get {
return variables;
}
set {
variables = value ?? new List<ExpressionRangeVariable>();
}
}
public QueryExpressionSelectVBClause() {
variables = new List<ExpressionRangeVariable>();
}
public override object AcceptVisitor(IAstVisitor visitor, object data) {
return visitor.VisitQueryExpressionSelectVBClause(this, data);
}
public override string ToString() {
return string.Format("[QueryExpressionSelectVBClause Variables={0}]", GetCollectionString(Variables));
}
}
public class QueryExpressionWhereClause : QueryExpressionClause {
Expression condition;

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

@ -93,6 +93,8 @@ namespace ICSharpCode.NRefactory { @@ -93,6 +93,8 @@ namespace ICSharpCode.NRefactory {
object VisitExitStatement(ExitStatement exitStatement, object data);
object VisitExpressionRangeVariable(ExpressionRangeVariable expressionRangeVariable, object data);
object VisitExpressionStatement(ExpressionStatement expressionStatement, object data);
object VisitFieldDeclaration(FieldDeclaration fieldDeclaration, object data);
@ -163,22 +165,40 @@ namespace ICSharpCode.NRefactory { @@ -163,22 +165,40 @@ namespace ICSharpCode.NRefactory {
object VisitQueryExpression(QueryExpression queryExpression, object data);
object VisitQueryExpressionAggregateClause(QueryExpressionAggregateClause queryExpressionAggregateClause, object data);
object VisitQueryExpressionDistinctClause(QueryExpressionDistinctClause queryExpressionDistinctClause, object data);
object VisitQueryExpressionFromClause(QueryExpressionFromClause queryExpressionFromClause, object data);
object VisitQueryExpressionGroupClause(QueryExpressionGroupClause queryExpressionGroupClause, object data);
object VisitQueryExpressionGroupJoinVBClause(QueryExpressionGroupJoinVBClause queryExpressionGroupJoinVBClause, object data);
object VisitQueryExpressionGroupVBClause(QueryExpressionGroupVBClause queryExpressionGroupVBClause, object data);
object VisitQueryExpressionIntoClause(QueryExpressionIntoClause queryExpressionIntoClause, object data);
object VisitQueryExpressionJoinClause(QueryExpressionJoinClause queryExpressionJoinClause, object data);
object VisitQueryExpressionJoinConditionVB(QueryExpressionJoinConditionVB queryExpressionJoinConditionVB, object data);
object VisitQueryExpressionJoinVBClause(QueryExpressionJoinVBClause queryExpressionJoinVBClause, object data);
object VisitQueryExpressionLetClause(QueryExpressionLetClause queryExpressionLetClause, object data);
object VisitQueryExpressionLetVBClause(QueryExpressionLetVBClause queryExpressionLetVBClause, object data);
object VisitQueryExpressionOrderClause(QueryExpressionOrderClause queryExpressionOrderClause, object data);
object VisitQueryExpressionOrdering(QueryExpressionOrdering queryExpressionOrdering, object data);
object VisitQueryExpressionPartitionVBClause(QueryExpressionPartitionVBClause queryExpressionPartitionVBClause, object data);
object VisitQueryExpressionSelectClause(QueryExpressionSelectClause queryExpressionSelectClause, object data);
object VisitQueryExpressionSelectVBClause(QueryExpressionSelectVBClause queryExpressionSelectVBClause, object data);
object VisitQueryExpressionWhereClause(QueryExpressionWhereClause queryExpressionWhereClause, object data);
object VisitRaiseEventStatement(RaiseEventStatement raiseEventStatement, object data);

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

File diff suppressed because it is too large Load Diff

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

@ -2019,166 +2019,319 @@ LambdaExpr<out Expression expr> @@ -2019,166 +2019,319 @@ LambdaExpr<out Expression expr>
QueryExpr<out Expression expr>
(.
QueryExpression qexpr = new QueryExpression();
List<QueryExpressionFromClause> fromClauses = new List<QueryExpressionFromClause>();
qexpr.StartLocation = la.Location;
List<QueryExpressionClause> middleClauses = new List<QueryExpressionClause>();
expr = qexpr;
.) =
FromOrAggregateQueryOperator<out fromClauses>
{ QueryOperator }
FromOrAggregateQueryOperator<middleClauses>
{ QueryOperator<middleClauses> }
(.
qexpr.EndLocation = t.EndLocation;
.)
.
FromOrAggregateQueryOperator<out List<QueryExpressionFromClause> fromClauses>
(. fromClauses = null; .) =
FromQueryOperator<out fromClauses>
| AggregateQueryOperator<out fromClauses>
FromOrAggregateQueryOperator<List<QueryExpressionClause> middleClauses>
(. .) =
FromQueryOperator<middleClauses>
| AggregateQueryOperator<middleClauses>
.
QueryOperator
QueryOperator<List<QueryExpressionClause> middleClauses>
(.
List<QueryExpressionFromClause> fromClauses = null;
QueryExpressionJoinVBClause joinClause = null;
QueryExpressionGroupVBClause groupByClause = null;
QueryExpressionPartitionVBClause partitionClause = null;
QueryExpressionGroupJoinVBClause groupJoinClause = null;
.) =
FromQueryOperator<out fromClauses>
| AggregateQueryOperator<out fromClauses>
| SelectQueryOperator
| DistinctQueryOperator
| WhereQueryOperator
| OrderByQueryOperator
| PartitionQueryOperator
| LetQueryOperator
| JoinQueryOperator
| IF(la.kind == Tokens.Group && Peek(1).kind == Tokens.Join) GroupJoinQueryOperator
| GroupByQueryOperator
FromQueryOperator<middleClauses>
| AggregateQueryOperator<middleClauses>
| SelectQueryOperator<middleClauses>
| DistinctQueryOperator<middleClauses>
| WhereQueryOperator<middleClauses>
| OrderByQueryOperator<middleClauses>
| PartitionQueryOperator<out partitionClause>
| LetQueryOperator<middleClauses>
| JoinQueryOperator<out joinClause>
(. middleClauses.Add(joinClause); .)
| IF(la.kind == Tokens.Group && Peek(1).kind == Tokens.Join) GroupJoinQueryOperator<out groupJoinClause>
(. middleClauses.Add(groupJoinClause); .)
| GroupByQueryOperator<out groupByClause>
(. middleClauses.Add(groupByClause); .)
.
OrderByQueryOperator
(. .) =
"Order" "By" OrderExpressionList
OrderByQueryOperator<List<QueryExpressionClause> middleClauses>
(.
QueryExpressionOrderClause orderClause = new QueryExpressionOrderClause();
orderClause.StartLocation = la.Location;
List<QueryExpressionOrdering> orderings = null;
.) =
"Order" "By" OrderExpressionList<out orderings>
(.
orderClause.Orderings = orderings;
orderClause.EndLocation = t.EndLocation;
middleClauses.Add(orderClause);
.)
.
OrderExpressionList
(. .) =
OrderExpression
OrderExpressionList<out List<QueryExpressionOrdering> orderings>
(.
orderings = new List<QueryExpressionOrdering>();
QueryExpressionOrdering ordering = null;
.) =
OrderExpression<out ordering>
(. orderings.Add(ordering); .)
{
"," OrderExpression
"," OrderExpression<out ordering>
(. orderings.Add(ordering); .)
}
.
OrderExpression
(. Expression orderExpr = null; .) =
OrderExpression<out QueryExpressionOrdering ordering>
(.
ordering = new QueryExpressionOrdering();
ordering.StartLocation = la.Location;
ordering.Direction = QueryExpressionOrderingDirection.None;
Expression orderExpr = null;
.) =
Expr<out orderExpr>
(.
ordering.Criteria = orderExpr;
.)
[
"Ascending"
| "Descending"
"Ascending" (. ordering.Direction = QueryExpressionOrderingDirection.Ascending; .)
| "Descending" (. ordering.Direction = QueryExpressionOrderingDirection.Descending; .)
]
(. ordering.EndLocation = t.EndLocation; .)
.
GroupByQueryOperator
(. .) =
"Group" ExpressionRangeVariableDeclarationList "By" ExpressionRangeVariableDeclarationList
"Into" ExpressionRangeVariableDeclarationList
GroupByQueryOperator<out QueryExpressionGroupVBClause groupByClause>
(.
groupByClause = new QueryExpressionGroupVBClause();
groupByClause.StartLocation = la.Location;
.) =
"Group" ExpressionRangeVariableDeclarationList<groupByClause.GroupVariables>
"By" ExpressionRangeVariableDeclarationList<groupByClause.ByVariables>
"Into" ExpressionRangeVariableDeclarationList<groupByClause.IntoVariables>
(.
SetParent(groupByClause.GroupVariables, groupByClause);
SetParent(groupByClause.ByVariables, groupByClause);
SetParent(groupByClause.IntoVariables, groupByClause);
groupByClause.EndLocation = t.EndLocation;
.)
.
GroupJoinQueryOperator
(. .) =
"Group" JoinQueryOperator
"Into" ExpressionRangeVariableDeclarationList
GroupJoinQueryOperator<out QueryExpressionGroupJoinVBClause groupJoinClause>
(.
groupJoinClause = new QueryExpressionGroupJoinVBClause();
groupJoinClause.StartLocation = la.Location;
QueryExpressionJoinVBClause joinClause = null;
.) =
"Group" JoinQueryOperator<out joinClause>
"Into" ExpressionRangeVariableDeclarationList<groupJoinClause.IntoVariables>
(.
groupJoinClause.JoinClause = joinClause;
groupJoinClause.EndLocation = t.EndLocation;
.)
.
FromQueryOperator<out List<QueryExpressionFromClause> fromClauses>
FromQueryOperator<List<QueryExpressionClause> middleClauses>
(.
.) =
"From" CollectionRangeVariableDeclarationList<out fromClauses>
.
"From" CollectionRangeVariableDeclarationList<middleClauses>
.
SelectQueryOperator
(. .) =
"Select" ExpressionRangeVariableDeclarationList
SelectQueryOperator<List<QueryExpressionClause> middleClauses>
(.
QueryExpressionSelectVBClause selectClause = new QueryExpressionSelectVBClause();
selectClause.StartLocation = la.Location;
.) =
"Select" ExpressionRangeVariableDeclarationList<selectClause.Variables>
(.
SetParent(selectClause.Variables, selectClause);
selectClause.EndLocation = t.Location;
middleClauses.Add(selectClause);
.)
.
DistinctQueryOperator
(. .) =
DistinctQueryOperator<List<QueryExpressionClause> middleClauses>
(.
QueryExpressionDistinctClause distinctClause = new QueryExpressionDistinctClause();
distinctClause.StartLocation = la.Location;
.) =
"Distinct"
(.
distinctClause.EndLocation = t.EndLocation;
middleClauses.Add(distinctClause);
.)
.
WhereQueryOperator
(. Expression operand = null; .) =
WhereQueryOperator<List<QueryExpressionClause> middleClauses>
(.
QueryExpressionWhereClause whereClause = new QueryExpressionWhereClause();
whereClause.StartLocation = la.Location;
Expression operand = null;
.) =
"Where" Expr<out operand>
(.
whereClause.Condition = operand;
whereClause.EndLocation = t.EndLocation;
middleClauses.Add(whereClause);
.)
.
PartitionQueryOperator
(. Expression expr = null; .) =
"Take" [ "While" ] Expr<out expr>
| "Skip" [ "While" ] Expr<out expr>
PartitionQueryOperator<out QueryExpressionPartitionVBClause partitionClause>
(.
partitionClause = new QueryExpressionPartitionVBClause();
partitionClause.StartLocation = la.Location;
Expression expr = null;
.) =
"Take" (. partitionClause.PartitionType = QueryExpressionPartitionType.Take; .)
[ "While" (. partitionClause.PartitionType = QueryExpressionPartitionType.TakeWhile; .) ]
Expr<out expr>
| "Skip" (. partitionClause.PartitionType = QueryExpressionPartitionType.Skip; .)
[ "While" ] (. partitionClause.PartitionType = QueryExpressionPartitionType.SkipWhile; .)
Expr<out expr>
(.
partitionClause.Expression = expr;
partitionClause.EndLocation = t.EndLocation;
.)
.
AggregateQueryOperator<out List<QueryExpressionFromClause> fromClauses>
AggregateQueryOperator<List<QueryExpressionClause> middleClauses>
(.
fromClauses =new List<QueryExpressionFromClause>();
QueryExpressionFromClause aggreateClause = null;
QueryExpressionFromClause fromClause = null;
QueryExpressionAggregateClause aggregateClause = new QueryExpressionAggregateClause();
aggregateClause.IntoVariables = new List<ExpressionRangeVariable>();
aggregateClause.StartLocation = la.Location;
.) =
"Aggregate" CollectionRangeVariableDeclaration<out aggreateClause> { QueryOperator }
(. fromClauses.Add(aggreateClause); .)
"Into" ExpressionRangeVariableDeclarationList
"Aggregate" CollectionRangeVariableDeclaration<out fromClause>
(.
aggregateClause.FromClause = fromClause;
.)
{
QueryOperator<aggregateClause.MiddleClauses>
}
(. SetParent(aggregateClause.MiddleClauses, aggregateClause); .)
"Into" ExpressionRangeVariableDeclarationList<aggregateClause.IntoVariables>
(.
SetParent(aggregateClause.IntoVariables, aggregateClause);
aggregateClause.EndLocation = t.EndLocation;
middleClauses.Add(aggregateClause);
.)
.
LetQueryOperator
(. .) =
"Let" ExpressionRangeVariableDeclarationList
LetQueryOperator<List<QueryExpressionClause> middleClauses>
(.
QueryExpressionLetVBClause letClause = new QueryExpressionLetVBClause();
letClause.StartLocation = la.Location;
.) =
"Let" ExpressionRangeVariableDeclarationList<letClause.Variables>
(.
letClause.EndLocation = t.EndLocation;
middleClauses.Add(letClause);
.)
.
ExpressionRangeVariableDeclarationList
(. .) =
ExpressionRangeVariableDeclaration
{ "," ExpressionRangeVariableDeclaration }
ExpressionRangeVariableDeclarationList<List<ExpressionRangeVariable> variables>
(.
ExpressionRangeVariable variable = null;
.) =
ExpressionRangeVariableDeclaration<out variable>
(. variables.Add(variable); .)
{ "," ExpressionRangeVariableDeclaration<out variable> (. variables.Add(variable); .) }
.
ExpressionRangeVariableDeclaration
ExpressionRangeVariableDeclaration<out ExpressionRangeVariable variable>
(.
variable = new ExpressionRangeVariable();
variable.StartLocation = la.Location;
Expression rhs = null;
TypeReference typeName = null;
.) =
[ IF(IsIdentifiedExpressionRange()) Identifier [ "As" TypeName<out typeName> ] "="
[
IF(IsIdentifiedExpressionRange()) Identifier
(. variable.Identifier = t.val; .)
[
"As" TypeName<out typeName>
(. variable.Type = typeName; .)
]
"="
]
Expr<out rhs>
(.
variable.Expression = rhs;
variable.EndLocation = t.EndLocation;
.)
.
JoinQueryOperator
(. QueryExpressionFromClause joinClause = null; .) =
"Join" CollectionRangeVariableDeclaration<out joinClause> [ JoinQueryOperator ] "On"
JoinCondition
JoinQueryOperator<out QueryExpressionJoinVBClause joinClause>
(.
joinClause = new QueryExpressionJoinVBClause();
joinClause.StartLocation = la.Location;
QueryExpressionFromClause joinVariable = null;
QueryExpressionJoinVBClause subJoin = null;
QueryExpressionJoinConditionVB condition = null;
.) =
"Join" CollectionRangeVariableDeclaration<out joinVariable>
(. joinClause.JoinVariable = joinVariable; .)
[
JoinQueryOperator<out subJoin>
(. joinClause.SubJoin = subJoin; .)
]
"On"
JoinCondition<out condition>
(. SafeAdd(joinClause, joinClause.Conditions, condition); .)
{
"And" JoinCondition
"And" JoinCondition<out condition>
(. SafeAdd(joinClause, joinClause.Conditions, condition); .)
}
(.
joinClause.EndLocation = t.EndLocation;
.)
.
CollectionRangeVariableDeclarationList<out List<QueryExpressionFromClause> fromClauses>
CollectionRangeVariableDeclarationList<List<QueryExpressionClause> middleClauses>
(.
fromClauses = new List<QueryExpressionFromClause>();
QueryExpressionFromClause fromClause = null;
.) =
CollectionRangeVariableDeclaration<out fromClause>
(. fromClauses.Add(fromClause); .)
{ "," CollectionRangeVariableDeclaration<out fromClause> (. fromClauses.Add(fromClause); .) }
(. middleClauses.Add(fromClause); .)
{ "," CollectionRangeVariableDeclaration<out fromClause> (. middleClauses.Add(fromClause); .) }
.
CollectionRangeVariableDeclaration<out QueryExpressionFromClause fromClause>
(.
fromClause = new QueryExpressionFromClause();
fromClause.StartLocation = la.Location;
TypeReference typeName = null;
Expression inExpr = null;
.) =
Identifier
[ "As" TypeName<out typeName> (. fromClause.Type = typeName; .) ]
"In" Expr<out inExpr>
(. fromClause.InExpression = inExpr; .)
(.
fromClause.InExpression = inExpr;
fromClause.EndLocation = t.EndLocation;
.)
.
JoinCondition
JoinCondition<out QueryExpressionJoinConditionVB condition>
(.
condition = new QueryExpressionJoinConditionVB();
condition.StartLocation = la.Location;
Expression lhs = null;
Expression rhs = null;
.) =
Expr<out lhs> "Equals" Expr<out rhs>
(.
condition.LeftSide = lhs;
condition.RightSide = rhs;
condition.EndLocation = t.EndLocation;
.)
.
MemberInitializer<out NamedArgumentExpression memberInitializer>

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

@ -400,6 +400,14 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -400,6 +400,14 @@ namespace ICSharpCode.NRefactory.Visitors {
return null;
}
public virtual object VisitExpressionRangeVariable(ExpressionRangeVariable expressionRangeVariable, object data) {
Debug.Assert((expressionRangeVariable != null));
Debug.Assert((expressionRangeVariable.Expression != null));
Debug.Assert((expressionRangeVariable.Type != null));
expressionRangeVariable.Expression.AcceptVisitor(this, data);
return expressionRangeVariable.Type.AcceptVisitor(this, data);
}
public virtual object VisitExpressionStatement(ExpressionStatement expressionStatement, object data) {
Debug.Assert((expressionStatement != null));
Debug.Assert((expressionStatement.Expression != null));
@ -841,6 +849,28 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -841,6 +849,28 @@ namespace ICSharpCode.NRefactory.Visitors {
return queryExpression.IntoClause.AcceptVisitor(this, data);
}
public virtual object VisitQueryExpressionAggregateClause(QueryExpressionAggregateClause queryExpressionAggregateClause, object data) {
Debug.Assert((queryExpressionAggregateClause != null));
Debug.Assert((queryExpressionAggregateClause.FromClause != null));
Debug.Assert((queryExpressionAggregateClause.MiddleClauses != null));
Debug.Assert((queryExpressionAggregateClause.IntoVariables != null));
queryExpressionAggregateClause.FromClause.AcceptVisitor(this, data);
foreach (QueryExpressionClause o in queryExpressionAggregateClause.MiddleClauses) {
Debug.Assert(o != null);
o.AcceptVisitor(this, data);
}
foreach (ExpressionRangeVariable o in queryExpressionAggregateClause.IntoVariables) {
Debug.Assert(o != null);
o.AcceptVisitor(this, data);
}
return null;
}
public virtual object VisitQueryExpressionDistinctClause(QueryExpressionDistinctClause queryExpressionDistinctClause, object data) {
Debug.Assert((queryExpressionDistinctClause != null));
return null;
}
public virtual object VisitQueryExpressionFromClause(QueryExpressionFromClause queryExpressionFromClause, object data) {
Debug.Assert((queryExpressionFromClause != null));
Debug.Assert((queryExpressionFromClause.Type != null));
@ -857,6 +887,38 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -857,6 +887,38 @@ namespace ICSharpCode.NRefactory.Visitors {
return queryExpressionGroupClause.GroupBy.AcceptVisitor(this, data);
}
public virtual object VisitQueryExpressionGroupJoinVBClause(QueryExpressionGroupJoinVBClause queryExpressionGroupJoinVBClause, object data) {
Debug.Assert((queryExpressionGroupJoinVBClause != null));
Debug.Assert((queryExpressionGroupJoinVBClause.JoinClause != null));
Debug.Assert((queryExpressionGroupJoinVBClause.IntoVariables != null));
queryExpressionGroupJoinVBClause.JoinClause.AcceptVisitor(this, data);
foreach (ExpressionRangeVariable o in queryExpressionGroupJoinVBClause.IntoVariables) {
Debug.Assert(o != null);
o.AcceptVisitor(this, data);
}
return null;
}
public virtual object VisitQueryExpressionGroupVBClause(QueryExpressionGroupVBClause queryExpressionGroupVBClause, object data) {
Debug.Assert((queryExpressionGroupVBClause != null));
Debug.Assert((queryExpressionGroupVBClause.GroupVariables != null));
Debug.Assert((queryExpressionGroupVBClause.ByVariables != null));
Debug.Assert((queryExpressionGroupVBClause.IntoVariables != null));
foreach (ExpressionRangeVariable o in queryExpressionGroupVBClause.GroupVariables) {
Debug.Assert(o != null);
o.AcceptVisitor(this, data);
}
foreach (ExpressionRangeVariable o in queryExpressionGroupVBClause.ByVariables) {
Debug.Assert(o != null);
o.AcceptVisitor(this, data);
}
foreach (ExpressionRangeVariable o in queryExpressionGroupVBClause.IntoVariables) {
Debug.Assert(o != null);
o.AcceptVisitor(this, data);
}
return null;
}
public virtual object VisitQueryExpressionIntoClause(QueryExpressionIntoClause queryExpressionIntoClause, object data) {
Debug.Assert((queryExpressionIntoClause != null));
Debug.Assert((queryExpressionIntoClause.ContinuedQuery != null));
@ -875,12 +937,44 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -875,12 +937,44 @@ namespace ICSharpCode.NRefactory.Visitors {
return queryExpressionJoinClause.EqualsExpression.AcceptVisitor(this, data);
}
public virtual object VisitQueryExpressionJoinConditionVB(QueryExpressionJoinConditionVB queryExpressionJoinConditionVB, object data) {
Debug.Assert((queryExpressionJoinConditionVB != null));
Debug.Assert((queryExpressionJoinConditionVB.LeftSide != null));
Debug.Assert((queryExpressionJoinConditionVB.RightSide != null));
queryExpressionJoinConditionVB.LeftSide.AcceptVisitor(this, data);
return queryExpressionJoinConditionVB.RightSide.AcceptVisitor(this, data);
}
public virtual object VisitQueryExpressionJoinVBClause(QueryExpressionJoinVBClause queryExpressionJoinVBClause, object data) {
Debug.Assert((queryExpressionJoinVBClause != null));
Debug.Assert((queryExpressionJoinVBClause.JoinVariable != null));
Debug.Assert((queryExpressionJoinVBClause.SubJoin != null));
Debug.Assert((queryExpressionJoinVBClause.Conditions != null));
queryExpressionJoinVBClause.JoinVariable.AcceptVisitor(this, data);
queryExpressionJoinVBClause.SubJoin.AcceptVisitor(this, data);
foreach (QueryExpressionJoinConditionVB o in queryExpressionJoinVBClause.Conditions) {
Debug.Assert(o != null);
o.AcceptVisitor(this, data);
}
return null;
}
public virtual object VisitQueryExpressionLetClause(QueryExpressionLetClause queryExpressionLetClause, object data) {
Debug.Assert((queryExpressionLetClause != null));
Debug.Assert((queryExpressionLetClause.Expression != null));
return queryExpressionLetClause.Expression.AcceptVisitor(this, data);
}
public virtual object VisitQueryExpressionLetVBClause(QueryExpressionLetVBClause queryExpressionLetVBClause, object data) {
Debug.Assert((queryExpressionLetVBClause != null));
Debug.Assert((queryExpressionLetVBClause.Variables != null));
foreach (ExpressionRangeVariable o in queryExpressionLetVBClause.Variables) {
Debug.Assert(o != null);
o.AcceptVisitor(this, data);
}
return null;
}
public virtual object VisitQueryExpressionOrderClause(QueryExpressionOrderClause queryExpressionOrderClause, object data) {
Debug.Assert((queryExpressionOrderClause != null));
Debug.Assert((queryExpressionOrderClause.Orderings != null));
@ -897,12 +991,28 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -897,12 +991,28 @@ namespace ICSharpCode.NRefactory.Visitors {
return queryExpressionOrdering.Criteria.AcceptVisitor(this, data);
}
public virtual object VisitQueryExpressionPartitionVBClause(QueryExpressionPartitionVBClause queryExpressionPartitionVBClause, object data) {
Debug.Assert((queryExpressionPartitionVBClause != null));
Debug.Assert((queryExpressionPartitionVBClause.Expression != null));
return queryExpressionPartitionVBClause.Expression.AcceptVisitor(this, data);
}
public virtual object VisitQueryExpressionSelectClause(QueryExpressionSelectClause queryExpressionSelectClause, object data) {
Debug.Assert((queryExpressionSelectClause != null));
Debug.Assert((queryExpressionSelectClause.Projection != null));
return queryExpressionSelectClause.Projection.AcceptVisitor(this, data);
}
public virtual object VisitQueryExpressionSelectVBClause(QueryExpressionSelectVBClause queryExpressionSelectVBClause, object data) {
Debug.Assert((queryExpressionSelectVBClause != null));
Debug.Assert((queryExpressionSelectVBClause.Variables != null));
foreach (ExpressionRangeVariable o in queryExpressionSelectVBClause.Variables) {
Debug.Assert(o != null);
o.AcceptVisitor(this, data);
}
return null;
}
public virtual object VisitQueryExpressionWhereClause(QueryExpressionWhereClause queryExpressionWhereClause, object data) {
Debug.Assert((queryExpressionWhereClause != null));
Debug.Assert((queryExpressionWhereClause.Condition != null));

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

@ -723,6 +723,19 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -723,6 +723,19 @@ namespace ICSharpCode.NRefactory.Visitors {
return null;
}
public virtual object VisitExpressionRangeVariable(ExpressionRangeVariable expressionRangeVariable, object data) {
Debug.Assert((expressionRangeVariable != null));
Debug.Assert((expressionRangeVariable.Expression != null));
Debug.Assert((expressionRangeVariable.Type != null));
nodeStack.Push(expressionRangeVariable.Expression);
expressionRangeVariable.Expression.AcceptVisitor(this, data);
expressionRangeVariable.Expression = ((Expression)(nodeStack.Pop()));
nodeStack.Push(expressionRangeVariable.Type);
expressionRangeVariable.Type.AcceptVisitor(this, data);
expressionRangeVariable.Type = ((TypeReference)(nodeStack.Pop()));
return null;
}
public virtual object VisitExpressionStatement(ExpressionStatement expressionStatement, object data) {
Debug.Assert((expressionStatement != null));
Debug.Assert((expressionStatement.Expression != null));
@ -1553,6 +1566,44 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -1553,6 +1566,44 @@ namespace ICSharpCode.NRefactory.Visitors {
return null;
}
public virtual object VisitQueryExpressionAggregateClause(QueryExpressionAggregateClause queryExpressionAggregateClause, object data) {
Debug.Assert((queryExpressionAggregateClause != null));
Debug.Assert((queryExpressionAggregateClause.FromClause != 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()));
for (int i = 0; i < queryExpressionAggregateClause.MiddleClauses.Count; i++) {
QueryExpressionClause o = queryExpressionAggregateClause.MiddleClauses[i];
Debug.Assert(o != null);
nodeStack.Push(o);
o.AcceptVisitor(this, data);
o = (QueryExpressionClause)nodeStack.Pop();
if (o == null)
queryExpressionAggregateClause.MiddleClauses.RemoveAt(i--);
else
queryExpressionAggregateClause.MiddleClauses[i] = o;
}
for (int i = 0; i < queryExpressionAggregateClause.IntoVariables.Count; i++) {
ExpressionRangeVariable o = queryExpressionAggregateClause.IntoVariables[i];
Debug.Assert(o != null);
nodeStack.Push(o);
o.AcceptVisitor(this, data);
o = (ExpressionRangeVariable)nodeStack.Pop();
if (o == null)
queryExpressionAggregateClause.IntoVariables.RemoveAt(i--);
else
queryExpressionAggregateClause.IntoVariables[i] = o;
}
return null;
}
public virtual object VisitQueryExpressionDistinctClause(QueryExpressionDistinctClause queryExpressionDistinctClause, object data) {
Debug.Assert((queryExpressionDistinctClause != null));
return null;
}
public virtual object VisitQueryExpressionFromClause(QueryExpressionFromClause queryExpressionFromClause, object data) {
Debug.Assert((queryExpressionFromClause != null));
Debug.Assert((queryExpressionFromClause.Type != null));
@ -1579,6 +1630,68 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -1579,6 +1630,68 @@ namespace ICSharpCode.NRefactory.Visitors {
return null;
}
public virtual object VisitQueryExpressionGroupJoinVBClause(QueryExpressionGroupJoinVBClause queryExpressionGroupJoinVBClause, object data) {
Debug.Assert((queryExpressionGroupJoinVBClause != null));
Debug.Assert((queryExpressionGroupJoinVBClause.JoinClause != null));
Debug.Assert((queryExpressionGroupJoinVBClause.IntoVariables != null));
nodeStack.Push(queryExpressionGroupJoinVBClause.JoinClause);
queryExpressionGroupJoinVBClause.JoinClause.AcceptVisitor(this, data);
queryExpressionGroupJoinVBClause.JoinClause = ((QueryExpressionJoinVBClause)(nodeStack.Pop()));
for (int i = 0; i < queryExpressionGroupJoinVBClause.IntoVariables.Count; i++) {
ExpressionRangeVariable o = queryExpressionGroupJoinVBClause.IntoVariables[i];
Debug.Assert(o != null);
nodeStack.Push(o);
o.AcceptVisitor(this, data);
o = (ExpressionRangeVariable)nodeStack.Pop();
if (o == null)
queryExpressionGroupJoinVBClause.IntoVariables.RemoveAt(i--);
else
queryExpressionGroupJoinVBClause.IntoVariables[i] = o;
}
return null;
}
public virtual object VisitQueryExpressionGroupVBClause(QueryExpressionGroupVBClause queryExpressionGroupVBClause, object data) {
Debug.Assert((queryExpressionGroupVBClause != null));
Debug.Assert((queryExpressionGroupVBClause.GroupVariables != null));
Debug.Assert((queryExpressionGroupVBClause.ByVariables != null));
Debug.Assert((queryExpressionGroupVBClause.IntoVariables != null));
for (int i = 0; i < queryExpressionGroupVBClause.GroupVariables.Count; i++) {
ExpressionRangeVariable o = queryExpressionGroupVBClause.GroupVariables[i];
Debug.Assert(o != null);
nodeStack.Push(o);
o.AcceptVisitor(this, data);
o = (ExpressionRangeVariable)nodeStack.Pop();
if (o == null)
queryExpressionGroupVBClause.GroupVariables.RemoveAt(i--);
else
queryExpressionGroupVBClause.GroupVariables[i] = o;
}
for (int i = 0; i < queryExpressionGroupVBClause.ByVariables.Count; i++) {
ExpressionRangeVariable o = queryExpressionGroupVBClause.ByVariables[i];
Debug.Assert(o != null);
nodeStack.Push(o);
o.AcceptVisitor(this, data);
o = (ExpressionRangeVariable)nodeStack.Pop();
if (o == null)
queryExpressionGroupVBClause.ByVariables.RemoveAt(i--);
else
queryExpressionGroupVBClause.ByVariables[i] = o;
}
for (int i = 0; i < queryExpressionGroupVBClause.IntoVariables.Count; i++) {
ExpressionRangeVariable o = queryExpressionGroupVBClause.IntoVariables[i];
Debug.Assert(o != null);
nodeStack.Push(o);
o.AcceptVisitor(this, data);
o = (ExpressionRangeVariable)nodeStack.Pop();
if (o == null)
queryExpressionGroupVBClause.IntoVariables.RemoveAt(i--);
else
queryExpressionGroupVBClause.IntoVariables[i] = o;
}
return null;
}
public virtual object VisitQueryExpressionIntoClause(QueryExpressionIntoClause queryExpressionIntoClause, object data) {
Debug.Assert((queryExpressionIntoClause != null));
Debug.Assert((queryExpressionIntoClause.ContinuedQuery != null));
@ -1609,6 +1722,44 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -1609,6 +1722,44 @@ namespace ICSharpCode.NRefactory.Visitors {
return null;
}
public virtual object VisitQueryExpressionJoinConditionVB(QueryExpressionJoinConditionVB queryExpressionJoinConditionVB, object data) {
Debug.Assert((queryExpressionJoinConditionVB != null));
Debug.Assert((queryExpressionJoinConditionVB.LeftSide != null));
Debug.Assert((queryExpressionJoinConditionVB.RightSide != null));
nodeStack.Push(queryExpressionJoinConditionVB.LeftSide);
queryExpressionJoinConditionVB.LeftSide.AcceptVisitor(this, data);
queryExpressionJoinConditionVB.LeftSide = ((Expression)(nodeStack.Pop()));
nodeStack.Push(queryExpressionJoinConditionVB.RightSide);
queryExpressionJoinConditionVB.RightSide.AcceptVisitor(this, data);
queryExpressionJoinConditionVB.RightSide = ((Expression)(nodeStack.Pop()));
return null;
}
public virtual object VisitQueryExpressionJoinVBClause(QueryExpressionJoinVBClause queryExpressionJoinVBClause, object data) {
Debug.Assert((queryExpressionJoinVBClause != null));
Debug.Assert((queryExpressionJoinVBClause.JoinVariable != null));
Debug.Assert((queryExpressionJoinVBClause.SubJoin != null));
Debug.Assert((queryExpressionJoinVBClause.Conditions != null));
nodeStack.Push(queryExpressionJoinVBClause.JoinVariable);
queryExpressionJoinVBClause.JoinVariable.AcceptVisitor(this, data);
queryExpressionJoinVBClause.JoinVariable = ((QueryExpressionFromClause)(nodeStack.Pop()));
nodeStack.Push(queryExpressionJoinVBClause.SubJoin);
queryExpressionJoinVBClause.SubJoin.AcceptVisitor(this, data);
queryExpressionJoinVBClause.SubJoin = ((QueryExpressionJoinVBClause)(nodeStack.Pop()));
for (int i = 0; i < queryExpressionJoinVBClause.Conditions.Count; i++) {
QueryExpressionJoinConditionVB o = queryExpressionJoinVBClause.Conditions[i];
Debug.Assert(o != null);
nodeStack.Push(o);
o.AcceptVisitor(this, data);
o = (QueryExpressionJoinConditionVB)nodeStack.Pop();
if (o == null)
queryExpressionJoinVBClause.Conditions.RemoveAt(i--);
else
queryExpressionJoinVBClause.Conditions[i] = o;
}
return null;
}
public virtual object VisitQueryExpressionLetClause(QueryExpressionLetClause queryExpressionLetClause, object data) {
Debug.Assert((queryExpressionLetClause != null));
Debug.Assert((queryExpressionLetClause.Expression != null));
@ -1618,6 +1769,23 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -1618,6 +1769,23 @@ namespace ICSharpCode.NRefactory.Visitors {
return null;
}
public virtual object VisitQueryExpressionLetVBClause(QueryExpressionLetVBClause queryExpressionLetVBClause, object data) {
Debug.Assert((queryExpressionLetVBClause != null));
Debug.Assert((queryExpressionLetVBClause.Variables != null));
for (int i = 0; i < queryExpressionLetVBClause.Variables.Count; i++) {
ExpressionRangeVariable o = queryExpressionLetVBClause.Variables[i];
Debug.Assert(o != null);
nodeStack.Push(o);
o.AcceptVisitor(this, data);
o = (ExpressionRangeVariable)nodeStack.Pop();
if (o == null)
queryExpressionLetVBClause.Variables.RemoveAt(i--);
else
queryExpressionLetVBClause.Variables[i] = o;
}
return null;
}
public virtual object VisitQueryExpressionOrderClause(QueryExpressionOrderClause queryExpressionOrderClause, object data) {
Debug.Assert((queryExpressionOrderClause != null));
Debug.Assert((queryExpressionOrderClause.Orderings != null));
@ -1644,6 +1812,15 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -1644,6 +1812,15 @@ namespace ICSharpCode.NRefactory.Visitors {
return null;
}
public virtual object VisitQueryExpressionPartitionVBClause(QueryExpressionPartitionVBClause queryExpressionPartitionVBClause, object data) {
Debug.Assert((queryExpressionPartitionVBClause != null));
Debug.Assert((queryExpressionPartitionVBClause.Expression != null));
nodeStack.Push(queryExpressionPartitionVBClause.Expression);
queryExpressionPartitionVBClause.Expression.AcceptVisitor(this, data);
queryExpressionPartitionVBClause.Expression = ((Expression)(nodeStack.Pop()));
return null;
}
public virtual object VisitQueryExpressionSelectClause(QueryExpressionSelectClause queryExpressionSelectClause, object data) {
Debug.Assert((queryExpressionSelectClause != null));
Debug.Assert((queryExpressionSelectClause.Projection != null));
@ -1653,6 +1830,23 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -1653,6 +1830,23 @@ namespace ICSharpCode.NRefactory.Visitors {
return null;
}
public virtual object VisitQueryExpressionSelectVBClause(QueryExpressionSelectVBClause queryExpressionSelectVBClause, object data) {
Debug.Assert((queryExpressionSelectVBClause != null));
Debug.Assert((queryExpressionSelectVBClause.Variables != null));
for (int i = 0; i < queryExpressionSelectVBClause.Variables.Count; i++) {
ExpressionRangeVariable o = queryExpressionSelectVBClause.Variables[i];
Debug.Assert(o != null);
nodeStack.Push(o);
o.AcceptVisitor(this, data);
o = (ExpressionRangeVariable)nodeStack.Pop();
if (o == null)
queryExpressionSelectVBClause.Variables.RemoveAt(i--);
else
queryExpressionSelectVBClause.Variables[i] = o;
}
return null;
}
public virtual object VisitQueryExpressionWhereClause(QueryExpressionWhereClause queryExpressionWhereClause, object data) {
Debug.Assert((queryExpressionWhereClause != null));
Debug.Assert((queryExpressionWhereClause.Condition != null));

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

@ -304,6 +304,13 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -304,6 +304,13 @@ namespace ICSharpCode.NRefactory.Visitors {
return result;
}
public sealed override object VisitExpressionRangeVariable(ExpressionRangeVariable expressionRangeVariable, object data) {
this.BeginVisit(expressionRangeVariable);
object result = this.TrackedVisitExpressionRangeVariable(expressionRangeVariable, data);
this.EndVisit(expressionRangeVariable);
return result;
}
public sealed override object VisitExpressionStatement(ExpressionStatement expressionStatement, object data) {
this.BeginVisit(expressionStatement);
object result = this.TrackedVisitExpressionStatement(expressionStatement, data);
@ -549,6 +556,20 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -549,6 +556,20 @@ namespace ICSharpCode.NRefactory.Visitors {
return result;
}
public sealed override object VisitQueryExpressionAggregateClause(QueryExpressionAggregateClause queryExpressionAggregateClause, object data) {
this.BeginVisit(queryExpressionAggregateClause);
object result = this.TrackedVisitQueryExpressionAggregateClause(queryExpressionAggregateClause, data);
this.EndVisit(queryExpressionAggregateClause);
return result;
}
public sealed override object VisitQueryExpressionDistinctClause(QueryExpressionDistinctClause queryExpressionDistinctClause, object data) {
this.BeginVisit(queryExpressionDistinctClause);
object result = this.TrackedVisitQueryExpressionDistinctClause(queryExpressionDistinctClause, data);
this.EndVisit(queryExpressionDistinctClause);
return result;
}
public sealed override object VisitQueryExpressionFromClause(QueryExpressionFromClause queryExpressionFromClause, object data) {
this.BeginVisit(queryExpressionFromClause);
object result = this.TrackedVisitQueryExpressionFromClause(queryExpressionFromClause, data);
@ -563,6 +584,20 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -563,6 +584,20 @@ namespace ICSharpCode.NRefactory.Visitors {
return result;
}
public sealed override object VisitQueryExpressionGroupJoinVBClause(QueryExpressionGroupJoinVBClause queryExpressionGroupJoinVBClause, object data) {
this.BeginVisit(queryExpressionGroupJoinVBClause);
object result = this.TrackedVisitQueryExpressionGroupJoinVBClause(queryExpressionGroupJoinVBClause, data);
this.EndVisit(queryExpressionGroupJoinVBClause);
return result;
}
public sealed override object VisitQueryExpressionGroupVBClause(QueryExpressionGroupVBClause queryExpressionGroupVBClause, object data) {
this.BeginVisit(queryExpressionGroupVBClause);
object result = this.TrackedVisitQueryExpressionGroupVBClause(queryExpressionGroupVBClause, data);
this.EndVisit(queryExpressionGroupVBClause);
return result;
}
public sealed override object VisitQueryExpressionIntoClause(QueryExpressionIntoClause queryExpressionIntoClause, object data) {
this.BeginVisit(queryExpressionIntoClause);
object result = this.TrackedVisitQueryExpressionIntoClause(queryExpressionIntoClause, data);
@ -577,6 +612,20 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -577,6 +612,20 @@ namespace ICSharpCode.NRefactory.Visitors {
return result;
}
public sealed override object VisitQueryExpressionJoinConditionVB(QueryExpressionJoinConditionVB queryExpressionJoinConditionVB, object data) {
this.BeginVisit(queryExpressionJoinConditionVB);
object result = this.TrackedVisitQueryExpressionJoinConditionVB(queryExpressionJoinConditionVB, data);
this.EndVisit(queryExpressionJoinConditionVB);
return result;
}
public sealed override object VisitQueryExpressionJoinVBClause(QueryExpressionJoinVBClause queryExpressionJoinVBClause, object data) {
this.BeginVisit(queryExpressionJoinVBClause);
object result = this.TrackedVisitQueryExpressionJoinVBClause(queryExpressionJoinVBClause, data);
this.EndVisit(queryExpressionJoinVBClause);
return result;
}
public sealed override object VisitQueryExpressionLetClause(QueryExpressionLetClause queryExpressionLetClause, object data) {
this.BeginVisit(queryExpressionLetClause);
object result = this.TrackedVisitQueryExpressionLetClause(queryExpressionLetClause, data);
@ -584,6 +633,13 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -584,6 +633,13 @@ namespace ICSharpCode.NRefactory.Visitors {
return result;
}
public sealed override object VisitQueryExpressionLetVBClause(QueryExpressionLetVBClause queryExpressionLetVBClause, object data) {
this.BeginVisit(queryExpressionLetVBClause);
object result = this.TrackedVisitQueryExpressionLetVBClause(queryExpressionLetVBClause, data);
this.EndVisit(queryExpressionLetVBClause);
return result;
}
public sealed override object VisitQueryExpressionOrderClause(QueryExpressionOrderClause queryExpressionOrderClause, object data) {
this.BeginVisit(queryExpressionOrderClause);
object result = this.TrackedVisitQueryExpressionOrderClause(queryExpressionOrderClause, data);
@ -598,6 +654,13 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -598,6 +654,13 @@ namespace ICSharpCode.NRefactory.Visitors {
return result;
}
public sealed override object VisitQueryExpressionPartitionVBClause(QueryExpressionPartitionVBClause queryExpressionPartitionVBClause, object data) {
this.BeginVisit(queryExpressionPartitionVBClause);
object result = this.TrackedVisitQueryExpressionPartitionVBClause(queryExpressionPartitionVBClause, data);
this.EndVisit(queryExpressionPartitionVBClause);
return result;
}
public sealed override object VisitQueryExpressionSelectClause(QueryExpressionSelectClause queryExpressionSelectClause, object data) {
this.BeginVisit(queryExpressionSelectClause);
object result = this.TrackedVisitQueryExpressionSelectClause(queryExpressionSelectClause, data);
@ -605,6 +668,13 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -605,6 +668,13 @@ namespace ICSharpCode.NRefactory.Visitors {
return result;
}
public sealed override object VisitQueryExpressionSelectVBClause(QueryExpressionSelectVBClause queryExpressionSelectVBClause, object data) {
this.BeginVisit(queryExpressionSelectVBClause);
object result = this.TrackedVisitQueryExpressionSelectVBClause(queryExpressionSelectVBClause, data);
this.EndVisit(queryExpressionSelectVBClause);
return result;
}
public sealed override object VisitQueryExpressionWhereClause(QueryExpressionWhereClause queryExpressionWhereClause, object data) {
this.BeginVisit(queryExpressionWhereClause);
object result = this.TrackedVisitQueryExpressionWhereClause(queryExpressionWhereClause, data);
@ -971,6 +1041,10 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -971,6 +1041,10 @@ namespace ICSharpCode.NRefactory.Visitors {
return base.VisitExitStatement(exitStatement, data);
}
public virtual object TrackedVisitExpressionRangeVariable(ExpressionRangeVariable expressionRangeVariable, object data) {
return base.VisitExpressionRangeVariable(expressionRangeVariable, data);
}
public virtual object TrackedVisitExpressionStatement(ExpressionStatement expressionStatement, object data) {
return base.VisitExpressionStatement(expressionStatement, data);
}
@ -1111,6 +1185,14 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -1111,6 +1185,14 @@ namespace ICSharpCode.NRefactory.Visitors {
return base.VisitQueryExpression(queryExpression, data);
}
public virtual object TrackedVisitQueryExpressionAggregateClause(QueryExpressionAggregateClause queryExpressionAggregateClause, object data) {
return base.VisitQueryExpressionAggregateClause(queryExpressionAggregateClause, data);
}
public virtual object TrackedVisitQueryExpressionDistinctClause(QueryExpressionDistinctClause queryExpressionDistinctClause, object data) {
return base.VisitQueryExpressionDistinctClause(queryExpressionDistinctClause, data);
}
public virtual object TrackedVisitQueryExpressionFromClause(QueryExpressionFromClause queryExpressionFromClause, object data) {
return base.VisitQueryExpressionFromClause(queryExpressionFromClause, data);
}
@ -1119,6 +1201,14 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -1119,6 +1201,14 @@ namespace ICSharpCode.NRefactory.Visitors {
return base.VisitQueryExpressionGroupClause(queryExpressionGroupClause, data);
}
public virtual object TrackedVisitQueryExpressionGroupJoinVBClause(QueryExpressionGroupJoinVBClause queryExpressionGroupJoinVBClause, object data) {
return base.VisitQueryExpressionGroupJoinVBClause(queryExpressionGroupJoinVBClause, data);
}
public virtual object TrackedVisitQueryExpressionGroupVBClause(QueryExpressionGroupVBClause queryExpressionGroupVBClause, object data) {
return base.VisitQueryExpressionGroupVBClause(queryExpressionGroupVBClause, data);
}
public virtual object TrackedVisitQueryExpressionIntoClause(QueryExpressionIntoClause queryExpressionIntoClause, object data) {
return base.VisitQueryExpressionIntoClause(queryExpressionIntoClause, data);
}
@ -1127,10 +1217,22 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -1127,10 +1217,22 @@ namespace ICSharpCode.NRefactory.Visitors {
return base.VisitQueryExpressionJoinClause(queryExpressionJoinClause, data);
}
public virtual object TrackedVisitQueryExpressionJoinConditionVB(QueryExpressionJoinConditionVB queryExpressionJoinConditionVB, object data) {
return base.VisitQueryExpressionJoinConditionVB(queryExpressionJoinConditionVB, data);
}
public virtual object TrackedVisitQueryExpressionJoinVBClause(QueryExpressionJoinVBClause queryExpressionJoinVBClause, object data) {
return base.VisitQueryExpressionJoinVBClause(queryExpressionJoinVBClause, data);
}
public virtual object TrackedVisitQueryExpressionLetClause(QueryExpressionLetClause queryExpressionLetClause, object data) {
return base.VisitQueryExpressionLetClause(queryExpressionLetClause, data);
}
public virtual object TrackedVisitQueryExpressionLetVBClause(QueryExpressionLetVBClause queryExpressionLetVBClause, object data) {
return base.VisitQueryExpressionLetVBClause(queryExpressionLetVBClause, data);
}
public virtual object TrackedVisitQueryExpressionOrderClause(QueryExpressionOrderClause queryExpressionOrderClause, object data) {
return base.VisitQueryExpressionOrderClause(queryExpressionOrderClause, data);
}
@ -1139,10 +1241,18 @@ namespace ICSharpCode.NRefactory.Visitors { @@ -1139,10 +1241,18 @@ namespace ICSharpCode.NRefactory.Visitors {
return base.VisitQueryExpressionOrdering(queryExpressionOrdering, data);
}
public virtual object TrackedVisitQueryExpressionPartitionVBClause(QueryExpressionPartitionVBClause queryExpressionPartitionVBClause, object data) {
return base.VisitQueryExpressionPartitionVBClause(queryExpressionPartitionVBClause, data);
}
public virtual object TrackedVisitQueryExpressionSelectClause(QueryExpressionSelectClause queryExpressionSelectClause, object data) {
return base.VisitQueryExpressionSelectClause(queryExpressionSelectClause, data);
}
public virtual object TrackedVisitQueryExpressionSelectVBClause(QueryExpressionSelectVBClause queryExpressionSelectVBClause, object data) {
return base.VisitQueryExpressionSelectVBClause(queryExpressionSelectVBClause, data);
}
public virtual object TrackedVisitQueryExpressionWhereClause(QueryExpressionWhereClause queryExpressionWhereClause, object data) {
return base.VisitQueryExpressionWhereClause(queryExpressionWhereClause, data);
}

3
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs

@ -205,6 +205,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -205,6 +205,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
} else if ("global".Equals(expression, StringComparison.InvariantCultureIgnoreCase)) {
return new NamespaceResolveResult(null, null, "");
}
// array
} else if (language == NR.SupportedLanguage.CSharp && expressionResult.Context.IsTypeContext && !expressionResult.Context.IsObjectCreation) {
expr = ParseTypeReference(expression);
}
@ -213,6 +214,8 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -213,6 +214,8 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
if (expr == null) {
return null;
}
// "new" is missing
if (expressionResult.Context.IsObjectCreation && !(expr is ObjectCreateExpression)) {
Expression tmp = expr;
while (tmp != null) {

Loading…
Cancel
Save