public virtual object VisitQueryExpressionJoinClause(QueryExpressionJoinClause queryExpressionJoinClause, object data) {
			Debug.Assert((queryExpressionJoinClause != null));
			Debug.Assert((queryExpressionJoinClause.OnExpression != null));
			Debug.Assert((queryExpressionJoinClause.EqualsExpression != null));
			Debug.Assert((queryExpressionJoinClause.Source != null));
			queryExpressionJoinClause.OnExpression.AcceptVisitor(this, data);
			queryExpressionJoinClause.EqualsExpression.AcceptVisitor(this, data);
			return queryExpressionJoinClause.Source.AcceptVisitor(this, data);
		}
		public virtual object VisitQueryExpressionJoinClause(QueryExpressionJoinClause queryExpressionJoinClause, object data) {
			throw new global::System.NotImplementedException("QueryExpressionJoinClause");
		}
		public virtual object VisitQueryExpressionJoinClause(QueryExpressionJoinClause queryExpressionJoinClause, object data) {
			Debug.Assert((queryExpressionJoinClause != null));
			Debug.Assert((queryExpressionJoinClause.OnExpression != null));
			Debug.Assert((queryExpressionJoinClause.EqualsExpression != null));
			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;
		}
		public override object VisitQueryExpressionJoinClause(QueryExpressionJoinClause joinClause, object data)
		{
			if (string.IsNullOrEmpty(joinClause.IntoIdentifier)) {
				AddVariable(joinClause.Source.Type, joinClause.Source.Identifier,
				            joinClause.Source.StartLocation, CurrentEndLocation,
				            false, true, joinClause.Source.Expression, null, false);
			} else {
				AddVariable(joinClause.Source.Type, joinClause.Source.Identifier,
				            joinClause.Source.StartLocation, joinClause.Source.EndLocation,
				            false, true, joinClause.Source.Expression, null, false);
				
				AddVariable(joinClause.Source.Type, joinClause.IntoIdentifier,
				            joinClause.Source.StartLocation, CurrentEndLocation,
				            false, false, joinClause.Source.Expression, null, false);
			}
			return base.VisitQueryExpressionJoinClause(joinClause, data);
		}
		public sealed override object VisitQueryExpressionJoinClause(QueryExpressionJoinClause queryExpressionJoinClause, object data) {
			this.BeginVisit(queryExpressionJoinClause);
			object result = this.TrackedVisitQueryExpressionJoinClause(queryExpressionJoinClause, data);
			this.EndVisit(queryExpressionJoinClause);
			return result;
		}
		public virtual object TrackedVisitQueryExpressionJoinClause(QueryExpressionJoinClause queryExpressionJoinClause, object data) {
			return base.VisitQueryExpressionJoinClause(queryExpressionJoinClause, data);
		}