dotnet / roslyn

The Roslyn .NET compiler provides C# and Visual Basic languages with rich code analysis APIs.
https://docs.microsoft.com/dotnet/csharp/roslyn-sdk/
MIT License
18.96k stars 4.03k forks source link

VerifyPdb helper doesn't include information about usings into XML used to verify baselines for portable format. #75300

Open AlekseyTs opened 4 days ago

AlekseyTs commented 4 days ago

The following test passes. Note VerifyPdb base-line for DebugInformationFormat.PortablePdb doesn't include any using information, but it is actually present in the PDB. As a result we are missing validation and and could potentially introduce a regression without noticing.

        [WorkItem("https://github.com/dotnet/roslyn/issues/74872")]
        [Fact]
        public void ExternAliases6()
        {
            string sourceA1 =
@"
namespace N
{
    public class A { }
}
";
            var comp = CreateCompilation(sourceA1, assemblyName: "A1");
            var refA1 = comp.EmitToImageReference(aliases: ImmutableArray.Create("A2"));

            string sourceA4 =
@"
namespace N
{
    public class A4 { }
}
";
            comp = CreateCompilation(sourceA4, assemblyName: "A4");
            var refA4 = comp.EmitToImageReference(aliases: ImmutableArray.Create("A5"));

            string sourceB =
@"
class B
{
    static void F(A x) { }
}
";
            string sourceC =
@"
extern alias A2;
global using A2::N;
";
            comp = CreateCompilation([sourceB, sourceC], references: new[] { refA1, refA4 }, options: TestOptions.DebugDll);
            comp.VerifyDiagnostics();

            comp.VerifyPdb(
@"
<symbols>
  <files>
    <file id=""1"" name="""" language=""C#"" />
  </files>
  <methods>
    <method containingType=""B"" name=""F"" parameterNames=""x"">
      <customDebugInfo>
        <using>
          <namespace usingCount=""1"" />
        </using>
      </customDebugInfo>
      <sequencePoints>
        <entry offset=""0x0"" startLine=""4"" startColumn=""24"" endLine=""4"" endColumn=""25"" document=""1"" />
        <entry offset=""0x1"" startLine=""4"" startColumn=""26"" endLine=""4"" endColumn=""27"" document=""1"" />
      </sequencePoints>
      <scope startOffset=""0x0"" endOffset=""0x2"">
        <namespace qualifier=""A2"" name=""N"" />
        <externinfo alias=""A2"" assembly=""A1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" />
        <externinfo alias=""A5"" assembly=""A4, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" />
      </scope>
    </method>
  </methods>
</symbols>
",
                format: DebugInformationFormat.Pdb);

            comp.VerifyPdb(
@"
<symbols>
  <files>
    <file id=""1"" name="""" language=""C#"" />
  </files>
  <methods>
    <method containingType=""B"" name=""F"" parameterNames=""x"">
      <sequencePoints>
        <entry offset=""0x0"" startLine=""4"" startColumn=""24"" endLine=""4"" endColumn=""25"" document=""1"" />
        <entry offset=""0x1"" startLine=""4"" startColumn=""26"" endLine=""4"" endColumn=""27"" document=""1"" />
      </sequencePoints>
    </method>
  </methods>
</symbols>
",
                format: DebugInformationFormat.PortablePdb);
        }

Also, PdbConverterPortableToWindows fails when the first VerifyPdb call for the scenario is done without explicitly providing format argument:

