runtime(python): support 'type's soft keyword form

Commit: 
https://github.com/vim/vim/commit/99964e2ea704465f25207c519fefb2bb6d6931bb
Author: Jon Parise <j...@indelible.org>
Date:   Sun Aug 24 12:31:08 2025 +0200

    runtime(python): support 'type's soft keyword form
    
    `type` became a soft keyword in Python 3.12. In that form, it is a
    statement that declares a type alias:
    
        # type_stmt ::= 'type' identifier [type_params] "=" expression
        type Point = tuple[float, float]
    
    To implement support for this, this change does three things:
    
    1. adds a `pythonType` group (linked to `Type`)
    2. matches `type` followed by an identifier as `pythonStatement`
    3. continues to match `type` in other forms as `pythonBuiltin`
    
    Ref:
    - https://docs.python.org/3/reference/lexical_analysis.html#soft-keywords
    - https://docs.python.org/3/reference/simple_stmts.html#the-type-statement
    
    closes: #18090
    
    Signed-off-by: Jon Parise <j...@indelible.org>
    Signed-off-by: Zvezdan Petkovic <zpetko...@acm.org>
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/runtime/syntax/python.vim b/runtime/syntax/python.vim
index 320fd785c..e963155d4 100644
--- a/runtime/syntax/python.vim
+++ b/runtime/syntax/python.vim
@@ -1,10 +1,11 @@
 " Vim syntax file
 " Language:    Python
 " Maintainer:  Zvezdan Petkovic <zpetko...@acm.org>
-" Last Change: 2025 Aug 18
+" Last Change: 2025 Aug 23
 " Credits:     Neil Schemenauer <n...@python.ca>
 "              Dmitry Vasiliev
 "              Rob B
+"              Jon Parise
 "
 "              This version is a major rewrite by Zvezdan Petkovic.
 "
@@ -112,6 +113,7 @@ syn keyword pythonAsync             async await
 " for more on this.
 syn match   pythonConditional   "^\s*\zscase\%(\s\+.*:.*$\)\@="
 syn match   pythonConditional   "^\s*\zsmatch\%(\s\+.*:\s*\%(#.*\)\=$\)\@="
+syn match   pythonStatement     "\<type\ze\s\+\h\w*" nextgroup=pythonType 
skipwhite
 
 " These names are special by convention. While they aren't real keywords,
 " giving them distinct highlighting provides a nice visual cue.
@@ -128,22 +130,23 @@ syn match   pythonDecoratorName   "@\s*\h\%(\w\|\.\)*" 
display contains=pythonDeco
 " Single line multiplication.
 syn match   pythonMatrixMultiply
       \ "\%(\w\|[])]\)\s*@"
-      \ 
contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonClass,pythonFunction,pythonDoctestValue
+      \ 
contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonClass,pythonFunction,pythonType,pythonDoctestValue
       \ transparent
 " Multiplication continued on the next line after backslash.
 syn match   pythonMatrixMultiply
       \ "[^\]\\s*
\%(\s*\.\.\.\s\)\=\s\+@"
-      \ 
contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonClass,pythonFunction,pythonDoctestValue
+      \ 
contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonClass,pythonFunction,pythonType,pythonDoctestValue
       \ transparent
 " Multiplication in a parenthesized expression over multiple lines with @ at
 " the start of each continued line; very similar to decorators and complex.
 syn match   pythonMatrixMultiply
       \ 
"^\s*\%(\%(>>>\|\.\.\.\)\s\+\)\=\zs\%(\h\|\%(\h\|[[(]\).\{-}\%(\w\|[])]\)\)\s*
\%(\s*\.\.\.\s\)\=\s\+@\%(.\{-}
\%(\s*\.\.\.\s\)\=\s\+@\)*"
-      \ 
contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonClass,pythonFunction,pythonDoctestValue
+      \ 
contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonClass,pythonFunction,pythonType,pythonDoctestValue
       \ transparent
 
 syn match   pythonClass                "\h\w*" display contained
 syn match   pythonFunction     "\h\w*" display contained
+syn match   pythonType         "\h\w*" display contained
 
 syn match   pythonComment      "#.*$" contains=pythonTodo,@Spell
 syn keyword pythonTodo         FIXME NOTE NOTES TODO XXX contained
@@ -300,10 +303,12 @@ if !exists("python_no_builtin_highlight")
   syn keyword pythonBuiltin    memoryview min next object oct open ord pow
   syn keyword pythonBuiltin    print property range repr reversed round set
   syn keyword pythonBuiltin    setattr slice sorted staticmethod str sum super
-  syn keyword pythonBuiltin    tuple type vars zip __import__
+  syn keyword pythonBuiltin    tuple vars zip __import__
+  " only match `type` as a builtin when it's not followed by an identifier
+  syn match   pythonBuiltin    "\<type\ze\(\s\+\h\w*\)\@!"
   " avoid highlighting attributes as builtins
   syn match   pythonAttribute  /\.\h\w*/hs=s+1
-       \ contains=ALLBUT,pythonBuiltin,pythonClass,pythonFunction,pythonAsync
+       \ 
contains=ALLBUT,pythonBuiltin,pythonClass,pythonFunction,pythonType,pythonAsync
        \ transparent
 endif
 
@@ -360,7 +365,7 @@ if !exists("python_no_doctest_highlight")
   if !exists("python_no_doctest_code_highlight")
     syn region pythonDoctest
          \ start="^\s*>>>\s" end="^\s*$"
-         \ contained 
contains=ALLBUT,pythonDoctest,pythonClass,pythonFunction,@Spell
+         \ contained 
contains=ALLBUT,pythonDoctest,pythonClass,pythonFunction,pythonType,@Spell
     syn region pythonDoctestValue
          \ start=+^\s*\%(>>>\s\|\.\.\.\s\|"""\|'''\)\@!\S\++ end="$"
          \ contained
@@ -387,6 +392,7 @@ hi def link pythonDecorator         Define
 hi def link pythonDecoratorName                Function
 hi def link pythonClass                        Structure
 hi def link pythonFunction             Function
+hi def link pythonType                 Type
 hi def link pythonComment              Comment
 hi def link pythonTodo                 Todo
 hi def link pythonString               String

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/E1uq8Df-00Ghzx-Bh%40256bit.org.

Raspunde prin e-mail lui