diff --git a/src/VisualStudio/Core/Def/Implementation/ProjectSystem/AbstractProject.cs b/src/VisualStudio/Core/Def/Implementation/ProjectSystem/AbstractProject.cs index e31b7dc639f34849365cfa9ba2c4dfc209fff9b1..f279a9a93bf3147e7e104753b2d57b3582dd80bf 100644 --- a/src/VisualStudio/Core/Def/Implementation/ProjectSystem/AbstractProject.cs +++ b/src/VisualStudio/Core/Def/Implementation/ProjectSystem/AbstractProject.cs @@ -122,7 +122,10 @@ internal abstract partial class AbstractProject : ForegroundThreadAffinitizedObj ContentTypeRegistryService = componentModel.GetService(); this.RunningDocumentTable = (IVsRunningDocumentTable4)serviceProvider.GetService(typeof(SVsRunningDocumentTable)); - this.DisplayName = projectSystemName; + + var displayName = hierarchy != null && hierarchy.TryGetName(out var name) ? name : projectSystemName; + this.DisplayName = displayName; + this.ProjectTracker = projectTracker; ProjectSystemName = projectSystemName; @@ -133,7 +136,7 @@ internal abstract partial class AbstractProject : ForegroundThreadAffinitizedObj // Set the default value for last design time build result to be true, until the project system lets us know that it failed. LastDesignTimeBuildSucceeded = true; - UpdateProjectDisplayNameAndFilePath(projectSystemName, projectFilePath); + UpdateProjectDisplayNameAndFilePath(displayName, projectFilePath); if (ProjectFilePath != null) { diff --git a/src/VisualStudio/Core/Def/Implementation/ProjectSystem/IVisualStudioHostProject.cs b/src/VisualStudio/Core/Def/Implementation/ProjectSystem/IVisualStudioHostProject.cs index c6636e01da7e4c4497ec2a85f073863a70c2dd50..1b926ffe47480abfd511ccfc79367b965ec62962 100644 --- a/src/VisualStudio/Core/Def/Implementation/ProjectSystem/IVisualStudioHostProject.cs +++ b/src/VisualStudio/Core/Def/Implementation/ProjectSystem/IVisualStudioHostProject.cs @@ -22,6 +22,21 @@ internal interface IVisualStudioHostProject Guid Guid { get; } Workspace Workspace { get; } + + /// + /// The public display name of the project. This name is not unique and may be shared + /// between multiple projects, especially in cases like Venus where the intellisense + /// projects will match the name of their logical parent project. + /// + string DisplayName { get; } + + /// + /// The name of the project according to the project system. In "regular" projects this is + /// equivalent to , but in Venus cases these will differ. The + /// ProjectSystemName is the 2_Default.aspx project name, whereas the regular display name + /// matches the display name of the project the user actually sees in the solution explorer. + /// These can be assumed to be unique within the Visual Studio workspace. + /// string ProjectSystemName { get; } IVisualStudioHostDocument GetDocumentOrAdditionalDocument(DocumentId id); diff --git a/src/VisualStudio/Core/Def/Implementation/ProjectSystem/MiscellaneousFilesWorkspace.HostProject.cs b/src/VisualStudio/Core/Def/Implementation/ProjectSystem/MiscellaneousFilesWorkspace.HostProject.cs index f5194821d8d625fa3dd1e56b6eb3609d4e166139..8ccf76d95fc450a67f2b164832851e10a0fea6fb 100644 --- a/src/VisualStudio/Core/Def/Implementation/ProjectSystem/MiscellaneousFilesWorkspace.HostProject.cs +++ b/src/VisualStudio/Core/Def/Implementation/ProjectSystem/MiscellaneousFilesWorkspace.HostProject.cs @@ -77,7 +77,8 @@ public ProjectInfo CreateProjectInfoForCurrentState() public Workspace Workspace => _workspace; - public string ProjectSystemName => "MiscellaneousFiles"; + public string DisplayName => "MiscellaneousFiles"; + public string ProjectSystemName => DisplayName; public IVisualStudioHostDocument GetDocumentOrAdditionalDocument(DocumentId id) { diff --git a/src/VisualStudio/Core/Next/FindReferences/Contexts/AbstractTableDataSourceFindUsagesContext.cs b/src/VisualStudio/Core/Next/FindReferences/Contexts/AbstractTableDataSourceFindUsagesContext.cs index cb8aafcdb786814efe17f79d0fe5094c3f24fef2..efc411f7e6c1176af60ab978b415cca239705563 100644 --- a/src/VisualStudio/Core/Next/FindReferences/Contexts/AbstractTableDataSourceFindUsagesContext.cs +++ b/src/VisualStudio/Core/Next/FindReferences/Contexts/AbstractTableDataSourceFindUsagesContext.cs @@ -245,7 +245,7 @@ public sealed override Task OnDefinitionFoundAsync(DefinitionItem definition) protected abstract Task OnDefinitionFoundWorkerAsync(DefinitionItem definition); - protected async Task<(Guid, SourceText)> GetGuidAndSourceTextAsync(Document document) + protected async Task<(Guid, string projectName, SourceText)> GetGuidAndProjectNameAndSourceTextAsync(Document document) { // The FAR system needs to know the guid for the project that a def/reference is // from (to support features like filtering). Normally that would mean we could @@ -254,10 +254,13 @@ protected async Task<(Guid, SourceText)> GetGuidAndSourceTextAsync(Document docu // when we have another type of workspace. This means we will show results, but // certain features (like filtering) may not work in that context. var workspace = document.Project.Solution.Workspace as VisualStudioWorkspaceImpl; - var guid = workspace?.GetHostProject(document.Project.Id)?.Guid ?? Guid.Empty; + var hostProject = workspace?.GetHostProject(document.Project.Id); + + var projectName = hostProject?.DisplayName ?? document.Project.Name; + var guid = hostProject?.Guid ?? Guid.Empty; var sourceText = await document.GetTextAsync(CancellationToken).ConfigureAwait(false); - return (guid, sourceText); + return (guid, projectName, sourceText); } protected async Task CreateDocumentSpanEntryAsync( @@ -266,7 +269,7 @@ protected async Task<(Guid, SourceText)> GetGuidAndSourceTextAsync(Document docu HighlightSpanKind spanKind) { var document = documentSpan.Document; - var (guid, sourceText) = await GetGuidAndSourceTextAsync(document).ConfigureAwait(false); + var (guid, projectName, sourceText) = await GetGuidAndProjectNameAndSourceTextAsync(document).ConfigureAwait(false); var narrowSpan = documentSpan.SourceSpan; var lineSpan = GetLineSpanForReference(sourceText, narrowSpan); @@ -275,7 +278,7 @@ protected async Task<(Guid, SourceText)> GetGuidAndSourceTextAsync(Document docu return new DocumentSpanEntry( this, definitionBucket, documentSpan, spanKind, - guid, sourceText, taggedLineParts); + projectName, guid, sourceText, taggedLineParts); } private TextSpan GetLineSpanForReference(SourceText sourceText, TextSpan referenceSpan) diff --git a/src/VisualStudio/Core/Next/FindReferences/Contexts/WithoutReferencesFindUsagesContext.cs b/src/VisualStudio/Core/Next/FindReferences/Contexts/WithoutReferencesFindUsagesContext.cs index 2d6a2535678e73ca03b02d9dd1be85d04c53d014..5a5f6a2b02bf84098c0f8c7447c519431c41fff9 100644 --- a/src/VisualStudio/Core/Next/FindReferences/Contexts/WithoutReferencesFindUsagesContext.cs +++ b/src/VisualStudio/Core/Next/FindReferences/Contexts/WithoutReferencesFindUsagesContext.cs @@ -81,9 +81,9 @@ protected override async Task OnDefinitionFoundWorkerAsync(DefinitionItem defini RoslynDefinitionBucket definitionBucket, DefinitionItem definition) { var documentSpan = definition.SourceSpans[0]; - var (guid, sourceText) = await GetGuidAndSourceTextAsync(documentSpan.Document).ConfigureAwait(false); + var (guid, projectName, sourceText) = await GetGuidAndProjectNameAndSourceTextAsync(documentSpan.Document).ConfigureAwait(false); - return new DefinitionItemEntry(this, definitionBucket, documentSpan, guid, sourceText); + return new DefinitionItemEntry(this, definitionBucket, documentSpan, projectName, guid, sourceText); } } } diff --git a/src/VisualStudio/Core/Next/FindReferences/Entries/AbstractDocumentSpanEntry.cs b/src/VisualStudio/Core/Next/FindReferences/Entries/AbstractDocumentSpanEntry.cs index a3b94268b944c12f022e86c8eda719dd5aa52227..640e7f85ce2027ff689c49aa33624b97af3314da 100644 --- a/src/VisualStudio/Core/Next/FindReferences/Entries/AbstractDocumentSpanEntry.cs +++ b/src/VisualStudio/Core/Next/FindReferences/Entries/AbstractDocumentSpanEntry.cs @@ -24,6 +24,7 @@ private abstract class AbstractDocumentSpanEntry : Entry private readonly AbstractTableDataSourceFindUsagesContext _context; private readonly DocumentSpan _documentSpan; + private readonly string _projectName; private readonly object _boxedProjectGuid; protected readonly SourceText _sourceText; @@ -31,13 +32,14 @@ private abstract class AbstractDocumentSpanEntry : Entry AbstractTableDataSourceFindUsagesContext context, RoslynDefinitionBucket definitionBucket, DocumentSpan documentSpan, + string projectName, Guid projectGuid, SourceText sourceText) : base(definitionBucket) { _context = context; - _documentSpan = documentSpan; + _projectName = projectName; _boxedProjectGuid = projectGuid; _sourceText = sourceText; } @@ -58,7 +60,7 @@ protected override object GetValueWorker(string keyName) case StandardTableKeyNames.Column: return _sourceText.Lines.GetLinePosition(SourceSpan.Start).Character; case StandardTableKeyNames.ProjectName: - return Document.Project.Name; + return _projectName; case StandardTableKeyNames.ProjectGuid: return _boxedProjectGuid; case StandardTableKeyNames.Text: diff --git a/src/VisualStudio/Core/Next/FindReferences/Entries/DefinitionItemEntry.cs b/src/VisualStudio/Core/Next/FindReferences/Entries/DefinitionItemEntry.cs index db2aaf821970014ab400282405c0c849096d69cd..eea78ee74a8a6f0853e9ed4c9971ec5d2ea3d3ba 100644 --- a/src/VisualStudio/Core/Next/FindReferences/Entries/DefinitionItemEntry.cs +++ b/src/VisualStudio/Core/Next/FindReferences/Entries/DefinitionItemEntry.cs @@ -22,9 +22,10 @@ private class DefinitionItemEntry : AbstractDocumentSpanEntry AbstractTableDataSourceFindUsagesContext context, RoslynDefinitionBucket definitionBucket, DocumentSpan documentSpan, + string documentName, Guid projectGuid, SourceText sourceText) - : base(context, definitionBucket, documentSpan, projectGuid, sourceText) + : base(context, definitionBucket, documentSpan, documentName, projectGuid, sourceText) { } diff --git a/src/VisualStudio/Core/Next/FindReferences/Entries/DocumentSpanEntry.cs b/src/VisualStudio/Core/Next/FindReferences/Entries/DocumentSpanEntry.cs index 01bf7ceafb8dd86567761480876003c6ceda0ad8..1293153a2734efa24327b356079e1c041ed2c0c1 100644 --- a/src/VisualStudio/Core/Next/FindReferences/Entries/DocumentSpanEntry.cs +++ b/src/VisualStudio/Core/Next/FindReferences/Entries/DocumentSpanEntry.cs @@ -39,10 +39,11 @@ private class DocumentSpanEntry : AbstractDocumentSpanEntry RoslynDefinitionBucket definitionBucket, DocumentSpan documentSpan, HighlightSpanKind spanKind, + string documentName, Guid projectGuid, SourceText sourceText, ClassifiedSpansAndHighlightSpan classifiedSpans) - : base(context, definitionBucket, documentSpan, projectGuid, sourceText) + : base(context, definitionBucket, documentSpan, documentName, projectGuid, sourceText) { _spanKind = spanKind; _classifiedSpansAndHighlights = classifiedSpans;