Skip to content

Commit 281713a

Browse files
xzyfermgreter
authored andcommitted
Revert "Merge pull request #2284 from xzyfer/remove-list-delimiter"
This reverts commit 9ab7daa, reversing changes made to 46f5244.
1 parent 589cce3 commit 281713a

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
@@ -1058,8 +1058,13 @@ namespace Sass {
10581058
List_Obj map = SASS_MEMORY_NEW(List, pstate, 0, SASS_HASH);
10591059

10601060
// it's not a map so return the lexed value as a list value
1061-
if (!lex_css< exactly<':'> >())
1062-
{ return key; }
1061+
if (!lex_css< exactly<':'> >()) {
1062+
List_Obj list = SASS_MEMORY_CAST(List, key);
1063+
if (list && list->delimiter() == SASS_NO_DELIMITER) {
1064+
list->delimiter(SASS_PARENTHESIS);
1065+
}
1066+
return key;
1067+
}
10631068

10641069
Expression_Obj value = parse_space_list();
10651070

@@ -1090,49 +1095,6 @@ namespace Sass {
10901095
return map;
10911096
}
10921097

1093-
Expression_Obj Parser::parse_bracket_list()
1094-
{
1095-
// check if we have an empty list
1096-
// return the empty list as such
1097-
if (peek_css< list_terminator >(position))
1098-
{
1099-
// return an empty list (nothing to delay)
1100-
return SASS_MEMORY_NEW(List, pstate, 0, SASS_SPACE, false, true);
1101-
}
1102-
1103-
bool has_paren = peek_css< exactly<'('> >() != NULL;
1104-
1105-
// now try to parse a space list
1106-
Expression_Obj list = parse_space_list();
1107-
// if it's a singleton, return it (don't wrap it)
1108-
if (!peek_css< exactly<','> >(position)) {
1109-
List_Obj l = Cast<List>(list);
1110-
if (!l || l->is_bracketed() || has_paren) {
1111-
List_Obj bracketed_list = SASS_MEMORY_NEW(List, pstate, 1, SASS_SPACE, false, true);
1112-
bracketed_list->append(list);
1113-
return bracketed_list;
1114-
}
1115-
l->is_bracketed(true);
1116-
return l;
1117-
}
1118-
1119-
// if we got so far, we actually do have a comma list
1120-
List_Obj bracketed_list = SASS_MEMORY_NEW(List, pstate, 2, SASS_COMMA, false, true);
1121-
// wrap the first expression
1122-
bracketed_list->append(list);
1123-
1124-
while (lex_css< exactly<','> >())
1125-
{
1126-
// check for abort condition
1127-
if (peek_css< list_terminator >(position)
1128-
) { break; }
1129-
// otherwise add another expression
1130-
bracketed_list->append(parse_space_list());
1131-
}
1132-
// return the list
1133-
return bracketed_list;
1134-
}
1135-
11361098
// parse list returns either a space separated list,
11371099
// a comma separated list or any bare expression found.
11381100
// so to speak: we unwrap items from lists if possible here!
@@ -1146,7 +1108,19 @@ namespace Sass {
11461108
{
11471109
// check if we have an empty list
11481110
// return the empty list as such
1149-
if (peek_css< list_terminator >(position))
1111+
if (peek_css< alternatives <
1112+
// exactly<'!'>,
1113+
exactly<';'>,
1114+
exactly<'}'>,
1115+
exactly<'{'>,
1116+
exactly<')'>,
1117+
exactly<']'>,
1118+
exactly<':'>,
1119+
end_of_file,
1120+
exactly<ellipsis>,
1121+
default_flag,
1122+
global_flag
1123+
> >(position))
11501124
{
11511125
// return an empty list (nothing to delay)
11521126
return SASS_MEMORY_NEW(List, pstate, 0);
@@ -1170,7 +1144,18 @@ namespace Sass {
11701144
while (lex_css< exactly<','> >())
11711145
{
11721146
// check for abort condition
1173-
if (peek_css< list_terminator >(position)
1147+
if (peek_css< alternatives <
1148+
exactly<';'>,
1149+
exactly<'}'>,
1150+
exactly<'{'>,
1151+
exactly<')'>,
1152+
exactly<']'>,
1153+
exactly<':'>,
1154+
end_of_file,
1155+
exactly<ellipsis>,
1156+
default_flag,
1157+
global_flag
1158+
> >(position)
11741159
) { break; }
11751160
// otherwise add another expression
11761161
comma_list->append(parse_space_list());
@@ -1185,16 +1170,39 @@ namespace Sass {
11851170
{
11861171
Expression_Obj disj1 = parse_disjunction();
11871172
// if it's a singleton, return it (don't wrap it)
1188-
if (peek_css< space_list_terminator >(position)
1189-
) {
1190-
return disj1; }
1173+
if (peek_css< alternatives <
1174+
// exactly<'!'>,
1175+
exactly<';'>,
1176+
exactly<'}'>,
1177+
exactly<'{'>,
1178+
exactly<')'>,
1179+
exactly<']'>,
1180+
exactly<','>,
1181+
exactly<':'>,
1182+
end_of_file,
1183+
exactly<ellipsis>,
1184+
default_flag,
1185+
global_flag
1186+
> >(position)
1187+
) { return disj1; }
11911188

11921189
List_Obj space_list = SASS_MEMORY_NEW(List, pstate, 2, SASS_SPACE);
11931190
space_list->append(disj1);
11941191

1195-
while (
1196-
!(peek_css< space_list_terminator >(position)) &&
1197-
peek_css< optional_css_whitespace >() != end
1192+
while (!(peek_css< alternatives <
1193+
// exactly<'!'>,
1194+
exactly<';'>,
1195+
exactly<'}'>,
1196+
exactly<'{'>,
1197+
exactly<')'>,
1198+
exactly<']'>,
1199+
exactly<','>,
1200+
exactly<':'>,
1201+
end_of_file,
1202+
exactly<ellipsis>,
1203+
default_flag,
1204+
global_flag
1205+
> >(position)) && peek_css< optional_css_whitespace >() != end
11981206
) {
11991207
// the space is parsed implicitly?
12001208
space_list->append(parse_disjunction());
@@ -1388,9 +1396,20 @@ namespace Sass {
13881396
}
13891397
else if (lex_css< exactly<'['> >()) {
13901398
// explicit bracketed
1391-
Expression_Obj value = parse_bracket_list();
1399+
Expression_Obj value = parse_list();
13921400
// lex the expected closing square bracket
13931401
if (!lex_css< exactly<']'> >()) error("unclosed squared bracket", pstate);
1402+
<<<<<<< HEAD
1403+
=======
1404+
// fix delimiter
1405+
List_Obj list = SASS_MEMORY_CAST(List, value);
1406+
if (!list || list->delimiter() != SASS_NO_DELIMITER) {
1407+
List_Ptr outer_list = SASS_MEMORY_NEW(List, pstate, 1, SASS_SPACE, false, SASS_BRACKETS);
1408+
outer_list->append(&value);
1409+
return outer_list;
1410+
}
1411+
list->delimiter(SASS_BRACKETS);
1412+
>>>>>>> parent of 9ab7daa... Merge pull request #2284 from xzyfer/remove-list-delimiter
13941413
return value;
13951414
}
13961415
// 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)