提交 be54ac35 编写于 作者: C CyrusNajmabadi

Make types private.

上级 4a873620
...@@ -20,92 +20,104 @@ namespace Microsoft.CodeAnalysis.Editor.Implementation.FindReferences ...@@ -20,92 +20,104 @@ namespace Microsoft.CodeAnalysis.Editor.Implementation.FindReferences
{ {
internal abstract class DefinitionLocation internal abstract class DefinitionLocation
{ {
public static readonly DefinitionLocation NonNavigatingInstance = NonNavigatingDefinitionLocation.Instance;
public abstract bool CanNavigateTo(); public abstract bool CanNavigateTo();
public abstract bool TryNavigateTo(); public abstract bool TryNavigateTo();
}
internal sealed class DocumentDefinitionLocation : DefinitionLocation public static DefinitionLocation CreateForDocumentLocation(DocumentLocation location)
{
public DocumentLocation Location { get; }
public DocumentDefinitionLocation(DocumentLocation location)
{ {
Location = location; return new DocumentDefinitionLocation(location);
} }
public override bool CanNavigateTo() public static DefinitionLocation CreateForSymbol(ISymbol symbol, Project referencingProject)
{ {
return Location.CanNavigateTo(); return new SymbolDefinitionLocation(symbol, referencingProject);
} }
public override bool TryNavigateTo() private sealed class DocumentDefinitionLocation : DefinitionLocation
{ {
return Location.TryNavigateTo(); public DocumentLocation Location { get; }
}
}
internal sealed class SymbolDefinitionLocation : DefinitionLocation public DocumentDefinitionLocation(DocumentLocation location)
{ {
private readonly Workspace _workspace; Location = location;
private readonly ProjectId _referencingProjectId; }
private readonly SymbolKey _symbolKey;
public SymbolDefinitionLocation(ISymbol definition, Project project) public override bool CanNavigateTo()
{ {
_workspace = project.Solution.Workspace; return Location.CanNavigateTo();
_referencingProjectId = project.Id; }
_symbolKey = definition.GetSymbolKey();
}
public override bool CanNavigateTo() public override bool TryNavigateTo()
{ {
return TryNavigateTo((symbol, project, service) => true); return Location.TryNavigateTo();
}
} }
public override bool TryNavigateTo() private sealed class SymbolDefinitionLocation : DefinitionLocation
{ {
return TryNavigateTo((symbol, project, service) => private readonly Workspace _workspace;
service.TryNavigateToSymbol(symbol, project)); private readonly ProjectId _referencingProjectId;
} private readonly SymbolKey _symbolKey;
private bool TryNavigateTo(Func<ISymbol, Project, ISymbolNavigationService, bool> action) public SymbolDefinitionLocation(ISymbol definition, Project project)
{
var symbol = ResolveSymbolInCurrentSolution();
var referencingProject = _workspace.CurrentSolution.GetProject(_referencingProjectId);
if (symbol == null || referencingProject == null)
{ {
return false; _workspace = project.Solution.Workspace;
_referencingProjectId = project.Id;
_symbolKey = definition.GetSymbolKey();
} }
var navigationService = _workspace.Services.GetService<ISymbolNavigationService>(); public override bool CanNavigateTo()
return action(symbol, referencingProject, navigationService); {
} return TryNavigateTo((symbol, project, service) => true);
}
private ISymbol ResolveSymbolInCurrentSolution() public override bool TryNavigateTo()
{ {
var compilation = _workspace.CurrentSolution.GetProject(_referencingProjectId) return TryNavigateTo((symbol, project, service) =>
.GetCompilationAsync(CancellationToken.None) service.TryNavigateToSymbol(symbol, project));
.WaitAndGetResult(CancellationToken.None); }
return _symbolKey.Resolve(compilation).Symbol;
}
}
internal sealed class NonNavigableDefinitionLocation : DefinitionLocation private bool TryNavigateTo(Func<ISymbol, Project, ISymbolNavigationService, bool> action)
{ {
public static readonly DefinitionLocation Instance = new NonNavigableDefinitionLocation(); var symbol = ResolveSymbolInCurrentSolution();
var referencingProject = _workspace.CurrentSolution.GetProject(_referencingProjectId);
if (symbol == null || referencingProject == null)
{
return false;
}
private NonNavigableDefinitionLocation() var navigationService = _workspace.Services.GetService<ISymbolNavigationService>();
{ return action(symbol, referencingProject, navigationService);
} }
public override bool CanNavigateTo() private ISymbol ResolveSymbolInCurrentSolution()
{ {
return false; var compilation = _workspace.CurrentSolution.GetProject(_referencingProjectId)
.GetCompilationAsync(CancellationToken.None)
.WaitAndGetResult(CancellationToken.None);
return _symbolKey.Resolve(compilation).Symbol;
}
} }
public override bool TryNavigateTo() private sealed class NonNavigatingDefinitionLocation : DefinitionLocation
{ {
return false; public static readonly DefinitionLocation Instance = new NonNavigatingDefinitionLocation();
private NonNavigatingDefinitionLocation()
{
}
public override bool CanNavigateTo()
{
return false;
}
public override bool TryNavigateTo()
{
return false;
}
} }
} }
...@@ -348,12 +360,12 @@ internal static class DefinitionItemExtensions ...@@ -348,12 +360,12 @@ internal static class DefinitionItemExtensions
var firstSourceReferenceLocation = referencedSymbol.Locations.FirstOrDefault(); var firstSourceReferenceLocation = referencedSymbol.Locations.FirstOrDefault();
if (firstSourceReferenceLocation != null) if (firstSourceReferenceLocation != null)
{ {
result.Add(new SymbolDefinitionLocation( result.Add(DefinitionLocation.CreateForSymbol(
definition, firstSourceReferenceLocation.Document.Project)); definition, firstSourceReferenceLocation.Document.Project));
} }
else else
{ {
result.Add(NonNavigableDefinitionLocation.Instance); result.Add(DefinitionLocation.NonNavigatingInstance);
} }
} }
else if (location.IsInSource) else if (location.IsInSource)
...@@ -364,7 +376,7 @@ internal static class DefinitionItemExtensions ...@@ -364,7 +376,7 @@ internal static class DefinitionItemExtensions
var documentLocation = new DocumentLocation(document, location.SourceSpan); var documentLocation = new DocumentLocation(document, location.SourceSpan);
if (documentLocation.CanNavigateTo()) if (documentLocation.CanNavigateTo())
{ {
result.Add(new DocumentDefinitionLocation(documentLocation)); result.Add(DefinitionLocation.CreateForDocumentLocation(documentLocation));
} }
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册