@@ -801,7 +801,7 @@ skip_literal_key(char_u *key)
801801 * Return FAIL when there is no valid key.
802802 */
803803 static int
804- get_literal_key (char_u * * arg , typval_T * tv )
804+ get_literal_key_tv (char_u * * arg , typval_T * tv )
805805{
806806 char_u * p = skip_literal_key (* arg );
807807
@@ -814,6 +814,47 @@ get_literal_key(char_u **arg, typval_T *tv)
814814 return OK ;
815815}
816816
817+ /*
818+ * Get a literal key for a Vim9 dict:
819+ * {"name": value},
820+ * {'name': value},
821+ * {name: value} use "name" as a literal key
822+ * Return the key in allocated memory or NULL in the case of an error.
823+ * "arg" is advanced to just after the key.
824+ */
825+ char_u *
826+ get_literal_key (char_u * * arg )
827+ {
828+ char_u * key ;
829+ char_u * end ;
830+ typval_T rettv ;
831+
832+ if (* * arg == '\'' )
833+ {
834+ if (eval_lit_string (arg , & rettv , TRUE) == FAIL )
835+ return NULL ;
836+ key = rettv .vval .v_string ;
837+ }
838+ else if (* * arg == '"' )
839+ {
840+ if (eval_string (arg , & rettv , TRUE) == FAIL )
841+ return NULL ;
842+ key = rettv .vval .v_string ;
843+ }
844+ else
845+ {
846+ end = skip_literal_key (* arg );
847+ if (end == * arg )
848+ {
849+ semsg (_ (e_invalid_key_str ), * arg );
850+ return NULL ;
851+ }
852+ key = vim_strnsave (* arg , end - * arg );
853+ * arg = end ;
854+ }
855+ return key ;
856+ }
857+
817858/*
818859 * Allocate a variable for a Dictionary and fill it from "*arg".
819860 * "*arg" points to the "{".
@@ -864,10 +905,17 @@ eval_dict(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int literal)
864905 {
865906 int has_bracket = vim9script && * * arg == '[' ;
866907
867- if (literal || (vim9script && !has_bracket ))
908+ if (literal )
909+ {
910+ if (get_literal_key_tv (arg , & tvkey ) == FAIL )
911+ goto failret ;
912+ }
913+ else if (vim9script && !has_bracket )
868914 {
869- if (get_literal_key (arg , & tvkey ) == FAIL )
915+ tvkey .vval .v_string = get_literal_key (arg );
916+ if (tvkey .vval .v_string == NULL )
870917 goto failret ;
918+ tvkey .v_type = VAR_STRING ;
871919 }
872920 else
873921 {
0 commit comments