Skip to content

Commit ea5ca7b

Browse files
author
Luma
committed
Change the behavior of the compiler for fucntion args
1 parent 3bb689f commit ea5ca7b

File tree

5 files changed

+65
-43
lines changed

5 files changed

+65
-43
lines changed

autoload/vimlparser.vim

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4971,16 +4971,24 @@ function! s:Compiler.compile_function(node) abort
49714971
let left = self.compile(a:node.left)
49724972
let rlist = map(a:node.rlist, 'self.compile(v:val)')
49734973
let default_args = map(a:node.default_args, 'self.compile(v:val)')
4974-
if !empty(rlist) && rlist[-1] ==# '...'
4975-
let rlist[-1] = '. ...'
4976-
endif
4977-
if empty(rlist)
4978-
call self.out('(function (%s)', left)
4979-
elseif empty(default_args)
4980-
call self.out('(function (%s (%s))', left, join(rlist, ' '))
4981-
else
4982-
call self.out('(function (%s (%s) (%s))', left, join(rlist, ' '), join(default_args, ' '))
4974+
if !empty(rlist)
4975+
let remaining = v:false
4976+
if rlist[-1] ==# '...'
4977+
call remove(rlist, -1)
4978+
let remaining = v:true
4979+
endif
4980+
for i in range(len(rlist))
4981+
if i < len(rlist) - len(default_args)
4982+
let left .= printf(' (%s)', rlist[i])
4983+
else
4984+
let left .= printf(' (%s %s)', rlist[i], default_args[i + len(default_args) - len(rlist)])
4985+
endif
4986+
endfor
4987+
if remaining
4988+
let left .= ' . ...'
4989+
endif
49834990
endif
4991+
call self.out('(function (%s)', left)
49844992
call self.incindent(' ')
49854993
call self.compile_body(a:node.body)
49864994
call self.out(')')

