Skip to content

Commit e640e9a

Browse files
committed
Typename parsing cleanup
- Remove unnecessary System.Type wrapper for type name parsing in tools. Create the type directly from the parsed name. - Rename S.R.TypeNameParser to S.R.TypeNameResolver to avoid name collisions with S.R.M.TypeNameParser - Move type name Unescape and Split helpers into dedicated helper type - Other cleanup
1 parent 5e2b55f commit e640e9a

35 files changed

+406
-495
lines changed

src/coreclr/System.Private.CoreLib/System.Private.CoreLib.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@
192192
<Compile Include="$(BclSourcesRoot)\System\Reflection\RuntimeModule.cs" />
193193
<Compile Include="$(BclSourcesRoot)\System\Reflection\RuntimeParameterInfo.cs" />
194194
<Compile Include="$(BclSourcesRoot)\System\Reflection\RuntimePropertyInfo.cs" />
195-
<Compile Include="$(BclSourcesRoot)\System\Reflection\TypeNameParser.CoreCLR.cs" />
195+
<Compile Include="$(BclSourcesRoot)\System\Reflection\TypeNameResolver.CoreCLR.cs" />
196196
<Compile Include="$(BclSourcesRoot)\System\Reflection\Metadata\RuntimeTypeMetadataUpdateHandler.cs" />
197197
<Compile Include="$(BclSourcesRoot)\System\Runtime\CompilerServices\CastHelpers.cs" />
198198
<Compile Include="$(BclSourcesRoot)\System\Runtime\CompilerServices\ICastableHelpers.cs" />

