Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: Folding for comments and different modes #5533

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
17 changes: 10 additions & 7 deletions ace-internal.d.ts
Expand Up @@ -783,7 +783,10 @@ export namespace Ace {
closingBracketBlock(session: EditSession, bracket: string, row: number, column: number, typeRe?: RegExp): Range | undefined;
}

type BehaviorAction = (state: string, action: string, editor: Editor, session: EditSession, text: string | Range) => ({ text: string, selection: number[] } | Range) & { [key: string]: any } | undefined;
type BehaviorAction = (state: string | string[], action: string, editor: Editor, session: EditSession, text: string | Range) => ({
text: string,
selection: number[]
} | Range) & { [key: string]: any } | undefined;
type BehaviorMap = Record<string, Record<string, BehaviorAction>>;

interface Behaviour {
Expand Down Expand Up @@ -841,21 +844,21 @@ export namespace Ace {

getTokenizer(): Tokenizer;

toggleCommentLines(state: any,
toggleCommentLines(state: string | string[],
session: EditSession,
startRow: number,
endRow: number): void;

toggleBlockComment(state: any,
toggleBlockComment(state: string | string[],
session: EditSession,
range: Range,
cursor: Point): void;

getNextLineIndent(state: any, line: string, tab: string): string;
getNextLineIndent(state: string | string[], line: string, tab: string): string;

checkOutdent(state: any, line: string, input: string): boolean;
checkOutdent(state: string | string[], line: string, input: string): boolean;

autoOutdent(state: any, doc: EditSession, row: number): void;
autoOutdent(state: string | string[], doc: EditSession, row: number): void;

// TODO implement WorkerClient types
createWorker(session: EditSession): any;
Expand All @@ -864,7 +867,7 @@ export namespace Ace {

getKeywords(append?: boolean): Array<string | RegExp>;

getCompletions(state: string,
getCompletions(state: string | string[],
session: EditSession,
pos: Point,
prefix: string): Completion[];
Expand Down
3 changes: 2 additions & 1 deletion src/background_tokenizer.js
Expand Up @@ -23,6 +23,7 @@ class BackgroundTokenizer {
/**@type {false|number}*/
this.running = false;
this.lines = [];
/**@type {string[]|string[][]}*/
this.states = [];
this.currentLine = 0;
this.tokenizer = tokenizer;
Expand Down Expand Up @@ -176,7 +177,7 @@ class BackgroundTokenizer {
/**
* Returns the state of tokenization at the end of a row.
* @param {Number} row The row to get state at
* @returns {string}
* @returns {string | string[]}
**/
getState(row) {
if (this.currentLine == row)
Expand Down
2 changes: 1 addition & 1 deletion src/edit_session.js
Expand Up @@ -272,7 +272,7 @@ class EditSession {
/**
* {:BackgroundTokenizer.getState}
* @param {Number} row The row to start at
* @returns {string}
* @returns {string | string[]}
* @related BackgroundTokenizer.getState
**/
getState(row) {
Expand Down
12 changes: 5 additions & 7 deletions src/edit_session/folding.js
Expand Up @@ -716,36 +716,34 @@ function Folding() {
if (dir != 1) {
do {
token = iterator.stepBackward();
} while (token && re.test(token.type) && !/^comment.end/.test(token.type));
} while (token && re.test(token.type));
token = iterator.stepForward();
}

range.start.row = iterator.getCurrentTokenRow();
range.start.column = iterator.getCurrentTokenColumn() + (/^comment.start/.test(token.type) ? token.value.length : 2);
range.start.column = iterator.getCurrentTokenColumn() + token.value.length;

iterator = new TokenIterator(this, row, column);
var initState = this.getState(iterator.$row);

if (dir != -1) {
var lastRow = -1;
do {
token = iterator.stepForward();
if (lastRow == -1) {
var state = this.getState(iterator.$row);
if (!re.test(state))
if (initState.toString() !== state.toString())
lastRow = iterator.$row;
} else if (iterator.$row > lastRow) {
break;
}
} while (token && re.test(token.type) && !/^comment.start/.test(token.type));
} while (token && re.test(token.type));
token = iterator.stepBackward();
} else
token = iterator.getCurrentToken();

range.end.row = iterator.getCurrentTokenRow();
range.end.column = iterator.getCurrentTokenColumn();
if (!/^comment.end/.test(token.type)) {
range.end.column += token.value.length - 2;
}
return range;
}
};
Expand Down
1 change: 1 addition & 0 deletions src/editor.js
Expand Up @@ -983,6 +983,7 @@ class Editor {
? [new Range(0, 0, session.doc.getLength() - 1, 0)]
: this.selection.getAllRanges();

/**@type{string|string[]}*/
var prevLineState = "";
var prevLine = "";
var lineIndent = "";
Expand Down
21 changes: 10 additions & 11 deletions src/ext/static_highlight_test.js
Expand Up @@ -10,7 +10,7 @@
var JavaScriptMode = require("../mode/javascript").Mode;
var TextMode = require("../mode/text").Mode;
var dom = require("../lib/dom");
var config = require("../config");

Check warning on line 13 in src/ext/static_highlight_test.js

View workflow job for this annotation

GitHub Actions / build (16.x)

'config' is assigned a value but never used

// Execution ORDER: test.setUpSuite, setUp, testFn, tearDown, test.tearDownSuite
module.exports = {
Expand Down Expand Up @@ -39,17 +39,16 @@
].join("\n");
var mode = new JavaScriptMode();
var result = highlighter.render(snippet, mode, theme);
assert.equal(result.html, "<div class='ace-tomorrow'><div class='ace_static_highlight ace_show_gutter' style='counter-reset:ace_line 0'>"
+ "<div class='ace_line'><span class='ace_gutter ace_gutter-cell'></span><span class='ace_comment ace_doc'>/** this is a function</span>\n</div>"
+ "<div class='ace_line'><span class='ace_gutter ace_gutter-cell'></span><span class='ace_comment ace_doc'>*</span>\n</div>"
+ "<div class='ace_line'><span class='ace_gutter ace_gutter-cell'></span><span class='ace_comment ace_doc'>*/</span>\n</div>"
+ "<div class='ace_line'><span class='ace_gutter ace_gutter-cell'></span>\n</div>"
+ "<div class='ace_line'><span class='ace_gutter ace_gutter-cell'></span><span class='ace_storage ace_type'>function</span> <span class='ace_entity ace_name ace_function'>hello</span> <span class='ace_paren ace_lparen'>(</span><span class='ace_variable ace_parameter'>a</span><span class='ace_punctuation ace_operator'>,</span> <span class='ace_variable ace_parameter'>b</span><span class='ace_punctuation ace_operator'>,</span> <span class='ace_variable ace_parameter'>c</span><span class='ace_paren ace_rparen'>)</span> <span class='ace_paren ace_lparen'>{</span>\n</div>"
+ "<div class='ace_line'><span class='ace_gutter ace_gutter-cell'></span> <span class='ace_storage ace_type'>console</span><span class='ace_punctuation ace_operator'>.</span><span class='ace_support ace_function ace_firebug'>log</span><span class='ace_paren ace_lparen'>(</span><span class='ace_identifier'>a</span> <span class='ace_keyword ace_operator'>*</span> <span class='ace_identifier'>b</span> <span class='ace_keyword ace_operator'>+</span> <span class='ace_identifier'>c</span> <span class='ace_keyword ace_operator'>+</span> <span class='ace_string'>&#39;sup$&#39;</span><span class='ace_paren ace_rparen'>)</span><span class='ace_punctuation ace_operator'>;</span>\n</div>"
+ "<div class='ace_line'><span class='ace_gutter ace_gutter-cell'></span><span class='ace_indent-guide'> </span><span class='ace_indent-guide'> </span> <span class='ace_comment'>//</span>\n</div>"
+ "<div class='ace_line'><span class='ace_gutter ace_gutter-cell'></span><span class='ace_indent-guide'> </span><span class='ace_indent-guide'> </span> <span class='ace_comment'>//</span>\n</div>"
+ "<div class='ace_line'><span class='ace_gutter ace_gutter-cell'></span><span class='ace_paren ace_rparen'>}</span>\n</div>"
+ "</div></div>");
assert.equal(result.html, `<div class='ace-tomorrow'><div class='ace_static_highlight ace_show_gutter' style='counter-reset:ace_line 0'><div class='ace_line'><span class='ace_gutter ace_gutter-cell'></span><span class='ace_comment ace_doc'>/**</span><span class='ace_comment ace_doc ace_body'> this is a function</span>
</div><div class='ace_line'><span class='ace_gutter ace_gutter-cell'></span><span class='ace_comment ace_doc ace_body'>*</span>
</div><div class='ace_line'><span class='ace_gutter ace_gutter-cell'></span><span class='ace_comment ace_doc'>*/</span>
</div><div class='ace_line'><span class='ace_gutter ace_gutter-cell'></span>
</div><div class='ace_line'><span class='ace_gutter ace_gutter-cell'></span><span class='ace_storage ace_type'>function</span> <span class='ace_entity ace_name ace_function'>hello</span> <span class='ace_paren ace_lparen'>(</span><span class='ace_variable ace_parameter'>a</span><span class='ace_punctuation ace_operator'>,</span> <span class='ace_variable ace_parameter'>b</span><span class='ace_punctuation ace_operator'>,</span> <span class='ace_variable ace_parameter'>c</span><span class='ace_paren ace_rparen'>)</span> <span class='ace_paren ace_lparen'>{</span>
</div><div class='ace_line'><span class='ace_gutter ace_gutter-cell'></span> <span class='ace_storage ace_type'>console</span><span class='ace_punctuation ace_operator'>.</span><span class='ace_support ace_function ace_firebug'>log</span><span class='ace_paren ace_lparen'>(</span><span class='ace_identifier'>a</span> <span class='ace_keyword ace_operator'>*</span> <span class='ace_identifier'>b</span> <span class='ace_keyword ace_operator'>+</span> <span class='ace_identifier'>c</span> <span class='ace_keyword ace_operator'>+</span> <span class='ace_string'>&#39;sup$&#39;</span><span class='ace_paren ace_rparen'>)</span><span class='ace_punctuation ace_operator'>;</span>
</div><div class='ace_line'><span class='ace_gutter ace_gutter-cell'></span><span class='ace_indent-guide'> </span><span class='ace_indent-guide'> </span> <span class='ace_comment'>//</span>
</div><div class='ace_line'><span class='ace_gutter ace_gutter-cell'></span><span class='ace_indent-guide'> </span><span class='ace_indent-guide'> </span> <span class='ace_comment'>//</span>
</div><div class='ace_line'><span class='ace_gutter ace_gutter-cell'></span><span class='ace_paren ace_rparen'>}</span>
</div></div></div>`);
assert.ok(!!result.css);
next();
},
Expand Down
54 changes: 45 additions & 9 deletions src/mode/_test/tokens_drools.json
Expand Up @@ -206,12 +206,25 @@
["comment.doc","/**"]
],[
"doc-start",
["comment.doc"," * "],
[
"comment.doc.body",
" * "
],
["comment.doc.tag","@param"],
["comment.doc"," name who we'll salute?"]
[
"comment.doc.body",
" name who we'll salute?"
]
],[
"start",
["comment.doc"," */"]
[
"comment.doc.body",
" "
],
[
"comment.doc",
"*/"
]
],[
"start",
["keyword","function"],
Expand Down Expand Up @@ -419,12 +432,25 @@
["comment.doc","/**"]
],[
"java-doc-start",
["comment.doc"," * "],
[
"comment.doc.body",
" * "
],
["comment.doc.tag.storage.type","TODO"],
["comment.doc"," There mus be better way"]
[
"comment.doc.body",
" There mus be better way"
]
],[
"java-start",
["comment.doc"," */"]
[
"comment.doc.body",
" "
],
[
"comment.doc",
"*/"
]
],[
"java-start",
["text"," "],
Expand Down Expand Up @@ -751,10 +777,20 @@
["comment.doc","/**"]
],[
"doc-start",
["comment.doc"," * Go Right"]
[
"comment.doc.body",
" * Go Right"
]
],[
"start",
["comment.doc"," */"]
[
"comment.doc.body",
" "
],
[
"comment.doc",
"*/"
]
],[
"start",
["keyword","rule"],
Expand Down Expand Up @@ -932,4 +968,4 @@
["keyword","end"]
],[
"start"
]]
]]