diff --git a/languages.toml b/languages.toml
index ea2339f8bae3..fb4cda225059 100644
--- a/languages.toml
+++ b/languages.toml
@@ -1129,7 +1129,7 @@ language-servers = [ "lua-language-server" ]
 
 [[grammar]]
 name = "lua"
-source = { git = "https://github.com/MunifTanjim/tree-sitter-lua", rev = "887dfd4e83c469300c279314ff1619b1d0b85b91" }
+source = { git = "https://github.com/tree-sitter-grammars/tree-sitter-lua", rev = "88e446476a1e97a8724dff7a23e2d709855077f2" }
 
 [[language]]
 name = "svelte"
diff --git a/runtime/queries/lua/highlights.scm b/runtime/queries/lua/highlights.scm
index f48e607c597f..2f3b3c05f6e8 100644
--- a/runtime/queries/lua/highlights.scm
+++ b/runtime/queries/lua/highlights.scm
@@ -1,9 +1,5 @@
 ;;; Highlighting for lua
 
-;;; Builtins
-((identifier) @variable.builtin
- (#eq? @variable.builtin "self"))
-
 ;; Keywords
 
 (if_statement
@@ -130,16 +126,65 @@
 ((identifier) @constant
  (#match? @constant "^[A-Z][A-Z_0-9]*$"))
 
-;; Parameters
-(parameters
-  (identifier) @variable.parameter)
+;; Tables
+
+(field name: (identifier) @variable.other.member)
+
+(dot_index_expression field: (identifier) @variable.other.member)
+
+(table_constructor
+[
+  "{"
+  "}"
+] @constructor)
 
-; ;; Functions
-(function_declaration name: (identifier) @function)
-(function_call name: (identifier) @function.call)
+;; Functions
 
-(function_declaration name: (dot_index_expression field: (identifier) @function))
-(function_call name: (dot_index_expression field: (identifier) @function.call))
+(parameters (identifier) @variable.parameter)
+
+(function_call
+  (identifier) @function.builtin
+  (#any-of? @function.builtin
+    ;; built-in functions in Lua 5.1
+    "assert" "collectgarbage" "dofile" "error" "getfenv" "getmetatable" "ipairs"
+    "load" "loadfile" "loadstring" "module" "next" "pairs" "pcall" "print"
+    "rawequal" "rawget" "rawset" "require" "select" "setfenv" "setmetatable"
+    "tonumber" "tostring" "type" "unpack" "xpcall"))
+
+(function_declaration
+  name: [
+    (identifier) @function
+    (dot_index_expression
+      field: (identifier) @function)
+  ])
+
+(function_declaration
+  name: (method_index_expression
+    method: (identifier) @function.method))
+
+(assignment_statement
+  (variable_list .
+    name: [
+      (identifier) @function
+      (dot_index_expression
+        field: (identifier) @function)
+    ])
+  (expression_list .
+    value: (function_definition)))
+
+(table_constructor
+  (field
+    name: (identifier) @function
+    value: (function_definition)))
+
+(function_call
+  name: [
+    (identifier) @function.call
+    (dot_index_expression
+      field: (identifier) @function.call)
+    (method_index_expression
+      method: (identifier) @function.method.call)
+  ])
 
 ; TODO: incorrectly highlights variable N in `N, nop = 42, function() end`
 (assignment_statement
@@ -153,6 +198,7 @@
 ;; Nodes
 (comment) @comment
 (string) @string
+(escape_sequence) @constant.character.escape
 (number) @constant.numeric.integer
 (label_statement) @label
 ; A bit of a tricky one, this will only match field names
@@ -162,7 +208,16 @@
 ;; Property
 (dot_index_expression field: (identifier) @variable.other.member)
 
-;; Variable
+;; Variables
+((identifier) @variable.builtin
+ (#eq? @variable.builtin "self"))
+
+(variable_list
+  (attribute
+    "<" @punctuation.bracket
+    (identifier) @attribute
+    ">" @punctuation.bracket))
+
 (identifier) @variable
 
 ;; Error