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;
+ }
+ }
+}