Microsoft.CodeAnalysis.CSharp.UnitTests.PDB.PDBUsingTests.ExternAliases6 [FAIL]
  PDB0007: token 0x35000002: An extern alias was not defined for assembly reference 23000002
  Stack Trace:
    D:\GitHub\roslyn\src\Test\PdbUtilities\Reader\PdbValidation.cs(328,0): at Microsoft.CodeAnalysis.Test.Utilities.PdbValidation.<>c.<VerifyConvertedPdbMatchesExpectedXml>b__16_0(PdbDiagnostic diagnostic)
       at Microsoft.DiaSymReader.Tools.PdbConverterPortableToWindows.ReportDiagnostic(PdbDiagnosticId id, Int32 token, Object[] args)
       at Microsoft.DiaSymReader.Tools.PdbConverterPortableToWindows.TryEncodeImport(MetadataReader pdbReader, MetadataModel metadataModel, ImportScopeHandle importScopeHandle, ImportDefinition import, HashSet`1 declaredExternAliases, ImmutableArray`1 aliasedAssemblyRefs, Boolean isProjectLevel, Boolean vbSemantics)
       at Microsoft.DiaSymReader.Tools.PdbConverterPortableToWindows.AddImportStrings(List`1 importStrings, List`1 importGroups, HashSet`1 declaredExternAliases, MetadataReader pdbReader, MetadataModel metadataModel, ImportScopeHandle importScopeHandle, ImmutableArray`1 aliasedAssemblyRefs, String vbDefaultNamespaceImportString, String vbCurrentMethodNamespace, Boolean vbSemantics)
       at Microsoft.DiaSymReader.Tools.PdbConverterPortableToWindows.Convert(PEReader peReader, MetadataReader pdbReader, SymUnmanagedWriter pdbWriter, PortablePdbConversionOptions options)
       at Microsoft.DiaSymReader.Tools.PdbConverter.ConvertPortableToWindows(PEReader peReader, MetadataReader pdbReader, SymUnmanagedWriter pdbWriter, PortablePdbConversionOptions options)
       at Microsoft.DiaSymReader.Tools.PdbConverter.ConvertPortableToWindows(PEReader peReader, MetadataReader pdbReader, Stream targetPdbStream, PortablePdbConversionOptions options)
       at Microsoft.DiaSymReader.Tools.PdbConverter.ConvertPortableToWindows(PEReader peReader, Stream sourcePdbStream, Stream targetPdbStream, PortablePdbConversionOptions options)
       at Microsoft.DiaSymReader.Tools.PdbConverter.ConvertPortableToWindows(Stream peStream, Stream sourcePdbStream, Stream targetPdbStream, PortablePdbConversionOptions options)
    D:\GitHub\roslyn\src\Test\PdbUtilities\Reader\PdbValidation.cs(335,0): at Microsoft.CodeAnalysis.Test.Utilities.PdbValidation.VerifyConvertedPdbMatchesExpectedXml(Stream peStreamOriginal, Stream pdbStreamOriginal, String qualifiedMethodName, String expectedPdb, PdbToXmlOptions pdbToXmlOptions, Boolean expectedIsRawXml, Boolean originalIsPortable)
    D:\GitHub\roslyn\src\Test\PdbUtilities\Reader\PdbValidation.cs(265,0): at Microsoft.CodeAnalysis.Test.Utilities.PdbValidation.<VerifyPdbImpl>g__Verify|13_0(Boolean isPortable, Boolean testOtherFormat, <>c__DisplayClass13_0&)
    D:\GitHub\roslyn\src\Test\PdbUtilities\Reader\PdbValidation.cs(252,0): at Microsoft.CodeAnalysis.Test.Utilities.PdbValidation.VerifyPdbImpl(Compilation compilation, IEnumerable`1 embeddedTexts, IMethodSymbol debugEntryPoint, String qualifiedMethodName, String expectedPdb, DebugInformationFormat format, PdbValidationOptions options, Int32 expectedValueSourceLine, String expectedValueSourcePath, Boolean expectedIsRawXml)
    D:\GitHub\roslyn\src\Test\PdbUtilities\Reader\PdbValidation.cs(176,0): at Microsoft.CodeAnalysis.Test.Utilities.PdbValidation.VerifyPdb(Compilation compilation, String qualifiedMethodName, String expectedPdb, IEnumerable`1 embeddedTexts, IMethodSymbol debugEntryPoint, DebugInformationFormat format, PdbValidationOptions options, Boolean expectedIsRawXml, Int32 expectedValueSourceLine, String expectedValueSourcePath)
    D:\GitHub\roslyn\src\Test\PdbUtilities\Reader\PdbValidation.cs(161,0): at Microsoft.CodeAnalysis.Test.Utilities.PdbValidation.VerifyPdb(Compilation compilation, String expectedPdb, IEnumerable`1 embeddedTexts, IMethodSymbol debugEntryPoint, DebugInformationFormat format, PdbValidationOptions options, Boolean expectedIsRawXml, Int32 expectedValueSourceLine, String expectedValueSourcePath)
    D:\GitHub\roslyn\src\Compilers\CSharp\Test\Emit2\PDB\PDBUsingTests.cs(885,0): at Microsoft.CodeAnalysis.CSharp.UnitTests.PDB.PDBUsingTests.ExternAliases6()
AlekseyTs commented 4 days ago

@tmat FYI