From c2ec8e34008cf9cbc1f1ab867fbaab915bcea48e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kato=20St=C3=B8len?= Date: Wed, 14 Oct 2020 08:26:56 +0200 Subject: [PATCH] Add API for loading specific nuget.config in ReferenceAssemblies This opt-in feature enables use of a specific nuget.config file in analyzer tests, instead of machine and user wide settings. When specifying a path to a nuget.config file, only that file is loaded. Closes: #551 --- .../PublicAPI.Unshipped.txt | 4 +++- .../ReferenceAssemblies.cs | 21 ++++++++++++------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/PublicAPI.Unshipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/PublicAPI.Unshipped.txt index 2364f2925..a7830f59b 100644 --- a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/PublicAPI.Unshipped.txt +++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/PublicAPI.Unshipped.txt @@ -307,4 +307,6 @@ virtual Microsoft.CodeAnalysis.Testing.DefaultVerifier.LanguageIsSupported(strin virtual Microsoft.CodeAnalysis.Testing.DefaultVerifier.NotEmpty(string collectionName, System.Collections.Generic.IEnumerable collection) -> void virtual Microsoft.CodeAnalysis.Testing.DefaultVerifier.PushContext(string context) -> Microsoft.CodeAnalysis.Testing.IVerifier virtual Microsoft.CodeAnalysis.Testing.DefaultVerifier.SequenceEqual(System.Collections.Generic.IEnumerable expected, System.Collections.Generic.IEnumerable actual, System.Collections.Generic.IEqualityComparer equalityComparer = null, string message = null) -> void -virtual Microsoft.CodeAnalysis.Testing.DefaultVerifier.True(bool assert, string message = null) -> void \ No newline at end of file +virtual Microsoft.CodeAnalysis.Testing.DefaultVerifier.True(bool assert, string message = null) -> void +Microsoft.CodeAnalysis.Testing.ReferenceAssemblies.NuGetConfigFilePath.get -> string +Microsoft.CodeAnalysis.Testing.ReferenceAssemblies.WithNuGetConfigFilePath(string nugetConfigFilePath) -> Microsoft.CodeAnalysis.Testing.ReferenceAssemblies \ No newline at end of file diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/ReferenceAssemblies.cs b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/ReferenceAssemblies.cs index 558762f4e..4cc4d4c60 100644 --- a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/ReferenceAssemblies.cs +++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/ReferenceAssemblies.cs @@ -71,7 +71,8 @@ private ReferenceAssemblies( ImmutableArray assemblies, ImmutableArray facadeAssemblies, ImmutableDictionary> languageSpecificAssemblies, - ImmutableArray packages) + ImmutableArray packages, + string? nugetConfigFilePath) { TargetFramework = targetFramework; AssemblyIdentityComparer = assemblyIdentityComparer; @@ -81,6 +82,7 @@ private ReferenceAssemblies( FacadeAssemblies = facadeAssemblies.IsDefault ? ImmutableArray.Empty : facadeAssemblies; LanguageSpecificAssemblies = languageSpecificAssemblies; Packages = packages.IsDefault ? ImmutableArray.Empty : packages; + NuGetConfigFilePath = nugetConfigFilePath; } public static ReferenceAssemblies Default @@ -119,14 +121,16 @@ public static ReferenceAssemblies Default public ImmutableArray Packages { get; } + public string? NuGetConfigFilePath { get; } + public ReferenceAssemblies WithAssemblyIdentityComparer(AssemblyIdentityComparer assemblyIdentityComparer) - => new ReferenceAssemblies(TargetFramework, assemblyIdentityComparer, ReferenceAssemblyPackage, ReferenceAssemblyPath, Assemblies, FacadeAssemblies, LanguageSpecificAssemblies, Packages); + => new ReferenceAssemblies(TargetFramework, assemblyIdentityComparer, ReferenceAssemblyPackage, ReferenceAssemblyPath, Assemblies, FacadeAssemblies, LanguageSpecificAssemblies, Packages, NuGetConfigFilePath); public ReferenceAssemblies WithAssemblies(ImmutableArray assemblies) - => new ReferenceAssemblies(TargetFramework, AssemblyIdentityComparer, ReferenceAssemblyPackage, ReferenceAssemblyPath, assemblies, FacadeAssemblies, LanguageSpecificAssemblies, Packages); + => new ReferenceAssemblies(TargetFramework, AssemblyIdentityComparer, ReferenceAssemblyPackage, ReferenceAssemblyPath, assemblies, FacadeAssemblies, LanguageSpecificAssemblies, Packages, NuGetConfigFilePath); public ReferenceAssemblies WithFacadeAssemblies(ImmutableArray facadeAssemblies) - => new ReferenceAssemblies(TargetFramework, AssemblyIdentityComparer, ReferenceAssemblyPackage, ReferenceAssemblyPath, Assemblies, facadeAssemblies, LanguageSpecificAssemblies, Packages); + => new ReferenceAssemblies(TargetFramework, AssemblyIdentityComparer, ReferenceAssemblyPackage, ReferenceAssemblyPath, Assemblies, facadeAssemblies, LanguageSpecificAssemblies, Packages, NuGetConfigFilePath); public ReferenceAssemblies AddAssemblies(ImmutableArray assemblies) => WithAssemblies(Assemblies.AddRange(assemblies)); @@ -135,7 +139,7 @@ public ReferenceAssemblies AddFacadeAssemblies(ImmutableArray facadeAsse => WithFacadeAssemblies(FacadeAssemblies.AddRange(facadeAssemblies)); public ReferenceAssemblies WithLanguageSpecificAssemblies(ImmutableDictionary> languageSpecificAssemblies) - => new ReferenceAssemblies(TargetFramework, AssemblyIdentityComparer, ReferenceAssemblyPackage, ReferenceAssemblyPath, Assemblies, FacadeAssemblies, languageSpecificAssemblies, Packages); + => new ReferenceAssemblies(TargetFramework, AssemblyIdentityComparer, ReferenceAssemblyPackage, ReferenceAssemblyPath, Assemblies, FacadeAssemblies, languageSpecificAssemblies, Packages, NuGetConfigFilePath); public ReferenceAssemblies WithLanguageSpecificAssemblies(string language, ImmutableArray assemblies) => WithLanguageSpecificAssemblies(LanguageSpecificAssemblies.SetItem(language, assemblies)); @@ -151,11 +155,14 @@ public ReferenceAssemblies AddLanguageSpecificAssemblies(string language, Immuta } public ReferenceAssemblies WithPackages(ImmutableArray packages) - => new ReferenceAssemblies(TargetFramework, AssemblyIdentityComparer, ReferenceAssemblyPackage, ReferenceAssemblyPath, Assemblies, FacadeAssemblies, LanguageSpecificAssemblies, packages); + => new ReferenceAssemblies(TargetFramework, AssemblyIdentityComparer, ReferenceAssemblyPackage, ReferenceAssemblyPath, Assemblies, FacadeAssemblies, LanguageSpecificAssemblies, packages, NuGetConfigFilePath); public ReferenceAssemblies AddPackages(ImmutableArray packages) => WithPackages(Packages.AddRange(packages)); + public ReferenceAssemblies WithNuGetConfigFilePath(string nugetConfigFilePath) + => new ReferenceAssemblies(TargetFramework, AssemblyIdentityComparer, ReferenceAssemblyPackage, ReferenceAssemblyPath, Assemblies, FacadeAssemblies, LanguageSpecificAssemblies, Packages, nugetConfigFilePath); + public async Task> ResolveAsync(string? language, CancellationToken cancellationToken) { if (language is object) @@ -200,7 +207,7 @@ public async Task> ResolveAsync(string? langua /// private async Task> ResolveCoreAsync(string language, CancellationToken cancellationToken) { - var settings = Settings.LoadDefaultSettings(root: null); + var settings = string.IsNullOrEmpty(NuGetConfigFilePath) ? Settings.LoadDefaultSettings(root: null) : Settings.LoadSpecificSettings(root: null, NuGetConfigFilePath); var sourceRepositoryProvider = new SourceRepositoryProvider(new PackageSourceProvider(settings), Repository.Provider.GetCoreV3()); var targetFramework = NuGetFramework.ParseFolder(TargetFramework); var logger = NullLogger.Instance;