js/vimlparser.js

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4475,18 +4475,27 @@ Compiler.prototype.compile_function = function(node) {
44754475
var left = this.compile(node.left);
44764476
var rlist = node.rlist.map((function(vval) { return this.compile(vval); }).bind(this));
44774477
var default_args = node.default_args.map((function(vval) { return this.compile(vval); }).bind(this));
4478-
if (!viml_empty(rlist) && rlist[rlist.length - 1] == "...") {
4479-
rlist[rlist.length - 1] = ". ...";
4480-
}
4481-
if (viml_empty(rlist)) {
4482-
this.out("(function (%s)", left);
4483-
}
4484-
else if (viml_empty(default_args)) {
4485-
this.out("(function (%s (%s))", left, viml_join(rlist, " "));
4486-
}
4487-
else {
4488-
this.out("(function (%s (%s) (%s))", left, viml_join(rlist, " "), viml_join(default_args, " "));
4478+
if (!viml_empty(rlist)) {
4479+
var remaining = v:false;
4480+
if (rlist[rlist.length - 1] == "...") {
4481+
viml_remove(rlist, -1);
4482+
var remaining = v:true;
4483+
}
4484+
var __c11 = viml_range(viml_len(rlist));
4485+
for (var __i11 = 0; __i11 < __c11.length; ++__i11) {
4486+
var i = __c11[__i11];
4487+
if (i < viml_len(rlist) - viml_len(default_args)) {
4488+
left += viml_printf(" (%s)", rlist[i]);
4489+
}
4490+
else {
4491+
left += viml_printf(" (%s %s)", rlist[i], default_args[i + viml_len(default_args) - viml_len(rlist)]);
4492+
}
4493+
}
4494+
if (remaining) {
4495+
left += " . ...";
4496+
}
44894497
}
4498+
this.out("(function (%s)", left);
44904499
this.incindent(" ");
44914500
this.compile_body(node.body);
44924501
this.out(")");
@@ -4573,9 +4582,9 @@ Compiler.prototype.compile_if = function(node) {
45734582
this.incindent(" ");
45744583
this.compile_body(node.body);
45754584
this.decindent();
4576-
var __c11 = node.elseif;
4577-
for (var __i11 = 0; __i11 < __c11.length; ++__i11) {
4578-
var enode = __c11[__i11];
4585+
var __c12 = node.elseif;
4586+
for (var __i12 = 0; __i12 < __c12.length; ++__i12) {
4587+
var enode = __c12[__i12];
45794588
this.out(" elseif %s", this.compile(enode.cond));
45804589
this.incindent(" ");
45814590
this.compile_body(enode.body);
@@ -4632,9 +4641,9 @@ Compiler.prototype.compile_try = function(node) {
46324641
this.out("(try");
46334642
this.incindent(" ");
46344643
this.compile_body(node.body);
4635-
var __c12 = node.catch;
4636-
for (var __i12 = 0; __i12 < __c12.length; ++__i12) {
4637-
var cnode = __c12[__i12];
4644+
var __c13 = node.catch;
4645+
for (var __i13 = 0; __i13 < __c13.length; ++__i13) {
4646+
var cnode = __c13[__i13];
46384647
if (cnode.pattern !== NIL) {
46394648
this.decindent();
46404649
this.out(" catch /%s/", cnode.pattern);
@@ -5628,9 +5637,9 @@ RegexpParser.prototype.get_token_sq_char_class = function() {
56285637
var r = this.reader.read_alpha();
56295638
if (this.reader.p(0) == ":" && this.reader.p(1) == "]") {
56305639
this.reader.seek_cur(2);
5631-
var __c13 = class_names;
5632-
for (var __i13 = 0; __i13 < __c13.length; ++__i13) {
5633-
var name = __c13[__i13];
5640+
var __c14 = class_names;
5641+
for (var __i14 = 0; __i14 < __c14.length; ++__i14) {
5642+
var name = __c14[__i14];
56345643
if (r == name) {
56355644
return "[:" + name + ":]";
56365645
}
@@ -5763,9 +5772,9 @@ RegexpParser.prototype.getoctchrs = function() {
57635772

57645773
RegexpParser.prototype.gethexchrs = function(n) {
57655774
var r = "";
5766-
var __c14 = viml_range(n);
5767-
for (var __i14 = 0; __i14 < __c14.length; ++__i14) {
5768-
var i = __c14[__i14];
5775+
var __c15 = viml_range(n);
5776+
for (var __i15 = 0; __i15 < __c15.length; ++__i15) {
5777+
var i = __c15[__i15];
57695778
var c = this.reader.peek();
57705779
if (!isxdigit(c)) {
57715780
break;

py/vimlparser.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3582,14 +3582,19 @@ def compile_function(self, node):
35823582
left = self.compile(node.left)
35833583
rlist = [self.compile(vval) for vval in node.rlist]
35843584
default_args = [self.compile(vval) for vval in node.default_args]
3585-
if not viml_empty(rlist) and rlist[-1] == "...":
3586-
rlist[-1] = ". ..."
3587-
if viml_empty(rlist):
3588-
self.out("(function (%s)", left)
3589-
elif viml_empty(default_args):
3590-
self.out("(function (%s (%s))", left, viml_join(rlist, " "))
3591-
else:
3592-
self.out("(function (%s (%s) (%s))", left, viml_join(rlist, " "), viml_join(default_args, " "))
3585+
if not viml_empty(rlist):
3586+
remaining = v:false
3587+
if rlist[-1] == "...":
3588+
viml_remove(rlist, -1)
3589+
remaining = v:true
3590+
for i in viml_range(viml_len(rlist)):
3591+
if i < viml_len(rlist) - viml_len(default_args):
3592+
left += viml_printf(" (%s)", rlist[i])
3593+
else:
3594+
left += viml_printf(" (%s %s)", rlist[i], default_args[i + viml_len(default_args) - viml_len(rlist)])
3595+
if remaining:
3596+
left += " . ..."
3597+
self.out("(function (%s)", left)
35933598
self.incindent(" ")
35943599
self.compile_body(node.body)
35953600
self.out(")")

test/test1.ok

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
; test1
2-
(function (s:foo (a b . ...))
2+
(function (s:foo (a) (b) . ...)
33
(return 0))
4-
(function (s:bar (a b . ...) (1 2))
4+
(function (s:bar (a 1) (b 2) . ...)
55
(return 0))
66
(if 1
77
(echo "if 1")

test/test_funcarg.ok

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
(function (X (foo) ((+ 1 2)))
1+
(function (X (foo (+ 1 2)))
22
(return a:foo))

0 commit comments

Comments
 (0)