/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/CSharp/Test/Semantic/Semantics/NameLengthTests.cs
589 строк
29 KB
Jared Parsons
Move net451 test assets to net461 (#74766)
17 авг 2024, 19:21
Не верифицирован
17 авг 2024, 19:21
75b26a2
Код
Авторство
О чём код?
// 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.IO; using Microsoft.CodeAnalysis.CSharp.Symbols; using Microsoft.CodeAnalysis.CSharp.Test.Utilities; using Roslyn.Test.Utilities; using Xunit; using Microsoft.Cci; using System; namespace Microsoft.CodeAnalysis.CSharp.UnitTests { public class NameLengthTests : CSharpTestBase { // Longest legal symbol name. private static readonly string s_longSymbolName = new string('A', MetadataWriter.NameLengthLimit); // Longest legal path name. private static readonly string s_longPathName = new string('A', MetadataWriter.PathLengthLimit); // Longest legal local name. private static readonly string s_longLocalName = new string('A', MetadataWriter.PdbLengthLimit); [Fact] public void UnmangledMemberNames() { var sourceTemplate = @" using System; class Fields {{ int {0}; // Fine int {0}1; // Too long }} class FieldLikeEvents {{ event Action {0}; // Fine (except accessors) event Action {0}1; // Too long }} class CustomEvents {{ event Action {0} {{ add {{ }} remove {{ }} }} // Fine (except accessors) event Action {0}1 {{ add {{ }} remove {{ }} }} // Too long }} class AutoProperties {{ int {0} {{ get; set; }} // Fine (except accessors and backing field) int {0}1 {{ get; set; }} // Too long }} class CustomProperties {{ int {0} {{ get {{ return 0; }} set {{ }} }} // Fine (except accessors) int {0}1 {{ get {{ return 0; }} set {{ }} }} // Too long }} class Methods {{ void {0}() {{ }} // Fine void {0}1() {{ }} // Too long }} "; var source = string.Format(sourceTemplate, s_longSymbolName); var comp = CreateCompilation(source); comp.VerifyDiagnostics( // Uninteresting // (6,9): warning CS0169: The field 'Fields.LongSymbolName' is never used // int LongSymbolName; // Fine Diagnostic(ErrorCode.WRN_UnreferencedField, s_longSymbolName).WithArguments("Fields." + s_longSymbolName).WithLocation(6, 9), // (7,9): warning CS0169: The field 'Fields.LongSymbolName + 1' is never used // int LongSymbolName + 1; // Too long Diagnostic(ErrorCode.WRN_UnreferencedField, s_longSymbolName + 1).WithArguments("Fields." + s_longSymbolName + 1).WithLocation(7, 9), // (12,18): warning CS0067: The event 'FieldLikeEvents.LongSymbolName' is never used // event Action LongSymbolName; // Fine Diagnostic(ErrorCode.WRN_UnreferencedEvent, s_longSymbolName).WithArguments("FieldLikeEvents." + s_longSymbolName).WithLocation(12, 18), // (13,18): warning CS0067: The event 'FieldLikeEvents.LongSymbolName + 1' is never used // event Action LongSymbolName + 1; // Too long Diagnostic(ErrorCode.WRN_UnreferencedEvent, s_longSymbolName + 1).WithArguments("FieldLikeEvents." + s_longSymbolName + 1).WithLocation(13, 18)); comp.VerifyEmitDiagnostics( // (7,9): error CS7013: Name 'LongSymbolName + 1' exceeds the maximum length allowed in metadata. // int LongSymbolName + 1; // Too long Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments(s_longSymbolName + 1).WithLocation(7, 9), // (12,18): error CS7013: Name 'add_LongSymbolName' exceeds the maximum length allowed in metadata. // event Action LongSymbolName; // Fine (except accessors) Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName).WithArguments("add_" + s_longSymbolName).WithLocation(12, 18), // (12,18): error CS7013: Name 'remove_LongSymbolName' exceeds the maximum length allowed in metadata. // event Action LongSymbolName; // Fine (except accessors) Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName).WithArguments("remove_" + s_longSymbolName).WithLocation(12, 18), // (13,18): error CS7013: Name 'LongSymbolName + 1' exceeds the maximum length allowed in metadata. // event Action LongSymbolName + 1; // Too long Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments(s_longSymbolName + 1).WithLocation(13, 18), // (13,18): error CS7013: Name 'LongSymbolName + 1' exceeds the maximum length allowed in metadata. // event Action LongSymbolName + 1; // Too long Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments(s_longSymbolName + 1).WithLocation(13, 18), // Would be nice not to report on the backing field. // (13,18): error CS7013: Name 'add_LongSymbolName + 1' exceeds the maximum length allowed in metadata. // event Action LongSymbolName + 1; // Too long Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments("add_" + s_longSymbolName + 1).WithLocation(13, 18), // (13,18): error CS7013: Name 'remove_LongSymbolName + 1' exceeds the maximum length allowed in metadata. // event Action LongSymbolName + 1; // Too long Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments("remove_" + s_longSymbolName + 1).WithLocation(13, 18), // (18,1044): error CS7013: Name 'add_LongSymbolName' exceeds the maximum length allowed in metadata. // event Action LongSymbolName { add { } remove { } } // Fine (except accessors) Diagnostic(ErrorCode.ERR_MetadataNameTooLong, "add").WithArguments("add_" + s_longSymbolName).WithLocation(18, 1044), // (18,1052): error CS7013: Name 'remove_LongSymbolName' exceeds the maximum length allowed in metadata. // event Action LongSymbolName { add { } remove { } } // Fine (except accessors) Diagnostic(ErrorCode.ERR_MetadataNameTooLong, "remove").WithArguments("remove_" + s_longSymbolName).WithLocation(18, 1052), // (19,18): error CS7013: Name 'LongSymbolName + 1' exceeds the maximum length allowed in metadata. // event Action LongSymbolName + 1 { add { } remove { } } // Too long Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments(s_longSymbolName + 1).WithLocation(19, 18), // (19,1045): error CS7013: Name 'add_LongSymbolName + 1' exceeds the maximum length allowed in metadata. // event Action LongSymbolName + 1 { add { } remove { } } // Too long Diagnostic(ErrorCode.ERR_MetadataNameTooLong, "add").WithArguments("add_" + s_longSymbolName + 1).WithLocation(19, 1045), // (19,1053): error CS7013: Name 'remove_LongSymbolName + 1' exceeds the maximum length allowed in metadata. // event Action LongSymbolName + 1 { add { } remove { } } // Too long Diagnostic(ErrorCode.ERR_MetadataNameTooLong, "remove").WithArguments("remove_" + s_longSymbolName + 1).WithLocation(19, 1053), // (24,9): error CS7013: Name '<LongSymbolName>k__BackingField' exceeds the maximum length allowed in metadata. // int LongSymbolName { get; set; } // Fine (except accessors and backing field) Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName).WithArguments("<" + s_longSymbolName + ">k__BackingField").WithLocation(24, 9), // (24,1035): error CS7013: Name 'get_LongSymbolName' exceeds the maximum length allowed in metadata. // int LongSymbolName { get; set; } // Fine (except accessors and backing field) Diagnostic(ErrorCode.ERR_MetadataNameTooLong, "get").WithArguments("get_" + s_longSymbolName).WithLocation(24, 1035), // (24,1040): error CS7013: Name 'set_LongSymbolName' exceeds the maximum length allowed in metadata. // int LongSymbolName { get; set; } // Fine (except accessors and backing field) Diagnostic(ErrorCode.ERR_MetadataNameTooLong, "set").WithArguments("set_" + s_longSymbolName).WithLocation(24, 1040), // (25,9): error CS7013: Name 'LongSymbolName + 1' exceeds the maximum length allowed in metadata. // int LongSymbolName + 1 { get; set; } // Too long Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments(s_longSymbolName + 1).WithLocation(25, 9), // (25,9): error CS7013: Name '<LongSymbolName + 1>k__BackingField' exceeds the maximum length allowed in metadata. // int LongSymbolName + 1 { get; set; } // Too long Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments("<" + s_longSymbolName + "1>k__BackingField").WithLocation(25, 9), // (25,1036): error CS7013: Name 'get_LongSymbolName + 1' exceeds the maximum length allowed in metadata. // int LongSymbolName + 1 { get; set; } // Too long Diagnostic(ErrorCode.ERR_MetadataNameTooLong, "get").WithArguments("get_" + s_longSymbolName + 1).WithLocation(25, 1036), // (25,1041): error CS7013: Name 'set_LongSymbolName + 1' exceeds the maximum length allowed in metadata. // int LongSymbolName + 1 { get; set; } // Too long Diagnostic(ErrorCode.ERR_MetadataNameTooLong, "set").WithArguments("set_" + s_longSymbolName + 1).WithLocation(25, 1041), // (30,1035): error CS7013: Name 'get_LongSymbolName' exceeds the maximum length allowed in metadata. // int LongSymbolName { get { return 0; } set { } } // Fine (except accessors) Diagnostic(ErrorCode.ERR_MetadataNameTooLong, "get").WithArguments("get_" + s_longSymbolName).WithLocation(30, 1035), // (30,1053): error CS7013: Name 'set_LongSymbolName' exceeds the maximum length allowed in metadata. // int LongSymbolName { get { return 0; } set { } } // Fine (except accessors) Diagnostic(ErrorCode.ERR_MetadataNameTooLong, "set").WithArguments("set_" + s_longSymbolName).WithLocation(30, 1053), // (31,9): error CS7013: Name 'LongSymbolName + 1' exceeds the maximum length allowed in metadata. // int LongSymbolName + 1 { get { return 0; } set { } } // Too long Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments(s_longSymbolName + 1).WithLocation(31, 9), // (31,1036): error CS7013: Name 'get_LongSymbolName + 1' exceeds the maximum length allowed in metadata. // int LongSymbolName + 1 { get { return 0; } set { } } // Too long Diagnostic(ErrorCode.ERR_MetadataNameTooLong, "get").WithArguments("get_" + s_longSymbolName + 1).WithLocation(31, 1036), // (31,1054): error CS7013: Name 'set_LongSymbolName + 1' exceeds the maximum length allowed in metadata. // int LongSymbolName + 1 { get { return 0; } set { } } // Too long Diagnostic(ErrorCode.ERR_MetadataNameTooLong, "set").WithArguments("set_" + s_longSymbolName + 1).WithLocation(31, 1054), // (37,10): error CS7013: Name 'LongSymbolName + 1' exceeds the maximum length allowed in metadata. // void LongSymbolName + 1() { } // Too long Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments(s_longSymbolName + 1).WithLocation(37, 10), // Uninteresting // (6,9): warning CS0169: The field 'Fields.LongSymbolName' is never used // int LongSymbolName; // Fine Diagnostic(ErrorCode.WRN_UnreferencedField, s_longSymbolName).WithArguments("Fields." + s_longSymbolName).WithLocation(6, 9), // (7,9): warning CS0169: The field 'Fields.LongSymbolName + 1' is never used // int LongSymbolName + 1; // Too long Diagnostic(ErrorCode.WRN_UnreferencedField, s_longSymbolName + 1).WithArguments("Fields." + s_longSymbolName + 1).WithLocation(7, 9), // (12,18): warning CS0067: The event 'FieldLikeEvents.LongSymbolName' is never used // event Action LongSymbolName; // Fine Diagnostic(ErrorCode.WRN_UnreferencedEvent, s_longSymbolName).WithArguments("FieldLikeEvents." + s_longSymbolName).WithLocation(12, 18), // (13,18): warning CS0067: The event 'FieldLikeEvents.LongSymbolName + 1' is never used // event Action LongSymbolName + 1; // Too long Diagnostic(ErrorCode.WRN_UnreferencedEvent, s_longSymbolName + 1).WithArguments("FieldLikeEvents." + s_longSymbolName + 1).WithLocation(13, 18)); } [Fact] public void EmptyNamespaces() { var sourceTemplate = @" namespace {0} {{ }} // Fine. namespace {0}1 {{ }} // Too long, but not checked. "; var source = string.Format(sourceTemplate, s_longSymbolName); var comp = CreateCompilation(source); comp.VerifyDiagnostics(); comp.VerifyEmitDiagnostics(); } [Fact] public void NonGeneratedTypeNames() { // {n} == LongSymbolName.Substring(n) var sourceTemplate = @" class {0} {{ }} // Fine class {0}1 {{ }} // Too long namespace N {{ struct {2} {{ }} // Fine struct {2}1 {{ }} // Too long after prepending 'N.' }} class Outer {{ enum {0} {{ }} // Fine, since outer class is not prepended enum {0}1 {{ }} // Too long }} interface {2}<T> {{ }} // Fine interface {2}1<T> {{ }} // Too long after appending '`1' "; var substring0 = s_longSymbolName; var substring1 = s_longSymbolName.Substring(1); var substring2 = s_longSymbolName.Substring(2); var source = string.Format(sourceTemplate, substring0, substring1, substring2); var comp = CreateCompilation(source); comp.VerifyDiagnostics(); comp.VerifyEmitDiagnostics( // (3,7): // class Diagnostic(ErrorCode.ERR_MetadataNameTooLong, substring0 + 1).WithArguments(substring0 + 1).WithLocation(3, 7), // (8,12): // struct Diagnostic(ErrorCode.ERR_MetadataNameTooLong, substring2 + 1).WithArguments("N." + substring2 + 1).WithLocation(8, 12), // (14,10): // enum Diagnostic(ErrorCode.ERR_MetadataNameTooLong, substring0 + 1).WithArguments(substring0 + 1).WithLocation(14, 10), // (18,11): // interface Diagnostic(ErrorCode.ERR_MetadataNameTooLong, substring2 + 1).WithArguments(substring2 + "1`1").WithLocation(18, 11)); } [Fact] public void ExplicitInterfaceImplementation() { var sourceTemplate = @" interface I {{ void {0}(); void {0}1(); }} namespace N {{ interface J<T> {{ void {1}(); void {1}1(); }} }} class C : I, N.J<C> {{ void I.{0}() {{ }} void I.{0}1() {{ }} void N.J<C>.{1}() {{ }} void N.J<C>.{1}1() {{ }} }} "; var name0 = s_longSymbolName.Substring(2); // Space for "I." var name1 = s_longSymbolName.Substring(7); // Space for "N.J<C>." var source = string.Format(sourceTemplate, name0, name1); var comp = CreateCompilation(source); comp.VerifyDiagnostics(); comp.VerifyEmitDiagnostics( // (20,12): // void I.{0}1() { } Diagnostic(ErrorCode.ERR_MetadataNameTooLong, name0 + 1).WithArguments("I." + name0 + 1).WithLocation(20, 12), // (23,17): // void N.J<C>.{1}1() { } Diagnostic(ErrorCode.ERR_MetadataNameTooLong, name1 + 1).WithArguments("N.J<C>." + name1 + 1).WithLocation(23, 17)); } [Fact] public void DllImport() { var sourceTemplate = @" using System.Runtime.InteropServices; class C1 {{ [DllImport(""goo.dll"", EntryPoint = ""Short1"")] static extern void {0}(); // Name is fine, entrypoint is fine. [DllImport(""goo.dll"", EntryPoint = ""Short2"")] static extern void {0}1(); // Name is too long, entrypoint is fine. }} class C2 {{ [DllImport(""goo.dll"", EntryPoint = ""{0}"")] static extern void Short1(); // Name is fine, entrypoint is fine. [DllImport(""goo.dll"", EntryPoint = ""{0}1"")] static extern void Short2(); // Name is fine, entrypoint is too long. }} class C3 {{ [DllImport(""goo.dll"")] static extern void {0}(); // Name is fine, entrypoint is unspecified. [DllImport(""goo.dll"")] static extern void {0}1(); // Name is too long, entrypoint is unspecified. }} "; var source = string.Format(sourceTemplate, s_longSymbolName); var comp = CreateCompilation(source); comp.VerifyDiagnostics(); comp.VerifyEmitDiagnostics( // (9,24): Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments(s_longSymbolName + 1).WithLocation(9, 24), // (17,24): Diagnostic(ErrorCode.ERR_MetadataNameTooLong, "Short2").WithArguments(s_longSymbolName + 1).WithLocation(17, 24), // (25,24): Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments(s_longSymbolName + 1).WithLocation(25, 24)); } [Fact] public void Parameters() { var sourceTemplate = @" class C {{ void M(bool {0}) {{ }} void M(long {0}1) {{ }} int this[bool {0}] {{ get {{ return 0; }} }} int this[long {0}1] {{ get {{ return 0; }} }} delegate void D1(bool {0}); delegate void D2(long {0}1); }} "; var source = string.Format(sourceTemplate, s_longSymbolName); var comp = CreateCompilation(source); comp.VerifyDiagnostics(); comp.VerifyEmitDiagnostics( // (5,17): error CS7013: Name 'LongSymbolName + 1' exceeds the maximum length allowed in metadata. // void M(long LongSymbolName + 1) { } Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments(s_longSymbolName + 1).WithLocation(5, 17), // (7,19): error CS7013: Name 'LongSymbolName + 1' exceeds the maximum length allowed in metadata. // int this[long LongSymbolName + 1] { get { return 0; } } Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments(s_longSymbolName + 1).WithLocation(7, 19), // (9,27): error CS7013: Name 'LongSymbolName + 1' exceeds the maximum length allowed in metadata. // delegate void D2(long LongSymbolName + 1); Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments(s_longSymbolName + 1).WithLocation(9, 27), // (9,27): error CS7013: Name 'LongSymbolName + 1' exceeds the maximum length allowed in metadata. // delegate void D2(long LongSymbolName + 1); Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments(s_longSymbolName + 1).WithLocation(9, 27)); // Second report is for Invoke method. Not ideal, but not urgent. } [Fact] public void TypeParameters() { var sourceTemplate = @" class C<{0}, {0}1> {{ }} delegate void D<{0}, {0}1>(); class E {{ void M<{0}, {0}1>() {{ }} }} "; var source = string.Format(sourceTemplate, s_longSymbolName); var comp = CreateCompilation(source); comp.VerifyDiagnostics(); comp.VerifyEmitDiagnostics( // (2,1034): error CS7013: Name 'LongSymbolName + 1' exceeds the maximum length allowed in metadata. // class C<LongSymbolName, LongSymbolName + 1> Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments(s_longSymbolName + 1).WithLocation(2, 1034), // (6,1042): error CS7013: Name 'LongSymbolName + 1' exceeds the maximum length allowed in metadata. // delegate void D<LongSymbolName, LongSymbolName + 1>(); Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments(s_longSymbolName + 1).WithLocation(6, 1042), // (10,1037): error CS7013: Name 'LongSymbolName + 1' exceeds the maximum length allowed in metadata. // void M<LongSymbolName, LongSymbolName + 1>() { } Diagnostic(ErrorCode.ERR_MetadataNameTooLong, s_longSymbolName + 1).WithArguments(s_longSymbolName + 1).WithLocation(10, 1037)); } [ConditionalFact(typeof(WindowsOnly), Reason = ConditionalSkipReason.NativePdbRequiresDesktop)] public void Locals() { var sourceTemplate = @" class C {{ int M() {{ int {0} = 1; int {0}1 = 1; return {0} + {0}1; }} }} "; var source = string.Format(sourceTemplate, s_longLocalName); var comp = CreateCompilation(source, options: TestOptions.DebugDll); comp.VerifyDiagnostics(); comp.VerifyEmitDiagnostics( options: TestOptions.NativePdbEmit, // (7,13): warning CS8029: Local name 'LongLocalName + 1' is too long for PDB. Consider shortening or compiling without /debug. // int LongSymbolName + 1 = 1; Diagnostic(ErrorCode.WRN_PdbLocalNameTooLong, s_longLocalName + 1).WithArguments(s_longLocalName + 1).WithLocation(7, 13)); } [ConditionalFact(typeof(WindowsOnly), Reason = ConditionalSkipReason.NativePdbRequiresDesktop)] public void ConstantLocals() { var sourceTemplate = @" class C {{ int M() {{ const int {0} = 1; const int {0}1 = 1; return {0} + {0}1; }} }} "; var source = string.Format(sourceTemplate, s_longLocalName); var comp = CreateCompilation(source, options: TestOptions.DebugDll); comp.VerifyDiagnostics(); comp.VerifyEmitDiagnostics( options: TestOptions.NativePdbEmit, // (7,19): warning CS8029: Local name 'LongSymbolName + 1' is too long for PDB. Consider shortening or compiling without /debug. // const int LongSymbolName + 1 = 1; Diagnostic(ErrorCode.WRN_PdbLocalNameTooLong, s_longLocalName + 1).WithArguments(s_longLocalName + 1).WithLocation(7, 19)); } [Fact] public void TestLambdaMethods() { var sourceTemplate = @" using System; class C {{ Func<int> {0}(int p) {{ return () => p - 1; }} Func<int> {0}1(int p) {{ return () => p + 1; }} }} "; int padding = GeneratedNames.MakeLambdaMethodName("A", -1, 0, 0, 0).Length - 1; string longName = s_longSymbolName.Substring(padding); var source = string.Format(sourceTemplate, longName); var comp = CreateCompilation(source); comp.VerifyDiagnostics(); comp.VerifyEmitDiagnostics( // (13,16): error CS7013: Name '<longName + 1>b__3' exceeds the maximum length allowed in metadata. // return () => p + 1; Diagnostic(ErrorCode.ERR_MetadataNameTooLong, "() => p + 1").WithArguments("<" + longName + "1>b__0").WithLocation(13, 16)); } [Fact] public void TestAnonymousTypeProperties() { var sourceTemplate = @" class C {{ object M() {{ return new {{ {0} = 1, {0}1 = 'a' }}; }} }} "; int padding = GeneratedNames.MakeAnonymousTypeBackingFieldName("A").Length - 1; string longName = s_longSymbolName.Substring(padding); var source = string.Format(sourceTemplate, longName); var comp = CreateCompilation(source); comp.VerifyDiagnostics(); // CONSIDER: Double reporting (once for field def, once for member ref) is not ideal. // CONSIDER: No location since the synthesized field symbol doesn't have one (would light up automatically). comp.VerifyEmitDiagnostics( // error CS7013: Name '<longName1>i__Field' exceeds the maximum length allowed in metadata. Diagnostic(ErrorCode.ERR_MetadataNameTooLong).WithArguments("<" + longName + 1 + ">i__Field").WithLocation(1, 1), // error CS7013: Name '<longName1>i__Field' exceeds the maximum length allowed in metadata. Diagnostic(ErrorCode.ERR_MetadataNameTooLong).WithArguments("<" + longName + 1 + ">i__Field").WithLocation(1, 1)); } [Fact] public void TestStateMachineMethods() { var sourceTemplate = @" using System.Collections.Generic; using System.Threading.Tasks; class Iterators {{ IEnumerable<int> {0}() {{ yield return 1; }} IEnumerable<int> {0}1() {{ yield return 1; }} }} class Async {{ async Task {0}() {{ await {0}(); }} async Task {0}1() {{ await {0}1(); }} }} "; int padding = GeneratedNames.MakeStateMachineTypeName("A", 0, 0).Length - 1; string longName = s_longSymbolName.Substring(padding); var source = string.Format(sourceTemplate, longName); var comp = CreateCompilationWithMscorlib461(source); comp.VerifyDiagnostics(); // CONSIDER: Location would light up if synthesized methods had them. comp.VerifyEmitDiagnostics( // error CS7013: Name '<longName1>d__1' exceeds the maximum length allowed in metadata. Diagnostic(ErrorCode.ERR_MetadataNameTooLong).WithArguments("<" + longName + 1 + ">d__1").WithLocation(1, 1), // error CS7013: Name '<longName1>d__1' exceeds the maximum length allowed in metadata. Diagnostic(ErrorCode.ERR_MetadataNameTooLong).WithArguments("<" + longName + 1 + ">d__1").WithLocation(1, 1)); } [WorkItem(531484, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/531484")] [Fact] public void TestFixedSizeBuffers() { var sourceTemplate = @" unsafe struct S {{ fixed int {0}[1]; fixed int {0}1[1]; }} "; int padding = GeneratedNames.MakeFixedFieldImplementationName("A").Length - 1; string longName = s_longSymbolName.Substring(padding); var source = string.Format(sourceTemplate, longName); var comp = CreateCompilation(source, options: TestOptions.UnsafeReleaseDll); comp.VerifyDiagnostics(); // CONSIDER: Location would light up if synthesized methods had them. comp.VerifyEmitDiagnostics( // error CS7013: Name '<longName1>e__FixedBuffer' exceeds the maximum length allowed in metadata. Diagnostic(ErrorCode.ERR_MetadataNameTooLong).WithArguments("<" + longName + 1 + ">e__FixedBuffer").WithLocation(1, 1)); } [Fact] public void TestResources() { var source = "class C { }"; var comp = CreateCompilation(source); Func<Stream> dataProvider = () => new System.IO.MemoryStream(); var resources = new[] { new ResourceDescription("name1", "path1", dataProvider, false), //fine new ResourceDescription(s_longSymbolName, "path2", dataProvider, false), //fine new ResourceDescription("name2", s_longPathName, dataProvider, false), //fine new ResourceDescription(s_longSymbolName + 1, "path3", dataProvider, false), //name error new ResourceDescription("name3", s_longPathName + 2, dataProvider, false), //path error new ResourceDescription(s_longSymbolName + 3, s_longPathName + 4, dataProvider, false), //name and path errors }; comp.VerifyEmitDiagnostics(resources, // error CS7013: Name 'LongSymbolName1' exceeds the maximum length allowed in metadata. Diagnostic(ErrorCode.ERR_MetadataNameTooLong).WithArguments(s_longSymbolName + 1).WithLocation(1, 1), // error CS7013: Name 'LongPathName2' exceeds the maximum length allowed in metadata. Diagnostic(ErrorCode.ERR_MetadataNameTooLong).WithArguments(s_longPathName + 2).WithLocation(1, 1), // error CS7013: Name 'LongSymbolName3' exceeds the maximum length allowed in metadata. Diagnostic(ErrorCode.ERR_MetadataNameTooLong).WithArguments(s_longSymbolName + 3).WithLocation(1, 1), // error CS7013: Name 'LongPathName4' exceeds the maximum length allowed in metadata. Diagnostic(ErrorCode.ERR_MetadataNameTooLong).WithArguments(s_longPathName + 4).WithLocation(1, 1)); } } }