Skip to content

Commit c75490d

Browse files
committed
Improve parameter vararg and keyword handling
1 parent e87c8a1 commit c75490d

File tree

1 file changed

+17
-13
lines changed

1 file changed

+17
-13
lines changed

src/bind.cpp

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ namespace Sass {
1414
std::string callee(type + " " + name);
1515

1616
std::map<std::string, Parameter_Obj> param_map;
17+
List_Obj varargs = SASS_MEMORY_NEW(List, as->pstate());
18+
varargs->is_arglist(true); // enable keyword size handling
1719

1820
for (size_t i = 0, L = as->length(); i < L; ++i) {
1921
if (auto str = Cast<String_Quoted>((*as)[i]->value())) {
@@ -245,15 +247,21 @@ namespace Sass {
245247
else {
246248
// named arg -- bind it to the appropriately named param
247249
if (!param_map.count(a->name())) {
248-
std::stringstream msg;
249-
msg << callee << " has no parameter named " << a->name();
250-
error(msg.str(), a->pstate());
250+
if (ps->has_rest_parameter()) {
251+
varargs->append(a);
252+
} else {
253+
std::stringstream msg;
254+
msg << callee << " has no parameter named " << a->name();
255+
error(msg.str(), a->pstate());
256+
}
251257
}
252-
if (param_map[a->name()]->is_rest_parameter()) {
253-
std::stringstream msg;
254-
msg << "argument " << a->name() << " of " << callee
255-
<< "cannot be used as named argument";
256-
error(msg.str(), a->pstate());
258+
if (param_map[a->name()]) {
259+
if (param_map[a->name()]->is_rest_parameter()) {
260+
std::stringstream msg;
261+
msg << "argument " << a->name() << " of " << callee
262+
<< "cannot be used as named argument";
263+
error(msg.str(), a->pstate());
264+
}
257265
}
258266
if (env->has_local(a->name())) {
259267
std::stringstream msg;
@@ -276,11 +284,7 @@ namespace Sass {
276284
// cerr << "********" << endl;
277285
if (!env->has_local(leftover->name())) {
278286
if (leftover->is_rest_parameter()) {
279-
env->local_frame()[leftover->name()] = SASS_MEMORY_NEW(List,
280-
leftover->pstate(),
281-
0,
282-
SASS_COMMA,
283-
true);
287+
env->local_frame()[leftover->name()] = varargs;
284288
}
285289
else if (leftover->default_value()) {
286290
Expression_Ptr dv = leftover->default_value()->perform(eval);

0 commit comments

Comments
 (0)