Browse Source

Refactor for readability

pull/2386/head
Anders Hörnfeldt 4 years ago committed by Siegfried Pammer
parent
commit
b45c0099ef
  1. 43
      ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs

43
ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs

@ -52,6 +52,8 @@ namespace ICSharpCode.Decompiler.Disassembler
public static class DisassemblerHelpers public static class DisassemblerHelpers
{ {
static readonly char[] _validNonLetterIdentifierCharacter = new char[] { '_', '$', '@', '?', '`', '.' };
public static string OffsetToString(int offset) public static string OffsetToString(int offset)
{ {
return string.Format("IL_{0:x4}", offset); return string.Format("IL_{0:x4}", offset);
@ -104,39 +106,36 @@ namespace ICSharpCode.Decompiler.Disassembler
} }
static bool IsValidIdentifierCharacter(char c) static bool IsValidIdentifierCharacter(char c)
{ => char.IsLetterOrDigit(c) || _validNonLetterIdentifierCharacter.IndexOf(c) >= 0;
return c == '_' || c == '$' || c == '@' || c == '?' || c == '`';
}
static bool IsValidIdentifier(string identifier) static bool IsValidIdentifier(string identifier)
{ {
if (string.IsNullOrEmpty(identifier)) if (string.IsNullOrEmpty(identifier))
return false; return false;
if (!(char.IsLetter(identifier[0]) || IsValidIdentifierCharacter(identifier[0])))
{ if (char.IsDigit(identifier[0]))
// As a special case, .ctor and .cctor are valid despite starting with a dot return false;
// As a special case, .ctor and .cctor are valid despite starting with a dot
if (identifier[0] == '.')
return identifier == ".ctor" || identifier == ".cctor"; return identifier == ".ctor" || identifier == ".cctor";
}
for (int i = 1; i < identifier.Length; i++) if (Metadata.ILOpCodeExtensions.ILKeywords.Contains(identifier))
{ return false;
if (!(char.IsLetterOrDigit(identifier[i]) || IsValidIdentifierCharacter(identifier[i]) || identifier[i] == '.'))
return false; return identifier.All(IsValidIdentifierCharacter);
}
return true;
} }
public static string Escape(string identifier) public static string Escape(string identifier)
{ {
if (IsValidIdentifier(identifier) && !Metadata.ILOpCodeExtensions.ILKeywords.Contains(identifier)) if (IsValidIdentifier(identifier))
{ {
return identifier; return identifier;
} }
else
{ // The ECMA specification says that ' inside SQString should be ecaped using an octal escape sequence,
// The ECMA specification says that ' inside SQString should be ecaped using an octal escape sequence, // but we follow Microsoft's ILDasm and use \'.
// but we follow Microsoft's ILDasm and use \'. return $"'{EscapeString(identifier).Replace("'", "\\'")}'";
return "'" + EscapeString(identifier).Replace("'", "\\'") + "'";
}
} }
public static void WriteParameterReference(ITextOutput writer, MetadataReader metadata, MethodDefinitionHandle handle, int sequence) public static void WriteParameterReference(ITextOutput writer, MetadataReader metadata, MethodDefinitionHandle handle, int sequence)
@ -278,7 +277,7 @@ namespace ICSharpCode.Decompiler.Disassembler
public static string EscapeString(string str) public static string EscapeString(string str)
{ {
StringBuilder sb = new StringBuilder(); var sb = new StringBuilder();
foreach (char ch in str) foreach (char ch in str)
{ {
switch (ch) switch (ch)
@ -317,7 +316,7 @@ namespace ICSharpCode.Decompiler.Disassembler
// print control characters and uncommon white spaces as numbers // print control characters and uncommon white spaces as numbers
if (char.IsControl(ch) || char.IsSurrogate(ch) || (char.IsWhiteSpace(ch) && ch != ' ')) if (char.IsControl(ch) || char.IsSurrogate(ch) || (char.IsWhiteSpace(ch) && ch != ' '))
{ {
sb.Append("\\u" + ((int)ch).ToString("x4")); sb.AppendFormat("\\u{0:x4}", (int)ch);
} }
else else
{ {

Loading…
Cancel
Save