|
|
@ -55,15 +55,33 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring |
|
|
|
TypeCriteria[variable] = new List<ITypeCriterion>(); |
|
|
|
TypeCriteria[variable] = new List<ITypeCriterion>(); |
|
|
|
TypeCriteria[variable].Add(criterion); |
|
|
|
TypeCriteria[variable].Add(criterion); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public override void VisitMemberReferenceExpression(MemberReferenceExpression memberReferenceExpression) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
base.VisitMemberReferenceExpression(memberReferenceExpression); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var memberResolveResult = context.Resolve(memberReferenceExpression) as MemberResolveResult; |
|
|
|
|
|
|
|
if (memberResolveResult == null) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
var targetResolveResult = memberResolveResult.TargetResult as LocalResolveResult; |
|
|
|
|
|
|
|
if (targetResolveResult == null) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
var variable = targetResolveResult.Variable; |
|
|
|
|
|
|
|
AddCriterion(variable, new HasMemberCriterion(memberResolveResult.Member)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public override void VisitInvocationExpression(InvocationExpression invocationExpression) |
|
|
|
public override void VisitInvocationExpression(InvocationExpression invocationExpression) |
|
|
|
{ |
|
|
|
{ |
|
|
|
base.VisitInvocationExpression(invocationExpression); |
|
|
|
base.VisitInvocationExpression(invocationExpression); |
|
|
|
|
|
|
|
|
|
|
|
var resolveResult = context.Resolve(invocationExpression); |
|
|
|
var resolveResult = context.Resolve(invocationExpression); |
|
|
|
var invocationResolveResult = resolveResult as InvocationResolveResult; |
|
|
|
var invocationResolveResult = resolveResult as InvocationResolveResult; |
|
|
|
if (invocationResolveResult == null) |
|
|
|
if (invocationResolveResult == null) |
|
|
|
return; |
|
|
|
return; |
|
|
|
CollectRestrictionsFromNodes(invocationExpression.Arguments); |
|
|
|
CollectRestrictionsFromNodes(invocationExpression.Arguments); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// invocationExpression.Target resolves to a method group and VisitMemberReferenceExpression
|
|
|
|
|
|
|
|
// only handles members, so handle method groups here
|
|
|
|
var targetResolveResult = invocationResolveResult.TargetResult as LocalResolveResult; |
|
|
|
var targetResolveResult = invocationResolveResult.TargetResult as LocalResolveResult; |
|
|
|
if (targetResolveResult == null) |
|
|
|
if (targetResolveResult == null) |
|
|
|
return; |
|
|
|
return; |
|
|
@ -73,18 +91,12 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring |
|
|
|
|
|
|
|
|
|
|
|
void CollectRestrictionsFromNodes(IEnumerable<Expression> expressions) |
|
|
|
void CollectRestrictionsFromNodes(IEnumerable<Expression> expressions) |
|
|
|
{ |
|
|
|
{ |
|
|
|
var identifiers = |
|
|
|
foreach (var expression in expressions) { |
|
|
|
from expression in expressions |
|
|
|
var resolveResult = context.Resolve(expression); |
|
|
|
from node in expression.DescendantsAndSelf |
|
|
|
var argumentResolveResult = resolveResult as LocalResolveResult; |
|
|
|
let identifier = node as IdentifierExpression |
|
|
|
|
|
|
|
where identifier != null |
|
|
|
|
|
|
|
select identifier; |
|
|
|
|
|
|
|
foreach (var identifier in identifiers) { |
|
|
|
|
|
|
|
var resolveResult2 = context.Resolve(identifier); |
|
|
|
|
|
|
|
var argumentResolveResult = resolveResult2 as LocalResolveResult; |
|
|
|
|
|
|
|
if (argumentResolveResult == null) |
|
|
|
if (argumentResolveResult == null) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
var expectedType = context.GetExpectedType(identifier); |
|
|
|
var expectedType = context.GetExpectedType(expression); |
|
|
|
AddCriterion(argumentResolveResult.Variable, new IsTypeCriterion(expectedType)); |
|
|
|
AddCriterion(argumentResolveResult.Variable, new IsTypeCriterion(expectedType)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|