提交 d0ea0869 编写于 作者: T TomasMatousek

Decouple Workspace metadata provider from compiler metadata provider.

The service no longer derives directly from MetadataReferenceProvider. Instead the service exposes API to get metadata references and an instance of compiler reference provider. (changeset 1349108)
上级 4cbd636d
......@@ -23,9 +23,9 @@ internal partial class CSharpProjectFileLoader : ProjectFileLoader
{
private class CSharpProjectFile : ProjectFile
{
private readonly IMetadataReferenceProviderService metadataService;
private readonly IMetadataService metadataService;
public CSharpProjectFile(CSharpProjectFileLoader loader, MSB.Evaluation.Project project, IMetadataReferenceProviderService metadataService)
public CSharpProjectFile(CSharpProjectFileLoader loader, MSB.Evaluation.Project project, IMetadataService metadataService)
: base(loader, project)
{
this.metadataService = metadataService;
......@@ -33,7 +33,7 @@ public CSharpProjectFile(CSharpProjectFileLoader loader, MSB.Evaluation.Project
public override SourceCodeKind GetSourceCodeKind(string documentFileName)
{
return documentFileName.EndsWith(".csx", System.StringComparison.OrdinalIgnoreCase)
return documentFileName.EndsWith(".csx", StringComparison.OrdinalIgnoreCase)
? SourceCodeKind.Script
: SourceCodeKind.Regular;
}
......
......@@ -25,7 +25,7 @@ public override string Language
protected override ProjectFile CreateProjectFile(MSB.Evaluation.Project loadedProject)
{
return new CSharpProjectFile(this, loadedProject, this.workspaceServices.GetService<IMetadataReferenceProviderService>());
return new CSharpProjectFile(this, loadedProject, this.workspaceServices.GetService<IMetadataService>());
}
}
}
\ No newline at end of file
......@@ -34,7 +34,7 @@ public static ProjectInfo CreateProjectInfo(Workspace workspace, string projectN
// TODO (tomat): to match csc.exe/vbc.exe we should use CommonCommandLineCompiler.ExistingReferencesResolver to deal with #r's
var referenceResolver = new MetadataFileReferenceResolver(commandLineArguments.ReferencePaths, commandLineArguments.BaseDirectory);
var referenceProvider = workspace.Services.GetService<IMetadataReferenceProviderService>().GetProvider();
var referenceProvider = workspace.Services.GetService<IMetadataService>().GetProvider();
var xmlFileResolver = new XmlFileResolver(commandLineArguments.BaseDirectory);
var strongNameProvider = new DesktopStrongNameProvider(commandLineArguments.KeyFileSearchPaths);
......
......@@ -2,8 +2,9 @@
namespace Microsoft.CodeAnalysis.Host
{
internal interface IMetadataReferenceProviderService : IWorkspaceService
internal interface IMetadataService : IWorkspaceService
{
PortableExecutableReference GetReference(string resolvedPath, MetadataReferenceProperties properties);
MetadataReferenceProvider GetProvider();
}
}
// Copyright (c) Microsoft Open Technologies, Inc. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.CodeAnalysis;
using System.Diagnostics;
using Microsoft.CodeAnalysis.Host.Mef;
namespace Microsoft.CodeAnalysis.Host
{
[ExportWorkspaceServiceFactory(typeof(IMetadataReferenceProviderService), ServiceLayer.Default)]
internal sealed class MetadataReferenceProviderServiceFactory : IWorkspaceServiceFactory
[ExportWorkspaceServiceFactory(typeof(IMetadataService), ServiceLayer.Default)]
internal sealed class MetadataServiceFactory : IWorkspaceServiceFactory
{
public IWorkspaceService CreateService(HostWorkspaceServices workspaceServices)
{
return new MetadataReferenceProviderService(workspaceServices);
return new Service(workspaceServices.GetService<IDocumentationProviderService>());
}
private sealed class MetadataReferenceProviderService : IMetadataReferenceProviderService
private sealed class Service : IMetadataService
{
private readonly HostWorkspaceServices workspaceServices;
private readonly IDocumentationProviderService documentationService;
private readonly Provider provider;
public MetadataReferenceProviderService(HostWorkspaceServices workspaceServices)
public Service(IDocumentationProviderService documentationService)
{
this.workspaceServices = workspaceServices;
this.documentationService = documentationService;
this.provider = new Provider(this);
}
public MetadataReferenceProvider GetProvider()
{
return new Provider(this.workspaceServices.GetService<IDocumentationProviderService>());
return provider;
}
public PortableExecutableReference GetReference(string resolvedPath, MetadataReferenceProperties properties)
{
return MetadataReference.CreateFromFile(resolvedPath, properties, this.documentationService.GetDocumentationProvider(resolvedPath));
}
}
private sealed class Provider : MetadataReferenceProvider
{
private readonly IDocumentationProviderService documentationService;
private readonly Service service;
public Provider(IDocumentationProviderService documentationService)
internal Provider(Service service)
{
this.documentationService = documentationService;
}
Debug.Assert(service != null);
this.service = service;
}
public override PortableExecutableReference GetReference(string resolvedPath, MetadataReferenceProperties properties)
{
return MetadataReference.CreateFromFile(resolvedPath, properties, this.documentationService.GetDocumentationProvider(resolvedPath));
return service.GetReference(resolvedPath, properties);
}
}
}
......
......@@ -854,9 +854,8 @@ private async Task<MetadataReference> GetProjectMetadata(string projectFilePath,
}
else
{
var metadataService = this.Services.GetService<IMetadataReferenceProviderService>();
var provider = metadataService.GetProvider();
return provider.GetReference(outputFilePath, new MetadataReferenceProperties(MetadataImageKind.Assembly, aliases));
var metadataService = this.Services.GetService<IMetadataService>();
return metadataService.GetReference(outputFilePath, new MetadataReferenceProperties(MetadataImageKind.Assembly, aliases));
}
}
......
......@@ -15,7 +15,7 @@ internal partial class SolutionServices
internal readonly ITextFactoryService TextFactory;
internal readonly ITextCacheService TextCache;
internal readonly ICompilationCacheService CompilationCacheService;
internal readonly IMetadataReferenceProviderService MetadataReferenceProviderService;
internal readonly IMetadataService MetadataService;
public SolutionServices(Workspace workspace)
{
......@@ -24,7 +24,7 @@ public SolutionServices(Workspace workspace)
this.TextFactory = workspace.Services.GetService<ITextFactoryService>();
this.TextCache = workspace.Services.GetService<ITextCacheService>();
this.CompilationCacheService = workspace.Services.GetService<ICompilationCacheService>();
this.MetadataReferenceProviderService = workspace.Services.GetService<IMetadataReferenceProviderService>();
this.MetadataService = workspace.Services.GetService<IMetadataService>();
}
}
}
......@@ -821,8 +821,8 @@
<Compile Include="Workspace\Host\HostLanguageServices.cs" />
<Compile Include="Workspace\Host\HostServices.cs" />
<Compile Include="Workspace\Host\Mef\MefHostServices.cs" />
<Compile Include="Workspace\Host\Metadata\MetadataReferenceProviderServiceFactory.cs" />
<Compile Include="Workspace\Host\Metadata\IMetadataReferenceProviderService.cs" />
<Compile Include="Workspace\Host\Metadata\MetadataServiceFactory.cs" />
<Compile Include="Workspace\Host\Metadata\IMetadataService.cs" />
<Compile Include="Workspace\Host\PersistentStorage\AbstractPersistentStorage.cs" />
<Compile Include="Workspace\Host\PersistentStorage\IPersistentStorage.cs" />
<Compile Include="Workspace\Host\PersistentStorage\IPersistentStorageService.cs" />
......
......@@ -27,17 +27,17 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End Property
Protected Overrides Function CreateProjectFile(loadedProject As MSB.Evaluation.Project) As ProjectFile
Return New VisualBasicProjectFile(Me, loadedProject, Me._workspaceServices.GetService(Of IMetadataReferenceProviderService))
Return New VisualBasicProjectFile(Me, loadedProject, Me._workspaceServices.GetService(Of IMetadataService))
End Function
Friend Class VisualBasicProjectFile
Inherits ProjectFile
Private _metadataService As IMetadataReferenceProviderService
Private _metadataService As IMetadataService
Public Sub New(loader As VisualBasicProjectFileLoader, loadedProject As MSB.Evaluation.Project, metadataServices As IMetadataReferenceProviderService)
Public Sub New(loader As VisualBasicProjectFileLoader, loadedProject As MSB.Evaluation.Project, metadataService As IMetadataService)
MyBase.New(loader, loadedProject)
Me._metadataService = metadataServices
Me._metadataService = metadataService
End Sub
Public Overrides Function GetSourceCodeKind(documentFileName As String) As SourceCodeKind
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册