Skip to content

Commit ded4a65

Browse files
Apply fixes for Magik language (#4076)
* Add support for pipe-enclosed variables * Split (and fix) the different variable types * Add test case for slot * Simplify regex * Add tests for global variables with `?` and `!` * Use keyword as alias for `_unset`/`_constant` * Update variable_feature.test * Run prettier --------- Co-authored-by: Dmitry Sharabin <dmitrysharabin@gmail.com>
1 parent 29e1beb commit ded4a65

14 files changed

Lines changed: 175 additions & 87 deletions

src/languages/magik.js

Lines changed: 71 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -9,76 +9,112 @@ export default {
99

1010
'char': {
1111
pattern: /%(?:[a-z][\w?!]*|.)/i,
12-
greedy: true
12+
greedy: true,
1313
},
1414

1515
'string': {
1616
pattern: /"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,
17-
greedy: true
17+
greedy: true,
1818
},
1919

2020
'regex': {
2121
pattern: /\/(?:(?:\\.|[^\\/\r\n])+\/[qisdlmucx]*|\/)/,
22-
greedy: true
22+
greedy: true,
2323
},
2424

25-
'declaration': [
26-
{ pattern: /(\b_package\s+).*/i, lookbehind: true },
27-
{ pattern: /(\b_global\s+)(?!_)\w+/i, lookbehind: true },
28-
{ pattern: /(\b_constant\s+)[a-z_]+/i, lookbehind: true }
29-
],
25+
'slot': {
26+
pattern: /(^|[\s({])\.\s*[a-z][\w?!]*/i,
27+
lookbehind: true,
28+
greedy: true,
29+
},
3030

3131
'pragma': {
3232
pattern: /_pragma.*/,
3333
alias: 'prolog',
3434
inside: {
3535
'modifier': /classify_level|topic|usage/,
36-
'pragma-punctuation': { pattern: /[={},]/ }
37-
}
36+
'pragma-punctuation': { pattern: /[={},]/ },
37+
},
3838
},
3939

40-
'number': /\b\d+(?:\.\d+)?(?:[e&][+-]?\d+)?\b|\b(?:[2-9]|[12]\d|3[0-6])r[a-z0-9]+\b/i,
41-
4240
'symbol': {
4341
pattern: /(^|\W):(?:\|[^|]*\||\\.|[\w?!])+/,
44-
lookbehind: true
42+
lookbehind: true,
4543
},
4644

45+
'global-reference': [
46+
{ pattern: /@(?:[a-z_]\w*:)?\|[^|]*\|/i, alias: 'symbol' }, // @|name| or @prefix:|name|
47+
{ pattern: /@(?:[a-z_]\w*:)?[a-z_]\w*/i, alias: 'symbol' }, // @name or @prefix:name
48+
],
49+
50+
'dynamic-variable': [
51+
{ pattern: /\|![\w?!]+!\|/, alias: 'variable' }, // variable encased like |!var!|
52+
{ pattern: /\|![\w?!]+\|!/, alias: 'variable' }, // variable encased like |!var|!
53+
{ pattern: /!\|[\w?!]+\|!/, alias: 'variable' }, // variable encased like !|var!|
54+
{ pattern: /!\|\|!/, alias: 'variable' }, // empty variable !||!
55+
{ pattern: /[a-z_]+:![a-z][\w?!]*!/i, alias: 'variable' }, // variable with a prefix like sw:!var!
56+
{ pattern: /![a-z][\w?!]*!/i, alias: 'variable' }, // variable encased like !var!
57+
],
58+
59+
'global-variable': [
60+
{ pattern: /[a-z_]+:[\w?!]+/i, alias: 'variable' }, // variable with a prefix like sw:gis_program_manager
61+
{ pattern: /[a-z_]+:\|[\w?!]+\|/i, alias: 'variable' }, // variable with a prefix like sw:|gis_program_manager|
62+
],
63+
64+
'declaration': [
65+
{ pattern: /(\b_package\s+)\w+\b/i, lookbehind: true },
66+
{ pattern: /(\b_(?:constant|global|import|local)\s+)(?!_)\w+\b/i, lookbehind: true },
67+
],
68+
69+
'number':
70+
/(?<!\|)(?:\b\d+(?:\.\d+)?(?:[e&][+-]?\d+)?\b|\b(?:[2-9]|[12]\d|3[0-6])r[a-z0-9]+\b)/i,
71+
4772
'operator': [
48-
/_(?:and|andif|or|orif|xor)<</i, /(?:\*\*\^?|\*\^?|\/\^?|_mod\^?|_div\^?|-\^?|\+\^?)<</i, /\^?<</, // assignment operators
49-
/<>/, />=/, /<=/, /</, /~=/, /=/, // relational operators
50-
/\*\*/, /\*/, /\//, // arithmetic operators
51-
/\+/, /-/, /~/, // unary operators
73+
/_(?:and|andif|or|orif|xor)<</i,
74+
/(?:\*\*\^?|\*\^?|\/\^?|_mod\^?|_div\^?|-\^?|\+\^?)<</i,
75+
/\^?<</,
76+
/<>/,
77+
/>=/,
78+
/<=/,
79+
/</,
80+
/~=/,
81+
/=/,
82+
/\*\*/,
83+
/\*/,
84+
/\//,
85+
/\+/,
86+
/-/,
87+
/~/,
5288
],
5389

5490
'keyword-operator': [
5591
{ pattern: /\b_(?:cf|is|isnt)\b/i, alias: 'keyword' }, // comparison
56-
{ pattern: /\b_(?:div|mod)\b/i, alias: 'keyword' } // math
92+
{ pattern: /\b_(?:div|mod)\b/i, alias: 'keyword' }, // math
5793
],
5894

95+
'keyword-variable': {
96+
pattern: /\b_(?:class|dynamic|global|import|local)\b/i,
97+
alias: 'keyword',
98+
},
99+
59100
'keyword': [
60-
/\b_(?:class|dynamic|global|import|local)\b/i, // variables
61101
/\b_(?:block|endblock)\b/i, // block
62102
/\b_(?:elif|else|endif|if|then)\b/i, // if
63103
/\b_(?:and|andif|not|or|orif|xor)\b/i, // logical operators
64104
/\b_(?:continue|endloop|finally|for|leave|loop|loopbody|over|while)\b/i, // loop
65105
/\b_(?:default|handling)\b/i, // handling
66106
/\b_(?:catch|endcatch)\b/i, // catch
67107
/\b_throw\b/i, // throw
68-
/>>/, /\b_return\b/i, // return
108+
/>>/,
109+
/\b_return\b/i,
69110
/\b_primitive\b/i, // primitive
70111
/\b_(?:endtry|try|when)\b/i, // try
71112
/\b_(?:endprotect|locking|protect|protection)\b/i, // protect
72113
/\b_(?:endlock|lock)\b/i, // lock
73114
/\b_with\b/i, // standalone since _finally, _handling, _throw, _try, _leave and _continue all can have this
74-
/\b_(?:allresults|gather|optional|scatter)\b/i // parameter options
115+
/\b_(?:allresults|gather|optional|scatter)\b/i, // parameter options
75116
],
76117

77-
'slot': {
78-
pattern: /(^|[\s({])\.\s*[a-z_]+/i,
79-
lookbehind: true
80-
},
81-
82118
'builtin': /\b_(?:clone|package|super|thisthread)\b/i,
83119

84120
'boolean': /\b_(?:false|maybe|true)\b/i,
@@ -87,42 +123,32 @@ export default {
87123

88124
'unset': {
89125
pattern: /\b_unset\b/i,
90-
alias: 'symbol'
126+
alias: 'keyword',
91127
},
92128

93129
'constant': {
94130
pattern: /\b_constant\b/i,
95-
alias: 'symbol'
96-
},
97-
98-
'global-reference': {
99-
pattern: /@(?:[a-z_]\w*:)?[a-z_]\w*/i,
100-
alias: 'symbol'
131+
alias: 'keyword',
101132
},
102133

103134
'self': [
104135
{
105136
pattern: /(\b_method\s+)\S+(?=\.)/,
106-
lookbehind: true
137+
lookbehind: true,
107138
},
108-
/\b_self\b/i
139+
/\b_self\b/i,
109140
],
110141

111142
'function': [
112143
/\b_(?:abstract|endmethod|iter|method|private)\b/i, // method keywords
113144
/\b_(?:endproc|proc)\b/i, // procedure
114-
{ pattern: /(\.)\s*\|[a-z_]\w*[!?]?\|/, lookbehind: true }, // encased |methodNames|
115-
{ pattern: /(\.)\s*[a-z_]\w*[!?]?/, lookbehind: true }, // methods
145+
{ pattern: /(\.)\s*\|[a-z][\w?!]*\|/, lookbehind: true }, // encased |methodNames|
146+
{ pattern: /(\.)\s*[a-z][\w?!]*/, lookbehind: true }, // methods
116147
],
117148

118149
'variable': [
119-
/\|![\w?!]+!\|/, // variable encased like |!var!|
120-
/\|![\w?!]+\|!/, // variable encased like |!var|!
121-
/!\|[\w?!]+\|!/, // variable encased like !|var!|
122-
/!\|\|!/, // empty variable !||!
123-
/![a-z][\w?!]*!/, // variable encased like !var!
124-
/\b[a-z_]+:\w+\b/i, // variable with a prefix like sw:gis_program_manager
125-
{ pattern: /(^|[^.])\b[a-z]\w*\b/i, lookbehind: true }
150+
/\|[\w?!]+\|/, // variable encased like |var|, |0|, |123|
151+
{ pattern: /(^|[^.])\b[a-z]\w*\b/i, lookbehind: true },
126152
],
127-
}
153+
},
128154
};

tests/languages/magik/constant_feature.test

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
1-
_constant something
2-
_global _constant something
3-
_global _constant gis_program_manager << _unset
1+
_block
2+
_constant something << _unset
3+
_constant max_size << 1
4+
_constant _local max_size << 1
5+
_local _constant max_size << 1
6+
_endblock
47
_global _constant !current_view! << _unset
5-
_constant max_size << 1
6-
_constant _local max_size << 1
7-
_local _constant max_size << 1
8+
_global _constant gis_program_manager << _unset
89

910
----------------------------------------------------
1011

1112
[
12-
["constant", "_constant"], ["declaration", "something"],
13-
["keyword", "_global"], ["constant", "_constant"], ["declaration", "something"],
14-
["keyword", "_global"], ["constant", "_constant"], ["declaration", "gis_program_manager"], ["operator", "<<"], ["unset", "_unset"],
15-
["keyword", "_global"], ["constant", "_constant"], ["variable", "!current_view!"], ["operator", "<<"], ["unset", "_unset"],
16-
["constant", "_constant"], ["declaration", "max_size"], ["operator", "<<"], ["number", "1"],
17-
["constant", "_constant"], ["declaration", "_local"], ["variable", "max_size"], ["operator", "<<"], ["number", "1"],
18-
["keyword", "_local"], ["constant", "_constant"], ["declaration", "max_size"], ["operator", "<<"], ["number", "1"]
13+
["keyword", "_block"],
14+
["constant", "_constant"], ["declaration", "something"], ["operator", "<<"], ["unset", "_unset"],
15+
["constant", "_constant"], ["declaration", "max_size"], ["operator", "<<"], ["number", "1"],
16+
["constant", "_constant"], ["keyword-variable", "_local"], ["declaration", "max_size"], ["operator", "<<"], ["number", "1"],
17+
["keyword-variable", "_local"], ["constant", "_constant"], ["declaration", "max_size"], ["operator", "<<"], ["number", "1"],
18+
["keyword", "_endblock"],
19+
["keyword-variable", "_global"], ["constant", "_constant"], ["dynamic-variable", "!current_view!"], ["operator", "<<"], ["unset", "_unset"],
20+
["keyword-variable", "_global"], ["constant", "_constant"], ["declaration", "gis_program_manager"], ["operator", "<<"], ["unset", "_unset"]
1921
]
2022

2123
----------------------------------------------------

tests/languages/magik/declaration_feature.test

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
_package user
2+
_global some_var
23
_global some_var; some_var << 1
34
_constant yippie << 2
45
_global _constant !done_meas_follow_nodes! << _unset
6+
_import some_var
57

68
----------------------------------------------------
79

810
[
911
["builtin", "_package"], ["declaration", "user"],
10-
["keyword", "_global"], ["declaration", "some_var"], ["punctuation", ";"], ["variable", "some_var"], ["operator", "<<"], ["number", "1"],
11-
["constant", "_constant"], ["declaration", "yippie"], ["operator", "<<"], ["number", "2"],
12-
["keyword", "_global"], ["constant", "_constant"], ["variable", "!done_meas_follow_nodes!"], ["operator", "<<"], ["unset", "_unset"]
12+
["keyword-variable", "_global"], ["declaration", "some_var"],
13+
["keyword-variable", "_global"], ["declaration", "some_var"], ["punctuation", ";"], ["variable", "some_var"], ["operator", "<<"], ["number", "1"],
14+
["constant", "_constant"], ["declaration", "yippie"], ["operator", "<<"], ["number", "2"],
15+
["keyword-variable", "_global"], ["constant", "_constant"], ["dynamic-variable", "!done_meas_follow_nodes!"], ["operator", "<<"], ["unset", "_unset"],
16+
["keyword-variable", "_import"], ["declaration", "some_var"]
1317
]
1418

1519
----------------------------------------------------
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
!terminal!
2+
sw:!terminal!
3+
|!terminal!|
4+
|!terminal|!
5+
!|terminal|!
6+
!||!
7+
8+
----------------------------------------------------
9+
10+
[
11+
["dynamic-variable", "!terminal!"],
12+
["dynamic-variable", "sw:!terminal!"],
13+
["dynamic-variable", "|!terminal!|"],
14+
["dynamic-variable", "|!terminal|!"],
15+
["dynamic-variable", "!|terminal|!"],
16+
["dynamic-variable", "!||!"]
17+
]
18+
19+
----------------------------------------------------
20+
21+
Checks for dynamic variables.

tests/languages/magik/function_feature.test

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ variable.method_name?
66
variable.method_name()
77
variable.|methodName|()
88
object.method
9+
object.int!method
910
object.getName
1011
object.|getName|
1112
object.method<< _unset
@@ -26,6 +27,7 @@ _clone.init()
2627
["variable", "variable"], ".", ["function", "method_name"], ["punctuation", "("], ["punctuation", ")"],
2728
["variable", "variable"], ".", ["function", "|methodName|"], ["punctuation", "("], ["punctuation", ")"],
2829
["variable", "object"], ".", ["function", "method"],
30+
["variable", "object"], ".", ["function", "int!method"],
2931
["variable", "object"], ".", ["function", "getName"],
3032
["variable", "object"], ".", ["function", "|getName|"],
3133
["variable", "object"], ".", ["function", "method"], ["operator", "<<"], ["unset", "_unset"],

tests/languages/magik/global-reference_feature.test

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
@gis_program_manager
2-
(@gis_program_manager)
3-
{@gis_program_manager}
4-
,@gis_program_manager
2+
@|gis_program_manager|
3+
@sw:gis_program_manager
4+
@sw:|gis_program_manager|
55

66
----------------------------------------------------
77

88
[
99
["global-reference", "@gis_program_manager"],
10-
["punctuation", "("], ["global-reference", "@gis_program_manager"], ["punctuation", ")"],
11-
["punctuation", "{"], ["global-reference", "@gis_program_manager"], ["punctuation", "}"],
12-
["punctuation", ","], ["global-reference", "@gis_program_manager"]
10+
["global-reference", "@|gis_program_manager|"],
11+
["global-reference", "@sw:gis_program_manager"],
12+
["global-reference", "@sw:|gis_program_manager|"]
1313
]
1414

1515
----------------------------------------------------
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
sw:gis_program_manager
2+
sw:|gis_program_manager|
3+
sw:question?
4+
sw:|question?|
5+
sw:sys!system
6+
sw:|sys!system|
7+
8+
----------------------------------------------------
9+
10+
[
11+
["global-variable", "sw:gis_program_manager"],
12+
["global-variable", "sw:|gis_program_manager|"],
13+
["global-variable", "sw:question?"],
14+
["global-variable", "sw:|question?|"],
15+
["global-variable", "sw:sys!system"],
16+
["global-variable", "sw:|sys!system|"]
17+
]
18+
19+
----------------------------------------------------
20+
21+
Checks for global variables.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
_class _dynamic _global _import _local
2+
3+
----------------------------------------------------
4+
5+
[
6+
["keyword-variable", "_class"], ["keyword-variable", "_dynamic"], ["keyword-variable", "_global"], ["keyword-variable", "_import"], ["keyword-variable", "_local"]
7+
]
8+
9+
----------------------------------------------------
10+
11+
Checks for keyword variables.

tests/languages/magik/keyword_feature.test

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
_class _dynamic _global _import _local
21
_block _endblock
32
_elif _else _endif _if _then
43
_and _andif _not _or _orif _xor
@@ -17,7 +16,6 @@ _allresults _gather _optional _scatter
1716
----------------------------------------------------
1817

1918
[
20-
["keyword", "_class"], ["keyword", "_dynamic"], ["keyword", "_global"], ["keyword", "_import"], ["keyword", "_local"],
2119
["keyword", "_block"], ["keyword", "_endblock"],
2220
["keyword", "_elif"], ["keyword", "_else"], ["keyword", "_endif"], ["keyword", "_if"], ["keyword", "_then"],
2321
["keyword", "_and"], ["keyword", "_andif"], ["keyword", "_not"], ["keyword", "_or"], ["keyword", "_orif"], ["keyword", "_xor"],

0 commit comments

Comments
 (0)