diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/FindReferencedEntities.cs b/ICSharpCode.NRefactory.CSharp/Resolver/FindReferencedEntities.cs index f06cc6f498..2971839eda 100644 --- a/ICSharpCode.NRefactory.CSharp/Resolver/FindReferencedEntities.cs +++ b/ICSharpCode.NRefactory.CSharp/Resolver/FindReferencedEntities.cs @@ -60,9 +60,9 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver if (ferr != null) { Resolved(node, ferr.GetEnumeratorCall); if (ferr.CurrentProperty != null) - referenceFound(node, ferr.CurrentProperty); + referenceFound(node, ferr.CurrentProperty.MemberDefinition); if (ferr.MoveNextMethod != null) - referenceFound(node, ferr.MoveNextMethod); + referenceFound(node, ferr.MoveNextMethod.MemberDefinition); } } diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/FindReferences.cs b/ICSharpCode.NRefactory.CSharp/Resolver/FindReferences.cs index bfc39c5f5d..cbc594034a 100644 --- a/ICSharpCode.NRefactory.CSharp/Resolver/FindReferences.cs +++ b/ICSharpCode.NRefactory.CSharp/Resolver/FindReferences.cs @@ -203,6 +203,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver break; case EntityType.Property: scope = FindMemberReferences(entity, m => new FindPropertyReferences((IProperty)m)); + if (entity.Name == "Current") + additionalScope = FindEnumeratorCurrentReferences((IProperty)entity); break; case EntityType.Event: scope = FindMemberReferences(entity, m => new FindEventReferences((IEvent)m)); @@ -562,6 +564,39 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver } #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 SearchScope GetSearchScopeForMethod(IMethod method) {