Browse Source

FindReferences for IEnumerator.Current now finds foreach statements.

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
eba021814c
  1. 4
      ICSharpCode.NRefactory.CSharp/Resolver/FindReferencedEntities.cs
  2. 35
      ICSharpCode.NRefactory.CSharp/Resolver/FindReferences.cs

4
ICSharpCode.NRefactory.CSharp/Resolver/FindReferencedEntities.cs

@ -60,9 +60,9 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
if (ferr != null) { if (ferr != null) {
Resolved(node, ferr.GetEnumeratorCall); Resolved(node, ferr.GetEnumeratorCall);
if (ferr.CurrentProperty != null) if (ferr.CurrentProperty != null)
referenceFound(node, ferr.CurrentProperty); referenceFound(node, ferr.CurrentProperty.MemberDefinition);
if (ferr.MoveNextMethod != null) if (ferr.MoveNextMethod != null)
referenceFound(node, ferr.MoveNextMethod); referenceFound(node, ferr.MoveNextMethod.MemberDefinition);
} }
} }

35
ICSharpCode.NRefactory.CSharp/Resolver/FindReferences.cs

@ -203,6 +203,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
break; break;
case EntityType.Property: case EntityType.Property:
scope = FindMemberReferences(entity, m => new FindPropertyReferences((IProperty)m)); scope = FindMemberReferences(entity, m => new FindPropertyReferences((IProperty)m));
if (entity.Name == "Current")
additionalScope = FindEnumeratorCurrentReferences((IProperty)entity);
break; break;
case EntityType.Event: case EntityType.Event:
scope = FindMemberReferences(entity, m => new FindEventReferences((IEvent)m)); scope = FindMemberReferences(entity, m => new FindEventReferences((IEvent)m));
@ -562,6 +564,39 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
} }
#endregion #endregion
#region Find References to IEnumerator.Current
SearchScope FindEnumeratorCurrentReferences(IProperty property)
{
IProperty propertyDefinition = (IProperty)property.MemberDefinition;
return new SearchScope(
delegate(ICompilation compilation) {
IProperty imported = compilation.Import(propertyDefinition);
return imported != null ? new FindEnumeratorCurrentReferencesNavigator(imported) : null;
});
}
sealed class FindEnumeratorCurrentReferencesNavigator : FindReferenceNavigator
{
IProperty property;
public FindEnumeratorCurrentReferencesNavigator(IProperty property)
{
this.property = property;
}
internal override bool CanMatch(AstNode node)
{
return node is ForeachStatement;
}
internal override bool IsMatch(ResolveResult rr)
{
ForEachResolveResult ferr = rr as ForEachResolveResult;
return ferr != null && ferr.CurrentProperty != null && ferr.CurrentProperty.MemberDefinition == property;
}
}
#endregion
#region Find Method References #region Find Method References
SearchScope GetSearchScopeForMethod(IMethod method) SearchScope GetSearchScopeForMethod(IMethod method)
{ {

Loading…
Cancel
Save