Skip to content

Commit b02e7c4

Browse files
committed
Revert "Merge pull request #2284 from xzyfer/remove-list-delimiter"
This reverts commit 9ab7daa, reversing changes made to 46f5244.
1 parent 90a5aeb commit b02e7c4

File tree

9 files changed

+93
-92
lines changed

9 files changed

+93
-92
lines changed

include/sass/values.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@ enum Sass_Separator {
3535
SASS_HASH
3636
};
3737

38+
// Tags for denoting Sass list delimiters
39+
enum Sass_List_Delimiter {
40+
SASS_NO_DELIMITER,
41+
SASS_PARENTHESIS,
42+
SASS_BRACKETS
43+
};
44+
3845
// Value Operators
3946
enum Sass_OP {
4047
AND, OR, // logical connectives

src/ast.hpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,24 +1061,25 @@ namespace Sass {
10611061
private:
10621062
ADD_PROPERTY(enum Sass_Separator, separator)
10631063
ADD_PROPERTY(bool, is_arglist)
1064-
ADD_PROPERTY(bool, is_bracketed)
1064+
ADD_PROPERTY(enum Sass_List_Delimiter, delimiter)
10651065
ADD_PROPERTY(bool, from_selector)
10661066
public:
10671067
List(ParserState pstate,
1068-
size_t size = 0, enum Sass_Separator sep = SASS_SPACE, bool argl = false, bool bracket = false)
1068+
size_t size = 0, enum Sass_Separator sep = SASS_SPACE, bool argl = false,
1069+
enum Sass_List_Delimiter delimiter = SASS_NO_DELIMITER)
10691070
: Value(pstate),
10701071
Vectorized<Expression_Obj>(size),
10711072
separator_(sep),
10721073
is_arglist_(argl),
1073-
is_bracketed_(bracket),
1074+
delimiter_(delimiter),
10741075
from_selector_(false)
10751076
{ concrete_type(LIST); }
10761077
List(const List* ptr)
10771078
: Value(ptr),
10781079
Vectorized<Expression_Obj>(*ptr),
10791080
separator_(ptr->separator_),
10801081
is_arglist_(ptr->is_arglist_),
1081-
is_bracketed_(ptr->is_bracketed_),
1082+
delimiter_(ptr->delimiter_),
10821083
from_selector_(ptr->from_selector_)
10831084
{ concrete_type(LIST); }
10841085
std::string type() const { return is_arglist_ ? "arglist" : "list"; }
@@ -1087,6 +1088,7 @@ namespace Sass {
10871088
return separator() == SASS_SPACE ?
10881089
" " : (compressed ? "," : ", ");
10891090
}
1091+
bool is_bracketed() const { return delimiter() == SASS_BRACKETS; }
10901092
bool is_invisible() const { return empty() && !is_bracketed(); }
10911093
Expression_Obj value_at_index(size_t i);
10921094

src/debugger.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,11 +585,11 @@ inline void debug_ast(AST_Node_Ptr node, std::string ind, Env* env)
585585
std::cerr << " (" << pstate_source_position(node) << ")";
586586
std::cerr << " (" << expression->length() << ") " <<
587587
(expression->separator() == SASS_COMMA ? "Comma " : expression->separator() == SASS_HASH ? "Map " : "Space ") <<
588+
(expression->delimiter() == SASS_PARENTHESIS ? "Parenthesis " : expression->delimiter() == SASS_BRACKETS ? "Bracket " : "None ") <<
588589
" [delayed: " << expression->is_delayed() << "] " <<
589590
" [interpolant: " << expression->is_interpolant() << "] " <<
590591
" [listized: " << expression->from_selector() << "] " <<
591592
" [arglist: " << expression->is_arglist() << "] " <<
592-
" [bracketed: " << expression->is_bracketed() << "] " <<
593593
" [expanded: " << expression->is_expanded() << "] " <<
594594
" [hash: " << expression->hash() << "] " <<
595595
std::endl;

src/eval.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ namespace Sass {
497497
l->length(),
498498
l->separator(),
499499
l->is_arglist(),
500-
l->is_bracketed());
500+
l->delimiter());
501501
for (size_t i = 0, L = l->length(); i < L; ++i) {
502502
ll->append((*l)[i]->perform(this));
503503
}

