INIT(= N_("E1348: Member \"%s\" of interface \"%s\" not implemented"));
EXTERN char e_function_str_of_interface_str_not_implemented[]
INIT(= N_("E1349: Function \"%s\" of interface \"%s\" not implemented"));
+EXTERN char e_duplicate_implements[]
+ INIT(= N_("E1350: Duplicate \"implements\""));
+EXTERN char e_duplicate_interface_after_implements_str[]
+ INIT(= N_("E1351: Duplicate interface after \"implements\": %s"));
#endif
echo nr
enddef
endclass
+
+ interface Another
+ this.member: string
+ endinterface
+
+ class SomeImpl implements Some, Another
+ this.member = 'abc'
+ static count: number
+ def Method(nr: number)
+ echo nr
+ enddef
+ endclass
+
END
v9.CheckScriptSuccess(lines)
+ lines =<< trim END
+ vim9script
+
+ interface Some
+ static counter: number
+ endinterface
+
+ class SomeImpl implements Some implements Some
+ static count: number
+ endclass
+ END
+ v9.CheckScriptFailure(lines, 'E1350:')
+
+ lines =<< trim END
+ vim9script
+
+ interface Some
+ static counter: number
+ endinterface
+
+ class SomeImpl implements Some, Some
+ static count: number
+ endclass
+ END
+ v9.CheckScriptFailure(lines, 'E1351: Duplicate interface after "implements": Some')
+
lines =<< trim END
vim9script
// 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
{