Add support for static_assert declarations (#61)

edge_only_predecessors
jdrouhard 2019-10-30 12:58:36 +07:00 committed by Max Brunsfeld
parent 9ad3202e7d
commit 7263d5bdb8
5 changed files with 176499 additions and 173603 deletions

@ -935,3 +935,39 @@ enum struct Foo : char { };
(enum_specifier (scoped_type_identifier (namespace_identifier) (type_identifier)) (scoped_type_identifier (namespace_identifier) (type_identifier)) (enumerator_list))
(enum_specifier (type_identifier))
(enum_specifier (type_identifier) (type_identifier) (enumerator_list)))
============================
static_assert declarations
============================
class A { static_assert(true, "message"); };
void f() { static_assert(false); }
static_assert(std::is_constructible<A>::value);
---
(translation_unit
(class_specifier
name: (type_identifier)
body: (field_declaration_list
(static_assert_declaration
condition: (true)
message: (string_literal))))
(function_definition
type: (primitive_type)
declarator: (function_declarator
declarator: (identifier)
parameters: (parameter_list))
body: (compound_statement
(static_assert_declaration
condition: (false))))
(static_assert_declaration
condition: (scoped_identifier
namespace: (template_type
name: (scoped_type_identifier
namespace: (namespace_identifier)
name: (type_identifier))
arguments: (template_argument_list
(type_descriptor
type: (type_identifier))))
name: (identifier))))

