forked from DonJayamanne/pythonVSCode
/
languageConfiguration.ts
120 lines (117 loc) · 4.13 KB
/
languageConfiguration.ts
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
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
'use strict';
import { IndentAction, LanguageConfiguration } from 'vscode';
import { verboseRegExp } from '../common/utils/regexp';
export function getLanguageConfiguration(): LanguageConfiguration {
return {
onEnterRules: [
// multi-line separator
{
beforeText: verboseRegExp(`
^
(?! \\s+ \\\\ )
[^#\n]+
\\\\
$
`),
action: {
indentAction: IndentAction.Indent,
},
},
// continue comments
{
beforeText: /^\s*#.*/,
afterText: /.+$/,
action: {
indentAction: IndentAction.None,
appendText: '# ',
},
},
// indent on enter (block-beginning statements)
{
/**
* This does not handle all cases. However, it does handle nearly all usage.
* Here's what it does not cover:
* - the statement is split over multiple lines (and hence the ":" is on a different line)
* - the code block is inlined (after the ":")
* - there are multiple statements on the line (separated by semicolons)
* Also note that `lambda` is purposefully excluded.
*/
beforeText: verboseRegExp(`
^
\\s*
(?:
(?:
(?:
class |
def |
async \\s+ def |
except |
for |
async \\s+ for |
if |
elif |
while |
with |
async \\s+ with |
match |
case
)
\\b .*
) |
else |
try |
finally
)
\\s*
[:]
\\s*
(?: [#] .* )?
$
`),
action: {
indentAction: IndentAction.Indent,
},
},
// outdent on enter (block-ending statements)
{
/**
* This does not handle all cases. Notable omissions here are
* "return" and "raise" which are complicated by the need to
* only outdent when the cursor is at the end of an expression
* rather than, say, between the parentheses of a tail-call or
* exception construction. (see issue #10583)
*/
beforeText: verboseRegExp(`
^
(?:
(?:
\\s*
(?:
pass
)
) |
(?:
\\s+
(?:
raise |
break |
continue
)
)
)
\\s*
(?: [#] .* )?
$
`),
action: {
indentAction: IndentAction.Outdent,
},
},
// Note that we do not currently have an auto-dedent
// solution for "elif", "else", "except", and "finally".
// We had one but had to remove it (see issue #6886).
],
};
}