Browse Source

CodeCoverage: experiment

pull/67/head
Dragan 12 years ago
parent
commit
34a9754c9f
  1. 46
      src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageStringTextSource.cs

46
src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageStringTextSource.cs

@ -22,40 +22,56 @@ namespace ICSharpCode.CodeCoverage
private readonly lineInfo[] lines; private readonly lineInfo[] lines;
public CodeCoverageStringTextSource(string source) public CodeCoverageStringTextSource(string source)
{ {
// protect readonly field from source mutation(s) this.textSource = source;
this.textSource = string.Copy(source);
lineInfo line; lineInfo line;
List<lineInfo> lineInfoList = new List<lineInfo>(); List<lineInfo> lineInfoList = new List<lineInfo>();
int offset = 0; int offset = 0;
int counter = 0; int counter = 0;
bool nl = false; bool newLine = false;
bool cr = false; bool cr = false;
bool lf = false; bool lf = false;
bool nel = false;
bool lsep = false;
// http://www.w3.org/TR/xml11/#sec-line-ends
foreach ( ushort ch in textSource ) { foreach ( ushort ch in textSource ) {
switch (ch) { switch (ch) {
case 13: case 0xD:
if (lf || cr) { if (lf||nel||cr) {
nl = true; // cr after [cr]lf newLine = true; // cr after cr|nel|lf
} else { } else {
cr = true; // cr found cr = true; // cr found
} }
break; break;
case 10: case 0xA:
if (lf) { if (lf||nel||lsep) {
nl = true; // lf after lf newLine = true; // lf after line-end
} else { } else {
lf = true; // lf found lf = true; // lf found
} }
break; break;
case 0x85:
if (lf||nel||lsep) {
newLine = true; // nel after line-end
} else {
nel = true; // lf found
}
break;
case 0x2028:
if (cr||lf||nel||lsep) {
newLine = true; // lsep after line-end
} else {
lsep = true; // lsep found
}
break;
default: default:
if (cr||lf) { if (cr||lf||nel||lsep) {
nl = true; // any noncrlf char after cr|lf newLine = true; // any non-line-end char after any line-end
} }
break; break;
} }
if (nl) { // nl detected - add line if (newLine) { // newLine detected - add line
line = new lineInfo(); line = new lineInfo();
line.Offset = offset; line.Offset = offset;
line.Length = counter - offset; line.Length = counter - offset;
@ -63,7 +79,9 @@ namespace ICSharpCode.CodeCoverage
offset = counter; offset = counter;
cr = false; cr = false;
lf = false; lf = false;
nl = false; nel = false;
lsep = false;
newLine = false;
} }
++counter; ++counter;
} }
@ -102,7 +120,7 @@ namespace ICSharpCode.CodeCoverage
if (Line==EndLine) { if (Line==EndLine) {
#region One line request #region One-Line request
line = GetLine(Line); line = GetLine(Line);
Debug.Assert(!(Column < 1), "Column < 1"); Debug.Assert(!(Column < 1), "Column < 1");

Loading…
Cancel
Save