@ -39,6 +39,7 @@ module.exports = grammar(C, {
$.namespace_definition,
$.using_declaration,
$.alias_declaration,
$.static_assert_declaration,
$.template_declaration,
$.template_instantiation,
// $.structured_binding_declaration,
@ -307,7 +308,8 @@ module.exports = grammar(C, {
$.access_specifier,
$.alias_declaration,
$.using_declaration,
$.type_definition
$.type_definition,
$.static_assert_declaration
),
field_declaration: $ => seq(
@ -516,6 +518,18 @@ module.exports = grammar(C, {
';'
),
static_assert_declaration: $ => seq(
'static_assert',
'(',
field('condition', $._expression),
optional(seq(
',',
field('message', $.string_literal)
)),
')',
';'
),
// Statements
_statement: ($, original) => choice(

62
src/grammar.json vendored

@ -77,6 +77,10 @@
"type": "SYMBOL",
"name": "alias_declaration"
},
{
"type": "SYMBOL",
"name": "static_assert_declaration"
},
{
"type": "SYMBOL",
"name": "template_declaration"
@ -2796,6 +2800,10 @@
{
"type": "SYMBOL",
"name": "type_definition"
},
{
"type": "SYMBOL",
"name": "static_assert_declaration"
}
]
},
@ -7628,6 +7636,60 @@
}
]
},
"static_assert_declaration": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "static_assert"
},
{
"type": "STRING",
"value": "("
},
{
"type": "FIELD",
"name": "condition",
"content": {
"type": "SYMBOL",
"name": "_expression"
}
},
{
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "FIELD",
"name": "message",
"content": {
"type": "SYMBOL",
"name": "string_literal"
}
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": ")"
},
{
"type": "STRING",
"value": ";"
}
]
},
"for_range_loop": {
"type": "SEQ",
"members": [

416
src/node-types.json vendored

@ -1018,7 +1018,7 @@
"named": true,
"fields": {
"left": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -1028,7 +1028,7 @@
]
},
"right": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -1242,6 +1242,10 @@
"type": "preproc_include",
"named": true
},
{
"type": "static_assert_declaration",
"named": true
},
{
"type": "template_declaration",
"named": true
@ -1321,7 +1325,7 @@
"named": true,
"fields": {
"body": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -1331,7 +1335,7 @@
]
},
"condition": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -1495,7 +1499,7 @@
},
"children": {
"multiple": true,
"required": true,
"required": false,
"types": [
{
"type": "attribute",
@ -1576,6 +1580,10 @@
"type": "preproc_ifdef",
"named": true
},
{
"type": "static_assert_declaration",
"named": true
},
{
"type": "template_declaration",
"named": true
@ -1687,7 +1695,7 @@
"named": true,
"fields": {
"body": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -1697,7 +1705,7 @@
]
},
"declarator": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -1707,7 +1715,7 @@
]
},
"right": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -1733,7 +1741,7 @@
},
"children": {
"multiple": true,
"required": true,
"required": false,
"types": [
{
"type": "attribute_specifier",
@ -1755,7 +1763,7 @@
"named": true,
"fields": {
"condition": {
"multiple": true,
"multiple": false,
"required": false,
"types": [
{
@ -1765,7 +1773,7 @@
]
},
"initializer": {
"multiple": true,
"multiple": false,
"required": false,
"types": [
{
@ -1783,7 +1791,7 @@
]
},
"update": {
"multiple": true,
"multiple": false,
"required": false,
"types": [
{
@ -1798,7 +1806,7 @@
}
},
"children": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -1964,7 +1972,7 @@
"named": true,
"fields": {
"alternative": {
"multiple": true,
"multiple": false,
"required": false,
"types": [
{
@ -1974,7 +1982,7 @@
]
},
"condition": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -1984,7 +1992,7 @@
]
},
"consequence": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -2091,7 +2099,7 @@
"named": true,
"fields": {
"label": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -2102,7 +2110,7 @@
}
},
"children": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -2242,7 +2250,7 @@
"named": true,
"fields": {
"length": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -2253,7 +2261,7 @@
}
},
"children": {
"multiple": true,
"multiple": false,
"required": false,
"types": [
{
@ -2365,7 +2373,7 @@
},
"children": {
"multiple": true,
"required": true,
"required": false,
"types": [
{
"type": "attribute_specifier",
@ -2439,7 +2447,7 @@
},
"children": {
"multiple": true,
"required": true,
"required": false,
"types": [
{
"type": "attribute",
@ -2646,7 +2654,7 @@
"named": true,
"fields": {
"alternative": {
"multiple": true,
"multiple": false,
"required": false,
"types": [
{
@ -2660,7 +2668,7 @@
]
},
"condition": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -2718,6 +2726,10 @@
"type": "preproc_ifdef",
"named": true
},
{
"type": "static_assert_declaration",
"named": true
},
{
"type": "template_declaration",
"named": true
@ -2785,6 +2797,10 @@
"type": "preproc_ifdef",
"named": true
},
{
"type": "static_assert_declaration",
"named": true
},
{
"type": "template_declaration",
"named": true
@ -2913,6 +2929,10 @@
"type": "preproc_ifdef",
"named": true
},
{
"type": "static_assert_declaration",
"named": true
},
{
"type": "template_declaration",
"named": true
@ -3005,6 +3025,10 @@
"type": "preproc_ifdef",
"named": true
},
{
"type": "static_assert_declaration",
"named": true
},
{
"type": "template_declaration",
"named": true
@ -3178,7 +3202,7 @@
"named": true,
"fields": {
"name": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -3188,7 +3212,7 @@
]
},
"namespace": {
"multiple": true,
"multiple": false,
"required": false,
"types": [
{
@ -3291,6 +3315,32 @@
}
}
},
{
"type": "static_assert_declaration",
"named": true,
"fields": {
"condition": {
"multiple": false,
"required": true,
"types": [
{
"type": "_expression",
"named": true
}
]
},
"message": {
"multiple": false,
"required": false,
"types": [
{
"type": "string_literal",
"named": true
}
]
}
}
},
{
"type": "storage_class_specifier",
"named": true,
@ -3469,7 +3519,7 @@
"named": true,
"fields": {
"parameters": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -3480,7 +3530,7 @@
}
},
"children": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -3552,7 +3602,7 @@
},
"type": {
"multiple": false,
"required": true,
"required": false,
"types": [
{
"type": "_type_specifier",
@ -3818,6 +3868,10 @@
"type": "preproc_include",
"named": true
},
{
"type": "static_assert_declaration",
"named": true
},
{
"type": "template_declaration",
"named": true
@ -3869,7 +3923,7 @@
"fields": {
"declarator": {
"multiple": true,
"required": false,
"required": true,
"types": [
{
"type": "_type_declarator",
@ -4136,7 +4190,7 @@
},
"children": {
"multiple": true,
"required": true,
"required": false,
"types": [
{
"type": "attribute_specifier",
@ -4183,7 +4237,7 @@
"named": true,
"fields": {
"body": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -4193,7 +4247,7 @@
]
},
"condition": {
"multiple": true,
"multiple": false,
"required": true,
"types": [
{
@ -4209,55 +4263,47 @@
"named": false
},
{
"type": "(",
"type": "!",
"named": false
},
{
"type": "...",
"type": "!=",
"named": false
},
{
"type": ",",
"type": "\"",
"named": false
},
{
"type": ")",
"type": "%",
"named": false
},
{
"type": "preproc_directive",
"named": true
},
{
"type": "preproc_arg",
"named": true
},
{
"type": ";",
"type": "%=",
"named": false
},
{
"type": "typedef",
"type": "&",
"named": false
},
{
"type": "extern",
"type": "&&",
"named": false
},
{
"type": "__attribute__",
"type": "&=",
"named": false
},
{
"type": "(",
"type": "'",
"named": false
},
{
"type": "{",
"type": "(",
"named": false
},
{
"type": "}",
"type": ")",
"named": false
},
{
@ -4265,391 +4311,403 @@
"named": false
},
{
"type": "[",
"type": "*=",
"named": false
},
{
"type": "]",
"type": "+",
"named": false
},
{
"type": "=",
"type": "++",
"named": false
},
{
"type": "static",
"type": "+=",
"named": false
},
{
"type": "register",
"type": ",",
"named": false
},
{
"type": "inline",
"type": "-",
"named": false
},
{
"type": "const",
"type": "--",
"named": false
},
{
"type": "volatile",
"type": "-=",
"named": false
},
{
"type": "restrict",
"type": "->",
"named": false
},
{
"type": "_Atomic",
"type": ".",
"named": false
},
{
"type": "mutable",
"type": "...",
"named": false
},
{
"type": "explicit",
"type": "/",
"named": false
},
{
"type": "constexpr",
"type": "/=",
"named": false
},
{
"type": "signed",
"type": ":",
"named": false
},
{
"type": "unsigned",
"type": "::",
"named": false
},
{
"type": "long",
"type": ";",
"named": false
},
{
"type": "short",
"type": "<",
"named": false
},
{
"type": "primitive_type",
"named": true
},
{
"type": "enum",
"type": "<<",
"named": false
},
{
"type": "class",
"type": "<<=",
"named": false
},
{
"type": "struct",
"type": "<=",
"named": false
},
{
"type": ":",
"type": "=",
"named": false
},
{
"type": "union",
"type": "==",
"named": false
},
{
"type": "if",
"type": ">",
"named": false
},
{
"type": "else",
"type": ">=",
"named": false
},
{
"type": "switch",
"type": ">>",
"named": false
},
{
"type": "case",
"type": ">>=",
"named": false
},
{
"type": "default",
"type": "?",
"named": false
},
{
"type": "while",
"type": "L\"",
"named": false
},
{
"type": "do",
"type": "L'",
"named": false
},
{
"type": "for",
"type": "[",
"named": false
},
{
"type": "return",
"type": "[[",
"named": false
},
{
"type": "break",
"type": "]",
"named": false
},
{
"type": "continue",
"type": "]]",
"named": false
},
{
"type": "goto",
"type": "^",
"named": false
},
{
"type": "?",
"type": "^=",
"named": false
},
{
"type": "*=",
"type": "_Atomic",
"named": false
},
{
"type": "/=",
"type": "__attribute__",
"named": false
},
{
"type": "%=",
"named": false
"type": "auto",
"named": true
},
{
"type": "+=",
"type": "break",
"named": false
},
{
"type": "-=",
"type": "case",
"named": false
},
{
"type": "<<=",
"type": "catch",
"named": false
},
{
"type": ">>=",
"type": "class",
"named": false
},
{
"type": "&=",
"type": "const",
"named": false
},
{
"type": "^=",
"type": "constexpr",
"named": false
},
{
"type": "|=",
"type": "continue",
"named": false
},
{
"type": "&",
"type": "default",
"named": false
},
{
"type": "!",
"type": "delete",
"named": false
},
{
"type": "~",
"type": "do",
"named": false
},
{
"type": "-",
"type": "else",
"named": false
},
{
"type": "+",
"type": "enum",
"named": false
},
{
"type": "/",
"named": false
"type": "escape_sequence",
"named": true
},
{
"type": "%",
"type": "explicit",
"named": false
},
{
"type": "||",
"type": "extern",
"named": false
},
{
"type": "&&",
"named": false
"type": "false",
"named": true
},
{
"type": "|",
"named": false
"type": "field_identifier",
"named": true
},
{
"type": "^",
"type": "final",
"named": false
},
{
"type": "==",
"type": "for",
"named": false
},
{
"type": "!=",
"type": "friend",
"named": false
},
{
"type": ">",
"type": "goto",
"named": false
},
{
"type": ">=",
"named": false
"type": "identifier",
"named": true
},
{
"type": "<=",
"type": "if",
"named": false
},
{
"type": "<",
"type": "inline",
"named": false
},
{
"type": "<<",
"type": "long",
"named": false
},
{
"type": ">>",
"type": "mutable",
"named": false
},
{
"type": "--",
"type": "namespace",
"named": false
},
{
"type": "++",
"named": false
"type": "namespace_identifier",
"named": true
},
{
"type": "sizeof",
"type": "new",
"named": false
},
{
"type": ".",
"type": "noexcept",
"named": false
},
{
"type": "->",
"named": false
"type": "null",
"named": true
},
{
"type": "number_literal",
"type": "nullptr",
"named": true
},
{
"type": "L'",
"named": false
"type": "number_literal",
"named": true
},
{
"type": "'",
"named": false
"type": "operator_name",
"named": true
},
{
"type": "L\"",
"type": "override",
"named": false
},
{
"type": "\"",
"named": false
"type": "preproc_arg",
"named": true
},
{
"type": "escape_sequence",
"type": "preproc_directive",
"named": true
},
{
"type": "system_lib_string",
"type": "primitive_type",
"named": true
},
{
"type": "true",
"named": true
"type": "private",
"named": false
},
{
"type": "false",
"named": true
"type": "protected",
"named": false
},
{
"type": "null",
"named": true
"type": "public",
"named": false
},
{
"type": "identifier",
"named": true
"type": "register",
"named": false
},
{
"type": "comment",
"named": true
"type": "restrict",
"named": false
},
{
"type": "final",
"type": "return",
"named": false
},
{
"type": "override",
"type": "short",
"named": false
},
{
"type": "virtual",
"type": "signed",
"named": false
},
{
"type": "public",
"type": "sizeof",
"named": false
},
{
"type": "private",
"type": "statement_identifier",
"named": true
},
{
"type": "static",
"named": false
},
{
"type": "protected",
"type": "static_assert",
"named": false
},
{
"type": "auto",
"named": true
"type": "struct",
"named": false
},
{
"type": "typename",
"type": "switch",
"named": false
},
{
"type": "system_lib_string",
"named": true
},
{
"type": "template",
"named": false
},
{
"type": ">",
"type": "throw",
"named": false
},
{
"type": "delete",
"type": "true",
"named": true
},
{
"type": "try",
"named": false
},
{
"type": "friend",
"type": "type_identifier",
"named": true
},
{
"type": "typedef",
"named": false
},
{
"type": "noexcept",
"type": "typename",
"named": false
},
{
"type": "throw",
"type": "union",
"named": false
},
{
"type": "namespace",
"type": "unsigned",
"named": false
},
{
@ -4657,35 +4715,39 @@
"named": false
},
{
"type": "try",
"type": "virtual",
"named": false
},
{
"type": "catch",
"type": "volatile",
"named": false
},
{
"type": "[[",
"type": "while",
"named": false
},
{
"type": "]]",
"type": "{",
"named": false
},
{
"type": "new",
"type": "|",
"named": false
},
{
"type": "::",
"type": "|=",
"named": false
},
{
"type": "operator_name",
"named": true
"type": "||",
"named": false
},
{
"type": "nullptr",
"named": true
"type": "}",
"named": false
},
{
"type": "~",
"named": false
}
]

349572
src/parser.c vendored

File diff suppressed because it is too large Load Diff