提交 af4996d8 编写于 作者: J Jason Malinowski

Introduce an interface IProjectCodeModel for ProjectCodeModel

This interface is able to live in our ServicesVisualStudio project
and that's what the project systems are able to interact with. This
makes the API more like an "optional service" that they can create.
Down the road, we can just have an IProjectCodeModelFactory that
keeps the implementation entirely separated out.
上级 112054c7
......@@ -8,9 +8,9 @@ namespace Microsoft.VisualStudio.LanguageServices.CSharp.ProjectSystemShim
{
internal partial class CSharpProjectShimWithServices : IProjectCodeModelProvider
{
private ProjectCodeModel _projectCodeModel;
private IProjectCodeModel _projectCodeModel;
public ProjectCodeModel ProjectCodeModel
public IProjectCodeModel ProjectCodeModel
{
get
{
......@@ -47,7 +47,7 @@ public override int CreateCodeModel(object parent, out EnvDTE.CodeModel codeMode
public override int CreateFileCodeModel(string fileName, object parent, out EnvDTE.FileCodeModel ppFileCodeModel)
{
ppFileCodeModel = ProjectCodeModel.GetOrCreateFileCodeModel(fileName, parent).Handle;
ppFileCodeModel = ProjectCodeModel.GetOrCreateFileCodeModel(fileName, parent);
return VSConstants.S_OK;
}
}
......
using EnvDTE;
using EnvDTE80;
using Microsoft.VisualStudio.LanguageServices.Implementation.Interop;
namespace Microsoft.VisualStudio.LanguageServices.Implementation.CodeModel
{
internal interface IProjectCodeModel
{
EnvDTE.FileCodeModel GetOrCreateFileCodeModel(string filePath);
EnvDTE.FileCodeModel GetOrCreateFileCodeModel(string filePath, object parent);
EnvDTE.CodeModel GetOrCreateRootCodeModel(Project parent);
void OnSourceFileRemoved(string fileName);
void OnSourceFileRenaming(string filePath, string newFilePath);
void OnProjectClosed();
}
}
......@@ -89,7 +89,7 @@ public void FireEvents(DocumentId documentId, CancellationToken cancellationToke
return false;
}
if (!codeModelProvider.ProjectCodeModel.TryGetCachedFileCodeModel(filename, out var fileCodeModelHandle))
if (!((ProjectCodeModel)codeModelProvider.ProjectCodeModel).TryGetCachedFileCodeModel(filename, out var fileCodeModelHandle))
{
return false;
}
......
......@@ -63,7 +63,7 @@ public bool FireEvents()
return needMoreTime;
}
if (!provider.ProjectCodeModel.TryGetCachedFileCodeModel(this.Workspace.GetFilePath(GetDocumentId()), out var fileCodeModelHandle))
if (!((ProjectCodeModel)provider.ProjectCodeModel).TryGetCachedFileCodeModel(this.Workspace.GetFilePath(GetDocumentId()), out var fileCodeModelHandle))
{
return needMoreTime;
}
......
......@@ -4,6 +4,6 @@ namespace Microsoft.VisualStudio.LanguageServices.Implementation.CodeModel
{
internal interface IProjectCodeModelProvider
{
ProjectCodeModel ProjectCodeModel { get; }
IProjectCodeModel ProjectCodeModel { get; }
}
}
......@@ -19,7 +19,7 @@ public void AddProject(AbstractProject project)
{
if (project is IProjectCodeModelProvider provider)
{
var fcms = provider.ProjectCodeModel.GetCachedFileCodeModelInstances();
var fcms = ((ProjectCodeModel)provider.ProjectCodeModel).GetCachedFileCodeModelInstances();
foreach (var fcm in fcms)
{
......
......@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using EnvDTE;
using Microsoft.CodeAnalysis;
using Microsoft.VisualStudio.LanguageServices.Implementation.Interop;
using Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem;
......@@ -12,7 +13,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Implementation.CodeModel
/// <summary>
/// The root type that is held by a project to provide CodeModel support.
/// </summary>
internal sealed class ProjectCodeModel
internal sealed class ProjectCodeModel : IProjectCodeModel
{
private readonly NonReentrantLock _guard = new NonReentrantLock();
private readonly ProjectId _projectId;
......@@ -30,7 +31,7 @@ public ProjectCodeModel(ProjectId projectId, ICodeModelInstanceFactory codeModel
_serviceProvider = serviceProvider;
}
internal void OnProjectClosed()
public void OnProjectClosed()
{
_codeModelCache?.OnProjectClosed();
}
......@@ -65,12 +66,12 @@ private CodeModelProjectCache GetCodeModelCache()
}
}
public IEnumerable<ComHandle<EnvDTE80.FileCodeModel2, FileCodeModel>> GetCachedFileCodeModelInstances()
internal IEnumerable<ComHandle<EnvDTE80.FileCodeModel2, FileCodeModel>> GetCachedFileCodeModelInstances()
{
return GetCodeModelCache().GetFileCodeModelInstances();
}
public bool TryGetCachedFileCodeModel(string fileName, out ComHandle<EnvDTE80.FileCodeModel2, FileCodeModel> fileCodeModelHandle)
internal bool TryGetCachedFileCodeModel(string fileName, out ComHandle<EnvDTE80.FileCodeModel2, FileCodeModel> fileCodeModelHandle)
{
var handle = GetCodeModelCache()?.GetComHandleForFileCodeModel(fileName);
......@@ -109,5 +110,15 @@ public void OnSourceFileRenaming(string filePath, string newFilePath)
{
GetCodeModelCache().OnSourceFileRenaming(filePath, newFilePath);
}
EnvDTE.FileCodeModel IProjectCodeModel.GetOrCreateFileCodeModel(string filePath)
{
return this.GetOrCreateFileCodeModel(filePath).Handle;
}
EnvDTE.FileCodeModel IProjectCodeModel.GetOrCreateFileCodeModel(string filePath, object parent)
{
return this.GetOrCreateFileCodeModel(filePath, parent).Handle;
}
}
}
......@@ -81,7 +81,7 @@ private Compilation GetCompilation()
}
var hostProject = ((VisualStudioWorkspaceImpl)Workspace).DeferredState.ProjectTracker.GetProject(_projectId);
var projectCodeModel = ((IProjectCodeModelProvider)hostProject).ProjectCodeModel;
var projectCodeModel = (ProjectCodeModel)((IProjectCodeModelProvider)hostProject).ProjectCodeModel;
return projectCodeModel.GetOrCreateFileCodeModel(absoluteFilePath);
}
......
......@@ -9,9 +9,9 @@ namespace Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem.C
{
internal sealed partial class CPSProject : IProjectCodeModelProvider
{
private ProjectCodeModel _projectCodeModel;
private IProjectCodeModel _projectCodeModel;
public ProjectCodeModel ProjectCodeModel
public IProjectCodeModel ProjectCodeModel
{
get
{
......@@ -44,7 +44,7 @@ public EnvDTE.FileCodeModel GetFileCodeModel(EnvDTE.ProjectItem item)
return null;
}
return ProjectCodeModel.GetOrCreateFileCodeModel(filePath, item).Handle;
return ProjectCodeModel.GetOrCreateFileCodeModel(filePath, item);
}
private class CPSCodeModelInstanceFactory : ICodeModelInstanceFactory
......@@ -64,7 +64,7 @@ EnvDTE.FileCodeModel ICodeModelInstanceFactory.TryCreateFileCodeModelThroughProj
return null;
}
return _project.ProjectCodeModel.GetOrCreateFileCodeModel(filePath, projectItem).Handle;
return _project.ProjectCodeModel.GetOrCreateFileCodeModel(filePath, projectItem);
}
private EnvDTE.ProjectItem GetProjectItem(string filePath)
......
......@@ -70,7 +70,7 @@ public override EnvDTE.FileCodeModel GetFileCodeModel(DocumentId documentId)
if (project is IProjectCodeModelProvider provider)
{
var projectCodeModel = provider.ProjectCodeModel;
return projectCodeModel.GetOrCreateFileCodeModel(document.FilePath).Handle;
return projectCodeModel.GetOrCreateFileCodeModel(document.FilePath);
}
return null;
......
......@@ -7,9 +7,9 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.ProjectSystemShim
Partial Friend Class VisualBasicProjectShimWithServices
Implements IProjectCodeModelProvider
Private _projectCodeModel As ProjectCodeModel
Private _projectCodeModel As IProjectCodeModel
Public ReadOnly Property ProjectCodeModel As ProjectCodeModel Implements IProjectCodeModelProvider.ProjectCodeModel
Public ReadOnly Property ProjectCodeModel As IProjectCodeModel Implements IProjectCodeModelProvider.ProjectCodeModel
Get
LazyInitialization.EnsureInitialized(_projectCodeModel, Function() New ProjectCodeModel(Me.Id, New VisualBasicCodeModelInstanceFactory(Me), DirectCast(Me.Workspace, VisualStudioWorkspaceImpl), ServiceProvider))
Return _projectCodeModel
......@@ -29,7 +29,7 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.ProjectSystemShim
Dim fileName = pProjectItem.FileNames(1)
If Not String.IsNullOrWhiteSpace(fileName) Then
ppFileCodeModel = ProjectCodeModel.GetOrCreateFileCodeModel(fileName, pProjectItem).Handle
ppFileCodeModel = ProjectCodeModel.GetOrCreateFileCodeModel(fileName, pProjectItem)
Return VSConstants.S_OK
End If
End If
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册