-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCommentRemover.cs
More file actions
143 lines (119 loc) · 3.82 KB
/
CommentRemover.cs
File metadata and controls
143 lines (119 loc) · 3.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CodeNavigator
{
class CommentRemover
{
private string code;
private List<CodeLocation> charMapping;
private int pCopyPos = 0;
private int pCurrentPos = 0;
private StringBuilder res = null;
bool bMLC = false;
bool bSLC = false;
internal CommentRemover(string code, List<CodeLocation> charMapping = null)
{
this.code = code;
this.charMapping = charMapping;
}
private bool FindComment()
{
bMLC = false;
bSLC = false;
while (pCurrentPos < code.Length)
{
pCurrentPos = code.IndexOf('/', pCurrentPos);
//remaining text too short
if (pCurrentPos == code.Length - 1)
pCurrentPos = -1;
//end of doc
if (pCurrentPos == -1)
return false;
//check next char
if (code[pCurrentPos + 1] == '/') //SLC
{
bSLC = true;
return true;
}
else if (code[pCurrentPos + 1] == '*') //MLC
{
bMLC = true;
return true;
}
//currently not '/', so we can inc.
pCurrentPos++;
}
return false;
}
private void SkipComment()
{
if (!FindComment())
return;
//begin of SL comment
//-> add text before comment and move to next line
if (bSLC)
{
Append();
MoveUntil("\n", false);
//EOF but comment did not end
if (pCurrentPos == -1)
pCopyPos = pCurrentPos;
}
//check for begin of multi line comment
else if (bMLC)
{
Append();
MoveUntil("*/", true);
//EOF but comment did not end
if (pCurrentPos == -1)
pCopyPos = pCurrentPos;
}
}
internal String RemoveComments()
{
while (pCurrentPos < code.Length && pCurrentPos!=-1)
{
//skip the next comment
SkipComment();
}
//no comments in doc?
if (pCopyPos == 0)
return code;
else
{
//append the rest of the document
Append();
return res.ToString();
}
}
private void Append()
{
if (res == null)
res = new StringBuilder();
//nothing to append
if (pCopyPos == -1)
return;
//if we need a char mapping, put the positions pCopyPos
if (charMapping != null && pCopyPos!=0)
//pCopyPos is the next char in code with comments;
//res.Length is the next char in code without comments
charMapping.Add(new CodeLocation(pCopyPos, res.Length));
//if current pos is -1, append entire text
int pEnd = (pCurrentPos == -1 ? code.Length : pCurrentPos);
res.Append(code.Substring(pCopyPos, pEnd - pCopyPos));
}
private void MoveUntil(String delim, bool bSkipDelim)
{
pCurrentPos = code.IndexOf(delim, pCurrentPos);
if (pCurrentPos == -1)
return;
//skip delim
if (bSkipDelim)
pCurrentPos += delim.Length;
//move copy pos to current pos
pCopyPos = pCurrentPos;
}
}
}