diff --git a/ICSharpCode.NRefactory/CSharp/Resolver/FindReferences.cs b/ICSharpCode.NRefactory/CSharp/Resolver/FindReferences.cs
index 5b7b3242d7..302bb853fe 100644
--- a/ICSharpCode.NRefactory/CSharp/Resolver/FindReferences.cs
+++ b/ICSharpCode.NRefactory/CSharp/Resolver/FindReferences.cs
@@ -31,21 +31,17 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
///
public class FindReferences
{
- CancellationToken cancellationToken;
-
///
/// Callback that is invoked whenever a reference is found.
///
public event Action ReferenceFound;
- #region Constructor
- public FindReferences(CancellationToken cancellationToken = default(CancellationToken))
- {
- this.cancellationToken = cancellationToken;
- }
- #endregion
-
#region Properties
+ ///
+ /// Gets/Sets the cancellation token.
+ ///
+ public CancellationToken CancellationToken { get; set; }
+
///
/// Gets/Sets whether to find type references even if an alias is being used.
///
@@ -224,7 +220,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
///
/// Gets the file names that possibly contain references to the element being searched for.
///
- public IEnumerable GetInterestingFileNames(SearchScope searchScope, ITypeResolveContext context)
+ public IList GetInterestingFileNames(SearchScope searchScope, IEnumerable allTypes, ITypeResolveContext context)
{
IEnumerable interestingTypes;
if (searchScope.TopLevelTypeDefinition != null) {
@@ -234,41 +230,41 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
interestingTypes = new [] { searchScope.TopLevelTypeDefinition.GetDefinition() };
break;
case Accessibility.Protected:
- interestingTypes = GetInterestingTypesProtected(context, searchScope.TopLevelTypeDefinition);
+ interestingTypes = GetInterestingTypesProtected(allTypes, context, searchScope.TopLevelTypeDefinition);
break;
case Accessibility.Internal:
- interestingTypes = GetInterestingTypesInternal(context, searchScope.TopLevelTypeDefinition.ProjectContent);
+ interestingTypes = GetInterestingTypesInternal(allTypes, context, searchScope.TopLevelTypeDefinition.ProjectContent);
break;
case Accessibility.ProtectedAndInternal:
- interestingTypes = GetInterestingTypesProtected(context, searchScope.TopLevelTypeDefinition)
- .Intersect(GetInterestingTypesInternal(context, searchScope.TopLevelTypeDefinition.ProjectContent));
+ interestingTypes = GetInterestingTypesProtected(allTypes, context, searchScope.TopLevelTypeDefinition)
+ .Intersect(GetInterestingTypesInternal(allTypes, context, searchScope.TopLevelTypeDefinition.ProjectContent));
break;
case Accessibility.ProtectedOrInternal:
- interestingTypes = GetInterestingTypesProtected(context, searchScope.TopLevelTypeDefinition)
- .Union(GetInterestingTypesInternal(context, searchScope.TopLevelTypeDefinition.ProjectContent));
+ interestingTypes = GetInterestingTypesProtected(allTypes, context, searchScope.TopLevelTypeDefinition)
+ .Union(GetInterestingTypesInternal(allTypes, context, searchScope.TopLevelTypeDefinition.ProjectContent));
break;
default:
- interestingTypes = context.GetTypes();
+ interestingTypes = allTypes;
break;
}
} else {
- interestingTypes = context.GetTypes();
+ interestingTypes = allTypes;
}
return (from typeDef in interestingTypes
from part in typeDef.GetParts()
where part.ParsedFile != null
select part.ParsedFile.FileName
- ).Distinct(Platform.FileNameComparer);
+ ).Distinct(Platform.FileNameComparer).ToList();
}
- IEnumerable GetInterestingTypesProtected(ITypeResolveContext context, ITypeDefinition referencedTypeDefinition)
+ IEnumerable GetInterestingTypesProtected(IEnumerable allTypes, ITypeResolveContext context, ITypeDefinition referencedTypeDefinition)
{
- return referencedTypeDefinition.GetSubTypeDefinitions(context);
+ return allTypes.Where(t => t.IsDerivedFrom(referencedTypeDefinition, context));
}
- IEnumerable GetInterestingTypesInternal(ITypeResolveContext context, IProjectContent referencedProjectContent)
+ IEnumerable GetInterestingTypesInternal(IEnumerable allTypes, ITypeResolveContext context, IProjectContent referencedProjectContent)
{
- return context.GetTypes().Where(t => referencedProjectContent.InternalsVisibleTo(t.ProjectContent, context));
+ return allTypes.Where(t => referencedProjectContent.InternalsVisibleTo(t.ProjectContent, context));
}
#endregion
@@ -304,7 +300,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
throw new ArgumentNullException("compilationUnit");
if (context == null)
throw new ArgumentNullException("context");
- cancellationToken.ThrowIfCancellationRequested();
+ this.CancellationToken.ThrowIfCancellationRequested();
if (searchScopes.Count == 0)
return;
foreach (SearchScope scope in searchScopes) {
@@ -318,7 +314,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
else
navigator = new CompositeResolveVisitorNavigator(searchScopes.ToArray());
navigator = new DetectSkippableNodesNavigator(navigator, compilationUnit);
- CSharpResolver resolver = new CSharpResolver(ctx, cancellationToken);
+ CSharpResolver resolver = new CSharpResolver(ctx, this.CancellationToken);
ResolveVisitor v = new ResolveVisitor(resolver, parsedFile, navigator);
v.Scan(compilationUnit);
}
diff --git a/ICSharpCode.NRefactory/CSharp/Resolver/LocalResolveResult.cs b/ICSharpCode.NRefactory/CSharp/Resolver/LocalResolveResult.cs
index ef056230f9..57779ab2a6 100644
--- a/ICSharpCode.NRefactory/CSharp/Resolver/LocalResolveResult.cs
+++ b/ICSharpCode.NRefactory/CSharp/Resolver/LocalResolveResult.cs
@@ -68,5 +68,10 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
{
return string.Format("[LocalResolveResult {0}]", variable);
}
+
+ public override DomRegion GetDefinitionRegion()
+ {
+ return variable.Region;
+ }
}
}
diff --git a/ICSharpCode.NRefactory/CSharp/Resolver/MemberResolveResult.cs b/ICSharpCode.NRefactory/CSharp/Resolver/MemberResolveResult.cs
index baaf504d7d..b47b4764c0 100644
--- a/ICSharpCode.NRefactory/CSharp/Resolver/MemberResolveResult.cs
+++ b/ICSharpCode.NRefactory/CSharp/Resolver/MemberResolveResult.cs
@@ -92,5 +92,10 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
{
return string.Format("[{0} {1}]", GetType().Name, member);
}
+
+ public override DomRegion GetDefinitionRegion()
+ {
+ return member.Region;
+ }
}
}
diff --git a/ICSharpCode.NRefactory/CSharp/Resolver/ResolveAtLocation.cs b/ICSharpCode.NRefactory/CSharp/Resolver/ResolveAtLocation.cs
index dcf78a2080..2f16a7ebf0 100644
--- a/ICSharpCode.NRefactory/CSharp/Resolver/ResolveAtLocation.cs
+++ b/ICSharpCode.NRefactory/CSharp/Resolver/ResolveAtLocation.cs
@@ -32,6 +32,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
CancellationToken cancellationToken = default(CancellationToken))
{
AstNode node = cu.GetNodeAt(location);
+ if (node == null)
+ return null;
AstNode resolvableNode;
if (node is Identifier) {
resolvableNode = node.Parent;
diff --git a/ICSharpCode.NRefactory/CSharp/Resolver/ResolveResult.cs b/ICSharpCode.NRefactory/CSharp/Resolver/ResolveResult.cs
index 9f31e05720..40a9931e69 100644
--- a/ICSharpCode.NRefactory/CSharp/Resolver/ResolveResult.cs
+++ b/ICSharpCode.NRefactory/CSharp/Resolver/ResolveResult.cs
@@ -63,5 +63,10 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
{
return Enumerable.Empty();
}
+
+ public virtual DomRegion GetDefinitionRegion()
+ {
+ return DomRegion.Empty;
+ }
}
}
diff --git a/ICSharpCode.NRefactory/CSharp/Resolver/TypeResolveResult.cs b/ICSharpCode.NRefactory/CSharp/Resolver/TypeResolveResult.cs
index 1336357ba6..79815d6565 100644
--- a/ICSharpCode.NRefactory/CSharp/Resolver/TypeResolveResult.cs
+++ b/ICSharpCode.NRefactory/CSharp/Resolver/TypeResolveResult.cs
@@ -30,5 +30,14 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
: base(type)
{
}
+
+ public override DomRegion GetDefinitionRegion()
+ {
+ ITypeDefinition def = this.Type.GetDefinition();
+ if (def != null)
+ return def.Region;
+ else
+ return DomRegion.Empty;
+ }
}
}