rust-code-analysis/tree-sitter-mozcpp/grammar.js

386 строки
8.3 KiB
JavaScript

const CPP = require("./tree-sitter-cpp/grammar.js")
module.exports = grammar(CPP, {
name: 'cpp',
rules: {
_top_level_item: ($, original) => choice(
$.alone_macro,
$.alone_macro_call,
original,
),
_field_declaration_list_item: ($, original) => choice(
original,
$.macro_statement,
),
alone_macro: $ => /[_A-Z][_A-Z0-9]+\s*\n/,
alone_macro_call: $ => seq(
/[_A-Z][_A-Z0-9]+/,
'(',
optional(seq(/[_A-Z][_A-Z0-9]+/, repeat(seq(',', /[_A-Z][_A-Z0-9]+/)))),
')',
'\n',
),
class_specifier: $ => prec.right(seq(
'class',
repeat($.macro_annotation),
choice(
field('name', $._class_name),
seq(
optional(field('name', $._class_name)),
optional($.virtual_specifier),
optional($.base_class_clause),
field('body', $.field_declaration_list)
)
)
)),
struct_specifier: $ => prec.right(seq(
'struct',
optional($.macro_annotation),
choice(
field('name', $._class_name),
seq(
optional(field('name', $._class_name)),
optional($.virtual_specifier),
optional($.base_class_clause),
field('body', $.field_declaration_list)
)
)
)),
parameter_list: ($, original) => seq(
original,
optional($.macro_annotation),
),
storage_class_specifier: ($, original) => choice(
original,
$.macro_annotation,
),
call_expression: ($, original) => choice(
original,
$._call_macro_with_decl_first_arg,
),
_call_macro_with_decl_first_arg: $ => seq(
field('function', choice(
'CACHE_TRY_INSPECT',
'CACHE_TRY_UNWRAP',
'FORWARD',
'FORWARD_SET_ATTRIBUTE',
'IDB_TRY_INSPECT',
'IDB_TRY_UNWRAP',
'LS_TRY_INSPECT',
'LS_TRY_UNWRAP',
'SDB_TRY_INSPECT',
'SDB_TRY_UNWRAP',
'PS_GET',
'PS_GET_AND_SET',
'PS_GET_LOCKLESS',
'QM_TRY_INSPECT',
'QM_NOTEONLY_TRY_UNWRAP',
'QM_TRY_UNWRAP',
'QM_WARNONLY_TRY_UNWRAP',
)),
field('arguments', seq(
'(',
$.parameter_declaration,
',',
commaSep(choice($._expression, $.initializer_list)),
')',
)),
),
macro_statement: $ => choice(
'MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER'
),
macro_annotation: $ => choice(
'MOZ_ALLOCATOR',
'MOZ_ALLOW_TEMPORARY',
'MOZ_ALWAYS_INLINE',
'MOZ_ALWAYS_INLINE_EVEN_DEBUG',
'MOZ_ASAN_BLACKLIST',
'MOZ_CAN_RUN_SCRIPT',
'MOZ_CAN_RUN_SCRIPT_BOUNDARY',
'MOZ_CAN_RUN_SCRIPT_FOR_DEFINITION',
'MOZ_COLD',
'MOZ_FALLTHROUGH',
'MOZ_FORMAT_PRINTF',
'MOZ_HAVE_ANALYZER_NORETURN',
'MOZ_HAVE_ASAN_BLACKLIST',
'MOZ_HAVE_NEVER_INLINE',
'MOZ_HAVE_NORETURN',
'MOZ_HAVE_NORETURN_PTR',
'MOZ_HAVE_NO_SANITIZE_ATTR',
'MOZ_HAVE_SIGNED_OVERFLOW_SANITIZE_ATTR',
'MOZ_HAVE_UNSIGNED_OVERFLOW_SANITIZE_ATTR',
'MOZ_HEAP_ALLOCATOR',
'MOZ_HEAP_CLASS',
'MOZ_IMPLICIT',
'MOZ_INHERIT_TYPE_ANNOTATIONS_FROM_TEMPLATE_ARGS',
'MOZ_INIT_OUTSIDE_CTOR',
'MOZ_IS_CLASS_INIT',
'MOZ_IS_REFPTR',
'MOZ_IS_SMARTPTR_TO_REFCOUNTED',
'MOZ_MAYBE_UNUSED',
'MOZ_MAY_CALL_AFTER_MUST_RETURN',
'MOZ_MUST_OVERRIDE',
'MOZ_MUST_RETURN_FROM_CALLER_IF_THIS_IS_ARG',
'MOZ_MUST_USE',
'MOZ_MUST_USE_TYPE',
'MOZ_NEEDS_MEMMOVABLE_MEMBERS',
'MOZ_NEEDS_MEMMOVABLE_TYPE',
'MOZ_NEEDS_NO_VTABLE_TYPE',
'MOZ_NEVER_INLINE',
'MOZ_NEVER_INLINE_DEBUG',
'MOZ_NONHEAP_CLASS',
'MOZ_NONNULL',
'MOZ_NONNULL_RETURN',
'MOZ_NON_AUTOABLE',
'MOZ_NON_MEMMOVABLE',
'MOZ_NON_OWNING_REF',
'MOZ_NON_PARAM',
'MOZ_NON_TEMPORARY_CLASS',
'MOZ_NORETURN',
'MOZ_NORETURN_PTR',
'MOZ_NO_ADDREF_RELEASE_ON_RETURN',
'MOZ_NO_ARITHMETIC_EXPR_IN_ARGUMENT',
'MOZ_NO_DANGLING_ON_TEMPORARIES',
'MOZ_NO_SANITIZE_SIGNED_OVERFLOW',
'MOZ_NO_SANITIZE_UNSIGNED_OVERFLOW',
'MOZ_ONLY_USED_TO_AVOID_STATIC_CONSTRUCTORS',
'MOZ_OWNING_REF',
'MOZ_POP_DISABLE_NONTRIVIAL_UNION_WARNINGS',
'MOZ_PRETEND_NORETURN_FOR_STATIC_ANALYSIS',
'MOZ_PUSH_DISABLE_NONTRIVIAL_UNION_WARNINGS',
'MOZ_RAII',
'MOZ_REQUIRED_BASE_METHOD',
'MOZ_STACK_CLASS',
'MOZ_STATIC_CLASS',
'MOZ_STATIC_LOCAL_CLASS',
'MOZ_TEMPORARY_CLASS',
'MOZ_TRIVIAL_CTOR_DTOR',
'MOZ_TSAN_BLACKLIST',
'MOZ_UNSAFE_REF',
'MOZ_XPCOM_ABI',
'JS_PUBLIC_API',
),
primitive_type: $ => token(choice(
'APIENTRY',
'ATOM',
'BOOL',
'BOOLEAN',
'BYTE',
'CCHAR',
'CHAR',
'COLORREF',
'DWORD',
'DWORDLONG',
'DWORD_PTR',
'DWORD32',
'DWORD64',
'FLOAT',
'HACCEL',
'HALF_PTR',
'HANDLE',
'HBITMAP',
'HBRUSH',
'HCOLORSPACE',
'HCONV',
'HCONVLIST',
'HCURSOR',
'HDC',
'HDDEDATA',
'HDESK',
'HDROP',
'HDWP',
'HENHMETAFILE',
'HFILE',
'HFONT',
'HGDIOBJ',
'HGLOBAL',
'HHOOK',
'HICON',
'HINSTANCE',
'HKEY',
'HKL',
'HLOCAL',
'HMENU',
'HMETAFILE',
'HMODULE',
'HMONITOR',
'HPALETTE',
'HPEN',
'HRESULT',
'HRGN',
'HRSRC',
'HSZ',
'HWINSTA',
'HWND',
'INT',
'INT_PTR',
'INT8',
'INT16',
'INT32',
'INT64',
'LANGID',
'LCID',
'LCTYPE',
'LGRPID',
'LONG',
'LONGLONG',
'LONG_PTR',
'LONG32',
'LONG64',
'LPARAM',
'LPBOOL',
'LPBYTE',
'LPCOLORREF',
'LPCSTR',
'LPCVOID',
'LPCWSTR',
'LPDWORD',
'LPHANDLE',
'LPINT',
'LPLONG',
'LPSTR',
'LPTSTR',
'LPWOID',
'LPWORD',
'LPWSTR',
'LRESULT',
'PBOOL',
'PBOOLEAN',
'PBYTE',
'PCHAR',
'PCSTR',
'PCTSTR',
'PCWSTR',
'PDWORD',
'PDWORDLONG',
'PDWORD_PTR',
'PDWORD32',
'PDWORD64',
'PFLOAT',
'PHALF_PTR',
'PHANDLE',
'PHKEY',
'PINT',
'PINT_PTR',
'PINT8',
'PINT16',
'PINT32',
'PINT64',
'PLCID',
'PLONG',
'PLONGLONG',
'PLONG32',
'PLONG64',
'POINTER_32',
'POINTER_64',
'POINTER_SIGNED',
'POINTER_UNSIGNED',
'PSHORT',
'PSIZE_T',
'PSSIZE_T',
'PSTR',
'PTBYTE',
'PTCHAR',
'PTSTR',
'PUCHAR',
'PUHALF_PTR',
'PUINT',
'PUINT_PTR',
'PUINT8',
'PUINT16',
'PUINT32',
'PUINT64',
'PULONG',
'PULONGLONG',
'PULONG32',
'PULONG64',
'PUSHORT',
'PVOID',
'PWCHAR',
'PWORD',
'PWSTR',
'QWORD',
'SC_HANDLE',
'SC_LOCK',
'SERVICE_STATUS_HANDLE',
'SHORT',
'SIZE_T',
'SSIZE_T',
'TBYTE',
'TCHAR',
'UCHAR',
'UHALF_PTR',
'UINT',
'UINT_PTR',
'UINT8',
'UINT16',
'UINT32',
'UINT64',
'ULONG',
'ULONGLONG',
'ULONG_PTR',
'ULONG32',
'ULONG64',
'UNICODE_STRING',
'USHORT',
'USN',
'VOID',
'WCHAR',
'WORD',
'WPARAM',
'bool',
'char',
'int',
'float',
'double',
'void',
'size_t',
'ssize_t',
'intptr_t',
'uintptr_t',
'charptr_t',
'intmax_t',
'intptr_t',
'uintmax_t',
'uintptr_t',
'ptrdiff_t',
'max_align_t',
'wchar_t',
'sig_atomic_t',
...[8, 16, 32, 64].map(n => `int${n}_t`),
...[8, 16, 32, 64].map(n => `uint${n}_t`),
...[8, 16, 32, 64].map(n => `char${n}_t`),
...[8, 16, 32, 64].map(n => `int_fast${n}_t`),
...[8, 16, 32, 64].map(n => `int_least${n}_t`),
...[8, 16, 32, 64].map(n => `uint_fast${n}_t`),
...[8, 16, 32, 64].map(n => `uint_least${n}_t`),
)),
concatenated_string: $ => seq(
choice($.raw_string_literal, $.string_literal),
repeat1(choice($.raw_string_literal, $.string_literal, $.identifier))
),
}
});
function commaSep(rule) {
return optional(commaSep1(rule));
}
function commaSep1(rule) {
return seq(rule, repeat(seq(',', rule)));
}