Skip to content

Commit de68414

Browse files
committed
[folding] should not fold whitespace after function. Fixes microsoft#3353
1 parent c2a6d7a commit de68414

14 files changed

Lines changed: 134 additions & 13 deletions

File tree

extensions/clojure/language-configuration.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,10 @@
1818
["[", "]"],
1919
["(", ")"],
2020
["\"", "\""]
21-
]
21+
],
22+
"folding": {
23+
"indendationBasedFolding": {
24+
"offSide": true
25+
}
26+
}
2227
}

extensions/coffeescript/language-configuration.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,10 @@
2121
["(", ")"],
2222
["\"", "\""],
2323
["'", "'"]
24-
]
24+
],
25+
"folding": {
26+
"indendationBasedFolding": {
27+
"offSide": true
28+
}
29+
}
2530
}

extensions/fsharp/language-configuration.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,10 @@
2020
["(", ")"],
2121
["\"", "\""],
2222
["'", "'"]
23-
]
23+
],
24+
"folding": {
25+
"indendationBasedFolding": {
26+
"offSide": true
27+
}
28+
}
2429
}

extensions/markdown/language-configuration.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,10 @@
3737
["(", ")"],
3838
["[", "]"],
3939
["`", "`"]
40-
]
40+
],
41+
"folding": {
42+
"indendationBasedFolding": {
43+
"offSide": true
44+
}
45+
}
4146
}

extensions/pug/language-configuration.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,10 @@
2020
["(", ")"],
2121
["'", "'"],
2222
["\"", "\""]
23-
]
23+
],
24+
"folding": {
25+
"indendationBasedFolding": {
26+
"offSide": true
27+
}
28+
}
2429
}

extensions/python/language-configuration.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@
2121
["(", ")"],
2222
["\"", "\""],
2323
["'", "'"]
24-
]
25-
// enhancedBrackets: [ { open: /.*:\s*$/, closeComplete: 'else:' } ],
24+
],
25+
"folding": {
26+
"indendationBasedFolding": {
27+
"offSide": true
28+
}
29+
}
2630
}

extensions/yaml/language-configuration.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,10 @@
2020
["(", ")"],
2121
["\"", "\""],
2222
["'", "'"]
23-
]
23+
],
24+
"folding": {
25+
"indendationBasedFolding": {
26+
"offSide": true
27+
}
28+
}
2429
}

src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ export class IndentGuidesOverlay extends DynamicViewOverlay {
7777
public onZonesChanged(e: viewEvents.ViewZonesChangedEvent): boolean {
7878
return true;
7979
}
80+
public onLanguageConfigurationChanged(e: viewEvents.ViewLanguageConfigurationEvent): boolean {
81+
return true;
82+
}
8083

8184
// --- end event handlers
8285

src/vs/editor/common/model/indentRanges.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
'use strict';
77

88
import { ITokenizedModel } from 'vs/editor/common/editorCommon';
9+
import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry';
910

1011
export class IndentRange {
1112
_indentRangeBrand: void;
@@ -32,17 +33,23 @@ export class IndentRange {
3233
export function computeRanges(model: ITokenizedModel, minimumRangeSize: number = 1): IndentRange[] {
3334

3435
let result: IndentRange[] = [];
36+
let foldingRules = LanguageConfigurationRegistry.getFoldingRules(model.getLanguageIdentifier().id);
37+
let offSide = foldingRules && foldingRules.indendationBasedFolding && foldingRules.indendationBasedFolding.offSide;
3538

3639
let previousRegions: { indent: number, line: number }[] = [];
3740
previousRegions.push({ indent: -1, line: model.getLineCount() + 1 }); // sentinel, to make sure there's at least one entry
3841

3942
for (let line = model.getLineCount(); line > 0; line--) {
4043
let indent = model.getIndentLevel(line);
44+
let previous = previousRegions[previousRegions.length - 1];
4145
if (indent === -1) {
46+
if (offSide) {
47+
// for offSide languages, empty lines are associated to the next block
48+
previous.line = line;
49+
}
4250
continue; // only whitespace
4351
}
4452

45-
let previous = previousRegions[previousRegions.length - 1];
4653

4754
if (previous.indent > indent) {
4855
// discard all regions with larger indent

src/vs/editor/common/modes/languageConfiguration.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@ export interface LanguageConfiguration {
6161
* settings will be used.
6262
*/
6363
surroundingPairs?: IAutoClosingPair[];
64+
65+
/**
66+
* The language's folding rules.
67+
*/
68+
folding?: FoldingRules;
69+
6470
/**
6571
* **Deprecated** Do not use.
6672
*
@@ -89,8 +95,25 @@ export interface IndentationRule {
8995
* If a line matches this pattern, then its indentation should not be changed and it should not be evaluated against the other rules.
9096
*/
9197
unIndentedLinePattern?: RegExp;
98+
9299
}
93100

101+
/**
102+
* Describes folding rules for a language.
103+
*/
104+
export interface FoldingRules {
105+
indendationBasedFolding?: {
106+
/**
107+
* Used by the indentation based strategy to decide wheter empty lines belong to the previous or the next block.
108+
* A language adheres to the off-side rule if blocks in that language are expressed by their indentation.
109+
* See [wikipedia](https://en.wikipedia.org/wiki/Off-side_rule) for more information.
110+
* If not set, `false` is used and empty lines belong to the previous block.
111+
*/
112+
offSide: boolean;
113+
};
114+
}
115+
116+
94117
/**
95118
* Describes a rule to be evaluated when pressing Enter.
96119
*/

0 commit comments

Comments
 (0)