Skip to content

Commit

Permalink
Refactored name escaping.
Browse files Browse the repository at this point in the history
  • Loading branch information
Haplois committed Feb 15, 2021
1 parent 0985aa8 commit 5184413
Show file tree
Hide file tree
Showing 7 changed files with 325 additions and 123 deletions.
14 changes: 7 additions & 7 deletions TestPlatform.sln
Original file line number Diff line number Diff line change
Expand Up @@ -82,17 +82,17 @@ EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{EE49F5DC-5835-4AE3-B3BA-8BDE0AD56330}"
ProjectSection(SolutionItems) = preProject
scripts\build.ps1 = scripts\build.ps1
scripts\build.sh = scripts\build.sh
scripts\PortableToFullPdb.ps1 = scripts\PortableToFullPdb.ps1
scripts\stylecop.json = scripts\stylecop.json
scripts\stylecop.ruleset = scripts\stylecop.ruleset
scripts\stylecop.test.ruleset = scripts\stylecop.test.ruleset
scripts\test.ps1 = scripts\test.ps1
scripts\verify-sign.ps1 = scripts\verify-sign.ps1
scripts\test.sh = scripts\test.sh
scripts\verify-nupkgs.ps1 = scripts\verify-nupkgs.ps1
scripts\PortableToFullPdb.ps1 = scripts\PortableToFullPdb.ps1
scripts\verify-sign.ps1 = scripts\verify-sign.ps1
scripts\vsts-prebuild.ps1 = scripts\vsts-prebuild.ps1
scripts\write-release-notes.ps1 = scripts\write-release-notes.ps1
scripts\build.sh = scripts\build.sh
scripts\test.sh = scripts\test.sh
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{E344E0A2-7715-4C7F-BAF7-D64EA94CB19B}"
Expand Down Expand Up @@ -818,6 +818,8 @@ Global
{9EFCEFB5-253E-4DE2-8A70-821D7B8189DF} = {B27FAFDF-2DBA-4AB0-BA85-FD5F21D359D6}
{3A8080FB-9C93-45B9-8EB5-828DDC31FDF0} = {B27FAFDF-2DBA-4AB0-BA85-FD5F21D359D6}
{BFF7714C-E5A3-4EEB-B04B-5FA47F29AD03} = {020E15EA-731F-4667-95AF-226671E0C3AE}
{0D4DF78D-7E5F-4516-B19F-E6AA71A1DBF4} = {EE49F5DC-5835-4AE3-B3BA-8BDE0AD56330}
{DED1590A-ED25-413B-8590-006A4DD5B2FD} = {EE49F5DC-5835-4AE3-B3BA-8BDE0AD56330}
{E344E0A2-7715-4C7F-BAF7-D64EA94CB19B} = {EE49F5DC-5835-4AE3-B3BA-8BDE0AD56330}
{DD9382B5-5EC4-4B3D-BEB7-95423731AE29} = {46250E12-4CF1-4051-B4A7-80C8C06E0068}
{156F8811-28BB-4EC7-87D9-434F10FB7DBE} = {46250E12-4CF1-4051-B4A7-80C8C06E0068}
Expand All @@ -829,7 +831,6 @@ Global
{CAE652AF-6801-425E-AAF3-AB20DE7DF88E} = {7D4082EA-7AC9-4DFB-98E8-C5E08BDC0EC3}
{FF80D706-8309-4E02-BAC0-D28B4CBCF600} = {B27FAFDF-2DBA-4AB0-BA85-FD5F21D359D6}
{7D4082EA-7AC9-4DFB-98E8-C5E08BDC0EC3} = {ED0C35EB-7F31-4841-A24F-8EB708FFA959}
{DED1590A-ED25-413B-8590-006A4DD5B2FD} = {EE49F5DC-5835-4AE3-B3BA-8BDE0AD56330}
{E141A226-CC0A-4F26-BD17-4AE427D81C3B} = {D27E1CB4-C641-4C6C-A140-EF5F6215AE29}
{376C19DE-31E2-4FF6-88FC-0D0D6233C999} = {B27FAFDF-2DBA-4AB0-BA85-FD5F21D359D6}
{3E698655-0701-482E-9AA7-F956F6337FC7} = {376C19DE-31E2-4FF6-88FC-0D0D6233C999}
Expand All @@ -842,15 +843,14 @@ Global
{65A25D6E-C9CC-4F45-8925-04087AC82634} = {B705537C-B82C-4A30-AFA5-6244D9A7DAEB}
{D9A30E32-D466-4EC5-B4F2-62E17562279B} = {B27FAFDF-2DBA-4AB0-BA85-FD5F21D359D6}
{21DB138B-85B7-479E-91FE-01E0F972EC56} = {D9A30E32-D466-4EC5-B4F2-62E17562279B}
{0D4DF78D-7E5F-4516-B19F-E6AA71A1DBF4} = {EE49F5DC-5835-4AE3-B3BA-8BDE0AD56330}
{8C068694-23A2-47A2-A0DD-DB82D0AF0142} = {376C19DE-31E2-4FF6-88FC-0D0D6233C999}
{24C7683D-2607-4901-B8EB-83A57E49E93D} = {376C19DE-31E2-4FF6-88FC-0D0D6233C999}
{69F5FF81-5615-4F06-B83C-FCF979BB84CA} = {ED0C35EB-7F31-4841-A24F-8EB708FFA959}
{E7D4921C-F12D-4E1C-85AC-8B7F91C59B0E} = {B27FAFDF-2DBA-4AB0-BA85-FD5F21D359D6}
{236A71E3-01DA-4679-9DFF-16A8E079ACFF} = {5E7F18A8-F843-4C8A-AB02-4C7D9205C6CF}
{41248B96-6E15-4E5E-A78F-859897676814} = {020E15EA-731F-4667-95AF-226671E0C3AE}
{074F5BD6-DC05-460B-B78F-044D125FD787} = {D9A30E32-D466-4EC5-B4F2-62E17562279B}
{DCD0C39E-C78C-4A44-B0BD-7325254A2E97} = {B27FAFDF-2DBA-4AB0-BA85-FD5F21D359D6}
{DCD0C39E-C78C-4A44-B0BD-7325254A2E97} = {376C19DE-31E2-4FF6-88FC-0D0D6233C999}
{2DE99835-A3A3-4922-82AD-6D10D284816D} = {7D4082EA-7AC9-4DFB-98E8-C5E08BDC0EC3}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ private static int ParseEscapedStringSegment(string escapedStringSegment, int po
else
{
stringBuilder.Append(escapedStringSegment[i + 1]);
i += 2;
i += 1;
}
}
else if (c == '\'')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,8 +166,8 @@ public static MethodBase GetMethod(Assembly assembly, string managedTypeName, st

MethodInfo method = null;
ManagedNameParser.ParseManagedMethodName(managedMethodName, out var methodName, out var methodArity, out var parameterTypes);
#if NET20 || NET35

#if NET20 || NET35
if (!IsNullOrWhiteSpace(methodName))
#else
if (!string.IsNullOrWhiteSpace(methodName))
Expand Down Expand Up @@ -256,7 +256,7 @@ private static void AppendTypeString(StringBuilder b, Type type, bool closedType
}
else
{
b.Append(type.Namespace);
AppendNamespace(b, type.Namespace);
b.Append('.');

AppendNestedTypeName(b, type);
Expand All @@ -268,6 +268,39 @@ private static void AppendTypeString(StringBuilder b, Type type, bool closedType
}
}

private static void AppendNamespace(StringBuilder b, string ns)
{
int start = 0;
bool shouldEscape = false;

for (int i = 0; i <= ns.Length; i++)
{
if (i == ns.Length || ns[i] == '.')
{
if (start != 0)
{
b.Append('.');
}

var part = ns.Substring(start, i - start);
if (shouldEscape)
{
NormalizeString(b, part);
shouldEscape = false;
}
else
{
b.Append(part);
}

start = i + 1;
continue;
}

shouldEscape = shouldEscape || NeedsEscaping(ns[i], i - start);
}
}

private static void AppendMethodString(StringBuilder methodBuilder, string name, int methodArity)
{
var arityStart = name.LastIndexOf('`');
Expand All @@ -288,34 +321,42 @@ private static void AppendMethodString(StringBuilder methodBuilder, string name,
if (IsNormalized(name))
{
methodBuilder.Append(name);
if (arity > 0 && methodArity == arity)
{
methodBuilder.Append($"`{arity}");
}
return;
}
else
{
NormalizeString(methodBuilder, name);
}

if (arity > 0 && methodArity == arity)
{
methodBuilder.Append($"`{arity}");
}
}

methodBuilder.Append("'");
private static void NormalizeString(StringBuilder b, string name)
{
b.Append("'");
for (int i = 0; i < name.Length; i++)
{
char c = name[i];
if (NeedsEscaping(c, i))
{
var encoded = Convert.ToString(((uint)c), 16);
methodBuilder.Append("\\u");
methodBuilder.Append('0', 4 - encoded.Length);
methodBuilder.Append(encoded);
}
else
{
methodBuilder.Append(c);
if (c == '\\' || c == '\'')
{
// var encoded = Convert.ToString(((uint)c), 16);
// b.Append("\\u");
// b.Append('0', 4 - encoded.Length);
// b.Append(encoded);

b.Append("\\");
b.Append(c);
continue;
}
}

b.Append(c);
}
methodBuilder.Append("'");
if (arity > 0 && methodArity == arity)
{
methodBuilder.Append($"`{arity}");
}
b.Append("'");
}

private static bool IsNormalized(string s)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,18 @@ private static string Capture(string managedMethodName, int start, int end)

private static int ParseMethodName(string managedMethodName, int start, out string methodName, out int arity)
{
int i = start;
var i = start;
var quoted = false;
for (; i < managedMethodName.Length; i++)
{
switch (managedMethodName[i])
var c = managedMethodName[i];
if (c == '\'' || quoted)
{
quoted = c == '\'' ? !quoted : quoted;
continue;
}

switch (c)
{
case var w when char.IsWhiteSpace(w):
string message = string.Format(CultureInfo.CurrentCulture, Resources.ErrorWhitespaceNotValid, i);
Expand Down Expand Up @@ -161,10 +169,17 @@ private static int ParseParameterTypeList(string managedMethodName, int start, o
private static int ParseParameterType(string managedMethodName, int start, out string parameterType)
{
parameterType = string.Empty;
var quoted = false;

int i = start;
for (; i < managedMethodName.Length; i++)
for (i = start; i < managedMethodName.Length; i++)
{
if (managedMethodName[i] == '\'' || quoted)
{
quoted = managedMethodName[i] == '\'' ? !quoted : quoted;
continue;
}

switch (managedMethodName[i])
{
case '<':
Expand All @@ -187,8 +202,16 @@ private static int ParseParameterType(string managedMethodName, int start, out s

private static int ParseArrayBrackets(string managedMethodName, int start)
{
var quoted = false;

for (int i = start; i < managedMethodName.Length; i++)
{
if (managedMethodName[i] == '\'' || quoted)
{
quoted = managedMethodName[i] == '\'' ? !quoted : quoted;
continue;
}

switch (managedMethodName[i])
{
case ']':
Expand All @@ -205,8 +228,16 @@ private static int ParseArrayBrackets(string managedMethodName, int start)

private static int ParseGenericBrackets(string managedMethodName, int start)
{
var quoted = false;

for (int i = start; i < managedMethodName.Length; i++)
{
if (managedMethodName[i] == '\'' || quoted)
{
quoted = managedMethodName[i] == '\'' ? !quoted : quoted;
continue;
}

switch (managedMethodName[i])
{
case '<':
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,7 @@ public void GenericExplicitInterfaceImplementation1()
containingTypeSymbol: implT,
methodSymbol: implT.FindMethod("TestClasses.IImplementation<T>.ImplMethod0"),
managedTypeName: "TestClasses.Impl`1",
managedMethodName: "'TestClasses\\u002eIImplementation\\u003cT\\u003e\\u002eImplMethod0'"); // "TestClasses.IImplementation<T>.ImplMethod0"
managedMethodName: "'TestClasses.IImplementation<T>.ImplMethod0'"); // "TestClasses.IImplementation<T>.ImplMethod0"
}

[TestMethod]
Expand All @@ -464,7 +464,7 @@ public void GenericExplicitInterfaceImplementation2()
containingTypeSymbol: implT,
methodSymbol: implT.FindMethod("TestClasses.IImplementation<T>.ImplMethod1"),
managedTypeName: "TestClasses.Impl`1",
managedMethodName: "'TestClasses\\u002eIImplementation\\u003cT\\u003e\\u002eImplMethod1'(!0)"); // "TestClasses.IImplementation<T>.ImplMethod1(!0)"
managedMethodName: "'TestClasses.IImplementation<T>.ImplMethod1'(!0)"); // "TestClasses.IImplementation<T>.ImplMethod1(!0)"
}

[TestMethod]
Expand All @@ -477,7 +477,7 @@ public void GenericExplicitInterfaceImplementation3()
containingTypeSymbol: implT,
methodSymbol: implT.FindMethod("TestClasses.IImplementation<T>.ImplMethod2"),
managedTypeName: "TestClasses.Impl`1",
managedMethodName: "'TestClasses\\u002eIImplementation\\u003cT\\u003e\\u002eImplMethod2'`1(!0,!!0,System.String)"); // "TestClasses.IImplementation<T>.ImplMethod2`1(!0,!!0,System.String)"
managedMethodName: "'TestClasses.IImplementation<T>.ImplMethod2'`1(!0,!!0,System.String)"); // "TestClasses.IImplementation<T>.ImplMethod2`1(!0,!!0,System.String)"
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public void VerifyThatInvalidIdentifierNamesAreParsed()
var asset = environment.GetTestAsset("CILProject.dll", "net451");
var assembly = Assembly.LoadFrom(asset);
var types = assembly.GetTypes();

foreach (var type in types)
{
var methods = type.GetMethods();
Expand Down
Loading

0 comments on commit 5184413

Please sign in to comment.