From f313f4ba171b544ba59cc40e890ee2f6c4f56f73 Mon Sep 17 00:00:00 2001 From: TomasMatousek Date: Tue, 10 Jun 2014 17:00:37 -0700 Subject: [PATCH] Move facade references resolution to MetadataReferenceProvider and override it in desktop implementation (MetadataFileReferenceProvider). (changeset 1275410) --- .../Compilation/ReferenceManagerTests.cs | 6 ++-- .../MetadataReferenceProvider.cs | 10 ++++-- .../MetadataFileReferenceProvider.cs | 30 +++++++++++++++++ .../CommonReferenceManager.Resolution.cs | 32 +++---------------- ...MetadataReferenceProviderServiceFactory.cs | 3 +- 5 files changed, 48 insertions(+), 33 deletions(-) diff --git a/Src/Compilers/CSharp/Test/Symbol/Compilation/ReferenceManagerTests.cs b/Src/Compilers/CSharp/Test/Symbol/Compilation/ReferenceManagerTests.cs index 4df575912c4..67ae0636a49 100644 --- a/Src/Compilers/CSharp/Test/Symbol/Compilation/ReferenceManagerTests.cs +++ b/Src/Compilers/CSharp/Test/Symbol/Compilation/ReferenceManagerTests.cs @@ -1910,7 +1910,7 @@ internal class C } [Fact] - [WorkItem(531342, "DevDiv")] + [WorkItem(531342, "DevDiv"), WorkItem(727122, "DevDiv")] public void PortableLibrary() { var mscorlibPP7 = new MetadataImageReference(ProprietaryTestResources.NetFX.ReferenceAssemblies_PortableProfile7.mscorlib, display: "mscorlib, PP7"); @@ -1932,7 +1932,7 @@ public void PortableLibrary() // w/o facades: - var main = CreateCompilation(mainSource, mainRefs); + var main = CreateCompilation(mainSource, mainRefs, compOptions: TestOptions.Dll.WithMetadataReferenceProvider(MetadataFileReferenceProvider.Default)); main.VerifyDiagnostics( // (1,18): error CS0012: The type 'System.Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. Diagnostic(ErrorCode.ERR_NoTypeDef, "C").WithArguments("System.Object", "System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")); @@ -1947,7 +1947,7 @@ public void PortableLibrary() var facades = dir.CreateDirectory("Facades"); var systemRuntimeFacade = facades.CreateFile("System.Runtime.dll").WriteAllBytes(ProprietaryTestResources.NetFX.ReferenceAssemblies_V45_Facades.System_Runtime); - main = CreateCompilation(mainSource, mainRefs); + main = CreateCompilation(mainSource, mainRefs, compOptions: TestOptions.Dll.WithMetadataReferenceProvider(MetadataFileReferenceProvider.Default)); main.VerifyDiagnostics(); var expectedReferences = new string[] diff --git a/Src/Compilers/Core/Source/MetadataReference/MetadataReferenceProvider.cs b/Src/Compilers/Core/Source/MetadataReference/MetadataReferenceProvider.cs index fa6b8e4f21e..08ea9ae2820 100644 --- a/Src/Compilers/Core/Source/MetadataReference/MetadataReferenceProvider.cs +++ b/Src/Compilers/Core/Source/MetadataReference/MetadataReferenceProvider.cs @@ -1,7 +1,7 @@ // 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.IO; -using Microsoft.CodeAnalysis.Text; +using System.Collections.Generic; +using Roslyn.Utilities; namespace Microsoft.CodeAnalysis { @@ -26,5 +26,11 @@ protected MetadataReferenceProvider() /// A corresponding to the and /// parameters. public abstract PortableExecutableReference GetReference(string resolvedPath, MetadataReferenceProperties properties); + + // TODO: workaround for bug #797360; remove + internal virtual IEnumerable GetFacadeReferences(string mscorlibPath) + { + return SpecializedCollections.EmptyEnumerable(); + } } } diff --git a/Src/Compilers/Core/Source/NonPortable/MetadataFileReferenceProvider.cs b/Src/Compilers/Core/Source/NonPortable/MetadataFileReferenceProvider.cs index 91ac6a5f158..192bfe6ec33 100644 --- a/Src/Compilers/Core/Source/NonPortable/MetadataFileReferenceProvider.cs +++ b/Src/Compilers/Core/Source/NonPortable/MetadataFileReferenceProvider.cs @@ -1,5 +1,9 @@ // 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.Collections.Generic; +using System.IO; +using Roslyn.Utilities; + namespace Microsoft.CodeAnalysis { /// @@ -24,5 +28,31 @@ public override PortableExecutableReference GetReference(string resolvedPath, Me { return new MetadataFileReference(resolvedPath, properties); } + + // TODO: workaround for bug #797360; remove + internal override IEnumerable GetFacadeReferences(string mscorlibPath) + { + string facadesDirectory = PathUtilities.CombineAbsoluteAndRelativePaths(PathUtilities.GetDirectoryName(mscorlibPath), @"Facades"); + string[] files; + + if (!Directory.Exists(facadesDirectory)) + { + yield break; + } + + try + { + files = Directory.GetFiles(facadesDirectory, "*.dll", SearchOption.TopDirectoryOnly); + } + catch + { + yield break; + } + + foreach (string file in files) + { + yield return new MetadataFileReference(file, MetadataReferenceProperties.Assembly); + } + } } } diff --git a/Src/Compilers/Core/Source/ReferenceManager/CommonReferenceManager.Resolution.cs b/Src/Compilers/Core/Source/ReferenceManager/CommonReferenceManager.Resolution.cs index 6766adea76e..ba2fd0edd25 100644 --- a/Src/Compilers/Core/Source/ReferenceManager/CommonReferenceManager.Resolution.cs +++ b/Src/Compilers/Core/Source/ReferenceManager/CommonReferenceManager.Resolution.cs @@ -692,7 +692,10 @@ private static void AddModule(PEModule module, int referenceIndex, ResolvedRefer } // Workaround for bug #797360: include facades if we reference a Portable Library: - referencesBuilder.AddRange(ResolveFacadeReferences(compilation)); + if (compilation.Options.MetadataReferenceProvider != null) + { + referencesBuilder.AddRange(ResolveFacadeReferences(compilation)); + } // add external reference at the end, so that they are processed first: referencesBuilder.AddRange(compilation.ExternalReferences); @@ -741,7 +744,7 @@ private IEnumerable ResolveFacadeReferences(TCompilation comp return SpecializedCollections.EmptyEnumerable(); } - return GetFacadeReferences(mscorlibPath); + return compilation.Options.MetadataReferenceProvider.GetFacadeReferences(mscorlibPath); } private bool DetectPortableDependency(CompilationReference compilationReference, ref bool referencesPortableLibrary) @@ -819,31 +822,6 @@ private static bool HasSystemRuntime(ImmutableArray identities return false; } - private static IEnumerable GetFacadeReferences(string mscorlibPath) - { - string facadesDirectory = PathUtilities.CombineAbsoluteAndRelativePaths(PathUtilities.GetDirectoryName(mscorlibPath), @"Facades"); - string[] files; - - if (!Directory.Exists(facadesDirectory)) - { - yield break; - } - - try - { - files = Directory.GetFiles(facadesDirectory, "*.dll", SearchOption.TopDirectoryOnly); - } - catch - { - yield break; - } - - foreach (string file in files) - { - yield return new MetadataFileReference(file, MetadataReferenceProperties.Assembly); - } - } - private static bool IsMscorlib(AssemblyIdentity identity) { return string.Equals(identity.Name, "mscorlib", StringComparison.Ordinal) && ByteSequenceComparer.Instance.Equals(identity.PublicKeyToken, MscorlibPublicKeyToken); diff --git a/Src/Workspaces/Core/Workspace/Host/Metadata/MetadataReferenceProviderServiceFactory.cs b/Src/Workspaces/Core/Workspace/Host/Metadata/MetadataReferenceProviderServiceFactory.cs index 9101301573d..69e90395f4f 100644 --- a/Src/Workspaces/Core/Workspace/Host/Metadata/MetadataReferenceProviderServiceFactory.cs +++ b/Src/Workspaces/Core/Workspace/Host/Metadata/MetadataReferenceProviderServiceFactory.cs @@ -29,7 +29,8 @@ public MetadataReferenceProvider GetProvider() } } - private sealed class Provider : MetadataReferenceProvider + // TODO: inherit directly from MetadataReferenceProvider when bug #797360 is fixed + private sealed class Provider : MetadataFileReferenceProvider { private readonly IDocumentationProviderService documentationService; -- GitLab