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.lua107
1 files changed, 55 insertions, 52 deletions
diff --git a/lua/lexers/meson.lua b/lua/lexers/meson.lua
index c224f82..75fe32b 100644
--- a/lua/lexers/meson.lua
+++ b/lua/lexers/meson.lua
@@ -1,23 +1,58 @@
--- Copyright 2020-2022 Florian Fischer. See LICENSE.
+-- Copyright 2020-2024 Florian Fischer. See LICENSE.
-- Meson file LPeg lexer.
-local lexer = require('lexer')
-local token, word_match = lexer.token, lexer.word_match
-local P, R, S = lpeg.P, lpeg.R, lpeg.S
+local lexer = lexer
+local S = lpeg.S
-local lex = lexer.new('meson', {fold_by_indentation = true})
-
--- Whitespace.
-lex:add_rule('whitespace', token(lexer.WHITESPACE, lexer.space^1))
+local lex = lexer.new(..., {fold_by_indentation = true})
-- Keywords.
-lex:add_rule('keyword', token(lexer.KEYWORD, word_match(
- 'and or not if elif else endif foreach break continue endforeach')))
+lex:add_rule('keyword', lex:tag(lexer.KEYWORD, lex:word_match(lexer.KEYWORD)))
--- Methods.
+-- Functions.
-- https://mesonbuild.com/Reference-manual.html#builtin-objects
-- https://mesonbuild.com/Reference-manual.html#returned-objects
-local method_names = word_match{
+local method = lex:tag(lexer.FUNCTION_METHOD, lex:word_match(lexer.FUNCTION_METHOD))
+-- https://mesonbuild.com/Reference-manual.html#functions
+local func = lex:tag(lexer.FUNCTION_BUILTIN, lex:word_match(lexer.FUNCTION_BUILTIN))
+-- 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', (method + func) * #(lexer.space^0 * '('))
+
+-- Builtin objects.
+-- https://mesonbuild.com/Reference-manual.html#builtin-objects
+lex:add_rule('object', lex:tag(lexer.VARIABLE_BUILTIN, lex:word_match(lexer.VARIABLE_BUILTIN)))
+
+-- Constants.
+lex:add_rule('constant', lex:tag(lexer.CONSTANT_BUILTIN, lex:word_match(lexer.CONSTANT_BUILTIN)))
+
+-- Identifiers.
+lex:add_rule('identifier', lex:tag(lexer.IDENTIFIER, lexer.word))
+
+-- Strings.
+local str = lexer.range("'", true)
+local multiline_str = lexer.range("'''")
+lex:add_rule('string', lex:tag(lexer.STRING, multiline_str + str))
+
+-- Comments.
+lex:add_rule('comment', lex:tag(lexer.COMMENT, lexer.to_eol('#', true)))
+
+-- Numbers.
+local oct_num = '0o' * lpeg.R('07')
+local integer = S('+-')^-1 * (lexer.hex_num + lexer.bin_num + oct_num + lexer.dec_num)
+lex:add_rule('number', lex:tag(lexer.NUMBER, integer))
+
+-- Operators.
+lex:add_rule('operator', lex:tag(lexer.OPERATOR, S('()[]{}-=+/%:.,?<>')))
+
+-- Word lists
+lex:set_word_list(lexer.KEYWORD, {
+ 'and', 'or', 'not', 'if', 'elif', 'else', 'endif', 'foreach', 'break', 'continue', 'endforeach'
+})
+
+lex:set_word_list(lexer.FUNCTION_METHOD, {
-- array --
'contains', 'get', 'length',
-- boolean --
@@ -69,14 +104,9 @@ local method_names = word_match{
'found', 'get_variable',
-- run result object --
'compiled', 'returncode', 'stderr', 'stdout'
-}
--- A method call must be followed by an opening parenthesis.
-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{
+lex:set_word_list(lexer.FUNCTION_BUILTIN, {
'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',
@@ -86,41 +116,14 @@ local func_names = word_match{
'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.
-lex:add_rule('function', token(lexer.FUNCTION, func_names * #(lexer.space^0 * '(')))
-
--- Builtin objects.
--- https://mesonbuild.com/Reference-manual.html#builtin-objects
-lex:add_rule('object',
- token('object', word_match('meson build_machine host_machine target_machine')))
-lex:add_style('object', lexer.styles.type)
+})
--- Constants.
-lex:add_rule('constant', token(lexer.CONSTANT, word_match('false true')))
-
--- Identifiers.
-lex:add_rule('identifier', token(lexer.IDENTIFIER, lexer.word))
+lex:set_word_list(lexer.VARIABLE_BUILTIN, {
+ 'meson', 'build_machine', 'host_machine', 'target_machine'
+})
--- Strings.
-local str = lexer.range("'", true)
-local multiline_str = lexer.range("'''")
-lex:add_rule('string', token(lexer.STRING, multiline_str + str))
+lex:set_word_list(lexer.CONSTANT_BUILTIN, {'false', 'true'})
--- Comments.
-lex:add_rule('comment', token(lexer.COMMENT, lexer.to_eol('#', true)))
-
--- 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))
-
--- Operators.
-lex:add_rule('operator', token(lexer.OPERATOR, S('()[]{}-=+/%:.,?<>')))
+lexer.property['scintillua.comment'] = '#'
return lex