Two things:

- Start using prettier for formatting
- Start adding foreach loop highlighting
This commit is contained in:
Uy Ha 2021-06-04 00:19:26 +02:00
parent 4a81a1d859
commit 045e372f3b
5 changed files with 3954 additions and 1484 deletions

1
.prettierrc.toml Normal file
View file

@ -0,0 +1 @@
printWidth = 120

View file

@ -1,84 +1,65 @@
module.exports = grammar({ module.exports = grammar({
name: 'cmake', name: "cmake",
rules: { rules: {
source_file: $ => repeat($.command_invocation), source_file: ($) => repeat($.command_invocation),
line_ending: $ => $.newline, line_ending: ($) => $.newline,
seperation: $ => choice($.space, $.line_ending), seperation: ($) => choice($.space, $.line_ending),
space: $ => /[ \t]+/, space: ($) => /[ \t]+/,
newline: $ => /\n/, newline: ($) => /\n/,
identifier: $ => /[A-Za-z_][A-Za-z0-9_]*/, identifier: ($) => /[A-Za-z_][A-Za-z0-9_]*/,
escape_sequence: $ => choice( escape_sequence: ($) => choice($._escape_identity, $._escape_encoded, $._escape_semicolon),
$._escape_identity, _escape_identity: ($) => /\\[^A-Za-z0-9;]/,
$._escape_encoded, _escape_encoded: ($) => choice("\\t", "\\r", "\\n"),
$._escape_semicolon, _escape_semicolon: ($) => ";",
),
_escape_identity: $ => /\\[^A-Za-z0-9;]/,
_escape_encoded: $ => choice('\\t', '\\r', '\\n'),
_escape_semicolon: $ => '\;',
variable_ref: $ => choice( variable: ($) => repeat1(choice(/[a-zA-Z0-9/_.+-]/, $.escape_sequence)),
$.normal_var, variable_ref: ($) => choice($.normal_var, $.env_var, $.cache_var),
$.env_var, normal_var: ($) => seq("${", $.variable, "}"),
$.cache_var, env_var: ($) => seq("$ENV{", $.variable, "}"),
), cache_var: ($) => seq("$CACHE{", $.variable, "}"),
variable: $ => repeat1(choice(
/[a-zA-Z0-9/_.+-]/,
$.escape_sequence,
)),
normal_var: $ => seq('${', $.variable, '}'),
env_var: $ => seq('$ENV{', $.variable, '}'),
cache_var: $ => seq('$CACHE{', $.variable, '}'),
argument: $ => choice( argument: ($) => choice($.bracket_argument, $.quoted_argument, $.unquoted_argument),
$.bracket_argument,
$.quoted_argument,
$.unquoted_argument,
),
bracket_argument: $ => seq( bracket_argument: ($) => seq($._bracket_open, optional($.bracket_content), $._bracket_close),
$._bracket_open, _bracket_open: ($) => seq("[", repeat("="), "["),
optional($.bracket_content), bracket_content: ($) => repeat1(/[^\]]/),
$._bracket_close, _bracket_close: ($) => seq("]", repeat("="), "]"),
),
_bracket_open: $ => seq('[', repeat('='), '['),
bracket_content: $ => repeat1(/[^\]]/),
_bracket_close: $ => seq(']', repeat('='), ']'),
quoted_argument: $ => seq('"', optional($.quoted_element), '"'), quoted_argument: ($) => seq('"', optional($.quoted_element), '"'),
quoted_element: $ => repeat1(choice( quoted_element: ($) => repeat1(choice($.variable_ref, /[^\\"]/, $.escape_sequence, seq("\\", $.newline))),
$.variable_ref,
/[^\\"]/,
$.escape_sequence,
seq('\\', $.newline),
)),
unquoted_argument: $ => repeat1( unquoted_argument: ($) => repeat1(choice($.variable_ref, /[^ ()#\"\\]/, $.escape_sequence)),
choice(
$.variable_ref,
/[^ ()#\"\\]/,
$.escape_sequence,
)
),
arguments: $ => seq($.argument, repeat($._seperated_arguments)), arguments: ($) => seq($.argument, repeat($._seperated_arguments)),
_seperated_arguments: $ => prec.left(seq( _seperated_arguments: ($) => prec.left(seq(repeat1($.seperation), optional($.argument))),
repeat1($.seperation),
optional($.argument)
)),
foreach_loop: ($) =>
seq(
repeat($.space),
"foreach",
repeat($.seperation),
"(",
choice($.foreach_range, $.foreach_lists_items, $.foreach_zip_lists),
")",
repeat($.command_invocation),
repeat($.space),
"endforeach",
repeat($.seperation),
"(",
optional($.variable),
")"
),
foreach_items: ($) => seq("items"),
foreach_range: ($) => seq("a"),
foreach_lists_items: ($) => seq("b"),
foreach_zip_lists: ($) => seq("c"),
command_invocation: $ => seq( normal_command: ($) =>
repeat($.space), seq(repeat($.space), $.identifier, repeat($.space), "(", repeat($.seperation), optional($.arguments), ")"),
$.identifier,
repeat($.seperation),
'(',
repeat($.seperation),
optional($.arguments),
')'
),
} command_invocation: ($) => choice($.normal_command, $.foreach_loop),
}) },
});

View file

@ -79,6 +79,22 @@
"type": "STRING", "type": "STRING",
"value": ";" "value": ";"
}, },
"variable": {
"type": "REPEAT1",
"content": {
"type": "CHOICE",
"members": [
{
"type": "PATTERN",
"value": "[a-zA-Z0-9/_.+-]"
},
{
"type": "SYMBOL",
"name": "escape_sequence"
}
]
}
},
"variable_ref": { "variable_ref": {
"type": "CHOICE", "type": "CHOICE",
"members": [ "members": [
@ -96,22 +112,6 @@
} }
] ]
}, },
"variable": {
"type": "REPEAT1",
"content": {
"type": "CHOICE",
"members": [
{
"type": "PATTERN",
"value": "[a-zA-Z0-9/_.+-]"
},
{
"type": "SYMBOL",
"name": "escape_sequence"
}
]
}
},
"normal_var": { "normal_var": {
"type": "SEQ", "type": "SEQ",
"members": [ "members": [
@ -374,7 +374,136 @@
] ]
} }
}, },
"command_invocation": { "foreach_loop": {
"type": "SEQ",
"members": [
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "space"
}
},
{
"type": "STRING",
"value": "foreach"
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "seperation"
}
},
{
"type": "STRING",
"value": "("
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "foreach_range"
},
{
"type": "SYMBOL",
"name": "foreach_lists_items"
},
{
"type": "SYMBOL",
"name": "foreach_zip_lists"
}
]
},
{
"type": "STRING",
"value": ")"
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "command_invocation"
}
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "space"
}
},
{
"type": "STRING",
"value": "endforeach"
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "seperation"
}
},
{
"type": "STRING",
"value": "("
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "variable"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": ")"
}
]
},
"foreach_items": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "items"
}
]
},
"foreach_range": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "a"
}
]
},
"foreach_lists_items": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "b"
}
]
},
"foreach_zip_lists": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "c"
}
]
},
"normal_command": {
"type": "SEQ", "type": "SEQ",
"members": [ "members": [
{ {
@ -392,7 +521,7 @@
"type": "REPEAT", "type": "REPEAT",
"content": { "content": {
"type": "SYMBOL", "type": "SYMBOL",
"name": "seperation" "name": "space"
} }
}, },
{ {
@ -423,6 +552,19 @@
"value": ")" "value": ")"
} }
] ]
},
"command_invocation": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "normal_command"
},
{
"type": "SYMBOL",
"name": "foreach_loop"
}
]
} }
}, },
"extras": [ "extras": [

View file

@ -81,23 +81,15 @@
"named": true, "named": true,
"fields": {}, "fields": {},
"children": { "children": {
"multiple": true, "multiple": false,
"required": true, "required": true,
"types": [ "types": [
{ {
"type": "arguments", "type": "foreach_loop",
"named": true "named": true
}, },
{ {
"type": "identifier", "type": "normal_command",
"named": true
},
{
"type": "seperation",
"named": true
},
{
"type": "space",
"named": true "named": true
} }
] ]
@ -123,6 +115,60 @@
"named": true, "named": true,
"fields": {} "fields": {}
}, },
{
"type": "foreach_lists_items",
"named": true,
"fields": {}
},
{
"type": "foreach_loop",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "command_invocation",
"named": true
},
{
"type": "foreach_lists_items",
"named": true
},
{
"type": "foreach_range",
"named": true
},
{
"type": "foreach_zip_lists",
"named": true
},
{
"type": "seperation",
"named": true
},
{
"type": "space",
"named": true
},
{
"type": "variable",
"named": true
}
]
}
},
{
"type": "foreach_range",
"named": true,
"fields": {}
},
{
"type": "foreach_zip_lists",
"named": true,
"fields": {}
},
{ {
"type": "line_ending", "type": "line_ending",
"named": true, "named": true,
@ -138,6 +184,33 @@
] ]
} }
}, },
{
"type": "normal_command",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "arguments",
"named": true
},
{
"type": "identifier",
"named": true
},
{
"type": "seperation",
"named": true
},
{
"type": "space",
"named": true
}
]
}
},
{ {
"type": "normal_var", "type": "normal_var",
"named": true, "named": true,
@ -334,10 +407,34 @@
"type": "]", "type": "]",
"named": false "named": false
}, },
{
"type": "a",
"named": false
},
{
"type": "b",
"named": false
},
{
"type": "c",
"named": false
},
{
"type": "endforeach",
"named": false
},
{
"type": "foreach",
"named": false
},
{ {
"type": "identifier", "type": "identifier",
"named": true "named": true
}, },
{
"type": "items",
"named": false
},
{ {
"type": "newline", "type": "newline",
"named": true "named": true

File diff suppressed because it is too large Load diff