in src/dotnet/ReSharperPlugin.DotNetDisassembler/JitDisasm/DisassemblyPrettifier.cs [30:108]
public static string Prettify(string rawAsm, bool minimalComments)
{
if (!minimalComments)
return rawAsm;
try
{
var lines = rawAsm.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries);
var blocks = new List<Block>();
var prevBlock = BlockType.Unknown;
var currentMethod = "";
foreach (var line in lines)
{
if (line.Contains("; Assembly listing for method "))
currentMethod = line.Remove(0, "; Assembly listing for method ".Length);
else if (currentMethod == "")
return rawAsm; // in case if format is changed
var currentBlock = BlockType.Unknown;
if (line.StartsWith(";"))
currentBlock = BlockType.Comments;
else if (string.IsNullOrWhiteSpace(line))
{
continue;
}
else
{
currentBlock = BlockType.Code;
if (Regex.IsMatch(line, @"^\w+:"))
{
prevBlock = BlockType.Unknown;
}
}
if (currentBlock != prevBlock)
{
blocks.Add(new Block { MethodName = currentMethod, Type = currentBlock, Data = $"\n{line}\n" });
prevBlock = currentBlock;
}
else
blocks[blocks.Count - 1].Data += line + "\n";
}
var blocksByMethods = blocks.GroupBy(b => b.MethodName);
var output = new StringBuilder();
foreach (var method in blocksByMethods)
{
List<Block> methodBlocks = method.ToList();
int size = ParseMethodTotalSizes(methodBlocks);
if (minimalComments)
{
methodBlocks = methodBlocks.Where(m => m.Type != BlockType.Comments).ToList();
output.Append($"; Method {method.Key}");
}
foreach (var block in methodBlocks)
output.Append(block.Data);
if (minimalComments)
{
output.Append("; Total bytes of code: ")
.Append(size)
.AppendLine()
.AppendLine();
}
}
return output.ToString();
}
catch
{
return rawAsm; // format is changed - leave it as is
}
}