diff --git a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj index b45200bd78..aa3954d20b 100644 --- a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj +++ b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj @@ -363,6 +363,7 @@ + diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/FindReferences.cs b/ICSharpCode.NRefactory.CSharp/Resolver/FindReferences.cs index 608d992861..495d2f91e6 100644 --- a/ICSharpCode.NRefactory.CSharp/Resolver/FindReferences.cs +++ b/ICSharpCode.NRefactory.CSharp/Resolver/FindReferences.cs @@ -21,6 +21,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading; +using ICSharpCode.NRefactory.CSharp; using ICSharpCode.NRefactory.CSharp.Refactoring; using ICSharpCode.NRefactory.CSharp.TypeSystem; using ICSharpCode.NRefactory.Semantics; @@ -220,16 +221,24 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver #endregion #region GetSearchScopes - public IList GetSearchScopes(IEntity entity) + public IList GetSearchScopes(ISymbol symbol) { + if (symbol == null) + throw new ArgumentNullException("symbol"); + switch (symbol.SymbolKind) { + case SymbolKind.Namespace: + return new[] { GetSearchScopeForNamespace((INamespace)symbol) }; + case SymbolKind.TypeParameter: + return new[] { GetSearchScopeForTypeParameter((ITypeParameter)symbol) }; + // TODO: IVariable etc. + } + IEntity entity = symbol as IEntity; if (entity == null) - throw new ArgumentNullException("entity"); + throw new NotSupportedException("Unsupported symbol type"); if (entity is IMember) entity = NormalizeMember((IMember)entity); Accessibility effectiveAccessibility = GetEffectiveAccessibility(entity); - ITypeDefinition topLevelTypeDefinition = entity.DeclaringTypeDefinition; - while (topLevelTypeDefinition != null && topLevelTypeDefinition.DeclaringTypeDefinition != null) - topLevelTypeDefinition = topLevelTypeDefinition.DeclaringTypeDefinition; + var topLevelTypeDefinition = GetTopLevelTypeDefinition(entity); SearchScope scope; SearchScope additionalScope = null; switch (entity.SymbolKind) { @@ -289,13 +298,22 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver } } - public IList GetSearchScopes(INamespace ns) + public IList GetSearchScopes(IEnumerable symbols) { - if (ns == null) - throw new ArgumentNullException("ns"); - return new[] { GetSearchScopeForNamespace(ns) }; + if (symbols == null) + throw new ArgumentNullException("symbols"); + return symbols.SelectMany(GetSearchScopes).ToList(); + } + + static ITypeDefinition GetTopLevelTypeDefinition(IEntity entity) + { + if (entity == null) + return null; + ITypeDefinition topLevelTypeDefinition = entity.DeclaringTypeDefinition; + while (topLevelTypeDefinition != null && topLevelTypeDefinition.DeclaringTypeDefinition != null) + topLevelTypeDefinition = topLevelTypeDefinition.DeclaringTypeDefinition; + return topLevelTypeDefinition; } - #endregion #region GetInterestingFileNames @@ -360,6 +378,36 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver #endregion #region FindReferencesInFile + /// + /// Finds all references in the given file. + /// + /// The search scope for which to look. + /// AST resolver for the file to search in. + /// Callback used to report the references that were found. + /// CancellationToken that may be used to cancel the operation. + public void FindReferencesInFile(IFindReferenceSearchScope searchScope, CSharpAstResolver resolver, + FoundReferenceCallback callback, CancellationToken cancellationToken) + { + if (resolver == null) + throw new ArgumentNullException("resolver"); + FindReferencesInFile(searchScope, resolver.UnresolvedFile, (SyntaxTree)resolver.RootNode, resolver.Compilation, callback, cancellationToken); + } + + /// + /// Finds all references in the given file. + /// + /// The search scopes for which to look. + /// AST resolver for the file to search in. + /// Callback used to report the references that were found. + /// CancellationToken that may be used to cancel the operation. + public void FindReferencesInFile(IList searchScopes, CSharpAstResolver resolver, + FoundReferenceCallback callback, CancellationToken cancellationToken) + { + if (resolver == null) + throw new ArgumentNullException("resolver"); + FindReferencesInFile(searchScopes, resolver.UnresolvedFile, (SyntaxTree)resolver.RootNode, resolver.Compilation, callback, cancellationToken); + } + /// /// Finds all references in the given file. /// @@ -424,6 +472,14 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver } #endregion + #region RenameReferencesInFile + public void RenameReferencesInFile(IList searchScopes, string newName, CSharpAstResolver resolver, + Action callback, Action errorCallback, CancellationToken cancellationToken) + { + throw new NotImplementedException(); + } + #endregion + #region Find TypeDefinition References SearchScope FindTypeDefinitionReferences(ITypeDefinition typeDefinition, bool findTypeReferencesEvenIfAliased, out SearchScope additionalScope) { @@ -843,8 +899,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver var arr = rr as AwaitResolveResult; if (arr != null) { return IsMatch(arr.GetAwaiterInvocation) - || (arr.GetResultMethod != null && findReferences.IsMemberMatch(method, arr.GetResultMethod, true)) - || (arr.OnCompletedMethod != null && findReferences.IsMemberMatch(method, arr.OnCompletedMethod, true)); + || (arr.GetResultMethod != null && findReferences.IsMemberMatch(method, arr.GetResultMethod, true)) + || (arr.OnCompletedMethod != null && findReferences.IsMemberMatch(method, arr.OnCompletedMethod, true)); } } var mrr = rr as MemberResolveResult; @@ -1090,7 +1146,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver internal override bool IsMatch(ResolveResult rr) { ConversionResolveResult crr = rr as ConversionResolveResult; - return crr != null && crr.Conversion.IsUserDefined + return crr != null && crr.Conversion.IsUserDefined && findReferences.IsMemberMatch(op, crr.Conversion.Method, crr.Conversion.IsVirtualMethodLookup); } } @@ -1282,8 +1338,9 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver /// The compilation. /// Callback used to report the references that were found. /// Cancellation token that may be used to cancel the operation. + [Obsolete("Use GetSearchScopes(typeParameter) instead")] public void FindTypeParameterReferences(IType typeParameter, CSharpUnresolvedFile unresolvedFile, SyntaxTree syntaxTree, - ICompilation compilation, FoundReferenceCallback callback, CancellationToken cancellationToken) + ICompilation compilation, FoundReferenceCallback callback, CancellationToken cancellationToken) { if (typeParameter == null) throw new ArgumentNullException("typeParameter"); @@ -1295,6 +1352,17 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver FindReferencesInFile(searchScope, unresolvedFile, syntaxTree, compilation, callback, cancellationToken); } + SearchScope GetSearchScopeForTypeParameter(ITypeParameter tp) + { + var searchScope = new SearchScope(c => new FindTypeParameterReferencesNavigator(tp)); + var compilationProvider = tp as ICompilationProvider; + if (compilationProvider != null) + searchScope.declarationCompilation = compilationProvider.Compilation; + searchScope.topLevelTypeDefinition = GetTopLevelTypeDefinition(tp.Owner); + searchScope.accessibility = Accessibility.Private; + return searchScope; + } + class FindTypeParameterReferencesNavigator : FindReferenceNavigator { readonly ITypeParameter typeParameter; @@ -1322,14 +1390,14 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver } } #endregion - + #region Find Namespace References SearchScope GetSearchScopeForNamespace(INamespace ns) { var scope = new SearchScope ( delegate (ICompilation compilation) { - return new FindNamespaceNavigator (ns); - } + return new FindNamespaceNavigator (ns); + } ); return scope; } diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/RenameCallbackArguments.cs b/ICSharpCode.NRefactory.CSharp/Resolver/RenameCallbackArguments.cs new file mode 100644 index 0000000000..9be51621b5 --- /dev/null +++ b/ICSharpCode.NRefactory.CSharp/Resolver/RenameCallbackArguments.cs @@ -0,0 +1,31 @@ +/* + * Created by SharpDevelop. + * User: Daniel + * Date: 6/13/2013 + * Time: 17:50 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; + +namespace ICSharpCode.NRefactory.CSharp.Resolver +{ + /// + /// Arguments for the callback of . + /// + public class RenameCallbackArguments + { + public AstNode NodeToReplace { get; private set; } + public AstNode NewNode { get; private set; } + + public RenameCallbackArguments(AstNode nodeToReplace, AstNode newNode) + { + if (nodeToReplace == null) + throw new ArgumentNullException("nodeToReplace"); + if (newNode == null) + throw new ArgumentNullException("newNode"); + this.NodeToReplace = nodeToReplace; + this.NewNode = newNode; + } + } +}