src/functions.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1309,7 +1309,7 @@ namespace Sass {
13091309
if (l->empty()) error("argument `$list` of `" + std::string(sig) + "` must not be empty", pstate);
13101310
double index = std::floor(n->value() < 0 ? l->length() + n->value() : n->value() - 1);
13111311
if (index < 0 || index > l->length() - 1) error("index out of bounds for `" + std::string(sig) + "`", pstate);
1312-
List_Ptr result = SASS_MEMORY_NEW(List, pstate, l->length(), l->separator(), false, l->is_bracketed());
1312+
List_Ptr result = SASS_MEMORY_NEW(List, pstate, l->length(), l->separator(), false, l->delimiter());
13131313
for (size_t i = 0, L = l->length(); i < L; ++i) {
13141314
result->append(((i == index) ? v : (*l)[i]));
13151315
}
@@ -1345,12 +1345,12 @@ namespace Sass {
13451345
String_Constant_Obj sep = ARG("$separator", String_Constant);
13461346
enum Sass_Separator sep_val = (l1 ? l1->separator() : SASS_SPACE);
13471347
Value* bracketed = ARG("$bracketed", Value);
1348-
bool is_bracketed = (l1 ? l1->is_bracketed() : false);
1348+
enum Sass_List_Delimiter delimiter = (l1 ? l1->delimiter() : SASS_NO_DELIMITER);
13491349
if (!l1) {
13501350
l1 = SASS_MEMORY_NEW(List, pstate, 1);
13511351
l1->append(ARG("$list1", Expression));
13521352
sep_val = (l2 ? l2->separator() : SASS_SPACE);
1353-
is_bracketed = (l2 ? l2->is_bracketed() : false);
1353+
delimiter = (l2 ? l2->delimiter() : SASS_NO_DELIMITER);
13541354
}
13551355
if (!l2) {
13561356
l2 = SASS_MEMORY_NEW(List, pstate, 1);
@@ -1371,9 +1371,9 @@ namespace Sass {
13711371
String_Constant_Obj bracketed_as_str = Cast<String_Constant>(bracketed);
13721372
bool bracketed_is_auto = bracketed_as_str && unquote(bracketed_as_str->value()) == "auto";
13731373
if (!bracketed_is_auto) {
1374-
is_bracketed = !bracketed->is_false();
1374+
delimiter = bracketed->is_false() ? SASS_NO_DELIMITER : SASS_BRACKETS;
13751375
}
1376-
List_Obj result = SASS_MEMORY_NEW(List, pstate, len, sep_val, false, is_bracketed);
1376+
List_Obj result = SASS_MEMORY_NEW(List, pstate, len, sep_val, false, delimiter);
13771377
result->concat(l1);
13781378
result->concat(l2);
13791379
return result.detach();

src/parser.cpp

Lines changed: 73 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,8 +1048,13 @@ namespace Sass {
10481048
List_Obj map = SASS_MEMORY_NEW(List, pstate, 0, SASS_HASH);
10491049

10501050
// it's not a map so return the lexed value as a list value
1051-
if (!lex_css< exactly<':'> >())
1052-
{ return key; }
1051+
if (!lex_css< exactly<':'> >()) {
1052+
List_Obj list = SASS_MEMORY_CAST(List, key);
1053+
if (list && list->delimiter() == SASS_NO_DELIMITER) {
1054+
list->delimiter(SASS_PARENTHESIS);
1055+
}
1056+
return key;
1057+
}
10531058

10541059
Expression_Obj value = parse_space_list();
10551060

@@ -1080,49 +1085,6 @@ namespace Sass {
10801085
return map;
10811086
}
10821087

1083-
Expression_Obj Parser::parse_bracket_list()
1084-
{
1085-
// check if we have an empty list
1086-
// return the empty list as such
1087-
if (peek_css< list_terminator >(position))
1088-
{
1089-
// return an empty list (nothing to delay)
1090-
return SASS_MEMORY_NEW(List, pstate, 0, SASS_SPACE, false, true);
1091-
}
1092-
1093-
bool has_paren = peek_css< exactly<'('> >() != NULL;
1094-
1095-
// now try to parse a space list
1096-
Expression_Obj list = parse_space_list();
1097-
// if it's a singleton, return it (don't wrap it)
1098-
if (!peek_css< exactly<','> >(position)) {
1099-
List_Obj l = Cast<List>(list);
1100-
if (!l || l->is_bracketed() || has_paren) {
1101-
List_Obj bracketed_list = SASS_MEMORY_NEW(List, pstate, 1, SASS_SPACE, false, true);
1102-
bracketed_list->append(list);
1103-
return bracketed_list;
1104-
}
1105-
l->is_bracketed(true);
1106-
return l;
1107-
}
1108-
1109-
// if we got so far, we actually do have a comma list
1110-
List_Obj bracketed_list = SASS_MEMORY_NEW(List, pstate, 2, SASS_COMMA, false, true);
1111-
// wrap the first expression
1112-
bracketed_list->append(list);
1113-
1114-
while (lex_css< exactly<','> >())
1115-
{
1116-
// check for abort condition
1117-
if (peek_css< list_terminator >(position)
1118-
) { break; }
1119-
// otherwise add another expression
1120-
bracketed_list->append(parse_space_list());
1121-
}
1122-
// return the list
1123-
return bracketed_list;
1124-
}
1125-
11261088
// parse list returns either a space separated list,
11271089
// a comma separated list or any bare expression found.
11281090
// so to speak: we unwrap items from lists if possible here!
@@ -1136,7 +1098,19 @@ namespace Sass {
11361098
{
11371099
// check if we have an empty list
11381100
// return the empty list as such
1139-
if (peek_css< list_terminator >(position))
1101+
if (peek_css< alternatives <
1102+
// exactly<'!'>,
1103+
exactly<';'>,
1104+
exactly<'}'>,
1105+
exactly<'{'>,
1106+
exactly<')'>,
1107+
exactly<']'>,
1108+
exactly<':'>,
1109+
end_of_file,
1110+
exactly<ellipsis>,
1111+
default_flag,
1112+
global_flag
1113+
> >(position))
11401114
{
11411115
// return an empty list (nothing to delay)
11421116
return SASS_MEMORY_NEW(List, pstate, 0);
@@ -1160,7 +1134,18 @@ namespace Sass {
11601134
while (lex_css< exactly<','> >())
11611135
{
11621136
// check for abort condition
1163-
if (peek_css< list_terminator >(position)
1137+
if (peek_css< alternatives <
1138+
exactly<';'>,
1139+
exactly<'}'>,
1140+
exactly<'{'>,
1141+
exactly<')'>,
1142+
exactly<']'>,
1143+
exactly<':'>,
1144+
end_of_file,
1145+
exactly<ellipsis>,
1146+
default_flag,
1147+
global_flag
1148+
> >(position)
11641149
) { break; }
11651150
// otherwise add another expression
11661151
comma_list->append(parse_space_list());
@@ -1175,16 +1160,39 @@ namespace Sass {
11751160
{
11761161
Expression_Obj disj1 = parse_disjunction();
11771162
// if it's a singleton, return it (don't wrap it)
1178-
if (peek_css< space_list_terminator >(position)
1179-
) {
1180-
return disj1; }
1163+
if (peek_css< alternatives <
1164+
// exactly<'!'>,
1165+
exactly<';'>,
1166+
exactly<'}'>,
1167+
exactly<'{'>,
1168+
exactly<')'>,
1169+
exactly<']'>,
1170+
exactly<','>,
1171+
exactly<':'>,
1172+
end_of_file,
1173+
exactly<ellipsis>,
1174+
default_flag,
1175+
global_flag
1176+
> >(position)
1177+
) { return disj1; }
11811178

11821179
List_Obj space_list = SASS_MEMORY_NEW(List, pstate, 2, SASS_SPACE);
11831180
space_list->append(disj1);
11841181

1185-
while (
1186-
!(peek_css< space_list_terminator >(position)) &&
1187-
peek_css< optional_css_whitespace >() != end
1182+
while (!(peek_css< alternatives <
1183+
// exactly<'!'>,
1184+
exactly<';'>,
1185+
exactly<'}'>,
1186+
exactly<'{'>,
1187+
exactly<')'>,
1188+
exactly<']'>,
1189+
exactly<','>,
1190+
exactly<':'>,
1191+
end_of_file,
1192+
exactly<ellipsis>,
1193+
default_flag,
1194+
global_flag
1195+
> >(position)) && peek_css< optional_css_whitespace >() != end
11881196
) {
11891197
// the space is parsed implicitly?
11901198
space_list->append(parse_disjunction());
@@ -1378,9 +1386,20 @@ namespace Sass {
13781386
}
13791387
else if (lex_css< exactly<'['> >()) {
13801388
// explicit bracketed
1381-
Expression_Obj value = parse_bracket_list();
1389+
Expression_Obj value = parse_list();
13821390
// lex the expected closing square bracket
13831391
if (!lex_css< exactly<']'> >()) error("unclosed squared bracket", pstate);
1392+
<<<<<<< HEAD
1393+
=======
1394+
// fix delimiter
1395+
List_Obj list = SASS_MEMORY_CAST(List, value);
1396+
if (!list || list->delimiter() != SASS_NO_DELIMITER) {
1397+
List_Ptr outer_list = SASS_MEMORY_NEW(List, pstate, 1, SASS_SPACE, false, SASS_BRACKETS);
1398+
outer_list->append(&value);
1399+
return outer_list;
1400+
}
1401+
list->delimiter(SASS_BRACKETS);
1402+
>>>>>>> parent of 9ab7daa... Merge pull request #2284 from xzyfer/remove-list-delimiter
13841403
return value;
13851404
}
13861405
// string may be interpolated

src/parser.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,6 @@ namespace Sass {
256256
bool parse_number_prefix();
257257
Declaration_Obj parse_declaration();
258258
Expression_Obj parse_map();
259-
Expression_Obj parse_bracket_list();
260259
Expression_Obj parse_list(bool delayed = false);
261260
Expression_Obj parse_comma_list(bool delayed = false);
262261
Expression_Obj parse_space_list();

src/prelexer.cpp

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1419,28 +1419,6 @@ namespace Sass {
14191419
>(src);
14201420
}
14211421

1422-
const char* list_terminator(const char* src) {
1423-
return alternatives <
1424-
exactly<';'>,
1425-
exactly<'}'>,
1426-
exactly<'{'>,
1427-
exactly<')'>,
1428-
exactly<']'>,
1429-
exactly<':'>,
1430-
end_of_file,
1431-
exactly<ellipsis>,
1432-
default_flag,
1433-
global_flag
1434-
>(src);
1435-
};
1436-
1437-
const char* space_list_terminator(const char* src) {
1438-
return alternatives <
1439-
exactly<','>,
1440-
list_terminator
1441-
>(src);
1442-
};
1443-
14441422

14451423
// const char* real_uri_prefix(const char* src) {
14461424
// return alternatives<

src/prelexer.hpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -355,10 +355,6 @@ namespace Sass {
355355
const char* ie_keyword_arg_value(const char* src);
356356
const char* ie_keyword_arg_property(const char* src);
357357

358-
// characters that terminate parsing of a list
359-
const char* list_terminator(const char* src);
360-
const char* space_list_terminator(const char* src);
361-
362358
// match url()
363359
const char* H(const char* src);
364360
const char* W(const char* src);

0 commit comments

Comments
 (0)