mirror of https://github.com/buggins/dlangide.git
toggle comment feature
This commit is contained in:
parent
0221da6a76
commit
31054482b4
|
@ -269,6 +269,26 @@ class SimpleDSyntaxHighlighter : SyntaxHighlighter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected TokenWithRange[] getRangeTokens(TextRange range) {
|
||||||
|
TokenWithRange[] res;
|
||||||
|
//Log.d("getPositionToken for ", pos);
|
||||||
|
TextPosition start = tokenStart(range.start);
|
||||||
|
//Log.d("token start found: ", start);
|
||||||
|
initTokenizer(start);
|
||||||
|
for (;;) {
|
||||||
|
TokenWithRange tokenRange = nextToken();
|
||||||
|
//Log.d("read token: ", tokenRange);
|
||||||
|
if (!tokenRange.token) {
|
||||||
|
//Log.d("end of file");
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
if (tokenRange.range.intersects(range)) {
|
||||||
|
//Log.d("found: ", pos, " in ", tokenRange);
|
||||||
|
res ~= tokenRange;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected bool isInsideBlockComment(TextPosition pos) {
|
protected bool isInsideBlockComment(TextPosition pos) {
|
||||||
TokenWithRange tokenRange = getPositionToken(pos);
|
TokenWithRange tokenRange = getPositionToken(pos);
|
||||||
if (tokenRange.token && tokenRange.token.type == TokenType.COMMENT && tokenRange.token.isMultilineComment)
|
if (tokenRange.token && tokenRange.token.type == TokenType.COMMENT && tokenRange.token.isMultilineComment)
|
||||||
|
@ -339,12 +359,27 @@ class SimpleDSyntaxHighlighter : SyntaxHighlighter {
|
||||||
override bool canToggleBlockComment(TextRange range) {
|
override bool canToggleBlockComment(TextRange range) {
|
||||||
TokenWithRange startToken = getPositionToken(range.start);
|
TokenWithRange startToken = getPositionToken(range.start);
|
||||||
TokenWithRange endToken = getPositionToken(range.end);
|
TokenWithRange endToken = getPositionToken(range.end);
|
||||||
Log.d("canToggleBlockComment: startToken=", startToken, " endToken=", endToken);
|
//Log.d("canToggleBlockComment: startToken=", startToken, " endToken=", endToken);
|
||||||
if (startToken.token && endToken.token && startToken.range == endToken.range && startToken.token.isMultilineComment) {
|
if (startToken.token && endToken.token && startToken.range == endToken.range && startToken.token.isMultilineComment) {
|
||||||
Log.d("canToggleBlockComment: can uncomment");
|
//Log.d("canToggleBlockComment: can uncomment");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (range.empty)
|
||||||
return false;
|
return false;
|
||||||
|
TokenWithRange[] tokens = getRangeTokens(range);
|
||||||
|
foreach(ref t; tokens) {
|
||||||
|
if (t.token.type == TokenType.COMMENT) {
|
||||||
|
if (t.token.isMultilineComment) {
|
||||||
|
// disable until nested comments support is implemented
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
// single line comment
|
||||||
|
if (t.range.isInside(range.start) || t.range.isInside(range.end))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
/// toggle block comments for specified text range
|
/// toggle block comments for specified text range
|
||||||
override void toggleBlockComment(TextRange srcrange, Object source) {
|
override void toggleBlockComment(TextRange srcrange, Object source) {
|
||||||
|
@ -367,9 +402,9 @@ class SimpleDSyntaxHighlighter : SyntaxHighlighter {
|
||||||
break;
|
break;
|
||||||
charsRemoved++;
|
charsRemoved++;
|
||||||
}
|
}
|
||||||
Log.d("line before removing start of comment:", s);
|
//Log.d("line before removing start of comment:", s);
|
||||||
s = s[range.start.pos + charsRemoved .. $];
|
s = s[range.start.pos + charsRemoved .. $];
|
||||||
Log.d("line after removing start of comment:", s);
|
//Log.d("line after removing start of comment:", s);
|
||||||
charsRemoved += range.start.pos;
|
charsRemoved += range.start.pos;
|
||||||
}
|
}
|
||||||
if (i == range.end.line) {
|
if (i == range.end.line) {
|
||||||
|
@ -382,15 +417,57 @@ class SimpleDSyntaxHighlighter : SyntaxHighlighter {
|
||||||
break;
|
break;
|
||||||
endRemoved++;
|
endRemoved++;
|
||||||
}
|
}
|
||||||
Log.d("line before removing end of comment:", s);
|
//Log.d("line before removing end of comment:", s);
|
||||||
s = s[0 .. endp - endRemoved];
|
s = s[0 .. endp - endRemoved];
|
||||||
Log.d("line after removing end of comment:", s);
|
//Log.d("line after removing end of comment:", s);
|
||||||
}
|
}
|
||||||
dsttext ~= s;
|
dsttext ~= s;
|
||||||
}
|
}
|
||||||
EditOperation op = new EditOperation(EditAction.Replace, range, dsttext);
|
EditOperation op = new EditOperation(EditAction.Replace, range, dsttext);
|
||||||
_content.performOperation(op, source);
|
_content.performOperation(op, source);
|
||||||
return;
|
return;
|
||||||
|
} else {
|
||||||
|
if (srcrange.empty)
|
||||||
|
return;
|
||||||
|
TokenWithRange[] tokens = getRangeTokens(srcrange);
|
||||||
|
foreach(ref t; tokens) {
|
||||||
|
if (t.token.type == TokenType.COMMENT) {
|
||||||
|
if (t.token.isMultilineComment) {
|
||||||
|
// disable until nested comments support is implemented
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
// single line comment
|
||||||
|
if (t.range.isInside(srcrange.start) || t.range.isInside(srcrange.end))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dstring[] dsttext;
|
||||||
|
for (int i = srcrange.start.line; i <= srcrange.end.line; i++) {
|
||||||
|
dstring s = content.line(i);
|
||||||
|
int charsAdded = 0;
|
||||||
|
if (i == srcrange.start.line) {
|
||||||
|
int p = srcrange.start.pos;
|
||||||
|
if (p < s.length) {
|
||||||
|
s = s[p .. $];
|
||||||
|
charsAdded = -p;
|
||||||
|
} else {
|
||||||
|
charsAdded = -(cast(int)s.length);
|
||||||
|
s = null;
|
||||||
|
}
|
||||||
|
s = "/*" ~ s;
|
||||||
|
charsAdded += 2;
|
||||||
|
}
|
||||||
|
if (i == srcrange.end.line) {
|
||||||
|
int p = srcrange.end.pos + charsAdded;
|
||||||
|
s = p > 0 ? s[0..p] : null;
|
||||||
|
s ~= "*/";
|
||||||
|
}
|
||||||
|
dsttext ~= s;
|
||||||
|
}
|
||||||
|
EditOperation op = new EditOperation(EditAction.Replace, srcrange, dsttext);
|
||||||
|
_content.performOperation(op, source);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue