@ -140,49 +140,72 @@ namespace ICSharpCode.NRefactory.Visitors
@@ -140,49 +140,72 @@ namespace ICSharpCode.NRefactory.Visitors
return base . VisitLambdaExpression ( lambdaExpression , data ) ;
}
public override object VisitQueryExpression ( QueryExpression queryExpression , object data )
{
endLocationStack . Push ( GetQueryVariableEndScope ( queryExpression ) ) ;
base . VisitQueryExpression ( queryExpression , data ) ;
endLocationStack . Pop ( ) ;
return null ;
}
Location GetQueryVariableEndScope ( QueryExpression queryExpression )
{
return queryExpression . IntoClause . IsNull
? queryExpression . EndLocation
: queryExpression . IntoClause . StartLocation ;
}
public override object VisitQueryExpressionFromClause ( QueryExpressionFromClause fromClause , object data )
{
QueryExpression parentExpression = fromClause . Parent as QueryExpression ;
AddVariable ( fromClause . Type , fromClause . Identifier ,
fromClause . StartLocation , CurrentEndLocation ,
false , true , fromClause . InExpression , null ) ;
return base . VisitQueryExpressionFromClause ( fromClause , data ) ;
}
public override object VisitQueryExpressionIntoClause ( QueryExpressionIntoClause intoClause , object data )
{
QueryExpression parentExpression = intoClause . Parent as QueryExpression ;
if ( parentExpression ! = null ) {
AddVariable ( fromClause . Type , fromClause . Identifier ,
parentExpression . StartLocation , parentExpression . EndLocation ,
false , true , fromClause . InExpression , null ) ;
Expression initializer = null ;
var selectClause = parentExpression . SelectOrGroupClause as QueryExpressionSelectClause ;
if ( selectClause ! = null ) {
initializer = selectClause . Projection ;
} else {
var groupByClause = parentExpression . SelectOrGroupClause as QueryExpressionGroupClause ;
if ( groupByClause ! = null )
initializer = groupByClause . Projection ;
}
AddVariable ( null , intoClause . IntoIdentifier ,
intoClause . StartLocation , GetQueryVariableEndScope ( intoClause . ContinuedQuery ) ,
false , false , initializer , null ) ;
}
return base . VisitQueryExpressionFromClause ( fromClause , data ) ;
return base . VisitQueryExpressionIntoClause ( into Clause , data ) ;
}
public override object VisitQueryExpressionJoinClause ( QueryExpressionJoinClause joinClause , object data )
{
if ( string . IsNullOrEmpty ( joinClause . IntoIdentifier ) ) {
QueryExpression parentExpression = joinClause . Parent as QueryExpression ;
if ( parentExpression ! = null ) {
AddVariable ( joinClause . Type , joinClause . Identifier ,
parentExpression . StartLocation , parentExpression . EndLocation ,
false , true , joinClause . InExpression , null ) ;
}
AddVariable ( joinClause . Type , joinClause . Identifier ,
joinClause . StartLocation , CurrentEndLocation ,
false , true , joinClause . InExpression , null ) ;
} else {
AddVariable ( joinClause . Type , joinClause . Identifier ,
joinClause . StartLocation , joinClause . EndLocation ,
false , true , joinClause . InExpression , null ) ;
QueryExpression parentExpression = joinClause . Parent as QueryExpression ;
if ( parentExpression ! = null ) {
AddVariable ( joinClause . Type , joinClause . IntoIdentifier ,
parentExpression . StartLocation , parentExpression . EndLocation ,
false , false , joinClause . InExpression , null ) ;
}
AddVariable ( joinClause . Type , joinClause . IntoIdentifier ,
joinClause . StartLocation , CurrentEndLocation ,
false , false , joinClause . InExpression , null ) ;
}
return base . VisitQueryExpressionJoinClause ( joinClause , data ) ;
}
public override object VisitQueryExpressionLetClause ( QueryExpressionLetClause letClause , object data )
{
QueryExpression parentExpression = letClause . Parent as QueryExpression ;
if ( parentExpression ! = null ) {
AddVariable ( null , letClause . Identifier ,
parentExpression . StartLocation , parentExpression . EndLocation ,
false , false , letClause . Expression , null ) ;
}
AddVariable ( null , letClause . Identifier ,
letClause . StartLocation , CurrentEndLocation ,
false , false , letClause . Expression , null ) ;
return base . VisitQueryExpressionLetClause ( letClause , data ) ;
}