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