diff --git a/src/EditorFeatures/Core/Implementation/MetadataAsSource/MetadataAsSourceFileService.cs b/src/EditorFeatures/Core/Implementation/MetadataAsSource/MetadataAsSourceFileService.cs index 8dabeebeae41b..a56423a96fd8f 100644 --- a/src/EditorFeatures/Core/Implementation/MetadataAsSource/MetadataAsSourceFileService.cs +++ b/src/EditorFeatures/Core/Implementation/MetadataAsSource/MetadataAsSourceFileService.cs @@ -139,11 +139,14 @@ public async Task GetGeneratedFileAsync(Project project, I } catch (Exception e) when (FatalError.ReportWithoutCrashUnlessCanceled(e)) { + // Insert the exception message at the top of the fallback Metadata As Source document to + // help with diagnosing failures. When the generated source is added to the document, this + // comment will end up at the bottom. var failureText = e.ToString(); - var failureTextAsComment = "// " + failureText.Replace("\n", "\n// ") + "\n"; + var failureTextAsComment = "// " + failureText.Replace("\n", "\n// ") + Environment.NewLine; var sourceText = await temporaryDocument.GetTextAsync(cancellationToken).ConfigureAwait(false); - temporaryDocument = temporaryDocument.WithText(sourceText.Replace(default, failureTextAsComment)); + temporaryDocument = temporaryDocument.WithText(sourceText.Replace(new TextSpan(0, 0), failureTextAsComment)); useDecompiler = false; } diff --git a/src/EditorFeatures/Test/MetadataAsSource/AbstractMetadataAsSourceTests.TestContext.cs b/src/EditorFeatures/Test/MetadataAsSource/AbstractMetadataAsSourceTests.TestContext.cs index 710bd8f7dfaac..f0f3dd7af59e0 100644 --- a/src/EditorFeatures/Test/MetadataAsSource/AbstractMetadataAsSourceTests.TestContext.cs +++ b/src/EditorFeatures/Test/MetadataAsSource/AbstractMetadataAsSourceTests.TestContext.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using System.Security; @@ -9,6 +10,7 @@ using System.Threading.Tasks; using Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces; using Microsoft.CodeAnalysis.Text; +using Microsoft.VisualStudio.Composition; using Microsoft.VisualStudio.Text; using Roslyn.Test.Utilities; using Roslyn.Utilities; @@ -33,7 +35,8 @@ public static TestContext Create( bool includeXmlDocComments = false, string sourceWithSymbolReference = null, string languageVersion = null, - string metadataLanguageVersion = null) + string metadataLanguageVersion = null, + ExportProvider exportProvider = null) { projectLanguage ??= LanguageNames.CSharp; metadataSources ??= SpecializedCollections.EmptyEnumerable(); @@ -43,7 +46,8 @@ public static TestContext Create( var workspace = CreateWorkspace( projectLanguage, metadataSources, includeXmlDocComments, - sourceWithSymbolReference, languageVersion, metadataLanguageVersion); + sourceWithSymbolReference, languageVersion, metadataLanguageVersion, + exportProvider); return new TestContext(workspace); } @@ -95,22 +99,23 @@ private static string GetSpaceSeparatedTokens(string source) return string.Join(" ", tokens); } - public void VerifyResult(MetadataAsSourceFile file, string expected) + public void VerifyResult(MetadataAsSourceFile file, Lazy expected) { var actual = File.ReadAllText(file.FilePath).Trim(); var actualSpan = file.IdentifierLocation.SourceSpan; + var expectedText = expected.Value; // Compare exact texts and verify that the location returned is exactly that // indicated by expected - MarkupTestFile.GetSpan(expected, out expected, out var expectedSpan); - AssertEx.EqualOrDiff(expected, actual); + MarkupTestFile.GetSpan(expectedText, out expectedText, out var expectedSpan); + AssertEx.EqualOrDiff(expectedText, actual); Assert.Equal(expectedSpan.Start, actualSpan.Start); Assert.Equal(expectedSpan.End, actualSpan.End); } - public async Task GenerateAndVerifySourceAsync(string symbolMetadataName, string expected, Project project = null) + public async Task GenerateAndVerifySourceAsync(string symbolMetadataName, Lazy expected, Project project = null, bool allowDecompilation = false) { - var result = await GenerateSourceAsync(symbolMetadataName, project); + var result = await GenerateSourceAsync(symbolMetadataName, project, allowDecompilation); VerifyResult(result, expected); } @@ -215,7 +220,8 @@ private static string DeduceLanguageString(string input) private static TestWorkspace CreateWorkspace( string projectLanguage, IEnumerable metadataSources, bool includeXmlDocComments, string sourceWithSymbolReference, - string languageVersion, string metadataLanguageVersion) + string languageVersion, string metadataLanguageVersion, + ExportProvider exportProvider) { var languageVersionAttribute = languageVersion is null ? "" : $@" LanguageVersion=""{languageVersion}"""; @@ -252,7 +258,7 @@ private static TestWorkspace CreateWorkspace( "); - return TestWorkspace.Create(xmlString); + return TestWorkspace.Create(xmlString, exportProvider: exportProvider); } internal Document GetDocument(MetadataAsSourceFile file) diff --git a/src/EditorFeatures/Test/MetadataAsSource/AbstractMetadataAsSourceTests.cs b/src/EditorFeatures/Test/MetadataAsSource/AbstractMetadataAsSourceTests.cs index 58a334b9ccce8..3b731b457ed19 100644 --- a/src/EditorFeatures/Test/MetadataAsSource/AbstractMetadataAsSourceTests.cs +++ b/src/EditorFeatures/Test/MetadataAsSource/AbstractMetadataAsSourceTests.cs @@ -1,10 +1,12 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Test.Utilities; +using Microsoft.VisualStudio.Composition; using Roslyn.Utilities; using Xunit; @@ -14,10 +16,10 @@ namespace Microsoft.CodeAnalysis.Editor.UnitTests.MetadataAsSource public abstract partial class AbstractMetadataAsSourceTests { internal static async Task GenerateAndVerifySourceAsync( - string metadataSource, string symbolName, string projectLanguage, string expected, bool includeXmlDocComments = false, string languageVersion = null, string metadataLanguageVersion = null) + string metadataSource, string symbolName, string projectLanguage, Lazy expected, bool allowDecompilation = false, bool includeXmlDocComments = false, string languageVersion = null, string metadataLanguageVersion = null, ExportProvider exportProvider = null) { - using var context = TestContext.Create(projectLanguage, SpecializedCollections.SingletonEnumerable(metadataSource), includeXmlDocComments, languageVersion: languageVersion, metadataLanguageVersion: metadataLanguageVersion); - await context.GenerateAndVerifySourceAsync(symbolName, expected); + using var context = TestContext.Create(projectLanguage, SpecializedCollections.SingletonEnumerable(metadataSource), includeXmlDocComments, languageVersion: languageVersion, metadataLanguageVersion: metadataLanguageVersion, exportProvider: exportProvider); + await context.GenerateAndVerifySourceAsync(symbolName, expected, allowDecompilation: allowDecompilation); } internal static async Task GenerateAndVerifySourceLineAsync(string source, string language, string expected) diff --git a/src/EditorFeatures/Test/MetadataAsSource/MetadataAsSourceTests.VisualBasic.cs b/src/EditorFeatures/Test/MetadataAsSource/MetadataAsSourceTests.VisualBasic.cs index 6f9d553e70882..c01d1b90ace8a 100644 --- a/src/EditorFeatures/Test/MetadataAsSource/MetadataAsSourceTests.VisualBasic.cs +++ b/src/EditorFeatures/Test/MetadataAsSource/MetadataAsSourceTests.VisualBasic.cs @@ -1,5 +1,6 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Threading.Tasks; using Microsoft.CodeAnalysis.MetadataAsSource; using Microsoft.CodeAnalysis.Test.Utilities; @@ -21,7 +22,7 @@ Module M Public Class D End Class End Module"; - await GenerateAndVerifySourceAsync(metadataSource, "M+D", LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" + await GenerateAndVerifySourceAsync(metadataSource, "M+D", LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -29,7 +30,7 @@ Friend Module M Public Class [|D|] Public Sub New() End Class -End Module"); +End Module")); } // This test depends on the version of mscorlib used by the TestWorkspace and may @@ -65,7 +66,7 @@ End Class End Namespace"; using var context = TestContext.Create(LanguageNames.VisualBasic); - await context.GenerateAndVerifySourceAsync("System.ObsoleteAttribute", expected); + await context.GenerateAndVerifySourceAsync("System.ObsoleteAttribute", new Lazy(() => expected)); } [Fact, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] diff --git a/src/EditorFeatures/Test/MetadataAsSource/MetadataAsSourceTests.cs b/src/EditorFeatures/Test/MetadataAsSource/MetadataAsSourceTests.cs index 6a02d862c8252..12db3418525f8 100644 --- a/src/EditorFeatures/Test/MetadataAsSource/MetadataAsSourceTests.cs +++ b/src/EditorFeatures/Test/MetadataAsSource/MetadataAsSourceTests.cs @@ -1,9 +1,12 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Composition; +using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis.CodeGeneration; using Microsoft.CodeAnalysis.Formatting; +using Microsoft.CodeAnalysis.Host.Mef; using Microsoft.CodeAnalysis.Test.Utilities; using Roslyn.Test.Utilities; using Roslyn.Utilities; @@ -21,21 +24,21 @@ public async Task TestClass() var metadataSource = "public class C {}"; var symbolName = "C"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion public class [|C|] {{ public C(); -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region Public Class [|C|] Public Sub New() -End Class"); +End Class")); } [WorkItem(546241, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546241")] @@ -45,19 +48,19 @@ public async Task TestInterface() var metadataSource = "public interface I {}"; var symbolName = "I"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion public interface [|I|] {{ -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region Public Interface [|I|] -End Interface"); +End Interface")); } [Fact, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] @@ -66,21 +69,21 @@ public async Task TestConstructor() var metadataSource = "public class C {}"; var symbolName = "C..ctor"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion public class C {{ public [|C|](); -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region Public Class C Public Sub [|New|]() -End Class"); +End Class")); } [Fact, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] @@ -89,7 +92,7 @@ public async Task TestMethod() var metadataSource = "public class C { public void Goo() {} }"; var symbolName = "C.Goo"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -98,8 +101,8 @@ public class C public C(); public void [|Goo|](); -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -107,7 +110,7 @@ Public Class C Public Sub New() Public Sub [|Goo|]() -End Class"); +End Class")); } [Fact, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] @@ -116,7 +119,7 @@ public async Task TestField() var metadataSource = "public class C { public string S; }"; var symbolName = "C.S"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -125,8 +128,8 @@ public class C public string [|S|]; public C(); -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -134,7 +137,7 @@ Public Class C Public [|S|] As String Public Sub New() -End Class"); +End Class")); } [WorkItem(546240, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546240")] @@ -144,7 +147,7 @@ public async Task TestProperty() var metadataSource = "public class C { public string S { get; protected set; } }"; var symbolName = "C.S"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -153,8 +156,8 @@ public class C public C(); public string [|S|] {{ get; protected set; }} -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -162,7 +165,7 @@ Public Class C Public Sub New() Public Property [|S|] As String -End Class"); +End Class")); } [WorkItem(546194, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546194")] @@ -173,7 +176,7 @@ public async Task TestEvent() var metadataSource = "using System; public class C { public event Action E; }"; var symbolName = "C.E"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -184,8 +187,8 @@ public class C public C(); public event Action [|E|]; -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -195,7 +198,7 @@ Public Class C Public Sub New() Public Event [|E|] As Action -End Class"); +End Class")); } [Fact, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] @@ -204,7 +207,7 @@ public async Task TestNestedType() var metadataSource = "public class C { protected class D { } }"; var symbolName = "C+D"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -216,8 +219,8 @@ protected class [|D|] {{ public D(); }} -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -227,7 +230,7 @@ Public Sub New() Protected Class [|D|] Public Sub New() End Class -End Class"); +End Class")); } [WorkItem(546195, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546195"), WorkItem(546269, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546269")] @@ -237,7 +240,7 @@ public async Task TestEnum() var metadataSource = "public enum E { A, B, C }"; var symbolName = "E"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -246,8 +249,8 @@ public enum [|E|] A = 0, B = 1, C = 2 -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -255,7 +258,7 @@ Public Enum [|E|] A = 0 B = 1 C = 2 -End Enum"); +End Enum")); } [WorkItem(546195, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546195"), WorkItem(546269, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546269")] @@ -265,7 +268,7 @@ public async Task TestEnumFromField() var metadataSource = "public enum E { A, B, C }"; var symbolName = "E.C"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -274,8 +277,8 @@ public enum E A = 0, B = 1, [|C|] = 2 -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -283,7 +286,7 @@ Public Enum E A = 0 B = 1 [|C|] = 2 -End Enum"); +End Enum")); } [WorkItem(546273, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546273")] @@ -293,7 +296,7 @@ public async Task TestEnumWithUnderlyingType() var metadataSource = "public enum E : short { A = 0, B = 1, C = 2 }"; var symbolName = "E.C"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -302,8 +305,8 @@ public enum E : short A = 0, B = 1, [|C|] = 2 -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -311,7 +314,7 @@ Public Enum E As Short A = 0 B = 1 [|C|] = 2 -End Enum"); +End Enum")); } [WorkItem(650741, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/650741")] @@ -321,21 +324,21 @@ public async Task TestEnumWithOverflowingUnderlyingType() var metadataSource = "public enum E : ulong { A = 9223372036854775808 }"; var symbolName = "E.A"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion public enum E : ulong {{ [|A|] = 9223372036854775808 -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region Public Enum E As ULong [|A|] = 9223372036854775808UL -End Enum"); +End Enum")); } [Fact, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] @@ -344,7 +347,7 @@ public async Task TestEnumWithDifferentValues() var metadataSource = "public enum E : short { A = 1, B = 2, C = 3 }"; var symbolName = "E.C"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -353,8 +356,8 @@ public enum E : short A = 1, B = 2, [|C|] = 3 -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -362,7 +365,7 @@ Public Enum E As Short A = 1 B = 2 [|C|] = 3 -End Enum"); +End Enum")); } [WorkItem(546198, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546198")] @@ -372,7 +375,7 @@ public async Task TestTypeInNamespace() var metadataSource = "namespace N { public class C {} }"; var symbolName = "N.C"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -382,8 +385,8 @@ public class [|C|] {{ public C(); }} -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -391,7 +394,7 @@ Namespace N Public Class [|C|] Public Sub New() End Class -End Namespace"); +End Namespace")); } [WorkItem(546223, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546223")] @@ -401,7 +404,7 @@ public async Task TestInlineConstant() var metadataSource = @"public class C { public const string S = ""Hello mas""; }"; var symbolName = "C.S"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -410,8 +413,8 @@ public class C public const string [|S|] = ""Hello mas""; public C(); -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -419,7 +422,7 @@ Public Class C Public Const [|S|] As String = ""Hello mas"" Public Sub New() -End Class"); +End Class")); } [WorkItem(546221, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546221")] @@ -439,7 +442,7 @@ public class C {}"; var symbolName = "C"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -447,15 +450,15 @@ await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSh public class [|C|] {{ public C(); -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region Public Class [|C|] Public Sub New() -End Class"); +End Class")); } [WorkItem(546231, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546231")] @@ -465,19 +468,19 @@ public async Task TestNoDefaultConstructorInStructs() var metadataSource = "public struct S {}"; var symbolName = "S"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion public struct [|S|] {{ -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region Public Structure [|S|] -End Structure"); +End Structure")); } [Fact, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] @@ -486,7 +489,7 @@ public async Task TestReferenceDefinedType() var metadataSource = "public class C { public static C Create() { return new C(); } }"; var symbolName = "C"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -495,8 +498,8 @@ public class [|C|] public C(); public static C Create(); -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -504,7 +507,7 @@ Public Class [|C|] Public Sub New() Public Shared Function Create() As C -End Class"); +End Class")); } [WorkItem(546227, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546227")] @@ -514,7 +517,7 @@ public async Task TestGenericType() var metadataSource = "public class G { public SomeType S; }"; var symbolName = "G`1"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -523,8 +526,8 @@ public class [|G|] public SomeType S; public G(); -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -532,7 +535,7 @@ await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.Vis Public S As SomeType Public Sub New() -End Class"); +End Class")); } [Fact, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] @@ -549,7 +552,7 @@ internal class MyAttribute : System.Attribute { } "; var symbolName = "C`1"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -558,8 +561,8 @@ public class [|C|]<[MyAttribute] T> public C(); public void Method([MyAttribute] T x, [MyAttribute] T y); -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -567,7 +570,7 @@ await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.Vis Public Sub New() Public Sub Method( x As T, y As T) -End Class"); +End Class")); } [Fact, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] @@ -585,7 +588,7 @@ internal class AllowNullAttribute : System.Attribute { } "; var symbolName = "C`1"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -595,8 +598,8 @@ await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSh public interface [|C|]<[NullableAttribute(2)] T> {{ bool Equals([AllowNullAttribute] T other); -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -605,7 +608,7 @@ Imports System.Runtime.CompilerServices Public Interface [|C|](Of T) Function Equals( other As T) As Boolean -End Interface"); +End Interface")); } [WorkItem(546227, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546227")] @@ -615,7 +618,7 @@ public async Task TestGenericDelegate() var metadataSource = "public class C { public delegate void D(SomeType s); }"; var symbolName = "C+D`1"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -624,15 +627,15 @@ public class C public C(); public delegate void [|D|](SomeType s); -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region Public Class C Public Sub New() Public Delegate Sub [|D|](Of SomeType)(s As SomeType) -End Class"); +End Class")); } [WorkItem(546200, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546200")] @@ -655,7 +658,7 @@ public class C {}"; var symbolName = "C"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -665,8 +668,8 @@ await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSh public class [|C|] {{ public C(); -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -675,7 +678,7 @@ Imports N Public Class [|C|] Public Sub New() -End Class"); +End Class")); } [Fact, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] @@ -801,7 +804,7 @@ public class C public void set_IndexProp(int p1, string value); }}"; var symbolName = "C.get_IndexProp"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, expected); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => expected)); } [WorkItem(566688, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/566688")] @@ -832,7 +835,7 @@ public class [|C|] public C(); }}"; var symbolName = "C"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, expected); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => expected)); } [WorkItem(530978, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530978")] @@ -921,7 +924,7 @@ public class [|C|] public static C operator +(C c1, C c2); }}"; var symbolName = "C"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, expectedCS); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => expectedCS)); var expectedVB = $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} @@ -960,7 +963,7 @@ Protected Overrides Sub Finalize() Public Shared Operator +(c1 As C, c2 As C) As C End Class"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, expectedVB); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => expectedVB)); } [WorkItem(530923, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530923")] @@ -1019,7 +1022,7 @@ public class [|C|] public static C operator -(C c1, C c2); }}"; var symbolName = "C"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, expectedCS); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => expectedCS)); var expectedVB = $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} @@ -1050,7 +1053,7 @@ Protected Overrides Sub Finalize() Public Shared Operator +(c1 As C, c2 As C) As C Public Shared Operator -(c1 As C, c2 As C) As C End Class"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, expectedVB); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => expectedVB)); } [WorkItem(728644, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/728644")] @@ -1091,7 +1094,7 @@ public interface [|IGoo|] // M:IGoo.Method1 Uri Method1(); }}"; - await GenerateAndVerifySourceAsync(source, symbolName, LanguageNames.CSharp, expectedCS, includeXmlDocComments: true); + await GenerateAndVerifySourceAsync(source, symbolName, LanguageNames.CSharp, new Lazy(() => expectedCS), includeXmlDocComments: true); var expectedVB = $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} @@ -1113,7 +1116,7 @@ Property Prop1 As Uri ' M:IGoo.Method1 Function Method1() As Uri End Interface"; - await GenerateAndVerifySourceAsync(source, symbolName, LanguageNames.VisualBasic, expectedVB, includeXmlDocComments: true); + await GenerateAndVerifySourceAsync(source, symbolName, LanguageNames.VisualBasic, new Lazy(() => expectedVB), includeXmlDocComments: true); } [WorkItem(679114, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/679114"), WorkItem(715013, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/715013")] @@ -1141,7 +1144,7 @@ public class [|Test|] public void goo(FileOptions options = FileOptions.None); }}"; - await GenerateAndVerifySourceAsync(source, symbolName, LanguageNames.CSharp, expectedCS); + await GenerateAndVerifySourceAsync(source, symbolName, LanguageNames.CSharp, new Lazy(() => expectedCS)); var expectedVB = $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} @@ -1154,7 +1157,7 @@ Public Sub New() Public Sub goo(Optional options As FileOptions = FileOptions.None) End Class"; - await GenerateAndVerifySourceAsync(source, symbolName, LanguageNames.VisualBasic, expectedVB); + await GenerateAndVerifySourceAsync(source, symbolName, LanguageNames.VisualBasic, new Lazy(() => expectedVB)); } [WorkItem(651261, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/651261")] @@ -1183,7 +1186,7 @@ public class [|TestAttribute|] : Attribute {{ public TestAttribute(int[] i); }}"; - await GenerateAndVerifySourceAsync(source, symbolName, LanguageNames.CSharp, expectedCS); + await GenerateAndVerifySourceAsync(source, symbolName, LanguageNames.CSharp, new Lazy(() => expectedCS)); var expectedVB = $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} @@ -1197,7 +1200,7 @@ Inherits Attribute Public Sub New(i() As Integer) End Class"; - await GenerateAndVerifySourceAsync(source, symbolName, LanguageNames.VisualBasic, expectedVB); + await GenerateAndVerifySourceAsync(source, symbolName, LanguageNames.VisualBasic, new Lazy(() => expectedVB)); } [WorkItem(897006, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/897006")] @@ -1233,7 +1236,7 @@ public static class ObjectExtensions sourceWithSymbolReference: sourceWithSymbolReference); var navigationSymbol = await context.GetNavigationSymbolAsync(); var metadataAsSourceFile = await context.GenerateSourceAsync(navigationSymbol); - context.VerifyResult(metadataAsSourceFile, expected); + context.VerifyResult(metadataAsSourceFile, new Lazy(() => expected)); } [WorkItem(897006, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/897006")] @@ -1276,7 +1279,7 @@ End Module sourceWithSymbolReference: sourceWithSymbolReference); var navigationSymbol = await context.GetNavigationSymbolAsync(); var metadataAsSourceFile = await context.GenerateSourceAsync(navigationSymbol); - context.VerifyResult(metadataAsSourceFile, expected); + context.VerifyResult(metadataAsSourceFile, new Lazy(() => expected)); } [Fact, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] @@ -1303,7 +1306,7 @@ public int this[int x] }"; var symbolName = "Program"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -1317,8 +1320,8 @@ public class [|Program|] public int this[int x] {{ get; set; }} public static Program operator +(Program p1, Program p2); -}}"); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" +}}")); + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -1331,7 +1334,7 @@ Public Sub New() Default Public Property Item(x As Integer) As Integer Public Shared Operator +(p1 As Program, p2 As Program) As Program -End Class"); +End Class")); } [WorkItem(15387, "https://github.com/dotnet/roslyn/issues/15387")] @@ -1352,7 +1355,7 @@ public interface IComImport }"; var symbolName = "IComImport"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -1366,7 +1369,7 @@ public interface [|IComImport|] void MOverload(int i); int Prop {{ get; }} -}}"); +}}")); } [Fact, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] @@ -1380,7 +1383,7 @@ public class C { }"; var symbolName = "C"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -1391,7 +1394,7 @@ public class [|C|] public C(); public void M(CancellationToken cancellationToken = default); -}}", languageVersion: "CSharp7_1"); +}}"), languageVersion: "CSharp7_1"); } [WorkItem(446567, "https://devdiv.visualstudio.com/DevDiv/_workitems?id=446567")] @@ -1432,7 +1435,7 @@ public interface [|IGoo|] // M:IGoo.Method1 ABCDE FGHIJK Uri Method1(); }}"; - await GenerateAndVerifySourceAsync(source, symbolName, LanguageNames.CSharp, expectedCS, includeXmlDocComments: true); + await GenerateAndVerifySourceAsync(source, symbolName, LanguageNames.CSharp, new Lazy(() => expectedCS), includeXmlDocComments: true); var expectedVB = $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} @@ -1454,7 +1457,7 @@ Property Prop1 As Uri ' M:IGoo.Method1 ABCDE FGHIJK Function Method1() As Uri End Interface"; - await GenerateAndVerifySourceAsync(source, symbolName, LanguageNames.VisualBasic, expectedVB, includeXmlDocComments: true); + await GenerateAndVerifySourceAsync(source, symbolName, LanguageNames.VisualBasic, new Lazy(() => expectedVB), includeXmlDocComments: true); } [Fact, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] @@ -1489,7 +1492,7 @@ public class [|TestType|] where T : unmanaged sourceWithSymbolReference: sourceWithSymbolReference); var navigationSymbol = await context.GetNavigationSymbolAsync(); var metadataAsSourceFile = await context.GenerateSourceAsync(navigationSymbol); - context.VerifyResult(metadataAsSourceFile, expected); + context.VerifyResult(metadataAsSourceFile, new Lazy(() => expected)); } [Fact, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] @@ -1529,7 +1532,7 @@ public class TestType sourceWithSymbolReference: sourceWithSymbolReference); var navigationSymbol = await context.GetNavigationSymbolAsync(); var metadataAsSourceFile = await context.GenerateSourceAsync(navigationSymbol); - context.VerifyResult(metadataAsSourceFile, expected); + context.VerifyResult(metadataAsSourceFile, new Lazy(() => expected)); } [Fact, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] @@ -1558,7 +1561,7 @@ class C sourceWithSymbolReference: sourceWithSymbolReference); var navigationSymbol = await context.GetNavigationSymbolAsync(); var metadataAsSourceFile = await context.GenerateSourceAsync(navigationSymbol); - context.VerifyResult(metadataAsSourceFile, expected); + context.VerifyResult(metadataAsSourceFile, new Lazy(() => expected)); } [WorkItem(29786, "https://github.com/dotnet/roslyn/issues/29786")] @@ -1689,16 +1692,16 @@ public readonly struct S "; var symbolName = "S"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion public readonly struct [|S|] {{ public readonly int i; -}}"); +}}")); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -1707,7 +1710,7 @@ Imports System.Runtime.CompilerServices Public Structure [|S|] Public ReadOnly i As Integer -End Structure"); +End Structure")); } [WorkItem(34650, "https://github.com/dotnet/roslyn/issues/34650")] @@ -1722,22 +1725,22 @@ public struct S "; var symbolName = "S"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion public struct [|S|] {{ public readonly int i; -}}"); +}}")); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region Public Structure [|S|] Public ReadOnly i As Integer -End Structure"); +End Structure")); } [WorkItem(34650, "https://github.com/dotnet/roslyn/issues/34650")] @@ -1751,15 +1754,15 @@ public ref struct S "; var symbolName = "S"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion public ref struct [|S|] {{ -}}"); +}}")); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -1768,7 +1771,7 @@ Imports System.Runtime.CompilerServices Public Structure [|S|] -End Structure"); +End Structure")); } [WorkItem(34650, "https://github.com/dotnet/roslyn/issues/34650")] @@ -1782,15 +1785,15 @@ public readonly ref struct S "; var symbolName = "S"; - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion public readonly ref struct [|S|] {{ -}}"); +}}")); - await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" + await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -1799,7 +1802,7 @@ Imports System.Runtime.CompilerServices Public Structure [|S|] -End Structure"); +End Structure")); } @@ -1816,17 +1819,17 @@ public readonly void M() {} var symbolName = "S.M"; await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, metadataLanguageVersion: "Preview", - expected: $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + expected: new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion public struct S {{ public readonly void [|M|](); -}}"); +}}")); await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, metadataLanguageVersion: "Preview", - expected: $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" + expected: new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -1834,7 +1837,7 @@ Imports System.Runtime.CompilerServices Public Structure S Public Sub [|M|]() -End Structure"); +End Structure")); } @@ -1851,17 +1854,17 @@ public void M() {} var symbolName = "S.M"; await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, metadataLanguageVersion: "Preview", - expected: $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + expected: new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion public readonly struct S {{ public void [|M|](); -}}"); +}}")); await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, metadataLanguageVersion: "Preview", - expected: $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" + expected: new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -1870,7 +1873,7 @@ Imports System.Runtime.CompilerServices Public Structure S Public Sub [|M|]() -End Structure"); +End Structure")); } [WorkItem(34650, "https://github.com/dotnet/roslyn/issues/34650")] @@ -1886,23 +1889,23 @@ public struct S var symbolName = "S.P"; await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, metadataLanguageVersion: "Preview", - expected: $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + expected: new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion public struct S {{ public readonly int [|P|] {{ get; }} -}}"); +}}")); await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, metadataLanguageVersion: "Preview", - expected: $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" + expected: new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region Public Structure S Public ReadOnly Property [|P|] As Integer -End Structure"); +End Structure")); } [WorkItem(34650, "https://github.com/dotnet/roslyn/issues/34650")] @@ -1918,23 +1921,23 @@ public struct S var symbolName = "S.P"; await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, metadataLanguageVersion: "CSharp7_3", - expected: $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + expected: new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion public struct S {{ public int [|P|] {{ get; }} -}}"); +}}")); await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, metadataLanguageVersion: "Preview", - expected: $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" + expected: new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region Public Structure S Public ReadOnly Property [|P|] As Integer -End Structure"); +End Structure")); } [WorkItem(34650, "https://github.com/dotnet/roslyn/issues/34650")] @@ -1950,23 +1953,23 @@ public struct S var symbolName = "S.P"; await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, metadataLanguageVersion: "Preview", - expected: $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + expected: new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion public struct S {{ public readonly int [|P|] {{ get; }} -}}"); +}}")); await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, metadataLanguageVersion: "Preview", - expected: $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" + expected: new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region Public Structure S Public ReadOnly Property [|P|] As Integer -End Structure"); +End Structure")); } [WorkItem(34650, "https://github.com/dotnet/roslyn/issues/34650")] @@ -1982,17 +1985,17 @@ public readonly struct S var symbolName = "S.P"; await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, metadataLanguageVersion: "Preview", - expected: $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + expected: new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion public readonly struct S {{ public int [|P|] {{ get; }} -}}"); +}}")); await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, metadataLanguageVersion: "Preview", - expected: $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" + expected: new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -2001,7 +2004,7 @@ Imports System.Runtime.CompilerServices Public Structure S Public ReadOnly Property [|P|] As Integer -End Structure"); +End Structure")); } [WorkItem(34650, "https://github.com/dotnet/roslyn/issues/34650")] @@ -2017,23 +2020,23 @@ public struct S var symbolName = "S.P"; await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, metadataLanguageVersion: "Preview", - expected: $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + expected: new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion public struct S {{ public int [|P|] {{ readonly get; set; }} -}}"); +}}")); await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, metadataLanguageVersion: "Preview", - expected: $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" + expected: new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region Public Structure S Public Property [|P|] As Integer -End Structure"); +End Structure")); } [WorkItem(34650, "https://github.com/dotnet/roslyn/issues/34650")] @@ -2049,23 +2052,23 @@ public struct S var symbolName = "S.P"; await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, metadataLanguageVersion: "Preview", - expected: $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + expected: new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion public struct S {{ public int [|P|] {{ get; readonly set; }} -}}"); +}}")); await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, metadataLanguageVersion: "Preview", - expected: $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" + expected: new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region Public Structure S Public Property [|P|] As Integer -End Structure"); +End Structure")); } [WorkItem(34650, "https://github.com/dotnet/roslyn/issues/34650")] @@ -2081,23 +2084,23 @@ public struct S var symbolName = "S.P"; await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, metadataLanguageVersion: "Preview", - expected: $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + expected: new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion public struct S {{ public readonly int [|P|] {{ get; set; }} -}}"); +}}")); await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, metadataLanguageVersion: "Preview", - expected: $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" + expected: new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region Public Structure S Public Property [|P|] As Integer -End Structure"); +End Structure")); } [WorkItem(34650, "https://github.com/dotnet/roslyn/issues/34650")] @@ -2113,7 +2116,7 @@ public struct S var symbolName = "S.Item"; await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, metadataLanguageVersion: "Preview", - expected: $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + expected: new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -2123,10 +2126,10 @@ await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSh public struct S {{ public readonly int [|this|][int i] {{ get; }} -}}"); +}}")); await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, metadataLanguageVersion: "Preview", - expected: $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" + expected: new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -2135,7 +2138,7 @@ Imports System.Reflection Public Structure S Default Public ReadOnly Property [|Item|](i As Integer) As Integer -End Structure"); +End Structure")); } [WorkItem(34650, "https://github.com/dotnet/roslyn/issues/34650")] @@ -2151,7 +2154,7 @@ public struct S var symbolName = "S.Item"; await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, metadataLanguageVersion: "Preview", - expected: $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + expected: new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -2161,10 +2164,10 @@ await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSh public struct S {{ public int [|this|][int i] {{ readonly get; set; }} -}}"); +}}")); await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, metadataLanguageVersion: "Preview", - expected: $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" + expected: new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -2173,7 +2176,7 @@ Imports System.Reflection Public Structure S Default Public Property [|Item|](i As Integer) As Integer -End Structure"); +End Structure")); } [WorkItem(34650, "https://github.com/dotnet/roslyn/issues/34650")] @@ -2189,7 +2192,7 @@ public readonly event System.Action E { add {} remove {} } var symbolName = "S.E"; await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, metadataLanguageVersion: "Preview", - expected: $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + expected: new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -2198,10 +2201,10 @@ await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSh public struct S {{ public readonly event Action [|E|]; -}}"); +}}")); await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, metadataLanguageVersion: "Preview", - expected: $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" + expected: new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -2209,7 +2212,7 @@ Imports System Public Structure S Public Event [|E|] As Action -End Structure"); +End Structure")); } [WorkItem(34650, "https://github.com/dotnet/roslyn/issues/34650")] @@ -2225,7 +2228,7 @@ public event System.Action E { add {} remove {} } var symbolName = "S.E"; await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSharp, metadataLanguageVersion: "Preview", - expected: $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + expected: new Lazy(() => $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null // {CodeAnalysisResources.InMemoryAssembly} #endregion @@ -2234,10 +2237,10 @@ await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.CSh public readonly struct S {{ public event Action [|E|]; -}}"); +}}")); await GenerateAndVerifySourceAsync(metadataSource, symbolName, LanguageNames.VisualBasic, metadataLanguageVersion: "Preview", - expected: $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" + expected: new Lazy(() => $@"#Region ""{FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" ' {CodeAnalysisResources.InMemoryAssembly} #End Region @@ -2247,7 +2250,7 @@ Imports System.Runtime.CompilerServices Public Structure S Public Event [|E|] As Action -End Structure"); +End Structure")); } [Fact, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] @@ -2286,7 +2289,7 @@ public class [|TestType|]<[NullableAttribute(1)] T> where T : notnull var navigationSymbol = await context.GetNavigationSymbolAsync(); var metadataAsSourceFile = await context.GenerateSourceAsync(navigationSymbol); - context.VerifyResult(metadataAsSourceFile, expected); + context.VerifyResult(metadataAsSourceFile, new Lazy(() => expected)); } [Fact, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] @@ -2331,7 +2334,7 @@ public class TestType var navigationSymbol = await context.GetNavigationSymbolAsync(); var metadataAsSourceFile = await context.GenerateSourceAsync(navigationSymbol); - context.VerifyResult(metadataAsSourceFile, expected); + context.VerifyResult(metadataAsSourceFile, new Lazy(() => expected)); } [Fact, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] @@ -2364,7 +2367,55 @@ class C var navigationSymbol = await context.GetNavigationSymbolAsync(); var metadataAsSourceFile = await context.GenerateSourceAsync(navigationSymbol); - context.VerifyResult(metadataAsSourceFile, expected); + context.VerifyResult(metadataAsSourceFile, new Lazy(() => expected)); + } + + [Theory, Trait(Traits.Feature, Traits.Features.MetadataAsSource)] + [InlineData(LanguageNames.CSharp)] + [InlineData(LanguageNames.VisualBasic)] + public async Task TestFailedDecompilation(string languageName) + { + var exportProvider = ExportProviderCache + .GetOrCreateExportProviderFactory( + TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithPart(typeof(ThrowingDecompiledSourceService))) + .CreateExportProvider(); + var throwingService = exportProvider.GetExportedValue(); + var expectedException = throwingService.Exception; + + var metadataSource = "public class C {}"; + var symbolName = "C"; + + var expected = new Lazy(() => + { + var failureText = "// " + expectedException.ToString().Replace("\n", "\n// "); + + // Using the decompiler forces the language to C#, so the expected output is the same in both cases + return $@"#region {FeaturesResources.Assembly} ReferencedAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null +// {CodeAnalysisResources.InMemoryAssembly} +#endregion + +public class [|C|] +{{ + public C(); +}} +{failureText}"; + }); + + await GenerateAndVerifySourceAsync(metadataSource, symbolName, languageName, expected, allowDecompilation: true, exportProvider: exportProvider); + } + + [Export] + [ExportLanguageService(typeof(IDecompiledSourceService), LanguageNames.CSharp, ServiceLayer.Host)] + [Shared] + [PartNotDiscoverable] + private sealed class ThrowingDecompiledSourceService : IDecompiledSourceService + { + public Exception Exception { get; } = new NotImplementedException(); + + public Task AddSourceToAsync(Document document, Compilation symbolCompilation, ISymbol symbol, CancellationToken cancellationToken) + { + throw Exception; + } } } }