Fix type name parsing in NativeAOT (#79963)
authorAndrii Kurdiumov <kant2002@gmail.com>
Sun, 25 Dec 2022 23:45:49 +0000 (05:45 +0600)
committerGitHub <noreply@github.com>
Sun, 25 Dec 2022 23:45:49 +0000 (08:45 +0900)
Simplified type name parsing was breaking if full name or assembly name has underscode ('_') in it. That breaks referencing `SQLitePCL.Batteries_V2, SQLitePCLRaw.batteries_v2` type inside `Microsoft.Data.Sqlite`

Fixes https://github.com/dotnet/efcore/issues/29725

src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ReflectionMethodBodyScanner.cs

index 22ca17d..4427756 100644 (file)
@@ -23,7 +23,7 @@ namespace ILCompiler.DependencyAnalysis
             StringBuilder typeName = new StringBuilder();
             StringBuilder typeNamespace = new StringBuilder();
             string containingTypeName = null;
-            while (i < name.Length && (char.IsLetterOrDigit(name[i]) || name[i] == '.' || name[i] == '`' || name[i] == '+'))
+            while (i < name.Length && (char.IsLetterOrDigit(name[i]) || name[i] == '.' || name[i] == '_' || name[i] == '`' || name[i] == '+'))
             {
                 if (name[i] == '.')
                 {
@@ -59,7 +59,7 @@ namespace ILCompiler.DependencyAnalysis
 
             // Consume assembly name
             StringBuilder assemblyName = new StringBuilder();
-            while (i < name.Length && (char.IsLetterOrDigit(name[i]) || name[i] == '.'))
+            while (i < name.Length && (char.IsLetterOrDigit(name[i]) || name[i] == '.' || name[i] == '_'))
             {
                 assemblyName.Append(name[i]);
                 i++;