diff --git a/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageMethodElement.cs b/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageMethodElement.cs index 1191b16756..a6fb43f706 100644 --- a/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageMethodElement.cs +++ b/src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageMethodElement.cs @@ -126,9 +126,52 @@ namespace ICSharpCode.CodeCoverage sps.Add(sp); } + + // SP's are originaly ordered by CIL offset + // but ccrewrite can move offset of + // Contract.Requires before method signature SP (xxx{) and + // Contract.Ensures after method closing SP (}) + // So sort SP's back by line/column + sps.OrderBy(item => item.Line).OrderBy(item => item.Column); return sps; } + // Find method-body start SequencePoint "xxxx {" + public static CodeCoverageSequencePoint getBodyStartSP(IEnumerable sPoints) { + CodeCoverageSequencePoint startSeqPoint = null; + bool startFound = false; + foreach (CodeCoverageSequencePoint sPoint in sPoints) { + if ( sPoint.Content == "{") { + if (startSeqPoint == null) startSeqPoint = sPoint; + startFound = true; + break; + } + startSeqPoint = sPoint; + } + return startFound == true? startSeqPoint : null; + } + + // Find method-body final SequencePoint "}" + public static CodeCoverageSequencePoint getBodyFinalSP(IEnumerable sps) { + CodeCoverageSequencePoint finalSeqPoint = null; + foreach (CodeCoverageSequencePoint sp in Enumerable.Reverse(sps)) { + if ( sp.Content == "}") { + if (finalSeqPoint == null) { + finalSeqPoint = sp; + } + // check for ccrewrite duplicate + else if (sp.Line == finalSeqPoint.Line && + sp.Column == finalSeqPoint.Column && + sp.EndLine == finalSeqPoint.EndLine && + sp.EndColumn == finalSeqPoint.EndColumn && + sp.Offset < finalSeqPoint.Offset) { + finalSeqPoint = sp; + } + } + } + return finalSeqPoint; + } + List FilterSequencePoints(List sps) { List returnList = sps; @@ -166,12 +209,6 @@ namespace ICSharpCode.CodeCoverage } } - // SP's are originaly ordered by CIL offset - // but ccrewrite can move offset of - // Contract.Requires before method signature SP (xxx{) and - // Contract.Ensures after method closing SP (}) - // So sort SP's back by line/column - selected.OrderBy(item => item.Line).OrderBy(item => item.Column); returnList = selected; } @@ -206,42 +243,6 @@ namespace ICSharpCode.CodeCoverage return bps; } - // Find method-body start SequencePoint "xxxx {" - public static CodeCoverageSequencePoint getBodyStartSP(IEnumerable sPoints) { - CodeCoverageSequencePoint startSeqPoint = null; - bool startFound = false; - foreach (CodeCoverageSequencePoint sPoint in sPoints) { - if ( sPoint.Content == "{") { - if (startSeqPoint == null) startSeqPoint = sPoint; - startFound = true; - break; - } - startSeqPoint = sPoint; - } - return startFound == true? startSeqPoint : null; - } - - // Find method-body final SequencePoint "}" - public static CodeCoverageSequencePoint getBodyFinalSP(IEnumerable sps) { - CodeCoverageSequencePoint finalSeqPoint = null; - foreach (CodeCoverageSequencePoint sp in Enumerable.Reverse(sps)) { - if ( sp.Content == "}") { - if (finalSeqPoint == null) { - finalSeqPoint = sp; - } - // check for ccrewrite duplicate - else if (sp.Line == finalSeqPoint.Line && - sp.Column == finalSeqPoint.Column && - sp.EndLine == finalSeqPoint.EndLine && - sp.EndColumn == finalSeqPoint.EndColumn && - sp.Offset < finalSeqPoint.Offset) { - finalSeqPoint = sp; - } - } - } - return finalSeqPoint; - } - Tuple GetBranchRatio () { // goal: Get branch ratio and exclude (rewriten) Code Contracts branches