Browse Source

Use new ILRange methods

pull/191/merge
Eusebiu Marcu 15 years ago
parent
commit
64d92bf919
  1. 2
      ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs
  2. 4
      ICSharpCode.Decompiler/Ast/TextOutputFormatter.cs
  3. 29
      ICSharpCode.Decompiler/CodeMappings.cs

2
ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs

@ -177,7 +177,7 @@ namespace ICSharpCode.Decompiler.Ast @@ -177,7 +177,7 @@ namespace ICSharpCode.Decompiler.Ast
Expression astExpr = node as Expression;
// get IL ranges - used in debugger
List<ILRange> ilRanges = expr.GetILRanges();
List<ILRange> ilRanges = ILRange.OrderAndJoint(expr.GetSelfAndChildrenRecursive<ILExpression>().SelectMany(e => e.ILRanges));
AstNode result;
if (astExpr != null)

4
ICSharpCode.Decompiler/Ast/TextOutputFormatter.cs

@ -133,9 +133,9 @@ namespace ICSharpCode.Decompiler.Ast @@ -133,9 +133,9 @@ namespace ICSharpCode.Decompiler.Ast
if (n != default(AstType)) {
MemberMapping mapping = n.Annotation<MemberMapping>();
foreach (var range in ranges) {
// make sure we have one ILRange per source code line
foreach (var range in ranges) {
var map = mapping.MemberCodeMappings.Find(s => s.SourceCodeLine == output.CurrentLine);
if (map == null) {
// check if the range is in previous mapping
var prevmap = mapping.MemberCodeMappings.Find(m => m.ILInstructionOffset.From <= range.From &&

29
ICSharpCode.Decompiler/CodeMappings.cs

@ -49,11 +49,20 @@ namespace ICSharpCode.Decompiler @@ -49,11 +49,20 @@ namespace ICSharpCode.Decompiler
resultList.Add(ILInstructionOffset.From);
resultList.Add(ILInstructionOffset.To);
// add the next gap if exists
var map = MemberMapping.MemberCodeMappings.Find(m => m.ILInstructionOffset.From >= ILInstructionOffset.To);
if (map != null && map.ILInstructionOffset.From != ILInstructionOffset.To) {
resultList.Add(ILInstructionOffset.To);
resultList.Add(map.ILInstructionOffset.From);
var list = MemberMapping.MemberCodeMappings.ConvertAll<ILRange>(s => new ILRange { From = s.ILInstructionOffset.From, To = s.ILInstructionOffset.To });
var invertedList = ILRange.Invert(list, MemberMapping.CodeSize);
if (invertedList != null && invertedList.Count() > 0) {
foreach (var range in invertedList) {
resultList.Add(range.From);
resultList.Add(range.To);
}
}
// remove last gap - step on the last line
if (resultList[resultList.Count - 1] == MemberMapping.CodeSize) {
resultList.RemoveAt(resultList.Count - 1);
resultList.RemoveAt(resultList.Count - 1);
}
return resultList.ToArray();
@ -75,6 +84,11 @@ namespace ICSharpCode.Decompiler @@ -75,6 +84,11 @@ namespace ICSharpCode.Decompiler
/// </summary>
public uint MetadataToken { get; set; }
/// <summary>
/// Gets or sets the code size for the member mapping.
/// </summary>
public int CodeSize { get; set; }
/// <summary>
/// Gets or sets the source code mappings.
/// </summary>
@ -107,7 +121,7 @@ namespace ICSharpCode.Decompiler @@ -107,7 +121,7 @@ namespace ICSharpCode.Decompiler
/// <param name="method">Method to create the mapping for.</param>
/// <param name="sourceCodeMappings">Source code mapping storage.</param>
public static MemberMapping CreateCodeMapping(
this MemberReference member,
this MethodDefinition member,
ConcurrentDictionary<string, List<MemberMapping>> codeMappings)
{
// create IL/CSharp code mappings - used in debugger
@ -118,7 +132,8 @@ namespace ICSharpCode.Decompiler @@ -118,7 +132,8 @@ namespace ICSharpCode.Decompiler
currentMemberMapping = new MemberMapping() {
MetadataToken = (uint)member.MetadataToken.ToInt32(),
Type = member.DeclaringType.Resolve(),
MemberCodeMappings = new List<SourceCodeMapping>()
MemberCodeMappings = new List<SourceCodeMapping>(),
CodeSize = member.Body.CodeSize
};
mapping.Add(currentMemberMapping);
}

Loading…
Cancel
Save