Skip to content

Commit 32a9a04

Browse files
authored
Resolve ILLink warnings in System.Text.RegularExpressions (#46687)
* Add DynamicallyAccessedMembers All to TypeBuilder and EnumBuilder CreateType methods. Contributes to #45623
1 parent 0798951 commit 32a9a04

File tree

9 files changed

+32
-41
lines changed

9 files changed

+32
-41
lines changed

src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,14 @@ public FieldBuilder DefineLiteral(string literalName, object? literalValue)
3838
return fieldBuilder;
3939
}
4040

41+
[return: DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes.All)]
4142
public TypeInfo? CreateTypeInfo()
4243
{
4344
return m_typeBuilder.CreateTypeInfo();
4445
}
4546

4647
// CreateType cause EnumBuilder to be baked.
48+
[return: DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes.All)]
4749
public Type? CreateType()
4850
{
4951
return m_typeBuilder.CreateType();

src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1881,6 +1881,7 @@ private EventBuilder DefineEventNoLock(string name, EventAttributes attributes,
18811881

18821882
#region Create Type
18831883

1884+
[return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
18841885
public TypeInfo? CreateTypeInfo()
18851886
{
18861887
lock (SyncRoot)
@@ -1889,6 +1890,7 @@ private EventBuilder DefineEventNoLock(string name, EventAttributes attributes,
18891890
}
18901891
}
18911892

1893+
[return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
18921894
public Type? CreateType()
18931895
{
18941896
lock (SyncRoot)
@@ -1897,6 +1899,9 @@ private EventBuilder DefineEventNoLock(string name, EventAttributes attributes,
18971899
}
18981900
}
18991901

1902+
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2083:UnrecognizedReflectionPattern",
1903+
Justification = "Reflection.Emit is not subject to trimming")]
1904+
[return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
19001905
private TypeInfo? CreateTypeNoLock()
19011906
{
19021907
if (IsCreated())

src/libraries/System.Reflection.Emit/ref/System.Reflection.Emit.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ internal EnumBuilder() { }
106106
public override System.RuntimeTypeHandle TypeHandle { get { throw null; } }
107107
public System.Reflection.Emit.FieldBuilder UnderlyingField { get { throw null; } }
108108
public override System.Type UnderlyingSystemType { get { throw null; } }
109+
[return: System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)]
109110
public System.Reflection.TypeInfo? CreateTypeInfo() { throw null; }
110111
public System.Reflection.Emit.FieldBuilder DefineLiteral(string literalName, object? literalValue) { throw null; }
111112
protected override System.Reflection.TypeAttributes GetAttributeFlagsImpl() { throw null; }
@@ -460,7 +461,9 @@ internal TypeBuilder() { }
460461
public override System.RuntimeTypeHandle TypeHandle { get { throw null; } }
461462
public override System.Type UnderlyingSystemType { get { throw null; } }
462463
public void AddInterfaceImplementation([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)] System.Type interfaceType) { }
464+
[return: System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)]
463465
public System.Type? CreateType() { throw null; }
466+
[return: System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)]
464467
public System.Reflection.TypeInfo? CreateTypeInfo() { throw null; }
465468
public System.Reflection.Emit.ConstructorBuilder DefineConstructor(System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, System.Type[]? parameterTypes) { throw null; }
466469
public System.Reflection.Emit.ConstructorBuilder DefineConstructor(System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, System.Type[]? parameterTypes, System.Type[][]? requiredCustomModifiers, System.Type[][]? optionalCustomModifiers) { throw null; }

src/libraries/System.Text.RegularExpressions/src/ILLink/ILLink.Suppressions.Debug.xml

Lines changed: 0 additions & 23 deletions
This file was deleted.

src/libraries/System.Text.RegularExpressions/src/ILLink/ILLink.Suppressions.xml

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexAssemblyCompiler.cs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
using System.Collections;
5-
using System.Threading;
5+
using System.Diagnostics.CodeAnalysis;
66
using System.Reflection;
77
using System.Reflection.Emit;
8+
using System.Threading;
89

910
#if DEBUG // until it can be fully implemented
1011
namespace System.Text.RegularExpressions
@@ -97,14 +98,19 @@ private void GenerateInitTrackCount()
9798
}
9899

99100
/// <summary>Generates a very simple factory method.</summary>
100-
internal void GenerateCreateInstance(Type type)
101+
private void GenerateCreateInstance([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] Type type)
101102
{
102103
// return new Type();
103104
Newobj(type.GetConstructor(Type.EmptyTypes)!);
104105
Ret();
105106
}
106107

107-
private void GenerateRegexDefaultCtor(string pattern, RegexOptions options, Type regexRunnerFactoryType, RegexCode code, TimeSpan matchTimeout)
108+
private void GenerateRegexDefaultCtor(
109+
string pattern,
110+
RegexOptions options,
111+
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] Type regexRunnerFactoryType,
112+
RegexCode code,
113+
TimeSpan matchTimeout)
108114
{
109115
// Call the base ctor and store pattern, options, and factory.
110116
// base.ctor();
@@ -241,7 +247,12 @@ internal void Save()
241247
}
242248

243249
/// <summary>Begins the definition of a new type with a specified base class</summary>
244-
private static TypeBuilder DefineType(ModuleBuilder moduleBuilder, string typeName, bool isPublic, bool isSealed, Type inheritFromClass)
250+
private static TypeBuilder DefineType(
251+
ModuleBuilder moduleBuilder,
252+
string typeName,
253+
bool isPublic,
254+
bool isSealed,
255+
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type inheritFromClass)
245256
{
246257
TypeAttributes attrs = TypeAttributes.Class | TypeAttributes.BeforeFieldInit | (isPublic ? TypeAttributes.Public : TypeAttributes.NotPublic);
247258
if (isSealed)

src/libraries/System.Text.RegularExpressions/src/System/Text/RegularExpressions/RegexCompiler.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ namespace System.Text.RegularExpressions
1515
/// RegexCompiler translates a block of RegexCode to MSIL, and creates a
1616
/// subclass of the RegexRunner type.
1717
/// </summary>
18+
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2060:MakeGenericMethod",
19+
Target = "M:System.Text.RegularExpressions.RegexCompiler.#cctor",
20+
Justification = "The referenced methods don't have any DynamicallyAccessedMembers annotations. See https://github.com/mono/linker/issues/1727")]
1821
internal abstract class RegexCompiler
1922
{
2023
private static readonly FieldInfo s_runtextbegField = RegexRunnerField("runtextbeg");

src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.Mono.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,11 +192,13 @@ public override Type UnderlyingSystemType
192192
}
193193
}
194194

195+
[return: DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes.All)]
195196
public Type? CreateType()
196197
{
197198
return _tb.CreateType();
198199
}
199200

201+
[return: DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes.All)]
200202
public TypeInfo? CreateTypeInfo()
201203
{
202204
return _tb.CreateTypeInfo();

src/mono/netcore/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.Mono.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -796,10 +796,9 @@ private bool has_ctor_method()
796796
// We require emitted types to have all members on their bases to be accessible.
797797
// This is basically an identity function for `this`.
798798
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2083:UnrecognizedReflectionPattern",
799-
Justification = "Reflection emitted types have all of their members")]
799+
Justification = "Reflection.Emit is not subject to trimming")]
800800
[return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
801-
public
802-
TypeInfo? CreateTypeInfo()
801+
public TypeInfo? CreateTypeInfo()
803802
{
804803
/* handle nesting_type */
805804
if (createTypeCalled)

0 commit comments

Comments
 (0)