Skip to content

Commit abbb158

Browse files
committed
fix: allow function definitions to contain preproc attributes
Specifically for Neovim which contains code like: ```c Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Arena *arena, Error *err) FUNC_API_SINCE(8) FUNC_API_FAST { ... } ```
1 parent ecdd500 commit abbb158

File tree

5 files changed

+83792
-79312
lines changed

5 files changed

+83792
-79312
lines changed

grammar.js

+30-5
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ module.exports = grammar({
6767
[$.enum_specifier],
6868
[$._type_specifier, $._old_style_parameter_list],
6969
[$.parameter_list, $._old_style_parameter_list],
70+
[$.function_declarator, $._function_declaration_declarator],
7071
],
7172

7273
word: $ => $.identifier,
@@ -244,13 +245,15 @@ module.exports = grammar({
244245

245246
declaration: $ => seq(
246247
$._declaration_specifiers,
247-
$._declaration_declarator,
248+
commaSep1(field('declarator', choice(
249+
seq(
250+
$._declaration_declarator,
251+
optional($.gnu_asm_expression),
252+
),
253+
$.init_declarator,
254+
))),
248255
';',
249256
),
250-
_declaration_declarator: $ => commaSep1(field('declarator', choice(
251-
seq($._declarator, optional($.gnu_asm_expression)),
252-
$.init_declarator,
253-
))),
254257

255258
type_definition: $ => seq(
256259
optional('__extension__'),
@@ -357,6 +360,15 @@ module.exports = grammar({
357360
$.identifier,
358361
),
359362

363+
_declaration_declarator: $ => choice(
364+
$.attributed_declarator,
365+
$.pointer_declarator,
366+
alias($._function_declaration_declarator, $.function_declarator),
367+
$.array_declarator,
368+
$.parenthesized_declarator,
369+
$.identifier,
370+
),
371+
360372
_field_declarator: $ => choice(
361373
alias($.attributed_field_declarator, $.attributed_declarator),
362374
alias($.pointer_field_declarator, $.pointer_declarator),
@@ -446,12 +458,25 @@ module.exports = grammar({
446458
))),
447459

448460
function_declarator: $ => prec.right(1,
461+
seq(
462+
field('declarator', $._declarator),
463+
field('parameters', $.parameter_list),
464+
optional($.gnu_asm_expression),
465+
repeat(choice(
466+
$.attribute_specifier,
467+
$.identifier,
468+
$.preproc_call_expression,
469+
)),
470+
)),
471+
472+
_function_declaration_declarator: $ => prec.right(1,
449473
seq(
450474
field('declarator', $._declarator),
451475
field('parameters', $.parameter_list),
452476
optional($.gnu_asm_expression),
453477
repeat($.attribute_specifier),
454478
)),
479+
455480
function_field_declarator: $ => prec(1, seq(
456481
field('declarator', $._field_declarator),
457482
field('parameters', $.parameter_list),

src/grammar.json

+157-66
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)