src/coreclr/System.Private.CoreLib/src/System/Reflection/MdImport.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,12 +270,12 @@ internal static unsafe MarshalAsAttribute GetMarshalAs(ConstArray nativeType, Ru
270270
: Text.Encoding.UTF8.GetString(MemoryMarshal.CreateReadOnlySpanFromNullTerminated(marshalCookieRaw));
271271

272272
RuntimeType? safeArrayUserDefinedType = string.IsNullOrEmpty(safeArrayUserDefinedTypeName) ? null :
273-
TypeNameParser.GetTypeReferencedByCustomAttribute(safeArrayUserDefinedTypeName, scope);
273+
TypeNameResolver.GetTypeReferencedByCustomAttribute(safeArrayUserDefinedTypeName, scope);
274274
RuntimeType? marshalTypeRef = null;
275275

276276
try
277277
{
278-
marshalTypeRef = marshalTypeName is null ? null : TypeNameParser.GetTypeReferencedByCustomAttribute(marshalTypeName, scope);
278+
marshalTypeRef = marshalTypeName is null ? null : TypeNameResolver.GetTypeReferencedByCustomAttribute(marshalTypeName, scope);
279279
}
280280
catch (TypeLoadException)
281281
{

src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ private static partial void GetTypeCoreIgnoreCase(QCallAssembly assembly,
249249
{
250250
ArgumentException.ThrowIfNullOrEmpty(name);
251251

252-
return TypeNameParser.GetType(name, topLevelAssembly: this,
252+
return TypeNameResolver.GetType(name, topLevelAssembly: this,
253253
throwOnError: throwOnError, ignoreCase: ignoreCase);
254254
}
255255

src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeCustomAttributeData.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,7 @@ private static object EncodedValueToRawValue(PrimitiveValue val, CustomAttribute
543543
}
544544
private static RuntimeType ResolveType(RuntimeModule scope, string typeName)
545545
{
546-
RuntimeType type = TypeNameParser.GetTypeReferencedByCustomAttribute(typeName, scope);
546+
RuntimeType type = TypeNameResolver.GetTypeReferencedByCustomAttribute(typeName, scope);
547547
Debug.Assert(type is not null);
548548
return type;
549549
}
@@ -899,7 +899,7 @@ private static CustomAttributeType ParseCustomAttributeType(ref CustomAttributeD
899899
throw new BadImageFormatException();
900900
}
901901

902-
enumType = TypeNameParser.GetTypeReferencedByCustomAttribute(enumTypeMaybe, module);
902+
enumType = TypeNameResolver.GetTypeReferencedByCustomAttribute(enumTypeMaybe, module);
903903
if (!enumType.IsEnum)
904904
{
905905
throw new BadImageFormatException();

src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeModule.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ public override void GetObjectData(SerializationInfo info, StreamingContext cont
403403
{
404404
ArgumentException.ThrowIfNullOrEmpty(className);
405405

406-
return TypeNameParser.GetType(className, topLevelAssembly: Assembly,
406+
return TypeNameResolver.GetType(className, topLevelAssembly: Assembly,
407407
throwOnError: throwOnError, ignoreCase: ignoreCase);
408408
}
409409

src/coreclr/System.Private.CoreLib/src/System/Reflection/TypeNameParser.CoreCLR.cs renamed to src/coreclr/System.Private.CoreLib/src/System/Reflection/TypeNameResolver.CoreCLR.cs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@
44
using System.Diagnostics;
55
using System.Diagnostics.CodeAnalysis;
66
using System.IO;
7+
using System.Reflection.Metadata;
78
using System.Runtime.CompilerServices;
89
using System.Runtime.InteropServices;
910
using System.Runtime.Loader;
1011
using System.Threading;
1112

1213
namespace System.Reflection
1314
{
14-
internal partial struct TypeNameParser
15+
internal partial struct TypeNameResolver
1516
{
1617
private Func<AssemblyName, Assembly?>? _assemblyResolver;
1718
private Func<Assembly?, string, bool, Type?>? _typeResolver;
@@ -55,13 +56,13 @@ internal partial struct TypeNameParser
5556
return null;
5657
}
5758

58-
Metadata.TypeName? parsed = Metadata.TypeNameParser.Parse(typeName, throwOnError: throwOnError);
59+
TypeName? parsed = TypeNameParser.Parse(typeName, throwOnError);
5960
if (parsed is null)
6061
{
6162
return null;
6263
}
6364

64-
return new TypeNameParser()
65+
return new TypeNameResolver()
6566
{
6667
_assemblyResolver = assemblyResolver,
6768
_typeResolver = typeResolver,
@@ -79,7 +80,7 @@ internal partial struct TypeNameParser
7980
bool ignoreCase,
8081
Assembly topLevelAssembly)
8182
{
82-
Metadata.TypeName? parsed = Metadata.TypeNameParser.Parse(typeName, throwOnError);
83+
TypeName? parsed = TypeNameParser.Parse(typeName, throwOnError);
8384

8485
if (parsed is null)
8586
{
@@ -90,7 +91,7 @@ internal partial struct TypeNameParser
9091
return throwOnError ? throw new ArgumentException(SR.Argument_AssemblyGetTypeCannotSpecifyAssembly) : null;
9192
}
9293

93-
return new TypeNameParser()
94+
return new TypeNameResolver()
9495
{
9596
_throwOnError = throwOnError,
9697
_ignoreCase = ignoreCase,
@@ -110,8 +111,8 @@ internal static RuntimeType GetTypeReferencedByCustomAttribute(string typeName,
110111

111112
RuntimeAssembly requestingAssembly = scope.GetRuntimeAssembly();
112113

113-
Metadata.TypeName parsed = Metadata.TypeName.Parse(typeName);
114-
RuntimeType? type = (RuntimeType?)new TypeNameParser()
114+
TypeName parsed = TypeName.Parse(typeName);
115+
RuntimeType? type = (RuntimeType?)new TypeNameResolver()
115116
{
116117
_throwOnError = true,
117118
_suppressContextualReflectionContext = true,
@@ -140,13 +141,13 @@ internal static RuntimeType GetTypeReferencedByCustomAttribute(string typeName,
140141
return null;
141142
}
142143

143-
Metadata.TypeName? parsed = Metadata.TypeNameParser.Parse(typeName, throwOnError);
144+
TypeName? parsed = TypeNameParser.Parse(typeName, throwOnError);
144145
if (parsed is null)
145146
{
146147
return null;
147148
}
148149

149-
RuntimeType? type = (RuntimeType?)new TypeNameParser()
150+
RuntimeType? type = (RuntimeType?)new TypeNameResolver()
150151
{
151152
_requestingAssembly = requestingAssembly,
152153
_throwOnError = throwOnError,
@@ -181,11 +182,10 @@ internal static RuntimeType GetTypeReferencedByCustomAttribute(string typeName,
181182
}
182183

183184
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode",
184-
Justification = "TypeNameParser.GetType is marked as RequiresUnreferencedCode.")]
185+
Justification = "TypeNameResolver.GetType is marked as RequiresUnreferencedCode.")]
185186
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2075:UnrecognizedReflectionPattern",
186-
Justification = "TypeNameParser.GetType is marked as RequiresUnreferencedCode.")]
187-
private Type? GetType(string escapedTypeName, // For nested types, it's Name. For other types it's FullName
188-
ReadOnlySpan<string> nestedTypeNames, Metadata.TypeName parsedName)
187+
Justification = "TypeNameResolver.GetType is marked as RequiresUnreferencedCode.")]
188+
private Type? GetType(string escapedTypeName, ReadOnlySpan<string> nestedTypeNames, TypeName parsedName)
189189
{
190190
Assembly? assembly;
191191

@@ -230,12 +230,12 @@ internal static RuntimeType GetTypeReferencedByCustomAttribute(string typeName,
230230
}
231231
return null;
232232
}
233-
return GetTypeFromDefaultAssemblies(UnescapeTypeName(escapedTypeName), nestedTypeNames, parsedName);
233+
return GetTypeFromDefaultAssemblies(TypeNameHelpers.Unescape(escapedTypeName), nestedTypeNames, parsedName);
234234
}
235235

236236
if (assembly is RuntimeAssembly runtimeAssembly)
237237
{
238-
string unescapedTypeName = UnescapeTypeName(escapedTypeName);
238+
string unescapedTypeName = TypeNameHelpers.Unescape(escapedTypeName);
239239
// Compat: Non-extensible parser allows ambiguous matches with ignore case lookup
240240
if (!_extensibleParser || !_ignoreCase)
241241
{
@@ -268,7 +268,7 @@ internal static RuntimeType GetTypeReferencedByCustomAttribute(string typeName,
268268
if (_throwOnError)
269269
{
270270
throw new TypeLoadException(SR.Format(SR.TypeLoad_ResolveNestedType,
271-
nestedTypeNames[i], (i > 0) ? nestedTypeNames[i - 1] : escapedTypeName));
271+
nestedTypeNames[i], (i > 0) ? nestedTypeNames[i - 1] : TypeNameHelpers.Unescape(escapedTypeName)));
272272
}
273273
return null;
274274
}
@@ -277,7 +277,7 @@ internal static RuntimeType GetTypeReferencedByCustomAttribute(string typeName,
277277
return type;
278278
}
279279

280-
private Type? GetTypeFromDefaultAssemblies(string typeName, ReadOnlySpan<string> nestedTypeNames, Metadata.TypeName parsedName)
280+
private Type? GetTypeFromDefaultAssemblies(string typeName, ReadOnlySpan<string> nestedTypeNames, TypeName parsedName)
281281
{
282282
RuntimeAssembly? requestingAssembly = (RuntimeAssembly?)_requestingAssembly;
283283
if (requestingAssembly is not null)

src/coreclr/System.Private.CoreLib/src/System/Type.CoreCLR.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public abstract partial class Type : MemberInfo, IReflect
1616
public static Type? GetType(string typeName, bool throwOnError, bool ignoreCase)
1717
{
1818
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
19-
return TypeNameParser.GetType(typeName, Assembly.GetExecutingAssembly(ref stackMark),
19+
return TypeNameResolver.GetType(typeName, Assembly.GetExecutingAssembly(ref stackMark),
2020
throwOnError: throwOnError, ignoreCase: ignoreCase);
2121
}
2222

@@ -25,7 +25,7 @@ public abstract partial class Type : MemberInfo, IReflect
2525
public static Type? GetType(string typeName, bool throwOnError)
2626
{
2727
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
28-
return TypeNameParser.GetType(typeName, Assembly.GetExecutingAssembly(ref stackMark),
28+
return TypeNameResolver.GetType(typeName, Assembly.GetExecutingAssembly(ref stackMark),
2929
throwOnError: throwOnError);
3030
}
3131

@@ -34,7 +34,7 @@ public abstract partial class Type : MemberInfo, IReflect
3434
public static Type? GetType(string typeName)
3535
{
3636
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
37-
return TypeNameParser.GetType(typeName, Assembly.GetExecutingAssembly(ref stackMark));
37+
return TypeNameResolver.GetType(typeName, Assembly.GetExecutingAssembly(ref stackMark));
3838
}
3939

4040
[RequiresUnreferencedCode("The type might be removed")]
@@ -45,7 +45,7 @@ public abstract partial class Type : MemberInfo, IReflect
4545
Func<Assembly?, string, bool, Type?>? typeResolver)
4646
{
4747
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
48-
return TypeNameParser.GetType(typeName, assemblyResolver, typeResolver,
48+
return TypeNameResolver.GetType(typeName, assemblyResolver, typeResolver,
4949
((assemblyResolver != null) && (typeResolver != null)) ? null : Assembly.GetExecutingAssembly(ref stackMark));
5050
}
5151

@@ -58,7 +58,7 @@ public abstract partial class Type : MemberInfo, IReflect
5858
bool throwOnError)
5959
{
6060
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
61-
return TypeNameParser.GetType(typeName, assemblyResolver, typeResolver,
61+
return TypeNameResolver.GetType(typeName, assemblyResolver, typeResolver,
6262
((assemblyResolver != null) && (typeResolver != null)) ? null : Assembly.GetExecutingAssembly(ref stackMark),
6363
throwOnError: throwOnError);
6464
}
@@ -73,7 +73,7 @@ public abstract partial class Type : MemberInfo, IReflect
7373
bool ignoreCase)
7474
{
7575
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
76-
return TypeNameParser.GetType(typeName, assemblyResolver, typeResolver,
76+
return TypeNameResolver.GetType(typeName, assemblyResolver, typeResolver,
7777
((assemblyResolver != null) && (typeResolver != null)) ? null : Assembly.GetExecutingAssembly(ref stackMark),
7878
throwOnError: throwOnError, ignoreCase: ignoreCase);
7979
}

src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerHelpers/ReflectionHelpers.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ internal static class ReflectionHelpers
1717
// a default assembly name.
1818
public static Type GetType(string typeName, string callingAssemblyName, bool throwOnError, bool ignoreCase)
1919
{
20-
return TypeNameParser.GetType(typeName, throwOnError: throwOnError, ignoreCase: ignoreCase, defaultAssemblyName: callingAssemblyName);
20+
return TypeNameResolver.GetType(typeName, throwOnError: throwOnError, ignoreCase: ignoreCase, defaultAssemblyName: callingAssemblyName);
2121
}
2222

2323
// This entry is used to implement Type.GetType()'s ability to detect the calling assembly and use it as
2424
// a default assembly name.
2525
public static Type ExtensibleGetType(string typeName, string callingAssemblyName, Func<AssemblyName, Assembly?> assemblyResolver, Func<Assembly?, string, bool, Type?>? typeResolver, bool throwOnError, bool ignoreCase)
2626
{
27-
return TypeNameParser.GetType(typeName, assemblyResolver, typeResolver, throwOnError: throwOnError, ignoreCase: ignoreCase, defaultAssemblyName: callingAssemblyName);
27+
return TypeNameResolver.GetType(typeName, assemblyResolver, typeResolver, throwOnError: throwOnError, ignoreCase: ignoreCase, defaultAssemblyName: callingAssemblyName);
2828
}
2929

3030
// This supports Assembly.GetExecutingAssembly() intrinsic expansion in the compiler

src/coreclr/nativeaot/System.Private.CoreLib/src/System.Private.CoreLib.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,7 @@
493493
<Compile Include="System\Reflection\Runtime\TypeInfos\RuntimeTypeInfo.CoreGetDeclared.cs" />
494494
<Compile Include="System\Reflection\Runtime\TypeInfos\RuntimeTypeInfo.InvokeMember.cs" />
495495
<Compile Include="System\Reflection\Runtime\TypeInfos\RuntimeTypeInfo.TypeComponentsCache.cs" />
496-
<Compile Include="System\Reflection\TypeNameParser.NativeAot.cs" />
496+
<Compile Include="System\Reflection\TypeNameResolver.NativeAot.cs" />
497497
</ItemGroup>
498498
<ItemGroup>
499499
<Compile Include="Internal\Reflection\Core\AssemblyBinder.cs" />

src/coreclr/nativeaot/System.Private.CoreLib/src/System/Reflection/Runtime/Assemblies/RuntimeAssemblyInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public sealed override Type GetType(string name, bool throwOnError, bool ignoreC
6868
{
6969
ArgumentException.ThrowIfNullOrEmpty(name);
7070

71-
return TypeNameParser.GetType(name,
71+
return TypeNameResolver.GetType(name,
7272
throwOnError: throwOnError,
7373
ignoreCase: ignoreCase,
7474
topLevelAssembly: this);

0 commit comments

Comments
 (0)