private static void TestDeterministicCompilationCSharp(string langVersion, SyntaxTree[] syntaxTrees, CSharpCompilationOptions compilationOptions, EmitOptions emitOptions, params TestMetadataReferenceInfo[] metadataReferences) { var originalCompilation = CreateCompilation( syntaxTrees, references: metadataReferences.SelectAsArray(r => r.MetadataReference), options: compilationOptions, // TFM needs to specified so the references are always the same, and not // dependent on the testrun environment targetFramework: TargetFramework.NetCoreApp30); var peBlob = originalCompilation.EmitToArray(options: emitOptions); using (var peReader = new PEReader(peBlob)) { var entries = peReader.ReadDebugDirectory(); AssertEx.Equal(new[] { DebugDirectoryEntryType.CodeView, DebugDirectoryEntryType.PdbChecksum, DebugDirectoryEntryType.Reproducible, DebugDirectoryEntryType.EmbeddedPortablePdb }, entries.Select(e => e.Type)); var codeView = entries[0]; var checksum = entries[1]; var reproducible = entries[2]; var embedded = entries[3]; using (var embeddedPdb = peReader.ReadEmbeddedPortablePdbDebugDirectoryData(embedded)) { var pdbReader = embeddedPdb.GetMetadataReader(); var metadataReferenceReader = DeterministicBuildCompilationTestHelpers.GetSingleBlob(PortableCustomDebugInfoKinds.CompilationMetadataReferences, pdbReader); var compilationOptionsReader = DeterministicBuildCompilationTestHelpers.GetSingleBlob(PortableCustomDebugInfoKinds.CompilationOptions, pdbReader); VerifyCompilationOptions(compilationOptions, originalCompilation, emitOptions, compilationOptionsReader, langVersion); DeterministicBuildCompilationTestHelpers.VerifyReferenceInfo(metadataReferences, metadataReferenceReader); } } }
private static IEnumerable <object[]> GetTestParameters() { foreach (var compilationOptions in GetCompilationOptions()) { foreach (var emitOptions in DeterministicBuildCompilationTestHelpers.GetEmitOptions()) { foreach (var parseOptions in GetCSharpParseOptions()) { yield return(new object[] { compilationOptions, emitOptions, parseOptions }); } } } }
private static void TestDeterministicCompilationCSharp( string langVersion, SyntaxTree[] syntaxTrees, CSharpCompilationOptions compilationOptions, EmitOptions emitOptions, TestMetadataReferenceInfo[] metadataReferences, int?debugDocumentsCount = null) { var targetFramework = TargetFramework.NetCoreApp; var originalCompilation = CreateCompilation( syntaxTrees, references: metadataReferences.SelectAsArray(r => r.MetadataReference), options: compilationOptions, targetFramework: targetFramework); var peBlob = originalCompilation.EmitToArray(options: emitOptions); using (var peReader = new PEReader(peBlob)) { var entries = peReader.ReadDebugDirectory(); AssertEx.Equal(new[] { DebugDirectoryEntryType.CodeView, DebugDirectoryEntryType.PdbChecksum, DebugDirectoryEntryType.Reproducible, DebugDirectoryEntryType.EmbeddedPortablePdb }, entries.Select(e => e.Type)); var codeView = entries[0]; var checksum = entries[1]; var reproducible = entries[2]; var embedded = entries[3]; using (var embeddedPdb = peReader.ReadEmbeddedPortablePdbDebugDirectoryData(embedded)) { var pdbReader = embeddedPdb.GetMetadataReader(); var metadataReferenceReader = DeterministicBuildCompilationTestHelpers.GetSingleBlob(PortableCustomDebugInfoKinds.CompilationMetadataReferences, pdbReader); var compilationOptionsReader = DeterministicBuildCompilationTestHelpers.GetSingleBlob(PortableCustomDebugInfoKinds.CompilationOptions, pdbReader); Assert.Equal(debugDocumentsCount ?? syntaxTrees.Length, pdbReader.Documents.Count); VerifyCompilationOptions(compilationOptions, originalCompilation, emitOptions, compilationOptionsReader, langVersion, syntaxTrees.Length); DeterministicBuildCompilationTestHelpers.VerifyReferenceInfo(metadataReferences, targetFramework, metadataReferenceReader); } } }
private static void VerifyCompilationOptions( CSharpCompilationOptions originalOptions, Compilation compilation, EmitOptions emitOptions, BlobReader compilationOptionsBlobReader, string langVersion) { var pdbOptions = DeterministicBuildCompilationTestHelpers.ParseCompilationOptions(compilationOptionsBlobReader); DeterministicBuildCompilationTestHelpers.AssertCommonOptions(emitOptions, originalOptions, compilation, pdbOptions); // See CSharpCompilation.SerializeForPdb to see options that are included pdbOptions.VerifyPdbOption("nullable", originalOptions.NullableContextOptions); pdbOptions.VerifyPdbOption("checked", originalOptions.CheckOverflow); pdbOptions.VerifyPdbOption("unsafe", originalOptions.AllowUnsafe); Assert.Equal(langVersion, pdbOptions["language-version"]); var firstSyntaxTree = (CSharpSyntaxTree)compilation.SyntaxTrees.FirstOrDefault(); pdbOptions.VerifyPdbOption("define", firstSyntaxTree.Options.PreprocessorSymbolNames, isDefault: v => v.IsEmpty(), toString: v => string.Join(",", v)); }
private static void VerifyCompilationOptions( CSharpCompilationOptions originalOptions, Compilation compilation, EmitOptions emitOptions, BlobReader compilationOptionsBlobReader, string langVersion) { var pdbOptions = DeterministicBuildCompilationTestHelpers.ParseCompilationOptions(compilationOptionsBlobReader); DeterministicBuildCompilationTestHelpers.AssertCommonOptions(emitOptions, originalOptions, compilation, pdbOptions); // See CSharpCompilation.SerializeForPdb to see options that are included Assert.Equal(originalOptions.NullableContextOptions.ToString(), pdbOptions["nullable"]); Assert.Equal(originalOptions.CheckOverflow.ToString(), pdbOptions["checked"]); Assert.Equal(originalOptions.AllowUnsafe.ToString(), pdbOptions["unsafe"]); Assert.Equal(langVersion, pdbOptions["language-version"]); var firstSyntaxTree = compilation.SyntaxTrees.FirstOrDefault() as CSharpSyntaxTree; if (firstSyntaxTree is null || firstSyntaxTree.Options.PreprocessorSymbols.IsEmpty) { Assert.False(pdbOptions.ContainsKey("define")); }