summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2023-01-27 13:16:19 +0000
committerBram Moolenaar <Bram@vim.org>2023-01-27 13:16:19 +0000
commit657aea7fc47fb919ce76fad64ba0ec55a1af80f1 (patch)
treec2d3c2d2dd3e8eba5c54545464e2b7476eda7dfe
parent53f54e49b7152e93d09ff77406f7eb63b3b5f732 (diff)
downloadvim-git-657aea7fc47fb919ce76fad64ba0ec55a1af80f1.tar.gz
patch 9.0.1249: cannot export an abstract classv9.0.1249
Problem: Cannot export an abstract class. (Ernie Rael) Solution: Add the EX_EXPORT flag to :abstract. (closes #11884)
-rw-r--r--src/errors.h2
-rw-r--r--src/ex_cmds.h2
-rw-r--r--src/testdir/test_vim9_class.vim32
-rw-r--r--src/version.c2
-rw-r--r--src/vim9class.c2
5 files changed, 38 insertions, 2 deletions
diff --git a/src/errors.h b/src/errors.h
index 3b54f1d9f..336c187d6 100644
--- a/src/errors.h
+++ b/src/errors.h
@@ -3442,4 +3442,6 @@ EXTERN char e_using_super_not_in_child_class[]
INIT(= N_("E1358: Using \"super\" not in a child class"));
EXTERN char e_cannot_define_new_function_in_abstract_class[]
INIT(= N_("E1359: Cannot define a \"new\" function in an abstract class"));
+EXTERN char e_invalid_command_str_expected_str[]
+ INIT(= N_("E476: Invalid command: %s, expected %s"));
#endif
diff --git a/src/ex_cmds.h b/src/ex_cmds.h
index 7e127221d..325fee569 100644
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -128,7 +128,7 @@ EXCMD(CMD_aboveleft, "aboveleft", ex_wrongmodifier,
EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM,
ADDR_NONE),
EXCMD(CMD_abstract, "abstract", ex_class,
- EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
+ EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK|EX_EXPORT,
ADDR_NONE),
EXCMD(CMD_all, "all", ex_all,
EX_BANG|EX_RANGE|EX_COUNT|EX_TRLBAR,
diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim
index 5edd511a3..a496b6d7d 100644
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -164,6 +164,24 @@ def Test_class_basic()
v9.CheckScriptSuccess(lines)
enddef
+def Test_class_interface_wrong_end()
+ var lines =<< trim END
+ vim9script
+ abstract class SomeName
+ this.member = 'text'
+ endinterface
+ END
+ v9.CheckScriptFailure(lines, 'E476: Invalid command: endinterface, expected endclass')
+
+ lines =<< trim END
+ vim9script
+ export interface AnotherName
+ this.member: string
+ endclass
+ END
+ v9.CheckScriptFailure(lines, 'E476: Invalid command: endclass, expected endinterface')
+enddef
+
def Test_class_member_initializer()
var lines =<< trim END
vim9script
@@ -845,6 +863,20 @@ def Test_interface_basics()
enddef
END
v9.CheckScriptSuccess(lines)
+
+ var imported =<< trim END
+ vim9script
+ export abstract class EnterExit
+ def Enter(): void
+ enddef
+ def Exit(): void
+ enddef
+ endclass
+ END
+ writefile(imported, 'XdefIntf2.vim', 'D')
+
+ lines[1] = " import './XdefIntf2.vim' as defIntf"
+ v9.CheckScriptSuccess(lines)
enddef
def Test_class_implements_interface()
diff --git a/src/version.c b/src/version.c
index 52502b525..cb304edec 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1249,
+/**/
1248,
/**/
1247,
diff --git a/src/vim9class.c b/src/vim9class.c
index 484500576..d64e35ec0 100644
--- a/src/vim9class.c
+++ b/src/vim9class.c
@@ -423,7 +423,7 @@ early_ret:
char *wrong_name = is_class ? "endinterface" : "endclass";
if (checkforcmd(&p, wrong_name, is_class ? 5 : 4))
{
- semsg(_(e_invalid_command_str), line);
+ semsg(_(e_invalid_command_str_expected_str), line, end_name);
break;
}