Mercurial > vim
diff src/vim9class.c @ 31649:520857d1fda7 v9.0.1157
patch 9.0.1157: "implements" only handles one interface name
Commit: https://github.com/vim/vim/commit/df8f9473596c8fb18ec893de677dba455e8925b3
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Jan 7 14:51:03 2023 +0000
patch 9.0.1157: "implements" only handles one interface name
Problem: "implements" only handles one interface name.
Solution: Handle a comma separated list of names. Check for duplicate
names.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 07 Jan 2023 16:00:05 +0100 |
parents | 68a9375d4ca3 |
children | ec76f9d2319e |
line wrap: on
line diff
--- a/src/vim9class.c +++ b/src/vim9class.c @@ -245,22 +245,45 @@ ex_class(exarg_T *eap) // specifies SomeInterface if (STRNCMP(arg, "implements", 10) == 0 && IS_WHITE_OR_NUL(arg[10])) { - arg = skipwhite(arg + 10); - char_u *impl_end = find_name_end(arg, NULL, NULL, FNE_CHECK_START); - if (!IS_WHITE_OR_NUL(*impl_end)) + if (ga_impl.ga_len > 0) { - semsg(_(e_white_space_required_after_name_str), arg); + emsg(_(e_duplicate_implements)); goto early_ret; } - char_u *iname = vim_strnsave(arg, impl_end - arg); - if (iname == NULL) - goto early_ret; - if (ga_add_string(&ga_impl, iname) == FAIL) + arg = skipwhite(arg + 10); + + for (;;) { - vim_free(iname); - goto early_ret; + char_u *impl_end = find_name_end(arg, NULL, NULL, + FNE_CHECK_START); + if (!IS_WHITE_OR_NUL(*impl_end) && *impl_end != ',') + { + semsg(_(e_white_space_required_after_name_str), arg); + goto early_ret; + } + char_u *iname = vim_strnsave(arg, impl_end - arg); + if (iname == NULL) + goto early_ret; + for (int i = 0; i < ga_impl.ga_len; ++i) + if (STRCMP(((char_u **)ga_impl.ga_data)[i], iname) == 0) + { + semsg(_(e_duplicate_interface_after_implements_str), + iname); + vim_free(iname); + goto early_ret; + } + if (ga_add_string(&ga_impl, iname) == FAIL) + { + vim_free(iname); + goto early_ret; + } + if (*impl_end != ',') + { + arg = skipwhite(impl_end); + break; + } + arg = skipwhite(impl_end + 1); } - arg = skipwhite(impl_end); } else {