/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/CSharp/Test/Emit2/PDB/PDBUsingTests.cs
3 345 строк
122 KB
Fred Silberberg
Simplify sequence point display (#81104)
10 ноя 2025, 20:11
Не верифицирован
10 ноя 2025, 20:11
0544ad5
Код
Авторство
О чём код?
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System.Collections.Immutable; using System.IO; using System.Linq; using System.Reflection.Metadata; using System.Reflection.Metadata.Ecma335; using System.Reflection.PortableExecutable; using System.Text; using Microsoft.CodeAnalysis.CSharp.Test.Utilities; using Microsoft.CodeAnalysis.Emit; using Microsoft.CodeAnalysis.Test.Utilities; using Microsoft.Metadata.Tools; using Roslyn.Test.MetadataUtilities; using Roslyn.Test.Utilities; using Xunit; namespace Microsoft.CodeAnalysis.CSharp.UnitTests.PDB { public class PDBUsingTests : CSharpPDBTestBase { #region Helpers private static CSharpCompilation CreateDummyCompilation(string assemblyName) { return CreateCompilation( "public class C { }", assemblyName: assemblyName, options: TestOptions.DebugDll); } #endregion [Fact] public void TestUsings() { var text = @" using System; class A { void M() { } } namespace X { using System.IO; class B { void M() { } } namespace Y { using System.Threading; class C { void M() { } } } } "; CompileAndVerify(text, options: TestOptions.DebugDll).VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""A"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""4"" startColumn=""20"" endLine=""4"" endColumn=""21"" document=""1"" /> <entry offset=""0x1"" startLine=""4"" startColumn=""22"" endLine=""4"" endColumn=""23"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <namespace name=""System"" /> </scope> </method> <method containingType=""X.B"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""10"" startColumn=""24"" endLine=""10"" endColumn=""25"" document=""1"" /> <entry offset=""0x1"" startLine=""10"" startColumn=""26"" endLine=""10"" endColumn=""27"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <namespace name=""System.IO"" /> <namespace name=""System"" /> </scope> </method> <method containingType=""X.Y.C"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""16"" startColumn=""28"" endLine=""16"" endColumn=""29"" document=""1"" /> <entry offset=""0x1"" startLine=""16"" startColumn=""30"" endLine=""16"" endColumn=""31"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <namespace name=""System.Threading"" /> <namespace name=""System.IO"" /> <namespace name=""System"" /> </scope> </method> </methods> </symbols>"); } [Fact(Skip = "https://github.com/dotnet/roslyn/issues/25737")] public void TestNamespaceAliases() { var text = @" using P = System; class A { void M() { } } namespace X { using Q = System.IO; class B { void M() { } } namespace Y { using R = System.Threading; class C { void M() { } } } } "; CompileAndVerify(text, options: TestOptions.DebugDll).VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""A"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""4"" startColumn=""20"" endLine=""4"" endColumn=""21"" document=""1"" /> <entry offset=""0x1"" startLine=""4"" startColumn=""22"" endLine=""4"" endColumn=""23"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""P"" target=""System"" kind=""namespace"" /> </scope> </method> <method containingType=""X.B"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""10"" startColumn=""24"" endLine=""10"" endColumn=""25"" document=""1"" /> <entry offset=""0x1"" startLine=""10"" startColumn=""26"" endLine=""10"" endColumn=""27"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""Q"" target=""System.IO"" kind=""namespace"" /> <alias name=""P"" target=""System"" kind=""namespace"" /> </scope> </method> <method containingType=""X.Y.C"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""16"" startColumn=""28"" endLine=""16"" endColumn=""29"" document=""1"" /> <entry offset=""0x1"" startLine=""16"" startColumn=""30"" endLine=""16"" endColumn=""31"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""R"" target=""System.Threading"" kind=""namespace"" /> <alias name=""Q"" target=""System.IO"" kind=""namespace"" /> <alias name=""P"" target=""System"" kind=""namespace"" /> </scope> </method> </methods> </symbols>"); } [Fact(Skip = "https://github.com/dotnet/roslyn/issues/25737")] public void TestTypeAliases1() { var text = @" using P = System.String; class A { void M() { } } namespace X { using Q = System.Int32; class B { void M() { } } namespace Y { using R = System.Char; class C { void M() { } } } } "; CompileAndVerify(text, options: TestOptions.DebugDll).VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""A"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""4"" startColumn=""20"" endLine=""4"" endColumn=""21"" document=""1"" /> <entry offset=""0x1"" startLine=""4"" startColumn=""22"" endLine=""4"" endColumn=""23"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""P"" target=""System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> </scope> </method> <method containingType=""X.B"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""10"" startColumn=""24"" endLine=""10"" endColumn=""25"" document=""1"" /> <entry offset=""0x1"" startLine=""10"" startColumn=""26"" endLine=""10"" endColumn=""27"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""Q"" target=""System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""P"" target=""System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> </scope> </method> <method containingType=""X.Y.C"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""16"" startColumn=""28"" endLine=""16"" endColumn=""29"" document=""1"" /> <entry offset=""0x1"" startLine=""16"" startColumn=""30"" endLine=""16"" endColumn=""31"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""R"" target=""System.Char, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""Q"" target=""System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""P"" target=""System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> </scope> </method> </methods> </symbols>"); } [Fact(Skip = "https://github.com/dotnet/roslyn/issues/68312")] public void TestTypeAliases1_B() { var text = @" using P = string; class A { void M() { } } namespace X { using Q = int; class B { void M() { } } namespace Y { using R = char; class C { void M() { } } } } "; CompileAndVerify(text, options: TestOptions.DebugDll, targetFramework: TargetFramework.NetFramework).VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""A"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""4"" startColumn=""20"" endLine=""4"" endColumn=""21"" document=""1"" /> <entry offset=""0x1"" startLine=""4"" startColumn=""22"" endLine=""4"" endColumn=""23"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""P"" target=""System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> </scope> </method> <method containingType=""X.B"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""10"" startColumn=""24"" endLine=""10"" endColumn=""25"" document=""1"" /> <entry offset=""0x1"" startLine=""10"" startColumn=""26"" endLine=""10"" endColumn=""27"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""Q"" target=""System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""P"" target=""System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> </scope> </method> <method containingType=""X.Y.C"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""16"" startColumn=""28"" endLine=""16"" endColumn=""29"" document=""1"" /> <entry offset=""0x1"" startLine=""16"" startColumn=""30"" endLine=""16"" endColumn=""31"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""R"" target=""System.Char, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""Q"" target=""System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""P"" target=""System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> </scope> </method> </methods> </symbols>"); } [Fact(Skip = "https://github.com/dotnet/roslyn/issues/25737")] public void TestTypeAliases2() { var text = @" using P = System.Collections.Generic.List<int>; class A { void M() { } } namespace X { using Q = System.Collections.Generic.List<System.Collections.Generic.List<char>>; class B { void M() { } } namespace Y { using P = System.Char; //hides previous P class C { void M() { } } } } "; CompileAndVerify(text, options: TestOptions.DebugDll).VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""A"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""4"" startColumn=""20"" endLine=""4"" endColumn=""21"" document=""1"" /> <entry offset=""0x1"" startLine=""4"" startColumn=""22"" endLine=""4"" endColumn=""23"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""P"" target=""System.Collections.Generic.List`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> </scope> </method> <method containingType=""X.B"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""10"" startColumn=""24"" endLine=""10"" endColumn=""25"" document=""1"" /> <entry offset=""0x1"" startLine=""10"" startColumn=""26"" endLine=""10"" endColumn=""27"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""Q"" target=""System.Collections.Generic.List`1[[System.Collections.Generic.List`1[[System.Char, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""P"" target=""System.Collections.Generic.List`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> </scope> </method> <method containingType=""X.Y.C"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""16"" startColumn=""28"" endLine=""16"" endColumn=""29"" document=""1"" /> <entry offset=""0x1"" startLine=""16"" startColumn=""30"" endLine=""16"" endColumn=""31"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""P"" target=""System.Char, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""Q"" target=""System.Collections.Generic.List`1[[System.Collections.Generic.List`1[[System.Char, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""P"" target=""System.Collections.Generic.List`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> </scope> </method> </methods> </symbols>"); } [Fact(Skip = "https://github.com/dotnet/roslyn/issues/68312")] public void TestTypeAliases3() { var text = @" using P = (int a, string b); class A { void M() { } } namespace X { using Q = int[]; class B { void M() { } } namespace Y { using R = dynamic; class C { void M() { } } namespace X { using unsafe S = int*; class D { void M() { } } } } } "; CompileAndVerify(text, options: TestOptions.UnsafeDebugDll, targetFramework: TargetFramework.NetFramework).VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""A"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""4"" startColumn=""20"" endLine=""4"" endColumn=""21"" document=""1"" /> <entry offset=""0x1"" startLine=""4"" startColumn=""22"" endLine=""4"" endColumn=""23"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""P"" target=""System.ValueTuple`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.ValueTuple, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51"" kind=""type"" /> </scope> </method> <method containingType=""X.B"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""10"" startColumn=""24"" endLine=""10"" endColumn=""25"" document=""1"" /> <entry offset=""0x1"" startLine=""10"" startColumn=""26"" endLine=""10"" endColumn=""27"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""Q"" target=""System.Int32[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""P"" target=""System.ValueTuple`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.ValueTuple, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51"" kind=""type"" /> </scope> </method> <method containingType=""X.Y.C"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""16"" startColumn=""28"" endLine=""16"" endColumn=""29"" document=""1"" /> <entry offset=""0x1"" startLine=""16"" startColumn=""30"" endLine=""16"" endColumn=""31"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""R"" target=""System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""Q"" target=""System.Int32[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""P"" target=""System.ValueTuple`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.ValueTuple, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51"" kind=""type"" /> </scope> </method> <method containingType=""X.Y.X.D"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""22"" startColumn=""32"" endLine=""22"" endColumn=""33"" document=""1"" /> <entry offset=""0x1"" startLine=""22"" startColumn=""34"" endLine=""22"" endColumn=""35"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""S"" target=""System.Int32*, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""R"" target=""System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""Q"" target=""System.Int32[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""P"" target=""System.ValueTuple`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.ValueTuple, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51"" kind=""type"" /> </scope> </method> </methods> </symbols>"); } [Fact] public void TestExternAliases1() { CSharpCompilation dummyCompilation1 = CreateDummyCompilation("a"); CSharpCompilation dummyCompilation2 = CreateDummyCompilation("b"); CSharpCompilation dummyCompilation3 = CreateDummyCompilation("c"); var text = @" extern alias P; class A { void M() { } } namespace X { extern alias Q; class B { void M() { } } namespace Y { extern alias R; class C { void M() { } } } } "; var compilation = CreateCompilation(text, assemblyName: GetUniqueName(), parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), options: TestOptions.DebugDll, references: new[] { new CSharpCompilationReference(dummyCompilation1, ImmutableArray.Create("P")) , new CSharpCompilationReference(dummyCompilation2, ImmutableArray.Create("Q")), new CSharpCompilationReference(dummyCompilation3, ImmutableArray.Create("R")) }); compilation.VerifyDiagnostics( // (2,1): info CS8020: Unused extern alias. // extern alias P; Diagnostic(ErrorCode.HDN_UnusedExternAlias, "extern alias P;"), // (8,5): info CS8020: Unused extern alias. // extern alias Q; Diagnostic(ErrorCode.HDN_UnusedExternAlias, "extern alias Q;"), // (14,9): info CS8020: Unused extern alias. // extern alias R; Diagnostic(ErrorCode.HDN_UnusedExternAlias, "extern alias R;")); compilation.VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""A"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""4"" startColumn=""20"" endLine=""4"" endColumn=""21"" document=""1"" /> <entry offset=""0x1"" startLine=""4"" startColumn=""22"" endLine=""4"" endColumn=""23"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""P"" /> <externinfo alias=""P"" assembly=""a, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> <externinfo alias=""Q"" assembly=""b, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> <externinfo alias=""R"" assembly=""c, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> </scope> </method> <method containingType=""X.B"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> </using> <forwardToModule declaringType=""A"" methodName=""M"" /> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""10"" startColumn=""24"" endLine=""10"" endColumn=""25"" document=""1"" /> <entry offset=""0x1"" startLine=""10"" startColumn=""26"" endLine=""10"" endColumn=""27"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""Q"" /> <extern alias=""P"" /> </scope> </method> <method containingType=""X.Y.C"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> <namespace usingCount=""1"" /> </using> <forwardToModule declaringType=""A"" methodName=""M"" /> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""16"" startColumn=""28"" endLine=""16"" endColumn=""29"" document=""1"" /> <entry offset=""0x1"" startLine=""16"" startColumn=""30"" endLine=""16"" endColumn=""31"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""R"" /> <extern alias=""Q"" /> <extern alias=""P"" /> </scope> </method> </methods> </symbols>"); } [Fact] [WorkItem(1120579, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1120579")] public void TestExternAliases2() { string source1 = @" namespace U.V.W {} "; var compilation1 = CreateCompilation(source1, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), options: TestOptions.DebugDll, assemblyName: "TestExternAliases2"); string source2 = @" using U.V.W; class A { void M() { } } "; var compilation2 = CreateCompilation( source2, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), options: TestOptions.DebugDll, references: new[] { // first unaliased reference compilation1.ToMetadataReference(), // second aliased reference compilation1.ToMetadataReference(ImmutableArray.Create("X")) }); compilation2.VerifyPdb("A.M", @" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""A"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""4"" startColumn=""20"" endLine=""4"" endColumn=""21"" document=""1"" /> <entry offset=""0x1"" startLine=""4"" startColumn=""23"" endLine=""4"" endColumn=""24"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <namespace name=""U.V.W"" /> <externinfo alias=""X"" assembly=""TestExternAliases2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> </scope> </method> </methods> </symbols> "); } [Fact] [WorkItem(1120579, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1120579")] public void TestExternAliases3() { string source1 = @" namespace U.V.W {} "; var compilation1 = CreateCompilation(source1, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), options: TestOptions.DebugDll, assemblyName: "TestExternAliases3"); string source2 = @" using U.V.W; class A { void M() { } } "; var compilation2 = CreateCompilation( source2, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), options: TestOptions.DebugDll, references: new[] { // first aliased reference compilation1.ToMetadataReference(ImmutableArray.Create("X")), // second unaliased reference compilation1.ToMetadataReference(), }); compilation2.VerifyPdb("A.M", @" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""A"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""4"" startColumn=""20"" endLine=""4"" endColumn=""21"" document=""1"" /> <entry offset=""0x1"" startLine=""4"" startColumn=""23"" endLine=""4"" endColumn=""24"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <namespace name=""U.V.W"" /> <externinfo alias=""X"" assembly=""TestExternAliases3, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> </scope> </method> </methods> </symbols> "); } [Fact] [WorkItem(60045, "https://github.com/dotnet/roslyn/issues/60045")] public void ExternAliases4() { var src1 = @" namespace N { public class C { } }"; var dummyCompilation = CreateCompilation(src1, assemblyName: "A", options: TestOptions.DebugDll); var src2 = @" namespace M { extern alias A; using A::N; public class D { public C P { get { return new C(); } set { } } } }"; var compilation = CreateCompilation(src2, assemblyName: GetUniqueName(), options: TestOptions.DebugDll, references: new[] { new CSharpCompilationReference(dummyCompilation, ImmutableArray.Create("A", "A")), }); compilation.VerifyDiagnostics(); compilation.GetEmitDiagnostics(); compilation.VerifyEmitDiagnostics(); } [WorkItem(63927, "https://github.com/dotnet/roslyn/issues/63927")] [Fact] public void ExternAliases5() { string sourceA = @"public class A { }"; var comp = CreateCompilation(sourceA, assemblyName: "A1"); var refA = comp.EmitToImageReference(aliases: ImmutableArray.Create("A2")); string sourceB = @"#nullable enable extern alias A2; class B { static void F(A2::A? a) { } } "; comp = CreateCompilation(sourceB, references: new[] { refA }, options: TestOptions.DebugDll); comp.VerifyDiagnostics(); comp.VerifyPdb( @"<symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""B"" name=""F"" parameterNames=""a""> <customDebugInfo> <using> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""5"" startColumn=""29"" endLine=""5"" endColumn=""30"" document=""1"" /> <entry offset=""0x1"" startLine=""5"" startColumn=""31"" endLine=""5"" endColumn=""32"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""A2"" /> <externinfo alias=""A2"" assembly=""A1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> </scope> </method> </methods> </symbols> "); } [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); } [WorkItem("https://github.com/dotnet/roslyn/issues/74872")] [Fact] public void ExternAliases7() { 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(N2.A x) { } } "; string sourceC = @" extern alias A2; global using N2 = 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=""27"" endLine=""4"" endColumn=""28"" document=""1"" /> <entry offset=""0x1"" startLine=""4"" startColumn=""29"" endLine=""4"" endColumn=""30"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""N2"" qualifier=""A2"" target=""N"" kind=""namespace"" /> <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=""27"" endLine=""4"" endColumn=""28"" document=""1"" /> <entry offset=""0x1"" startLine=""4"" startColumn=""29"" endLine=""4"" endColumn=""30"" document=""1"" /> </sequencePoints> </method> </methods> </symbols> ", format: DebugInformationFormat.PortablePdb); } [WorkItem("https://github.com/dotnet/roslyn/issues/74872")] [Fact] public void ExternAliases8() { string sourceA1 = @" namespace N { public class A { } } "; var comp = CreateCompilation(sourceA1, assemblyName: "A1"); var refA1 = comp.EmitToImageReference(aliases: ImmutableArray.Create("A2", "A3")); string sourceA4 = @" namespace N { public class A4 { } } "; comp = CreateCompilation(sourceA4, assemblyName: "A4"); var refA4 = comp.EmitToImageReference(aliases: ImmutableArray.Create("A5")); string sourceB = @" extern alias A3; 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( // (2,1): hidden CS8020: Unused extern alias. // extern alias A3; Diagnostic(ErrorCode.HDN_UnusedExternAlias, "extern alias A3;").WithLocation(2, 1) ); comp.VerifyPdb( @" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""B"" name=""F"" parameterNames=""x""> <customDebugInfo> <using> <namespace usingCount=""2"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""5"" startColumn=""24"" endLine=""5"" endColumn=""25"" document=""1"" /> <entry offset=""0x1"" startLine=""5"" startColumn=""26"" endLine=""5"" endColumn=""27"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""A3"" /> <namespace qualifier=""A3"" name=""N"" /> <externinfo alias=""A2"" assembly=""A1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> <externinfo alias=""A3"" 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=""5"" startColumn=""24"" endLine=""5"" endColumn=""25"" document=""1"" /> <entry offset=""0x1"" startLine=""5"" startColumn=""26"" endLine=""5"" endColumn=""27"" document=""1"" /> </sequencePoints> </method> </methods> </symbols> ", format: DebugInformationFormat.PortablePdb); } [WorkItem("https://github.com/dotnet/roslyn/issues/74872")] [Fact] public void ExternAliases9() { string sourceA1 = @" namespace N { public class A { } } "; var comp = CreateCompilation(sourceA1, assemblyName: "A1"); var refA1 = comp.EmitToImageReference(aliases: ImmutableArray.Create("A2", "A3")); string sourceA4 = @" namespace N { public class A4 { } } "; comp = CreateCompilation(sourceA4, assemblyName: "A4"); var refA4 = comp.EmitToImageReference(aliases: ImmutableArray.Create("A5")); string sourceB = @" extern alias A3; class B { static void F(N2.A x) { } } "; string sourceC = @" extern alias A2; global using N2 = A2::N; "; comp = CreateCompilation([sourceB, sourceC], references: new[] { refA1, refA4 }, options: TestOptions.DebugDll); comp.VerifyDiagnostics( // (2,1): hidden CS8020: Unused extern alias. // extern alias A3; Diagnostic(ErrorCode.HDN_UnusedExternAlias, "extern alias A3;").WithLocation(2, 1) ); comp.VerifyPdb( @" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""B"" name=""F"" parameterNames=""x""> <customDebugInfo> <using> <namespace usingCount=""2"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""5"" startColumn=""27"" endLine=""5"" endColumn=""28"" document=""1"" /> <entry offset=""0x1"" startLine=""5"" startColumn=""29"" endLine=""5"" endColumn=""30"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""A3"" /> <alias name=""N2"" qualifier=""A3"" target=""N"" kind=""namespace"" /> <externinfo alias=""A2"" assembly=""A1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> <externinfo alias=""A3"" 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=""5"" startColumn=""27"" endLine=""5"" endColumn=""28"" document=""1"" /> <entry offset=""0x1"" startLine=""5"" startColumn=""29"" endLine=""5"" endColumn=""30"" document=""1"" /> </sequencePoints> </method> </methods> </symbols> ", format: DebugInformationFormat.PortablePdb); } [WorkItem("https://github.com/dotnet/roslyn/issues/74872")] [Fact] public void ExternAliases10() { 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 = @" extern alias A5; 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( // (2,1): hidden CS8020: Unused extern alias. // extern alias A5; Diagnostic(ErrorCode.HDN_UnusedExternAlias, "extern alias A5;").WithLocation(2, 1) ); comp.VerifyPdb( @" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""B"" name=""F"" parameterNames=""x""> <customDebugInfo> <using> <namespace usingCount=""2"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""5"" startColumn=""24"" endLine=""5"" endColumn=""25"" document=""1"" /> <entry offset=""0x1"" startLine=""5"" startColumn=""26"" endLine=""5"" endColumn=""27"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""A5"" /> <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=""5"" startColumn=""24"" endLine=""5"" endColumn=""25"" document=""1"" /> <entry offset=""0x1"" startLine=""5"" startColumn=""26"" endLine=""5"" endColumn=""27"" document=""1"" /> </sequencePoints> </method> </methods> </symbols> ", format: DebugInformationFormat.PortablePdb); } [WorkItem("https://github.com/dotnet/roslyn/issues/74872")] [Fact] public void ExternAliases11() { 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 = @" extern alias A5; class B { static void F(N2.A x) { } } "; string sourceC = @" extern alias A2; global using N2 = A2::N; "; comp = CreateCompilation([sourceB, sourceC], references: new[] { refA1, refA4 }, options: TestOptions.DebugDll); comp.VerifyDiagnostics( // (2,1): hidden CS8020: Unused extern alias. // extern alias A5; Diagnostic(ErrorCode.HDN_UnusedExternAlias, "extern alias A5;").WithLocation(2, 1) ); comp.VerifyPdb( @" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""B"" name=""F"" parameterNames=""x""> <customDebugInfo> <using> <namespace usingCount=""2"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""5"" startColumn=""27"" endLine=""5"" endColumn=""28"" document=""1"" /> <entry offset=""0x1"" startLine=""5"" startColumn=""29"" endLine=""5"" endColumn=""30"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""A5"" /> <alias name=""N2"" qualifier=""A2"" target=""N"" kind=""namespace"" /> <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=""5"" startColumn=""27"" endLine=""5"" endColumn=""28"" document=""1"" /> <entry offset=""0x1"" startLine=""5"" startColumn=""29"" endLine=""5"" endColumn=""30"" document=""1"" /> </sequencePoints> </method> </methods> </symbols> ", format: DebugInformationFormat.PortablePdb); } [Fact(Skip = "https://github.com/dotnet/roslyn/issues/25737")] public void TestExternAliases_ExplicitAndGlobal() { var dummySource = @" namespace N { public class C { } } "; CSharpCompilation dummyCompilation1 = CreateCompilation(dummySource, assemblyName: "A", options: TestOptions.DebugDll); CSharpCompilation dummyCompilation2 = CreateCompilation(dummySource, assemblyName: "B", options: TestOptions.DebugDll); var text = @" extern alias A; extern alias B; using X = A::N; using Y = B::N; using Z = global::N; class C { void M() { } } "; var compilation = CreateCompilation(text, assemblyName: GetUniqueName(), options: TestOptions.DebugDll, references: new[] { new CSharpCompilationReference(dummyCompilation1, ImmutableArray.Create("global", "A")), new CSharpCompilationReference(dummyCompilation2, ImmutableArray.Create("B", "global")) }); compilation.VerifyDiagnostics( // (5,1): hidden CS8019: Unnecessary using directive. // using Y = B::N; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using Y = B::N;").WithLocation(5, 1), // (4,1): hidden CS8019: Unnecessary using directive. // using X = A::N; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using X = A::N;").WithLocation(4, 1), // (6,1): hidden CS8019: Unnecessary using directive. // using Z = global::N; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using Z = global::N;").WithLocation(6, 1)); compilation.VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""C"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""5""/> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""8"" startColumn=""20"" endLine=""8"" endColumn=""21"" document=""1"" /> <entry offset=""0x1"" startLine=""8"" startColumn=""22"" endLine=""8"" endColumn=""23"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""A""/> <extern alias=""B""/> <alias name=""X"" target=""N"" kind=""namespace""/> <alias name=""Y"" target=""N"" kind=""namespace""/> <alias name=""Z"" target=""N"" kind=""namespace""/> <externinfo alias=""A"" assembly=""A, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null""/> <externinfo alias=""B"" assembly=""B, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null""/> </scope> </method> </methods> </symbols>"); } [Fact(Skip = "https://github.com/dotnet/roslyn/issues/25737")] public void TestExternAliasesInUsing() { CSharpCompilation libComp = CreateCompilation(@" namespace N { public class A { } }", assemblyName: "Lib"); var text = @" extern alias P; using P::N; using Q = P::N.A; using R = P::N; using global::N; using S = global::N.B; using T = global::N; namespace N { class B { void M() { } } } "; var compilation = CreateCompilation(text, assemblyName: "Test", options: TestOptions.DebugDll, references: new[] { new CSharpCompilationReference(libComp, ImmutableArray.Create("P")) }); compilation.GetDiagnostics().Where(d => d.Severity > DiagnosticSeverity.Info).Verify(); compilation.VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""N.B"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""0"" /> <namespace usingCount=""7"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""12"" startColumn=""24"" endLine=""12"" endColumn=""25"" document=""1"" /> <entry offset=""0x1"" startLine=""12"" startColumn=""26"" endLine=""12"" endColumn=""27"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""P"" /> <namespace qualifier=""P"" name=""N"" /> <namespace name=""N"" /> <alias name=""Q"" target=""N.A, Lib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" kind=""type"" /> <alias name=""R"" qualifier=""P"" target=""N"" kind=""namespace"" /> <alias name=""S"" target=""N.B"" kind=""type"" /> <alias name=""T"" target=""N"" kind=""namespace"" /> <externinfo alias=""P"" assembly=""Lib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> </scope> </method> </methods> </symbols>"); } [Fact(Skip = "https://github.com/dotnet/roslyn/issues/25737")] public void TestNamespacesAndAliases() { CSharpCompilation dummyCompilation1 = CreateDummyCompilation("a"); CSharpCompilation dummyCompilation2 = CreateDummyCompilation("b"); CSharpCompilation dummyCompilation3 = CreateDummyCompilation("c"); var text = @" extern alias P; using System; using AU1 = System; using AT1 = System.Char; class A { void M() { } } namespace X { extern alias Q; using AU2 = System.IO; using AT2 = System.IO.Directory; using System.IO; class B { void M() { } } namespace Y { extern alias R; using AT3 = System.Text.StringBuilder; using System.Text; using AU3 = System.Text; class C { void M() { } } } } "; var compilation = CreateCompilation(text, assemblyName: GetUniqueName(), options: TestOptions.DebugDll, references: new[] { new CSharpCompilationReference(dummyCompilation1, ImmutableArray.Create("P")) , new CSharpCompilationReference(dummyCompilation2, ImmutableArray.Create("Q")), new CSharpCompilationReference(dummyCompilation3, ImmutableArray.Create("R")) }); compilation.VerifyDiagnostics( // (3,1): info CS8019: Unnecessary using directive. // using System; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using System;"), // (4,1): info CS8019: Unnecessary using directive. // using AU1 = System; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AU1 = System;"), // (5,1): info CS8019: Unnecessary using directive. // using AT1 = System.Char; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AT1 = System.Char;"), // (2,1): info CS8020: Unused extern alias. // extern alias P; Diagnostic(ErrorCode.HDN_UnusedExternAlias, "extern alias P;"), // (12,5): info CS8019: Unnecessary using directive. // using AU2 = System.IO; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AU2 = System.IO;"), // (13,5): info CS8019: Unnecessary using directive. // using AT2 = System.IO.Directory; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AT2 = System.IO.Directory;"), // (14,5): info CS8019: Unnecessary using directive. // using System.IO; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using System.IO;"), // (11,5): info CS8020: Unused extern alias. // extern alias Q; Diagnostic(ErrorCode.HDN_UnusedExternAlias, "extern alias Q;"), // (21,9): info CS8019: Unnecessary using directive. // using AT3 = System.Text.StringBuilder; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AT3 = System.Text.StringBuilder;"), // (22,9): info CS8019: Unnecessary using directive. // using System.Text; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using System.Text;"), // (23,9): info CS8019: Unnecessary using directive. // using AU3 = System.Text; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AU3 = System.Text;"), // (20,9): info CS8020: Unused extern alias. // extern alias R; Diagnostic(ErrorCode.HDN_UnusedExternAlias, "extern alias R;")); compilation.VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""A"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""4"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""7"" startColumn=""20"" endLine=""7"" endColumn=""21"" document=""1"" /> <entry offset=""0x1"" startLine=""7"" startColumn=""22"" endLine=""7"" endColumn=""23"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""P"" /> <namespace name=""System"" /> <alias name=""AT1"" target=""System.Char, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""AU1"" target=""System"" kind=""namespace"" /> <externinfo alias=""P"" assembly=""a, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> <externinfo alias=""Q"" assembly=""b, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> <externinfo alias=""R"" assembly=""c, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> </scope> </method> <method containingType=""X.B"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""4"" /> <namespace usingCount=""4"" /> </using> <forwardToModule declaringType=""A"" methodName=""M"" /> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""16"" startColumn=""24"" endLine=""16"" endColumn=""25"" document=""1"" /> <entry offset=""0x1"" startLine=""16"" startColumn=""26"" endLine=""16"" endColumn=""27"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""Q"" /> <namespace name=""System.IO"" /> <alias name=""AT2"" target=""System.IO.Directory, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""AU2"" target=""System.IO"" kind=""namespace"" /> <extern alias=""P"" /> <namespace name=""System"" /> <alias name=""AT1"" target=""System.Char, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""AU1"" target=""System"" kind=""namespace"" /> </scope> </method> <method containingType=""X.Y.C"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""4"" /> <namespace usingCount=""4"" /> <namespace usingCount=""4"" /> </using> <forwardToModule declaringType=""A"" methodName=""M"" /> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""25"" startColumn=""28"" endLine=""25"" endColumn=""29"" document=""1"" /> <entry offset=""0x1"" startLine=""25"" startColumn=""30"" endLine=""25"" endColumn=""31"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""R"" /> <namespace name=""System.Text"" /> <alias name=""AT3"" target=""System.Text.StringBuilder, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""AU3"" target=""System.Text"" kind=""namespace"" /> <extern alias=""Q"" /> <namespace name=""System.IO"" /> <alias name=""AT2"" target=""System.IO.Directory, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""AU2"" target=""System.IO"" kind=""namespace"" /> <extern alias=""P"" /> <namespace name=""System"" /> <alias name=""AT1"" target=""System.Char, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""AU1"" target=""System"" kind=""namespace"" /> </scope> </method> </methods> </symbols>"); } [Fact(Skip = "https://github.com/dotnet/roslyn/issues/25737"), WorkItem(913022, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/913022")] public void ReferenceWithMultipleAliases() { var source1 = @" namespace N { public class D { } } namespace M { public class E { } } "; var compilation1 = CreateCompilation(source1, options: TestOptions.DebugDll); var source2 = @" extern alias A; extern alias B; using A::N; using B::M; using X = A::N; using Y = B::N; public class C { public static void Main() { System.Console.WriteLine(new D()); System.Console.WriteLine(new E()); System.Console.WriteLine(new X.D()); System.Console.WriteLine(new Y.D()); } }"; var compilation2 = CreateCompilation(source2, options: TestOptions.DebugDll, references: new[] { new CSharpCompilationReference(compilation1, ImmutableArray.Create("A", "B")) }); compilation2.VerifyDiagnostics(); compilation2.VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""C"" name=""Main""> <customDebugInfo> <using> <namespace usingCount=""6""/> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""13"" startColumn=""5"" endLine=""13"" endColumn=""6"" document=""1"" /> <entry offset=""0x1"" startLine=""14"" startColumn=""9"" endLine=""14"" endColumn=""43"" document=""1"" /> <entry offset=""0xc"" startLine=""15"" startColumn=""9"" endLine=""15"" endColumn=""43"" document=""1"" /> <entry offset=""0x17"" startLine=""16"" startColumn=""9"" endLine=""16"" endColumn=""45"" document=""1"" /> <entry offset=""0x22"" startLine=""17"" startColumn=""9"" endLine=""17"" endColumn=""45"" document=""1"" /> <entry offset=""0x2d"" startLine=""18"" startColumn=""5"" endLine=""18"" endColumn=""6"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2e""> <extern alias=""A""/> <extern alias=""B""/> <namespace qualifier=""A"" name=""N""/> <namespace qualifier=""A"" name=""M""/> <alias name=""X"" qualifier=""A"" target=""N"" kind=""namespace""/> <alias name=""Y"" qualifier=""A"" target=""N"" kind=""namespace""/> <externinfo alias = ""A"" assembly=""" + compilation1.AssemblyName + @", Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> <externinfo alias = ""B"" assembly=""" + compilation1.AssemblyName + @", Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> </scope> </method> </methods> </symbols> "); } [Fact] [WorkItem(913022, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/913022")] public void ReferenceWithGlobalAndDuplicateAliases() { var source1 = @" namespace N { public class D { } } "; var compilation1 = CreateCompilation(source1, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), options: TestOptions.DebugDll); var source2 = @" extern alias A; extern alias B; public class C { public static void Main() { System.Console.WriteLine(new N.D()); System.Console.WriteLine(new A::N.D()); System.Console.WriteLine(new B::N.D()); } }"; var compilation2 = CreateCompilation(source2, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), options: TestOptions.DebugDll, references: new[] { new CSharpCompilationReference(compilation1, ImmutableArray.Create("global", "B", "A", "A", "global")) }); compilation2.VerifyDiagnostics(); compilation2.VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""C"" name=""Main""> <customDebugInfo> <using> <namespace usingCount=""2"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""8"" startColumn=""5"" endLine=""8"" endColumn=""6"" document=""1"" /> <entry offset=""0x1"" startLine=""9"" startColumn=""9"" endLine=""9"" endColumn=""45"" document=""1"" /> <entry offset=""0xc"" startLine=""10"" startColumn=""9"" endLine=""10"" endColumn=""48"" document=""1"" /> <entry offset=""0x17"" startLine=""11"" startColumn=""9"" endLine=""11"" endColumn=""48"" document=""1"" /> <entry offset=""0x22"" startLine=""12"" startColumn=""5"" endLine=""12"" endColumn=""6"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x23""> <extern alias=""A"" /> <extern alias=""B"" /> <externinfo alias=""B"" assembly=""" + compilation1.AssemblyName + @", Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> <externinfo alias=""A"" assembly=""" + compilation1.AssemblyName + @", Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> </scope> </method> </methods> </symbols> "); } [Fact(Skip = "https://github.com/dotnet/roslyn/issues/25737")] public void TestPartialTypeInOneFile() { CSharpCompilation dummyCompilation1 = CreateDummyCompilation("a"); CSharpCompilation dummyCompilation2 = CreateDummyCompilation("b"); CSharpCompilation dummyCompilation3 = CreateDummyCompilation("c"); var text1 = @" extern alias P; using System; using AU1 = System; using AT1 = System.Char; namespace X { extern alias Q; using AU2 = System.IO; using AT2 = System.IO.Directory; using System.IO; partial class C { partial void M(); void N1() { } } } namespace X { extern alias R; using AU3 = System.Threading; using AT3 = System.Threading.Thread; using System.Threading; partial class C { partial void M() { } void N2() { } } } "; var compilation = CreateCompilation( text1, assemblyName: GetUniqueName(), options: TestOptions.DebugDll, references: new[] { new CSharpCompilationReference(dummyCompilation1, ImmutableArray.Create("P")), new CSharpCompilationReference(dummyCompilation2, ImmutableArray.Create("Q")), new CSharpCompilationReference(dummyCompilation3, ImmutableArray.Create("R")), }); compilation.VerifyDiagnostics( // (3,1): info CS8019: Unnecessary using directive. // using System; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using System;"), // (4,1): info CS8019: Unnecessary using directive. // using AU1 = System; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AU1 = System;"), // (5,1): info CS8019: Unnecessary using directive. // using AT1 = System.Char; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AT1 = System.Char;"), // (2,1): info CS8020: Unused extern alias. // extern alias P; Diagnostic(ErrorCode.HDN_UnusedExternAlias, "extern alias P;"), // (24,5): info CS8019: Unnecessary using directive. // using AU3 = System.Threading; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AU3 = System.Threading;"), // (25,5): info CS8019: Unnecessary using directive. // using AT3 = System.Threading.Thread; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AT3 = System.Threading.Thread;"), // (26,5): info CS8019: Unnecessary using directive. // using System.Threading; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using System.Threading;"), // (23,5): info CS8020: Unused extern alias. // extern alias R; Diagnostic(ErrorCode.HDN_UnusedExternAlias, "extern alias R;"), // (10,5): info CS8019: Unnecessary using directive. // using AU2 = System.IO; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AU2 = System.IO;"), // (11,5): info CS8019: Unnecessary using directive. // using AT2 = System.IO.Directory; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AT2 = System.IO.Directory;"), // (12,5): info CS8019: Unnecessary using directive. // using System.IO; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using System.IO;"), // (9,5): info CS8020: Unused extern alias. // extern alias Q; Diagnostic(ErrorCode.HDN_UnusedExternAlias, "extern alias Q;")); compilation.VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""X.C"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""4"" /> <namespace usingCount=""4"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""30"" startColumn=""26"" endLine=""30"" endColumn=""27"" document=""1"" /> <entry offset=""0x1"" startLine=""30"" startColumn=""28"" endLine=""30"" endColumn=""29"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""R"" /> <namespace name=""System.Threading"" /> <alias name=""AT3"" target=""System.Threading.Thread, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""AU3"" target=""System.Threading"" kind=""namespace"" /> <extern alias=""P"" /> <namespace name=""System"" /> <alias name=""AT1"" target=""System.Char, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""AU1"" target=""System"" kind=""namespace"" /> <externinfo alias=""P"" assembly=""a, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> <externinfo alias=""Q"" assembly=""b, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> <externinfo alias=""R"" assembly=""c, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> </scope> </method> <method containingType=""X.C"" name=""N1""> <customDebugInfo> <using> <namespace usingCount=""4"" /> <namespace usingCount=""4"" /> </using> <forwardToModule declaringType=""X.C"" methodName=""M"" /> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""17"" startColumn=""19"" endLine=""17"" endColumn=""20"" document=""1"" /> <entry offset=""0x1"" startLine=""17"" startColumn=""21"" endLine=""17"" endColumn=""22"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""Q"" /> <namespace name=""System.IO"" /> <alias name=""AT2"" target=""System.IO.Directory, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""AU2"" target=""System.IO"" kind=""namespace"" /> <extern alias=""P"" /> <namespace name=""System"" /> <alias name=""AT1"" target=""System.Char, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""AU1"" target=""System"" kind=""namespace"" /> </scope> </method> <method containingType=""X.C"" name=""N2""> <customDebugInfo> <using> <namespace usingCount=""4"" /> <namespace usingCount=""4"" /> </using> <forwardToModule declaringType=""X.C"" methodName=""M"" /> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""31"" startColumn=""19"" endLine=""31"" endColumn=""20"" document=""1"" /> <entry offset=""0x1"" startLine=""31"" startColumn=""21"" endLine=""31"" endColumn=""22"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""R"" /> <namespace name=""System.Threading"" /> <alias name=""AT3"" target=""System.Threading.Thread, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""AU3"" target=""System.Threading"" kind=""namespace"" /> <extern alias=""P"" /> <namespace name=""System"" /> <alias name=""AT1"" target=""System.Char, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""AU1"" target=""System"" kind=""namespace"" /> </scope> </method> </methods> </symbols>", options: PdbValidationOptions.SkipConversionValidation); // TODO: https://github.com/dotnet/roslyn/issues/18004 } [Fact(Skip = "https://github.com/dotnet/roslyn/issues/25737")] public void TestPartialTypeInTwoFiles() { CSharpCompilation dummyCompilation1 = CreateDummyCompilation("a"); CSharpCompilation dummyCompilation2 = CreateDummyCompilation("b"); CSharpCompilation dummyCompilation3 = CreateDummyCompilation("c"); CSharpCompilation dummyCompilation4 = CreateDummyCompilation("d"); var text1 = @" extern alias P; using System; using AU1 = System; using AT1 = System.Char; namespace X { extern alias Q; using AU2 = System.IO; using AT2 = System.IO.Directory; using System.IO; partial class C { partial void M(); void N1() { } } } "; var text2 = @" extern alias R; using System.Text; using AU3 = System.Text; using AT3 = System.Text.StringBuilder; namespace X { extern alias S; using AU4 = System.Threading; using AT4 = System.Threading.Thread; using System.Threading; partial class C { partial void M() { } void N2() { } } } "; var compilation = CreateCompilation( new string[] { text1, text2 }, assemblyName: GetUniqueName(), options: TestOptions.DebugDll, references: new[] { new CSharpCompilationReference(dummyCompilation1, ImmutableArray.Create("P")), new CSharpCompilationReference(dummyCompilation2, ImmutableArray.Create("Q")), new CSharpCompilationReference(dummyCompilation3, ImmutableArray.Create("R")), new CSharpCompilationReference(dummyCompilation4, ImmutableArray.Create("S")), }); compilation.VerifyDiagnostics( // (3,1): info CS8019: Unnecessary using directive. // using System; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using System;"), // (4,1): info CS8019: Unnecessary using directive. // using AU1 = System; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AU1 = System;"), // (5,1): info CS8019: Unnecessary using directive. // using AT1 = System.Char; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AT1 = System.Char;"), // (2,1): info CS8020: Unused extern alias. // extern alias P; Diagnostic(ErrorCode.HDN_UnusedExternAlias, "extern alias P;"), // (3,1): info CS8019: Unnecessary using directive. // using System.Text; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using System.Text;"), // (4,1): info CS8019: Unnecessary using directive. // using AU3 = System.Text; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AU3 = System.Text;"), // (5,1): info CS8019: Unnecessary using directive. // using AT3 = System.Text.StringBuilder; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AT3 = System.Text.StringBuilder;"), // (10,5): info CS8019: Unnecessary using directive. // using AU2 = System.IO; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AU2 = System.IO;"), // (2,1): info CS8020: Unused extern alias. // extern alias R; Diagnostic(ErrorCode.HDN_UnusedExternAlias, "extern alias R;"), // (11,5): info CS8019: Unnecessary using directive. // using AT2 = System.IO.Directory; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AT2 = System.IO.Directory;"), // (12,5): info CS8019: Unnecessary using directive. // using System.IO; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using System.IO;"), // (10,5): info CS8019: Unnecessary using directive. // using AU4 = System.Threading; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AU4 = System.Threading;"), // (9,5): info CS8020: Unused extern alias. // extern alias Q; Diagnostic(ErrorCode.HDN_UnusedExternAlias, "extern alias Q;"), // (11,5): info CS8019: Unnecessary using directive. // using AT4 = System.Threading.Thread; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using AT4 = System.Threading.Thread;"), // (12,5): info CS8019: Unnecessary using directive. // using System.Threading; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using System.Threading;"), // (9,5): info CS8020: Unused extern alias. // extern alias S; Diagnostic(ErrorCode.HDN_UnusedExternAlias, "extern alias S;")); compilation.VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""X.C"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""4"" /> <namespace usingCount=""4"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""16"" startColumn=""26"" endLine=""16"" endColumn=""27"" document=""1"" /> <entry offset=""0x1"" startLine=""16"" startColumn=""28"" endLine=""16"" endColumn=""29"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""S"" /> <namespace name=""System.Threading"" /> <alias name=""AT4"" target=""System.Threading.Thread, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""AU4"" target=""System.Threading"" kind=""namespace"" /> <extern alias=""R"" /> <namespace name=""System.Text"" /> <alias name=""AT3"" target=""System.Text.StringBuilder, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""AU3"" target=""System.Text"" kind=""namespace"" /> <externinfo alias=""P"" assembly=""a, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> <externinfo alias=""Q"" assembly=""b, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> <externinfo alias=""R"" assembly=""c, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> <externinfo alias=""S"" assembly=""d, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> </scope> </method> <method containingType=""X.C"" name=""N1""> <customDebugInfo> <using> <namespace usingCount=""4"" /> <namespace usingCount=""4"" /> </using> <forwardToModule declaringType=""X.C"" methodName=""M"" /> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""17"" startColumn=""19"" endLine=""17"" endColumn=""20"" document=""1"" /> <entry offset=""0x1"" startLine=""17"" startColumn=""21"" endLine=""17"" endColumn=""22"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""Q"" /> <namespace name=""System.IO"" /> <alias name=""AT2"" target=""System.IO.Directory, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""AU2"" target=""System.IO"" kind=""namespace"" /> <extern alias=""P"" /> <namespace name=""System"" /> <alias name=""AT1"" target=""System.Char, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""AU1"" target=""System"" kind=""namespace"" /> </scope> </method> <method containingType=""X.C"" name=""N2""> <customDebugInfo> <using> <namespace usingCount=""4"" /> <namespace usingCount=""4"" /> </using> <forwardToModule declaringType=""X.C"" methodName=""M"" /> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""17"" startColumn=""19"" endLine=""17"" endColumn=""20"" document=""1"" /> <entry offset=""0x1"" startLine=""17"" startColumn=""21"" endLine=""17"" endColumn=""22"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <extern alias=""S"" /> <namespace name=""System.Threading"" /> <alias name=""AT4"" target=""System.Threading.Thread, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""AU4"" target=""System.Threading"" kind=""namespace"" /> <extern alias=""R"" /> <namespace name=""System.Text"" /> <alias name=""AT3"" target=""System.Text.StringBuilder, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> <alias name=""AU3"" target=""System.Text"" kind=""namespace"" /> </scope> </method> </methods> </symbols>", options: PdbValidationOptions.SkipConversionValidation); // TODO: https://github.com/dotnet/roslyn/issues/18004 } [Fact] public void TestSynthesizedConstructors() { var text = @" namespace X { using System; partial class C { int x = 1; static int sx = 1; } } namespace X { using System.IO; partial class C { int y = 1; static int sy = 1; } } "; CompileAndVerify(text, options: TestOptions.DebugDll).VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""X.C"" name="".ctor""> <customDebugInfo> <using> <namespace usingCount=""1""/> <namespace usingCount=""0""/> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""8"" startColumn=""9"" endLine=""8"" endColumn=""19"" document=""1"" /> <entry offset=""0x7"" startLine=""19"" startColumn=""9"" endLine=""19"" endColumn=""19"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x16""> <namespace name=""System""/> </scope> </method> <method containingType=""X.C"" name="".cctor""> <customDebugInfo> <forward declaringType=""X.C"" methodName="".ctor""/> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""9"" startColumn=""9"" endLine=""9"" endColumn=""27"" document=""1"" /> <entry offset=""0x6"" startLine=""20"" startColumn=""9"" endLine=""20"" endColumn=""27"" document=""1"" /> </sequencePoints> </method> </methods> </symbols>"); } [Fact] public void TestFieldInitializerLambdas() { var text = WithWindowsLineBreaks(@" using System.Linq; class C { int x = new int[2].Count(x => { return x % 3 == 0; }); static bool sx = new int[2].Any(x => { return x % 2 == 0; }); } "); CompileAndVerify(text, options: TestOptions.DebugDll).VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""C"" name="".ctor""> <customDebugInfo> <using> <namespace usingCount=""1"" /> </using> <encLambdaMap> <methodOrdinal>2</methodOrdinal> <lambda offset=""-23"" /> </encLambdaMap> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""6"" startColumn=""5"" endLine=""6"" endColumn=""59"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x38""> <namespace name=""System.Linq"" /> </scope> </method> <method containingType=""C"" name="".cctor""> <customDebugInfo> <forward declaringType=""C"" methodName="".ctor"" /> <encLambdaMap> <methodOrdinal>3</methodOrdinal> <lambda offset=""-38"" /> </encLambdaMap> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""7"" startColumn=""5"" endLine=""10"" endColumn=""8"" document=""1"" /> </sequencePoints> </method> <method containingType=""C+<>c"" name=""<.ctor>b__2_0"" parameterNames=""x""> <customDebugInfo> <forward declaringType=""C"" methodName="".ctor"" /> <encLocalSlotMap> <slot kind=""21"" offset=""-23"" /> </encLocalSlotMap> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""6"" startColumn=""35"" endLine=""6"" endColumn=""36"" document=""1"" /> <entry offset=""0x1"" startLine=""6"" startColumn=""37"" endLine=""6"" endColumn=""55"" document=""1"" /> <entry offset=""0xa"" startLine=""6"" startColumn=""56"" endLine=""6"" endColumn=""57"" document=""1"" /> </sequencePoints> </method> <method containingType=""C+<>c"" name=""<.cctor>b__3_0"" parameterNames=""x""> <customDebugInfo> <forward declaringType=""C"" methodName="".ctor"" /> <encLocalSlotMap> <slot kind=""21"" offset=""-38"" /> </encLocalSlotMap> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""8"" startColumn=""5"" endLine=""8"" endColumn=""6"" document=""1"" /> <entry offset=""0x1"" startLine=""9"" startColumn=""9"" endLine=""9"" endColumn=""27"" document=""1"" /> <entry offset=""0xa"" startLine=""10"" startColumn=""5"" endLine=""10"" endColumn=""6"" document=""1"" /> </sequencePoints> </method> </methods> </symbols>"); } [Fact] public void TestAccessors() { var text = WithWindowsLineBreaks(@" using System; class C { int P1 { get; set; } int P2 { get { return 0; } set { } } int this[int x] { get { return 0; } set { } } event System.Action E1; event System.Action E2 { add { } remove { } } } "); CompileAndVerify(text, options: TestOptions.DebugDll).VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""C"" name=""get_P1""> <sequencePoints> <entry offset=""0x0"" startLine=""6"" startColumn=""14"" endLine=""6"" endColumn=""18"" document=""1"" /> </sequencePoints> </method> <method containingType=""C"" name=""set_P1"" parameterNames=""value""> <sequencePoints> <entry offset=""0x0"" startLine=""6"" startColumn=""19"" endLine=""6"" endColumn=""23"" document=""1"" /> </sequencePoints> </method> <method containingType=""C"" name=""get_P2""> <customDebugInfo> <using> <namespace usingCount=""1"" /> </using> <encLocalSlotMap> <slot kind=""21"" offset=""0"" /> </encLocalSlotMap> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""7"" startColumn=""18"" endLine=""7"" endColumn=""19"" document=""1"" /> <entry offset=""0x1"" startLine=""7"" startColumn=""20"" endLine=""7"" endColumn=""29"" document=""1"" /> <entry offset=""0x5"" startLine=""7"" startColumn=""30"" endLine=""7"" endColumn=""31"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x7""> <namespace name=""System"" /> </scope> </method> <method containingType=""C"" name=""set_P2"" parameterNames=""value""> <customDebugInfo> <forward declaringType=""C"" methodName=""get_P2"" /> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""7"" startColumn=""36"" endLine=""7"" endColumn=""37"" document=""1"" /> <entry offset=""0x1"" startLine=""7"" startColumn=""38"" endLine=""7"" endColumn=""39"" document=""1"" /> </sequencePoints> </method> <method containingType=""C"" name=""get_Item"" parameterNames=""x""> <customDebugInfo> <forward declaringType=""C"" methodName=""get_P2"" /> <encLocalSlotMap> <slot kind=""21"" offset=""0"" /> </encLocalSlotMap> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""8"" startColumn=""27"" endLine=""8"" endColumn=""28"" document=""1"" /> <entry offset=""0x1"" startLine=""8"" startColumn=""29"" endLine=""8"" endColumn=""38"" document=""1"" /> <entry offset=""0x5"" startLine=""8"" startColumn=""39"" endLine=""8"" endColumn=""40"" document=""1"" /> </sequencePoints> </method> <method containingType=""C"" name=""set_Item"" parameterNames=""x, value""> <customDebugInfo> <forward declaringType=""C"" methodName=""get_P2"" /> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""8"" startColumn=""45"" endLine=""8"" endColumn=""46"" document=""1"" /> <entry offset=""0x1"" startLine=""8"" startColumn=""47"" endLine=""8"" endColumn=""48"" document=""1"" /> </sequencePoints> </method> <method containingType=""C"" name=""add_E2"" parameterNames=""value""> <customDebugInfo> <forward declaringType=""C"" methodName=""get_P2"" /> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""10"" startColumn=""34"" endLine=""10"" endColumn=""35"" document=""1"" /> <entry offset=""0x1"" startLine=""10"" startColumn=""36"" endLine=""10"" endColumn=""37"" document=""1"" /> </sequencePoints> </method> <method containingType=""C"" name=""remove_E2"" parameterNames=""value""> <customDebugInfo> <forward declaringType=""C"" methodName=""get_P2"" /> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""10"" startColumn=""45"" endLine=""10"" endColumn=""46"" document=""1"" /> <entry offset=""0x1"" startLine=""10"" startColumn=""47"" endLine=""10"" endColumn=""48"" document=""1"" /> </sequencePoints> </method> </methods> </symbols>"); } [Fact] public void TestSynthesizedSealedAccessors() { var text = @" using System; class Base { public virtual int P { get; set; } } class Derived : Base { public sealed override int P { set { } } //have to synthesize a sealed getter } "; CompileAndVerify(text, options: TestOptions.DebugDll).VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""Base"" name=""get_P""> <sequencePoints> <entry offset=""0x0"" startLine=""6"" startColumn=""28"" endLine=""6"" endColumn=""32"" document=""1"" /> </sequencePoints> </method> <method containingType=""Base"" name=""set_P"" parameterNames=""value""> <sequencePoints> <entry offset=""0x0"" startLine=""6"" startColumn=""33"" endLine=""6"" endColumn=""37"" document=""1"" /> </sequencePoints> </method> <method containingType=""Derived"" name=""set_P"" parameterNames=""value""> <customDebugInfo> <using> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""11"" startColumn=""40"" endLine=""11"" endColumn=""41"" document=""1"" /> <entry offset=""0x1"" startLine=""11"" startColumn=""42"" endLine=""11"" endColumn=""43"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <namespace name=""System"" /> </scope> </method> </methods> </symbols>"); } [Fact] public void TestSynthesizedExplicitImplementation() { var text = WithWindowsLineBreaks(@" using System.Runtime.CompilerServices; interface I1 { [IndexerName(""A"")] int this[int x] { get; set; } } interface I2 { [IndexerName(""B"")] int this[int x] { get; set; } } class C : I1, I2 { public int this[int x] { get { return 0; } set { } } } "); CompileAndVerify(text, options: TestOptions.DebugDll).VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""C"" name=""get_Item"" parameterNames=""x""> <customDebugInfo> <using> <namespace usingCount=""1"" /> </using> <encLocalSlotMap> <slot kind=""21"" offset=""0"" /> </encLocalSlotMap> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""18"" startColumn=""34"" endLine=""18"" endColumn=""35"" document=""1"" /> <entry offset=""0x1"" startLine=""18"" startColumn=""36"" endLine=""18"" endColumn=""45"" document=""1"" /> <entry offset=""0x5"" startLine=""18"" startColumn=""46"" endLine=""18"" endColumn=""47"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x7""> <namespace name=""System.Runtime.CompilerServices"" /> </scope> </method> <method containingType=""C"" name=""set_Item"" parameterNames=""x, value""> <customDebugInfo> <forward declaringType=""C"" methodName=""get_Item"" parameterNames=""x"" /> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""18"" startColumn=""52"" endLine=""18"" endColumn=""53"" document=""1"" /> <entry offset=""0x1"" startLine=""18"" startColumn=""54"" endLine=""18"" endColumn=""55"" document=""1"" /> </sequencePoints> </method> </methods> </symbols>"); } [WorkItem(692496, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/692496")] [Fact] public void SequencePointOnUsingExpression() { var source = @" using System; public class Test : IDisposable { static void Main() { using (new Test()) { } } public void Dispose() { } } "; var v = CompileAndVerify(source, options: TestOptions.DebugDll); v.VerifyIL("Test.Main", @" { // Code size 23 (0x17) .maxstack 1 .locals init (Test V_0) -IL_0000: nop -IL_0001: newobj ""Test..ctor()"" IL_0006: stloc.0 .try { -IL_0007: nop -IL_0008: nop IL_0009: leave.s IL_0016 } finally { ~IL_000b: ldloc.0 IL_000c: brfalse.s IL_0015 IL_000e: ldloc.0 IL_000f: callvirt ""void System.IDisposable.Dispose()"" IL_0014: nop ~IL_0015: endfinally } -IL_0016: ret }", sequencePointDisplay: SequencePointDisplayMode.Minimal); } [Fact(Skip = "https://github.com/dotnet/roslyn/issues/25737")] public void TestNestedType() { var libSource = @" public class Outer { public class Inner { } } "; var libRef = CreateCompilation(libSource, assemblyName: "Lib").EmitToImageReference(); var source = @" using I = Outer.Inner; public class Test { static void Main() { } } "; CompileAndVerify(source, new[] { libRef }, options: TestOptions.DebugExe).VerifyPdb("Test.Main", @" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <entryPoint declaringType=""Test"" methodName=""Main"" /> <methods> <method containingType=""Test"" name=""Main""> <customDebugInfo> <using> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""7"" startColumn=""5"" endLine=""7"" endColumn=""6"" document=""1"" /> <entry offset=""0x1"" startLine=""8"" startColumn=""5"" endLine=""8"" endColumn=""6"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""I"" target=""Outer+Inner, Lib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" kind=""type"" /> </scope> </method> </methods> </symbols>"); } [Fact(Skip = "https://github.com/dotnet/roslyn/issues/25737")] public void TestVerbatimIdentifiers() { var source = @" using @namespace; using @object = @namespace; using @string = @namespace.@class<@namespace.@interface>.@struct; namespace @namespace { public class @class<T> { public struct @struct { } } public interface @interface { } } class Test { static void Main() { } } "; var comp = CreateCompilation(source); // As in dev12, we drop all '@'s. comp.VerifyPdb("Test.Main", @" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""Test"" name=""Main""> <customDebugInfo> <using> <namespace usingCount=""3"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""20"" startColumn=""35"" endLine=""20"" endColumn=""36"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x1""> <namespace name=""namespace"" /> <alias name=""object"" target=""namespace"" kind=""namespace"" /> <alias name=""string"" target=""namespace.class`1+struct[namespace.interface]"" kind=""type"" /> </scope> </method> </methods> </symbols>"); } [WorkItem(842479, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/842479")] [Fact(Skip = "https://github.com/dotnet/roslyn/issues/25737")] public void UsingExternAlias() { var libSource = "public class C { }"; var lib = CreateCompilation(libSource, assemblyName: "Lib"); var libRef = lib.EmitToImageReference(aliases: ImmutableArray.Create("Q")); var source = @" extern alias Q; using R = Q; using Q; namespace N { using S = R; using R; class D { static void Main() { } } } "; var comp = CreateCompilation(source, new[] { libRef }); comp.VerifyPdb("N.D.Main", @" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""N.D"" name=""Main""> <customDebugInfo> <using> <namespace usingCount=""2"" /> <namespace usingCount=""3"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""13"" startColumn=""30"" endLine=""13"" endColumn=""31"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x1""> <namespace qualifier=""Q"" name="""" /> <alias name=""S"" qualifier=""Q"" target="""" kind=""namespace"" /> <extern alias=""Q"" /> <namespace qualifier=""Q"" name="""" /> <alias name=""R"" qualifier=""Q"" target="""" kind=""namespace"" /> <externinfo alias=""Q"" assembly=""Lib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" /> </scope> </method> </methods> </symbols>"); } [WorkItem(842478, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/842478")] [Fact(Skip = "https://github.com/dotnet/roslyn/issues/25737")] public void AliasIncludingDynamic() { var source = @" using AD = System.Action<dynamic>; class D { static void Main() { } } "; var comp = CreateCompilation(source); comp.VerifyPdb("D.Main", @" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""D"" name=""Main""> <customDebugInfo> <using> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""6"" startColumn=""26"" endLine=""6"" endColumn=""27"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x1""> <alias name=""AD"" target=""System.Action`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" kind=""type"" /> </scope> </method> </methods> </symbols>"); } [Fact] public void UsingExpression() { TestSequencePoints( @"using System; public class Test : IDisposable { static void Main() { [|using (new Test())|] { } } public void Dispose() { } }", TestOptions.ReleaseExe, methodName: "Test.Main"); } [Fact] public void UsingVariable() { TestSequencePoints( @"using System; public class Test : IDisposable { static void Main() { var x = new Test(); [|using (x)|] { } } public void Dispose() { } }", TestOptions.ReleaseExe, methodName: "Test.Main"); } [WorkItem(546754, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546754")] [Fact(Skip = "https://github.com/dotnet/roslyn/issues/25737")] public void ArrayType() { var source1 = @" using System; public class W {} public class Y<T> { public class F {} public class Z<U> {} } "; var comp1 = CreateCompilation(source1, options: TestOptions.DebugDll, assemblyName: "Comp1"); var source2 = @" using t1 = Y<W[]>; using t2 = Y<W[,]>; using t3 = Y<W[,][]>; using t4 = Y<Y<W>[][,]>; using t5 = Y<W[,][]>.Z<W[][,,]>; using t6 = Y<Y<Y<int[]>.F[,][]>.Z<Y<W[,][]>.F[]>[][]>; public class C1 { public static void Main() { } } "; var comp2 = CreateCompilation(source2, new[] { comp1.ToMetadataReference() }, options: TestOptions.DebugExe); comp2.VerifyPdb(@" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <entryPoint declaringType=""C1"" methodName=""Main"" /> <methods> <method containingType=""C1"" name=""Main""> <customDebugInfo> <using> <namespace usingCount=""6"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""12"" startColumn=""5"" endLine=""12"" endColumn=""6"" document=""1"" /> <entry offset=""0x1"" startLine=""13"" startColumn=""5"" endLine=""13"" endColumn=""6"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x2""> <alias name=""t1"" target=""Y`1[[W[], Comp1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], Comp1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" kind=""type"" /> <alias name=""t2"" target=""Y`1[[W[,], Comp1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], Comp1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" kind=""type"" /> <alias name=""t3"" target=""Y`1[[W[][,], Comp1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], Comp1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" kind=""type"" /> <alias name=""t4"" target=""Y`1[[Y`1[[W, Comp1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]][,][], Comp1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], Comp1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" kind=""type"" /> <alias name=""t5"" target=""Y`1+Z`1[[W[][,], Comp1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null],[W[,,][], Comp1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], Comp1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" kind=""type"" /> <alias name=""t6"" target=""Y`1[[Y`1+Z`1[[Y`1+F[[System.Int32[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]][][,], Comp1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null],[Y`1+F[[W[][,], Comp1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]][], Comp1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]][][], Comp1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], Comp1, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" kind=""type"" /> </scope> </method> </methods> </symbols>"); } [Fact(Skip = "https://github.com/dotnet/roslyn/issues/25737"), WorkItem(543615, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/543615")] public void WRN_DebugFullNameTooLong() { var text = @" using System; using DICT1 = System.Collections.Generic.Dictionary<int, int>; namespace goo { using ACT = System.Action<DICT1, DICT1, DICT1, DICT1, DICT1, DICT1, DICT1>; class C { static void Main() { ACT ac = null; Console.Write(ac); } } }"; var compilation = CreateCompilation(text, options: TestOptions.DebugExe); var exebits = new MemoryStream(); var pdbbits = new MemoryStream(); var result = compilation.Emit(exebits, pdbbits); result.Diagnostics.Verify( Diagnostic(ErrorCode.WRN_DebugFullNameTooLong, "Main").WithArguments("AACT TSystem.Action`7[[System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")); } [WorkItem(1084059, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1084059")] [Fact] public void StaticType() { var source = @" using static System.Math; class D { static void Main() { Max(1, 2); } } "; var comp = CreateCompilation(source, targetFramework: TargetFramework.Mscorlib40); comp.VerifyPdb("D.Main", @" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""D"" name=""Main""> <customDebugInfo> <using> <namespace usingCount=""1""/> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""8"" startColumn=""9"" endLine=""8"" endColumn=""19"" document=""1"" /> <entry offset=""0x8"" startLine=""9"" startColumn=""5"" endLine=""9"" endColumn=""6"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x9""> <type name=""System.Math, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089""/> </scope> </method> </methods> </symbols>"); } [Fact] public void UnusedImports() { var source = @" extern alias A; using System; using X = A::System.Linq.Enumerable; using Y = A::System.Linq; using Z = System.Data.DataColumn; using F = System.Func<int>; class C { static void Main() { } } "; var comp = CreateCompilationWithMscorlib40(source, parseOptions: TestOptions.Regular.WithNoRefSafetyRulesAttribute(), references: new[] { SystemCoreRef.WithAliases(new[] { "A" }), SystemDataRef }); var v = CompileAndVerify(comp, validator: (peAssembly) => { var reader = peAssembly.ManifestModule.MetadataReader; Assert.Equal(new[] { "mscorlib", "System.Core", "System.Data" }, peAssembly.AssemblyReferences.Select(ai => ai.Name)); Assert.Equal(new[] { "CompilationRelaxationsAttribute", "RuntimeCompatibilityAttribute", "DebuggableAttribute", "DebuggingModes", "Object", "Func`1", "Enumerable", "DataColumn" }, reader.TypeReferences.Select(h => reader.GetString(reader.GetTypeReference(h).Name))); Assert.Equal(1, reader.GetTableRowCount(TableIndex.TypeSpec)); }); } [Fact] public void UnusedImports_Nonexisting() { var source = @" extern alias A; using B; using X = C.D; using Y = A::E; using Z = F<int>; class C { static void Main() { } } "; var comp = CreateCompilation(source); comp.VerifyDiagnostics( // (6,11): error CS0246: The type or namespace name 'F<>' could not be found (are you missing a using directive or an assembly reference?) // using Z = F<int>; Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "F<int>").WithArguments("F<>").WithLocation(6, 11), // (5,14): error CS0234: The type or namespace name 'E' does not exist in the namespace 'A' (are you missing an assembly reference?) // using Y = A::E; Diagnostic(ErrorCode.ERR_DottedTypeNameNotFoundInNS, "E").WithArguments("E", "A").WithLocation(5, 14), // (4,13): error CS0426: The type name 'D' does not exist in the type 'C' // using X = C.D; Diagnostic(ErrorCode.ERR_DottedTypeNameNotFoundInAgg, "D").WithArguments("D", "C").WithLocation(4, 13), // (2,14): error CS0430: The extern alias 'A' was not specified in a /reference option // extern alias A; Diagnostic(ErrorCode.ERR_BadExternAlias, "A").WithArguments("A").WithLocation(2, 14), // (3,7): error CS0246: The type or namespace name 'B' could not be found (are you missing a using directive or an assembly reference?) // using B; Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "B").WithArguments("B").WithLocation(3, 7), // (5,1): hidden CS8019: Unnecessary using directive. // using Y = A::E; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using Y = A::E;").WithLocation(5, 1), // (3,1): hidden CS8019: Unnecessary using directive. // using B; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using B;").WithLocation(3, 1), // (4,1): hidden CS8019: Unnecessary using directive. // using X = C.D; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using X = C.D;").WithLocation(4, 1), // (6,1): hidden CS8019: Unnecessary using directive. // using Z = F<int>; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using Z = F<int>;").WithLocation(6, 1) ); } [Fact] public void EmittingPdbVsNot() { string source = @" using System; using X = System.IO.FileStream; class C { int x = 1; static int y = 1; C() { Console.WriteLine(); } } "; var c = CreateCompilation(source, assemblyName: "EmittingPdbVsNot", options: TestOptions.ReleaseDll); var peStream1 = new MemoryStream(); var peStream2 = new MemoryStream(); var pdbStream = new MemoryStream(); c.Emit(peStream: peStream1, pdbStream: pdbStream); c.Emit(peStream: peStream2); MetadataValidation.VerifyMetadataEqualModuloMvid(peStream1, peStream2); } [ConditionalFact(typeof(WindowsDesktopOnly), Reason = ConditionalSkipReason.NoPiaNeedsDesktop)] public void ImportedNoPiaTypes() { var sourceLib = @" using System; using System.Reflection; using System.Runtime.InteropServices; [assembly: Guid(""11111111-1111-1111-1111-111111111111"")] [assembly: ImportedFromTypeLib(""Goo"")] [assembly: TypeLibVersion(1, 0)] namespace N { public enum E { Value1 = 1 } public struct S1 { public int A1; public int A2; } public struct S2 { public const int Value2 = 2; } public struct SBad { public int A3; public const int Value3 = 3; } [ComImport, Guid(""22222222-2222-2222-2222-222222222222"")] public interface I { void F(); } public interface IBad { void F(); } } "; var source = @" using System; using static N.E; using static N.SBad; using Z1 = N.S1; using Z2 = N.S2; using ZBad = N.SBad; using NI = N.I; using NIBad = N.IBad; class C { NI i; void M() { Console.WriteLine(Value1); Console.WriteLine(Z2.Value2); Console.WriteLine(new Z1()); } } "; var libRef = CreateCompilation(sourceLib, assemblyName: "ImportedNoPiaTypesAssemblyName").EmitToImageReference(embedInteropTypes: true); var compilation = CreateCompilation(source, new[] { libRef }); var v = CompileAndVerify(compilation); v.Diagnostics.Verify( // (14,8): warning CS0169: The field 'C.i' is never used // NI i; Diagnostic(ErrorCode.WRN_UnreferencedField, "i").WithArguments("C.i"), // (5,1): hidden CS8019: Unnecessary using directive. // using static N.SBad; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using static N.SBad;"), // (10,1): hidden CS8019: Unnecessary using directive. // using NIBad = N.IBad; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using NIBad = N.IBad;"), // (8,1): hidden CS8019: Unnecessary using directive. // using ZBad = N.SBad; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using ZBad = N.SBad;")); // Usings of embedded types are currently omitted: v.VerifyPdb("C.M", @" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""C"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""1"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""18"" startColumn=""9"" endLine=""18"" endColumn=""35"" document=""1"" /> <entry offset=""0xb"" startLine=""19"" startColumn=""9"" endLine=""19"" endColumn=""38"" document=""1"" /> <entry offset=""0x11"" startLine=""20"" startColumn=""9"" endLine=""20"" endColumn=""37"" document=""1"" /> <entry offset=""0x24"" startLine=""21"" startColumn=""5"" endLine=""21"" endColumn=""6"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x25""> <namespace name=""System"" /> </scope> </method> </methods> </symbols>"); } [Fact(Skip = "https://github.com/dotnet/roslyn/issues/25737")] public void ImportedTypeWithUnknownBase() { var sourceLib1 = @" namespace N { public class A { } } "; var sourceLib2 = @" namespace N { public class B : A { } } "; var source = @" using System; using X = N.B; class C { void M() { Console.WriteLine(); } } "; var libRef1 = CreateCompilation(sourceLib1).EmitToImageReference(); var libRef2 = CreateCompilation(sourceLib2, new[] { libRef1 }, assemblyName: "LibRef2").EmitToImageReference(); var compilation = CreateCompilation(source, new[] { libRef2 }); var v = CompileAndVerify(compilation); v.Diagnostics.Verify( // (3,1): hidden CS8019: Unnecessary using directive. // using X = N.B; Diagnostic(ErrorCode.HDN_UnusedUsingDirective, "using X = N.B;")); v.VerifyPdb("C.M", @" <symbols> <files> <file id=""1"" name="""" language=""C#"" /> </files> <methods> <method containingType=""C"" name=""M""> <customDebugInfo> <using> <namespace usingCount=""2"" /> </using> </customDebugInfo> <sequencePoints> <entry offset=""0x0"" startLine=""9"" startColumn=""9"" endLine=""9"" endColumn=""29"" document=""1"" /> <entry offset=""0x5"" startLine=""10"" startColumn=""5"" endLine=""10"" endColumn=""6"" document=""1"" /> </sequencePoints> <scope startOffset=""0x0"" endOffset=""0x6""> <namespace name=""System"" /> <alias name=""X"" target=""N.B, LibRef2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"" kind=""type"" /> </scope> </method> </methods> </symbols>"); } [Fact] public void ImportScopeEquality() { var sources = new[] { @" extern alias A; using System; using C = System; namespace N.M { using System.Collections; class C1 { void F() {} } } namespace N.M { using System.Collections; class C2 { void F() {} } } ", @" extern alias A; using System; using C = System; namespace N.M { using System.Collections; class C3 { void F() {} } } namespace N.M { using System.Collections.Generic; class C4 { void F() {} } } ", @" extern alias A; using System; using D = System; namespace N.M { using System.Collections; class C5 { void F() {} } } ", @" extern alias A; using System; class C6 { void F() {} } " }; var c = CreateCompilationWithMscorlib40(sources, new[] { SystemCoreRef.WithAliases(ImmutableArray.Create("A")) }); var pdbStream = new MemoryStream(); c.EmitToArray(EmitOptions.Default.WithDebugInformationFormat(DebugInformationFormat.PortablePdb), pdbStream: pdbStream); var pdbImage = pdbStream.ToImmutable(); using var metadata = new PinnedMetadata(pdbImage); var mdReader = metadata.Reader; var writer = new StringWriter(); var mdVisualizer = new MetadataVisualizer(mdReader, writer, MetadataVisualizerOptions.NoHeapReferences); mdVisualizer.WriteImportScope(); AssertEx.AssertEqualToleratingWhitespaceDifferences(@" ImportScope (index: 0x35, size: 36): ======================================================================== Parent Imports ======================================================================== 1: nil (ImportScope) 'A' = 0x23000002 (AssemblyRef) 2: 0x35000001 (ImportScope) Extern Alias 'A', 'System' 3: 0x35000001 (ImportScope) Extern Alias 'A', 'System', 'C' = 'System' 4: 0x35000003 (ImportScope) nil 5: 0x35000004 (ImportScope) 'System.Collections' 6: 0x35000004 (ImportScope) 'System.Collections.Generic' 7: 0x35000001 (ImportScope) Extern Alias 'A', 'System', 'D' = 'System' 8: 0x35000007 (ImportScope) nil 9: 0x35000008 (ImportScope) 'System.Collections' ", writer.ToString()); } } }