From 64d92bf9193d1214f39f75f9b31e5a37cbeb6815 Mon Sep 17 00:00:00 2001 From: Eusebiu Marcu Date: Sun, 13 Mar 2011 18:48:46 +0200 Subject: [PATCH] Use new ILRange methods --- .../Ast/AstMethodBodyBuilder.cs | 2 +- .../Ast/TextOutputFormatter.cs | 4 +-- ICSharpCode.Decompiler/CodeMappings.cs | 29 ++++++++++++++----- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs b/ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs index 2b3262223..4aeddc69e 100644 --- a/ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs +++ b/ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs @@ -177,7 +177,7 @@ namespace ICSharpCode.Decompiler.Ast Expression astExpr = node as Expression; // get IL ranges - used in debugger - List ilRanges = expr.GetILRanges(); + List ilRanges = ILRange.OrderAndJoint(expr.GetSelfAndChildrenRecursive().SelectMany(e => e.ILRanges)); AstNode result; if (astExpr != null) diff --git a/ICSharpCode.Decompiler/Ast/TextOutputFormatter.cs b/ICSharpCode.Decompiler/Ast/TextOutputFormatter.cs index c03a6ae6f..635c00bf8 100644 --- a/ICSharpCode.Decompiler/Ast/TextOutputFormatter.cs +++ b/ICSharpCode.Decompiler/Ast/TextOutputFormatter.cs @@ -133,9 +133,9 @@ namespace ICSharpCode.Decompiler.Ast if (n != default(AstType)) { MemberMapping mapping = n.Annotation(); - 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 && diff --git a/ICSharpCode.Decompiler/CodeMappings.cs b/ICSharpCode.Decompiler/CodeMappings.cs index 2e3586e6e..9c09ec797 100644 --- a/ICSharpCode.Decompiler/CodeMappings.cs +++ b/ICSharpCode.Decompiler/CodeMappings.cs @@ -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(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 /// public uint MetadataToken { get; set; } + /// + /// Gets or sets the code size for the member mapping. + /// + public int CodeSize { get; set; } + /// /// Gets or sets the source code mappings. /// @@ -107,7 +121,7 @@ namespace ICSharpCode.Decompiler /// Method to create the mapping for. /// Source code mapping storage. public static MemberMapping CreateCodeMapping( - this MemberReference member, + this MethodDefinition member, ConcurrentDictionary> codeMappings) { // create IL/CSharp code mappings - used in debugger @@ -118,7 +132,8 @@ namespace ICSharpCode.Decompiler currentMemberMapping = new MemberMapping() { MetadataToken = (uint)member.MetadataToken.ToInt32(), Type = member.DeclaringType.Resolve(), - MemberCodeMappings = new List() + MemberCodeMappings = new List(), + CodeSize = member.Body.CodeSize }; mapping.Add(currentMemberMapping); }