Skip to content

Commit 6f11924

Browse files
committed
code folding
1 parent 5732793 commit 6f11924

4 files changed

+98
-1
lines changed

Diff for: CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## [0.7.2]
44

55
- Fixed outline's regions
6+
- Better code folding
67

78
## [0.7.0]
89

Diff for: extension.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import { exportAll, exportExplorerItem } from './commands/export';
99
import { ObjectScriptClassSymbolProvider } from './providers/ObjectScriptClassSymbolProvider';
1010
import { ObjectScriptRoutineSymbolProvider } from './providers/ObjectScriptRoutineSymbolProvider';
1111
import { DocumentContentProvider } from './providers/DocumentContentProvider';
12+
import { ObjectScriptClassFoldingRangeProvider } from './providers/ObjectScriptClassFoldingRangeProvider';
13+
import { ObjectScriptFoldingRangeProvider } from './providers/ObjectScriptFoldingRangeProvider';
1214

1315
import { ObjectScriptExplorerProvider } from './explorer/explorer';
1416
import { outputChannel } from './utils';
@@ -82,7 +84,12 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
8284
vscode.languages.registerDocumentSymbolProvider(
8385
{ language: 'objectscript' },
8486
new ObjectScriptRoutineSymbolProvider()
85-
)
87+
),
88+
vscode.languages.registerFoldingRangeProvider(
89+
{ language: 'objectscript-class' },
90+
new ObjectScriptClassFoldingRangeProvider()
91+
),
92+
vscode.languages.registerFoldingRangeProvider({ language: 'objectscript' }, new ObjectScriptFoldingRangeProvider())
8693
);
8794
}
8895

Diff for: providers/ObjectScriptClassFoldingRangeProvider.ts

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import * as vscode from 'vscode';
2+
3+
export class ObjectScriptClassFoldingRangeProvider implements vscode.FoldingRangeProvider {
4+
provideFoldingRanges(
5+
document: vscode.TextDocument,
6+
context: vscode.FoldingContext,
7+
token: vscode.CancellationToken
8+
): vscode.ProviderResult<vscode.FoldingRange[]> {
9+
let ranges: vscode.FoldingRange[] = [];
10+
11+
for (let i = 0; i < document.lineCount; i++) {
12+
let line = document.lineAt(i);
13+
let prevLine = i > 0 ? document.lineAt(i - 1) : { text: '' };
14+
15+
// Documenation block
16+
const docPattern = /\/{3}/;
17+
if (line.text.match(docPattern)) {
18+
const start = i;
19+
while (i++ && i < document.lineCount) {
20+
let line = document.lineAt(i);
21+
if (!line.text.match(docPattern)) {
22+
i--;
23+
break;
24+
}
25+
}
26+
const end = i;
27+
ranges.push({
28+
start,
29+
end,
30+
kind: vscode.FoldingRangeKind.Comment
31+
});
32+
continue;
33+
}
34+
if (line.text.match('^{') && !prevLine.text.match(/^\bClass\b/i)) {
35+
const start = i - 1;
36+
while (i++ && i < document.lineCount) {
37+
let line = document.lineAt(i);
38+
if (line.text.match(/^}/)) {
39+
break;
40+
}
41+
}
42+
const end = i;
43+
ranges.push({
44+
start,
45+
end,
46+
kind: vscode.FoldingRangeKind.Region
47+
});
48+
continue;
49+
}
50+
}
51+
52+
return ranges;
53+
}
54+
}

Diff for: providers/ObjectScriptFoldingRangeProvider.ts

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import * as vscode from 'vscode';
2+
3+
export class ObjectScriptFoldingRangeProvider implements vscode.FoldingRangeProvider {
4+
provideFoldingRanges(
5+
document: vscode.TextDocument,
6+
context: vscode.FoldingContext,
7+
token: vscode.CancellationToken
8+
): vscode.ProviderResult<vscode.FoldingRange[]> {
9+
let ranges: vscode.FoldingRange[] = [];
10+
11+
for (let i = 0; i < document.lineCount; i++) {
12+
let line = document.lineAt(i);
13+
14+
if (line.text.match(/^\b\w+\b/) && !line.text.match(/^\bROUTINE\b/)) {
15+
const start = i;
16+
while (i++ && i < document.lineCount) {
17+
let line = document.lineAt(i);
18+
if (line.text.match(/^\b\w+\b/)) {
19+
break;
20+
}
21+
}
22+
i--;
23+
const end = i;
24+
ranges.push({
25+
start,
26+
end,
27+
kind: vscode.FoldingRangeKind.Region
28+
});
29+
continue;
30+
}
31+
}
32+
33+
return ranges;
34+
}
35+
}

0 commit comments

Comments
 (0)