Skip to content

Commit cd09a56

Browse files
author
Luma
committed
make
1 parent f7f49e9 commit cd09a56

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

js/vimlparser.js

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,7 @@ function ExArg() {
488488
// node rest
489489
// node[] list
490490
// node[] rlist
491+
// node[] default_args
491492
// node[] body
492493
// string op
493494
// string str
@@ -497,7 +498,7 @@ function ExArg() {
497498
// TOPLEVEL .body
498499
// COMMENT .str
499500
// EXCMD .ea .str
500-
// FUNCTION .ea .body .left .rlist .attr .endfunction
501+
// FUNCTION .ea .body .left .rlist .default_args .attr .endfunction
501502
// ENDFUNCTION .ea
502503
// DELFUNCTION .ea .left
503504
// RETURN .ea .left
@@ -1639,6 +1640,7 @@ VimLParser.prototype.parse_cmd_function = function() {
16391640
node.ea = this.ea;
16401641
node.left = left;
16411642
node.rlist = [];
1643+
node.default_args = [];
16421644
node.attr = {"range":0, "abort":0, "dict":0, "closure":0};
16431645
node.endfunction = NIL;
16441646
this.reader.getn(1);
@@ -1662,6 +1664,13 @@ VimLParser.prototype.parse_cmd_function = function() {
16621664
varnode.pos = token.pos;
16631665
varnode.value = token.value;
16641666
viml_add(node.rlist, varnode);
1667+
if (tokenizer.peek().type == TOKEN_EQ) {
1668+
tokenizer.get();
1669+
viml_add(node.default_args, this.parse_expr());
1670+
}
1671+
else if (viml_len(node.default_args) > 0) {
1672+
throw Err("E989: Non-default argument follows default argument", varnode.pos);
1673+
}
16651674
// XXX: Vim doesn't skip white space before comma. F(a ,b) => E475
16661675
if (iswhite(this.reader.p(0)) && tokenizer.peek().type == TOKEN_COMMA) {
16671676
throw Err("E475: Invalid argument: White space is not allowed before comma", this.reader.getpos());
@@ -4465,14 +4474,18 @@ Compiler.prototype.compile_excmd = function(node) {
44654474
Compiler.prototype.compile_function = function(node) {
44664475
var left = this.compile(node.left);
44674476
var rlist = node.rlist.map((function(vval) { return this.compile(vval); }).bind(this));
4477+
var default_args = node.default_args.map((function(vval) { return this.compile(vval); }).bind(this));
44684478
if (!viml_empty(rlist) && rlist[rlist.length - 1] == "...") {
44694479
rlist[rlist.length - 1] = ". ...";
44704480
}
44714481
if (viml_empty(rlist)) {
44724482
this.out("(function (%s)", left);
44734483
}
4484+
else if (viml_empty(default_args)) {
4485+
this.out("(function (%s) (%s)", left, viml_join(rlist, " "));
4486+
}
44744487
else {
4475-
this.out("(function (%s %s)", left, viml_join(rlist, " "));
4488+
this.out("(function (%s) (%s) (%s)", left, viml_join(rlist, " "), viml_join(default_args, " "));
44764489
}
44774490
this.incindent(" ");
44784491
this.compile_body(node.body);

py/vimlparser.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,7 @@ def ExArg():
476476
# node rest
477477
# node[] list
478478
# node[] rlist
479+
# node[] default_args
479480
# node[] body
480481
# string op
481482
# string str
@@ -485,7 +486,7 @@ def ExArg():
485486
# TOPLEVEL .body
486487
# COMMENT .str
487488
# EXCMD .ea .str
488-
# FUNCTION .ea .body .left .rlist .attr .endfunction
489+
# FUNCTION .ea .body .left .rlist .default_args .attr .endfunction
489490
# ENDFUNCTION .ea
490491
# DELFUNCTION .ea .left
491492
# RETURN .ea .left
@@ -1352,6 +1353,7 @@ def parse_cmd_function(self):
13521353
node.ea = self.ea
13531354
node.left = left
13541355
node.rlist = []
1356+
node.default_args = []
13551357
node.attr = AttributeDict({"range": 0, "abort": 0, "dict": 0, "closure": 0})
13561358
node.endfunction = NIL
13571359
self.reader.getn(1)
@@ -1372,6 +1374,11 @@ def parse_cmd_function(self):
13721374
varnode.pos = token.pos
13731375
varnode.value = token.value
13741376
viml_add(node.rlist, varnode)
1377+
if tokenizer.peek().type == TOKEN_EQ:
1378+
tokenizer.get()
1379+
viml_add(node.default_args, self.parse_expr())
1380+
elif viml_len(node.default_args) > 0:
1381+
raise VimLParserException(Err("E989: Non-default argument follows default argument", varnode.pos))
13751382
# XXX: Vim doesn't skip white space before comma. F(a ,b) => E475
13761383
if iswhite(self.reader.p(0)) and tokenizer.peek().type == TOKEN_COMMA:
13771384
raise VimLParserException(Err("E475: Invalid argument: White space is not allowed before comma", self.reader.getpos()))
@@ -3574,12 +3581,15 @@ def compile_excmd(self, node):
35743581
def compile_function(self, node):
35753582
left = self.compile(node.left)
35763583
rlist = [self.compile(vval) for vval in node.rlist]
3584+
default_args = [self.compile(vval) for vval in node.default_args]
35773585
if not viml_empty(rlist) and rlist[-1] == "...":
35783586
rlist[-1] = ". ..."
35793587
if viml_empty(rlist):
35803588
self.out("(function (%s)", left)
3589+
elif viml_empty(default_args):
3590+
self.out("(function (%s) (%s)", left, viml_join(rlist, " "))
35813591
else:
3582-
self.out("(function (%s %s)", left, viml_join(rlist, " "))
3592+
self.out("(function (%s) (%s) (%s)", left, viml_join(rlist, " "), viml_join(default_args, " "))
35833593
self.incindent(" ")
35843594
self.compile_body(node.body)
35853595
self.out(")")

0 commit comments

Comments
 (0)