From: Dmitry Gutov Date: Fri, 20 Jan 2023 01:56:44 +0000 (+0200) Subject: ruby-ts-mode: Highlight builtin methods X-Git-Tag: emacs-29.0.90~654 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=d66ac5285f72e0343d1cc6aae2db70a00b35feed;p=emacs.git ruby-ts-mode: Highlight builtin methods * lisp/progmodes/ruby-mode.el (ruby-builtin-methods-with-reqs) (ruby-builtin-methods-no-reqs): New constants, extracted. (ruby-font-lock-keywords): Replace values with references. * lisp/progmodes/ruby-ts-mode.el (ruby-ts--builtin-methods): New variable. Construct regexp from aforementioned constants' values. * lisp/progmodes/ruby-ts-mode.el (ruby-ts--font-lock-settings): Use it. * lisp/progmodes/ruby-ts-mode.el (ruby-ts-mode): Add new font-lock feature: builtin-functions. * lisp/progmodes/ruby-ts-mode.el (ruby-ts--predefined-constants) (ruby-ts--predefined-variables): Unrelated to the rest of the patch, add string-start and string-end anchors. --- diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el index 2de7395f765..6e524693e37 100644 --- a/lisp/progmodes/ruby-mode.el +++ b/lisp/progmodes/ruby-mode.el @@ -141,6 +141,81 @@ This should only be called after matching against `ruby-here-doc-beg-re'." It should match the part after \"def\" and until \"=\".") +(defconst ruby-builtin-methods-with-reqs + '( ;; built-in methods on Kernel + "at_exit" + "autoload" + "autoload?" + "callcc" + "catch" + "eval" + "exec" + "format" + "lambda" + "load" + "loop" + "open" + "p" + "printf" + "proc" + "putc" + "require" + "require_relative" + "spawn" + "sprintf" + "syscall" + "system" + "throw" + "trace_var" + "trap" + "untrace_var" + "warn" + ;; keyword-like private methods on Module + "alias_method" + "attr" + "attr_accessor" + "attr_reader" + "attr_writer" + "define_method" + "extend" + "include" + "module_function" + "prepend" + "private_class_method" + "private_constant" + "public_class_method" + "public_constant" + "refine" + "using") + "List of built-in methods that require at least one argument.") + +(defconst ruby-builtin-methods-no-reqs + '("__callee__" + "__dir__" + "__method__" + "abort" + "binding" + "block_given?" + "caller" + "exit" + "exit!" + "fail" + "fork" + "global_variables" + "local_variables" + "print" + "private" + "protected" + "public" + "puts" + "raise" + "rand" + "readline" + "readlines" + "sleep" + "srand") + "List of built-in methods that only have optional arguments.") + (defvar ruby-use-smie t) (make-obsolete-variable 'ruby-use-smie nil "28.1") @@ -2292,84 +2367,13 @@ It will be properly highlighted even when the call omits parens.") ;; Core methods that have required arguments. (,(concat ruby-font-lock-keyword-beg-re - (regexp-opt - '( ;; built-in methods on Kernel - "at_exit" - "autoload" - "autoload?" - "callcc" - "catch" - "eval" - "exec" - "format" - "lambda" - "load" - "loop" - "open" - "p" - "printf" - "proc" - "putc" - "require" - "require_relative" - "spawn" - "sprintf" - "syscall" - "system" - "throw" - "trace_var" - "trap" - "untrace_var" - "warn" - ;; keyword-like private methods on Module - "alias_method" - "attr" - "attr_accessor" - "attr_reader" - "attr_writer" - "define_method" - "extend" - "include" - "module_function" - "prepend" - "private_class_method" - "private_constant" - "public_class_method" - "public_constant" - "refine" - "using") - 'symbols)) + (regexp-opt ruby-builtin-methods-with-reqs 'symbols)) (1 (unless (looking-at " *\\(?:[]|,.)}=]\\|$\\)") font-lock-builtin-face))) ;; Kernel methods that have no required arguments. (,(concat ruby-font-lock-keyword-beg-re - (regexp-opt - '("__callee__" - "__dir__" - "__method__" - "abort" - "binding" - "block_given?" - "caller" - "exit" - "exit!" - "fail" - "fork" - "global_variables" - "local_variables" - "print" - "private" - "protected" - "public" - "puts" - "raise" - "rand" - "readline" - "readlines" - "sleep" - "srand") - 'symbols)) + (regexp-opt ruby-builtin-methods-no-reqs 'symbols)) (1 font-lock-builtin-face)) ;; Here-doc beginnings. (,ruby-here-doc-beg-re diff --git a/lisp/progmodes/ruby-ts-mode.el b/lisp/progmodes/ruby-ts-mode.el index da2d00ce168..f365ca7f8c2 100644 --- a/lisp/progmodes/ruby-ts-mode.el +++ b/lisp/progmodes/ruby-ts-mode.el @@ -116,21 +116,30 @@ "Ruby's punctuation characters.") (defvar ruby-ts--predefined-constants - (rx (or "ARGF" "ARGV" "DATA" "ENV" "RUBY_COPYRIGHT" + (rx string-start + (or "ARGF" "ARGV" "DATA" "ENV" "RUBY_COPYRIGHT" "RUBY_DESCRIPTION" "RUBY_ENGINE" "RUBY_ENGINE_VERSION" "RUBY_PATCHLEVEL" "RUBY_PLATFORM" "RUBY_RELEASE_DATE" "RUBY_REVISION" "RUBY_VERSION" "STDERR" "STDIN" "STDOUT" - "TOPLEVEL_BINDING")) + "TOPLEVEL_BINDING") + string-end) "Ruby predefined global constants.") (defvar ruby-ts--predefined-variables - (rx (or "$!" "$@" "$~" "$&" "$‘" "$‘" "$+" "$=" "$/" "$\\" "$," "$;" + (rx string-start + (or "$!" "$@" "$~" "$&" "$‘" "$‘" "$+" "$=" "$/" "$\\" "$," "$;" "$." "$<" "$>" "$_" "$*" "$$" "$?" "$:" "$LOAD_PATH" "$LOADED_FEATURES" "$DEBUG" "$FILENAME" "$stderr" "$stdin" "$stdout" "$VERBOSE" "$-a" "$-i" "$-l" "$-p" - (seq "$" (+ digit)))) + (seq "$" (+ digit))) + string-end) "Ruby predefined global variables.") +(defvar ruby-ts--builtin-methods + (format "\\`%s\\'" (regexp-opt (append ruby-builtin-methods-no-reqs + ruby-builtin-methods-with-reqs))) + "Ruby built-in methods.") + (defconst ruby-ts--class-or-module-regex (rx string-start (or "class" "module" "singleton_class") @@ -324,6 +333,12 @@ values of OVERRIDE" (in_clause pattern: (identifier) @font-lock-variable-name-face)) + :language language + :feature 'builtin-functions + `((((identifier) @font-lock-builtin-face) + (:match ,ruby-ts--builtin-methods + @font-lock-builtin-face))) + ;; Yuan recommends also putting method definitions into the ;; 'function' category (thus keeping it in both). I've opted to ;; just use separate categories for them -- dgutov. @@ -1022,9 +1037,9 @@ leading double colon is not added." (setq-local treesit-font-lock-feature-list '(( comment method-definition parameter-definition) ( keyword regexp string type) - ( builtin-variable builtin-constant constant + ( builtin-variable builtin-constant builtin-functions delimiter escape-sequence - global instance + constant global instance interpolation literal symbol assignment) ( bracket error function operator punctuation)))