diff --git a/ICSharpCode.Decompiler.Tests/Helpers/Tester.cs b/ICSharpCode.Decompiler.Tests/Helpers/Tester.cs index a43e5cce8..8776bac1f 100644 --- a/ICSharpCode.Decompiler.Tests/Helpers/Tester.cs +++ b/ICSharpCode.Decompiler.Tests/Helpers/Tester.cs @@ -55,6 +55,7 @@ namespace ICSharpCode.Decompiler.Tests.Helpers UseRoslyn = 0x10, UseMcs = 0x20, ReferenceVisualBasic = 0x40, + ReferenceCore = 0x80, } [Flags] @@ -182,10 +183,29 @@ namespace ICSharpCode.Decompiler.Tests.Helpers return Regex.Replace(il, @"'\{[0-9A-F-]+\}'", "''"); } - static readonly string refAsmPath = new DotNetCorePathFinder(new Version(3, 0)).GetReferenceAssemblyPath(".NETCoreApp, Version = v3.0"); + static readonly string coreRefAsmPath = new DotNetCorePathFinder(new Version(3, 0)).GetReferenceAssemblyPath(".NETCoreApp, Version = v3.0"); + + static readonly string refAsmPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), + @"Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2"); static readonly string thisAsmPath = Path.GetDirectoryName(typeof(Tester).Assembly.Location); - static readonly Lazy> defaultReferences = new Lazy>(GetDefaultReferences); + static readonly Lazy> defaultReferences = new Lazy>(delegate { + return new[] + { + MetadataReference.CreateFromFile(Path.Combine(refAsmPath, "Facades\\netstandard.dll")), + MetadataReference.CreateFromFile(Path.Combine(refAsmPath, "mscorlib.dll")), + MetadataReference.CreateFromFile(Path.Combine(refAsmPath, "System.dll")), + MetadataReference.CreateFromFile(Path.Combine(refAsmPath, "System.Core.dll")), + MetadataReference.CreateFromFile(Path.Combine(refAsmPath, @"Facades\System.Runtime.dll")), + MetadataReference.CreateFromFile(Path.Combine(refAsmPath, "System.Xml.dll")), + MetadataReference.CreateFromFile(Path.Combine(refAsmPath, "Microsoft.CSharp.dll")), + MetadataReference.CreateFromFile(typeof(ValueTuple).Assembly.Location), + MetadataReference.CreateFromFile(typeof(ValueTask).Assembly.Location), + MetadataReference.CreateFromFile(typeof(Span<>).Assembly.Location), + }; + }); + + static readonly Lazy> coreDefaultReferences = new Lazy>(GetDefaultReferences); const string targetFrameworkAttributeSnippet = @" @@ -195,7 +215,7 @@ namespace ICSharpCode.Decompiler.Tests.Helpers static IEnumerable GetDefaultReferences() { - foreach (var reference in Directory.EnumerateFiles(refAsmPath, "*.dll")) { + foreach (var reference in Directory.EnumerateFiles(coreRefAsmPath, "*.dll")) { yield return MetadataReference.CreateFromFile(reference); } } @@ -215,6 +235,9 @@ namespace ICSharpCode.Decompiler.Tests.Helpers if (flags.HasFlag(CompilerOptions.Optimize)) { preprocessorSymbols.Add("OPT"); } + if (flags.HasFlag(CompilerOptions.ReferenceCore)) { + preprocessorSymbols.Add("NETCORE"); + } if (flags.HasFlag(CompilerOptions.UseRoslyn)) { preprocessorSymbols.Add("ROSLYN"); preprocessorSymbols.Add("CS60"); @@ -250,8 +273,15 @@ namespace ICSharpCode.Decompiler.Tests.Helpers languageVersion: Microsoft.CodeAnalysis.CSharp.LanguageVersion.CSharp8 ); var syntaxTrees = sourceFileNames.Select(f => SyntaxFactory.ParseSyntaxTree(File.ReadAllText(f), parseOptions, path: f)); - syntaxTrees = syntaxTrees.Concat(new[] { SyntaxFactory.ParseSyntaxTree(targetFrameworkAttributeSnippet) }); - var references = defaultReferences.Value; + if (flags.HasFlag(CompilerOptions.ReferenceCore)) { + syntaxTrees = syntaxTrees.Concat(new[] { SyntaxFactory.ParseSyntaxTree(targetFrameworkAttributeSnippet) }); + } + IEnumerable references; + if (flags.HasFlag(CompilerOptions.ReferenceCore)) { + references = coreDefaultReferences.Value; + } else { + references = defaultReferences.Value; + } if (flags.HasFlag(CompilerOptions.ReferenceVisualBasic)) { references = references.Concat(visualBasic.Value); } diff --git a/ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs b/ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs index 54cb2aae3..711a307dc 100644 --- a/ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs +++ b/ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs @@ -59,6 +59,12 @@ namespace ICSharpCode.Decompiler.Tests CompilerOptions.Optimize | CompilerOptions.UseRoslyn }; + static readonly CompilerOptions[] dotnetCoreOnlyOptions = + { + CompilerOptions.UseRoslyn | CompilerOptions.ReferenceCore, + CompilerOptions.Optimize | CompilerOptions.UseRoslyn | CompilerOptions.ReferenceCore + }; + static readonly CompilerOptions[] defaultOptions = { CompilerOptions.None, @@ -302,7 +308,7 @@ namespace ICSharpCode.Decompiler.Tests } [Test] - public void AsyncUsing([ValueSource(nameof(roslynOnlyOptions))] CompilerOptions cscOptions) + public void AsyncUsing([ValueSource(nameof(dotnetCoreOnlyOptions))] CompilerOptions cscOptions) { RunForLibrary(cscOptions: cscOptions); } @@ -442,7 +448,7 @@ namespace ICSharpCode.Decompiler.Tests [Test] public void InterfaceTests([ValueSource(nameof(defaultOptions))] CompilerOptions cscOptions) { - RunForLibrary(cscOptions: cscOptions); + RunForLibrary(cscOptions: cscOptions | CompilerOptions.ReferenceCore); } [Test]