aboutsummaryrefslogtreecommitdiff
path: root/lua/lexers/meson.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/lexers/meson.lua')
-rw-r--r--lua/lexers/meson.lua163
1 files changed, 64 insertions, 99 deletions
diff --git a/lua/lexers/meson.lua b/lua/lexers/meson.lua
index b6cbe15..c224f82 100644
--- a/lua/lexers/meson.lua
+++ b/lua/lexers/meson.lua
@@ -1,36 +1,18 @@
--- Copyright 2020 Florian Fischer. See LICENSE.
+-- Copyright 2020-2022 Florian Fischer. See LICENSE.
-- Meson file LPeg lexer.
-local l = require('lexer')
-local token, word_match = l.token, l.word_match
+local lexer = require('lexer')
+local token, word_match = lexer.token, lexer.word_match
local P, R, S = lpeg.P, lpeg.R, lpeg.S
-local M = {_NAME = 'meson'}
+local lex = lexer.new('meson', {fold_by_indentation = true})
-- Whitespace.
-local ws = token(l.WHITESPACE, l.space^1)
-
--- Comments.
-local comment = token(l.COMMENT, '#' * l.nonnewline_esc^0)
-
--- Strings.
-local str = l.delimited_range("'", true)
-local multiline_str = "'''" * (l.any - "'''")^0 * P("'''")^-1
-local string = token(l.STRING, multiline_str + str)
-
--- Numbers.
-local dec = R('19')^1 * R('09')^0
-local bin = '0b' * S('01')^1
-local oct = '0o' * R('07')^1
-local integer = S('+-')^-1 * (bin + l.hex_num + oct + dec)
-local number = token(l.NUMBER, integer)
+lex:add_rule('whitespace', token(lexer.WHITESPACE, lexer.space^1))
-- Keywords.
-local keyword = token(l.KEYWORD, word_match{
- 'and', 'or', 'not',
- 'if', 'elif', 'else', 'endif',
- 'foreach', 'break', 'continue', 'endforeach',
-})
+lex:add_rule('keyword', token(lexer.KEYWORD, word_match(
+ 'and or not if elif else endif foreach break continue endforeach')))
-- Methods.
-- https://mesonbuild.com/Reference-manual.html#builtin-objects
@@ -47,40 +29,34 @@ local method_names = word_match{
-- integer --
'is_even', 'is_odd',
-- string --
- 'contains', 'endswith', 'format', 'join', 'split', 'startswith', 'substring',
- 'strip', 'to_int', 'to_lower', 'to_upper', 'underscorify', 'version_compare',
+ 'contains', 'endswith', 'format', 'join', 'split', 'startswith', 'substring', 'strip', 'to_int',
+ 'to_lower', 'to_upper', 'underscorify', 'version_compare',
-- meson object --
- 'add_dist_script', 'add_install_script', 'add_postconf_script', 'backend',
- 'build_root', 'source_root', 'project_build_root', 'project_source_root',
- 'current_build_dir', 'current_source_dir', 'get_compiler',
- 'get_cross_property', 'get_external_property', 'can_run_host_binaries',
- 'has_exe_wrapper', 'install_dependency_manifest', 'is_cross_build',
- 'is_subproject', 'is_unity', 'override_find_program', 'override_dependency',
- 'project_version', 'project_license', 'project_name', 'version',
+ 'add_dist_script', 'add_install_script', 'add_postconf_script', 'backend', 'build_root',
+ 'source_root', 'project_build_root', 'project_source_root', 'current_build_dir',
+ 'current_source_dir', 'get_compiler', 'get_cross_property', 'get_external_property',
+ 'can_run_host_binaries', 'has_exe_wrapper', 'install_dependency_manifest', 'is_cross_build',
+ 'is_subproject', 'is_unity', 'override_find_program', 'override_dependency', 'project_version',
+ 'project_license', 'project_name', 'version',
-- *_machine object --
'cpu_family', 'cpu', 'system', 'endian',
-- compiler object --
- 'alignment', 'cmd_array', 'compiles', 'compute_int', 'find_library',
- 'first_supported_argument', 'first_supported_link_argument', 'get_define',
- 'get_id', 'get_argument_syntax', 'get_linker_id', 'get_supported_arguments',
- 'get_supported_link_arguments', 'has_argument', 'has_link_argument',
- 'has_function', 'check_header', 'has_header', 'has_header_symbol',
- 'has_member', 'has_members', 'has_multi_arguments',
- 'has_multi_link_arguments', 'has_type', 'links', 'run',
- 'symbols_have_underscore_prefix', 'sizeof', 'version',
- 'has_function_attribute', 'get_supported_function_attributes',
+ 'alignment', 'cmd_array', 'compiles', 'compute_int', 'find_library', 'first_supported_argument',
+ 'first_supported_link_argument', 'get_define', 'get_id', 'get_argument_syntax', 'get_linker_id',
+ 'get_supported_arguments', 'get_supported_link_arguments', 'has_argument', 'has_link_argument',
+ 'has_function', 'check_header', 'has_header', 'has_header_symbol', 'has_member', 'has_members',
+ 'has_multi_arguments', 'has_multi_link_arguments', 'has_type', 'links', 'run',
+ 'symbols_have_underscore_prefix', 'sizeof', 'version', 'has_function_attribute',
+ 'get_supported_function_attributes',
-- build target object --
- 'extract_all_objects', 'extract_objects', 'full_path', 'private_dir_include',
- 'name',
+ 'extract_all_objects', 'extract_objects', 'full_path', 'private_dir_include', 'name',
-- configuration data object --
- 'get', 'get_unquoted', 'has', 'keys', 'merge_from', 'set', 'set10',
- 'set_quoted',
+ 'get', 'get_unquoted', 'has', 'keys', 'merge_from', 'set', 'set10', 'set_quoted',
-- custom target object --
'full_path', 'to_list',
-- dependency object --
- 'found', 'name', 'get_pkgconfig_variable', 'get_configtool_variable',
- 'type_name', 'version', 'include_type', 'as_system', 'as_link_whole',
- 'partial_dependency', 'found',
+ 'found', 'name', 'get_pkgconfig_variable', 'get_configtool_variable', 'type_name', 'version',
+ 'include_type', 'as_system', 'as_link_whole', 'partial_dependency', 'found',
-- external program object --
'found', 'path', 'full_path',
-- environment object --
@@ -92,70 +68,59 @@ local method_names = word_match{
-- subproject object --
'found', 'get_variable',
-- run result object --
- 'compiled', 'returncode', 'stderr', 'stdout',
+ 'compiled', 'returncode', 'stderr', 'stdout'
}
-- A method call must be followed by an opening parenthesis.
-local method = token('method', method_names * #P(l.space^0 * S('(')))
+lex:add_rule('method', token('method', method_names * #(lexer.space^0 * '(')))
+lex:add_style('method', lexer.styles['function'])
-- Function.
-- https://mesonbuild.com/Reference-manual.html#functions
-local func_names = word_match{
- 'add_global_arguments', 'add_global_link_arguments', 'add_languages',
- 'add_project_arguments', 'add_project_link_arguments', 'add_test_setup',
- 'alias_targ', 'assert', 'benchmark', 'both_libraries', 'build_target',
- 'configuration_data', 'configure_file', 'custom_target', 'declare_dependency',
- 'dependency', 'disabler', 'error', 'environment', 'executable',
- 'find_library', 'find_program', 'files', 'generator', 'get_option',
- 'get_variable', 'import', 'include_directories', 'install_data',
- 'install_headers', 'install_man', 'install_subdir', 'is_disabler',
- 'is_variable', 'jar', 'join_paths', 'library', 'message', 'warning',
- 'summary', 'project', 'run_command', 'run_targ', 'set_variable',
- 'shared_library', 'shared_module', 'static_library', 'subdir', 'subdir_done',
- 'subproject', 'test', 'vcs_tag',
+local func_names = word_match{
+ 'add_global_arguments', 'add_global_link_arguments', 'add_languages', 'add_project_arguments',
+ 'add_project_link_arguments', 'add_test_setup', 'alias_targ', 'assert', 'benchmark',
+ 'both_libraries', 'build_target', 'configuration_data', 'configure_file', 'custom_target',
+ 'declare_dependency', 'dependency', 'disabler', 'error', 'environment', 'executable',
+ 'find_library', 'find_program', 'files', 'generator', 'get_option', 'get_variable', 'import',
+ 'include_directories', 'install_data', 'install_headers', 'install_man', 'install_subdir',
+ 'is_disabler', 'is_variable', 'jar', 'join_paths', 'library', 'message', 'warning', 'summary',
+ 'project', 'run_command', 'run_targ', 'set_variable', 'shared_library', 'shared_module',
+ 'static_library', 'subdir', 'subdir_done', 'subproject', 'test', 'vcs_tag'
}
--- A function call must be followed by an opening parenthesis.
--- The matching of function calls instead of just their names is needed to not
--- falsely highlight function names which can also be keyword arguments.
--- For example 'include_directories' can be a function call itself or a keyword
--- argument of an 'executable' or 'library' function call.
-local func = token(l.FUNCTION, func_names * #P(l.space^0 * S('(')))
+-- A function call must be followed by an opening parenthesis. The matching of function calls
+-- instead of just their names is needed to not falsely highlight function names which can also
+-- be keyword arguments. For example 'include_directories' can be a function call itself or a
+-- keyword argument of an 'executable' or 'library' function call.
+lex:add_rule('function', token(lexer.FUNCTION, func_names * #(lexer.space^0 * '(')))
-- Builtin objects.
-- https://mesonbuild.com/Reference-manual.html#builtin-objects
-local object = token('object', word_match{
- 'meson', 'build_machine', 'host_machine', 'target_machine',
-})
+lex:add_rule('object',
+ token('object', word_match('meson build_machine host_machine target_machine')))
+lex:add_style('object', lexer.styles.type)
-- Constants.
-local constant = token(l.CONSTANT, word_match{
- 'false', 'true',
-})
+lex:add_rule('constant', token(lexer.CONSTANT, word_match('false true')))
-- Identifiers.
-local identifier = token(l.IDENTIFIER, l.word)
+lex:add_rule('identifier', token(lexer.IDENTIFIER, lexer.word))
--- Operators.
-local operator = token(l.OPERATOR, S('()[]{}-=+/%:.,?<>'))
+-- Strings.
+local str = lexer.range("'", true)
+local multiline_str = lexer.range("'''")
+lex:add_rule('string', token(lexer.STRING, multiline_str + str))
-M._rules = {
- {'whitespace', ws},
- {'keyword', keyword},
- {'method', method},
- {'function', func},
- {'object', object},
- {'constant', constant},
- {'identifier', identifier},
- {'comment', comment},
- {'string', string},
- {'number', number},
- {'operator', operator},
-}
+-- Comments.
+lex:add_rule('comment', token(lexer.COMMENT, lexer.to_eol('#', true)))
-M._tokenstyles = {
- method = l.STYLE_FUNCTION,
- object = l.STYLE_TYPE,
-}
+-- Numbers.
+local dec = R('19')^1 * R('09')^0
+local bin = '0b' * S('01')^1
+local oct = '0o' * R('07')^1
+local integer = S('+-')^-1 * (bin + lexer.hex_num + oct + dec)
+lex:add_rule('number', token(lexer.NUMBER, integer))
-M._FOLDBYINDENTATION = true
+-- Operators.
+lex:add_rule('operator', token(lexer.OPERATOR, S('()[]{}-=+/%:.,?<>')))
-return M
+return lex