@@ -71,6 +71,12 @@ namespace Sass {
71
71
false , true );
72
72
}
73
73
74
+ std::string function_name (Signature sig)
75
+ {
76
+ std::string str (sig);
77
+ return str.substr (0 , str.find (' (' ));
78
+ }
79
+
74
80
namespace Functions {
75
81
76
82
inline void handle_utf8_error (const ParserState& pstate, Backtrace* backtrace)
@@ -147,6 +153,12 @@ namespace Sass {
147
153
Selector_List* get_arg_sel (const string& argname, Env& env, Signature sig, ParserState pstate, Backtrace* backtrace, Context& ctx) {
148
154
To_String to_string (&ctx, false );
149
155
Expression* exp = ARG (argname, Expression);
156
+ if (exp->concrete_type () == Expression::NULL_VAL) {
157
+ stringstream msg;
158
+ msg << argname << " : null is not a valid selector: it must be a string,\n " ;
159
+ msg << " a list of strings, or a list of lists of strings for `" << function_name (sig) << " '" ;
160
+ error (msg.str (), pstate);
161
+ }
150
162
string exp_src = exp->perform (&to_string) + " {" ;
151
163
return Parser::parse_selector (exp_src.c_str (), ctx);
152
164
}
@@ -155,6 +167,12 @@ namespace Sass {
155
167
Complex_Selector* get_arg_sel (const string& argname, Env& env, Signature sig, ParserState pstate, Backtrace* backtrace, Context& ctx) {
156
168
To_String to_string (&ctx, false );
157
169
Expression* exp = ARG (argname, Expression);
170
+ if (exp->concrete_type () == Expression::NULL_VAL) {
171
+ stringstream msg;
172
+ msg << argname << " : null is not a valid selector: it must be a string,\n " ;
173
+ msg << " a list of strings, or a list of lists of strings for `" << function_name (sig) << " '" ;
174
+ error (msg.str (), pstate);
175
+ }
158
176
string exp_src = exp->perform (&to_string) + " {" ;
159
177
Selector_List* sel_list = Parser::parse_selector (exp_src.c_str (), ctx);
160
178
return (sel_list->length () > 0 ) ? sel_list->first () : 0 ;
@@ -164,6 +182,12 @@ namespace Sass {
164
182
Compound_Selector* get_arg_sel (const string& argname, Env& env, Signature sig, ParserState pstate, Backtrace* backtrace, Context& ctx) {
165
183
To_String to_string (&ctx, false );
166
184
Expression* exp = ARG (argname, Expression);
185
+ if (exp->concrete_type () == Expression::NULL_VAL) {
186
+ stringstream msg;
187
+ msg << argname << " : null is not a valid selector: it must be a string,\n " ;
188
+ msg << " a list of strings, or a list of lists of strings for `" << function_name (sig) << " '" ;
189
+ error (msg.str (), pstate);
190
+ }
167
191
string exp_src = exp->perform (&to_string) + " {" ;
168
192
Selector_List* sel_list = Parser::parse_selector (exp_src.c_str (), ctx);
169
193
return (sel_list->length () > 0 ) ? sel_list->first ()->tail ()->head () : 0 ;
@@ -1601,6 +1625,12 @@ namespace Sass {
1601
1625
vector<Selector_List*> parsedSelectors;
1602
1626
for (size_t i = 0 , L = arglist->length (); i < L; ++i) {
1603
1627
Expression* exp = dynamic_cast <Expression*>(arglist->value_at_index (i));
1628
+ if (exp->concrete_type () == Expression::NULL_VAL) {
1629
+ stringstream msg;
1630
+ msg << " $selectors: null is not a valid selector: it must be a string,\n " ;
1631
+ msg << " a list of strings, or a list of lists of strings for 'selector-nest'" ;
1632
+ error (msg.str (), pstate);
1633
+ }
1604
1634
string exp_src = exp->perform (&to_string) + " {" ;
1605
1635
Selector_List* sel = Parser::parse_selector (exp_src.c_str (), ctx);
1606
1636
parsedSelectors.push_back (sel);
@@ -1655,6 +1685,12 @@ namespace Sass {
1655
1685
vector<Selector_List*> parsedSelectors;
1656
1686
for (size_t i = 0 , L = arglist->length (); i < L; ++i) {
1657
1687
Expression* exp = dynamic_cast <Expression*>(arglist->value_at_index (i));
1688
+ if (exp->concrete_type () == Expression::NULL_VAL) {
1689
+ stringstream msg;
1690
+ msg << " $selectors: null is not a valid selector: it must be a string,\n " ;
1691
+ msg << " a list of strings, or a list of lists of strings for 'selector-append'" ;
1692
+ error (msg.str (), pstate);
1693
+ }
1658
1694
string exp_src = exp->perform (&to_string) + " {" ;
1659
1695
Selector_List* sel = Parser::parse_selector (exp_src.c_str (), ctx);
1660
1696
parsedSelectors.push_back (sel);
@@ -1759,8 +1795,6 @@ namespace Sass {
1759
1795
Signature selector_extend_sig = " selector-extend($selector, $extendee, $extender)" ;
1760
1796
BUILT_IN (selector_extend)
1761
1797
{
1762
- To_String to_string;
1763
-
1764
1798
Selector_List* selector = ARGSEL (" $selector" , Selector_List, p_contextualize);
1765
1799
Selector_List* extendee = ARGSEL (" $extendee" , Selector_List, p_contextualize);
1766
1800
Selector_List* extender = ARGSEL (" $extender" , Selector_List, p_contextualize);
@@ -1795,10 +1829,7 @@ namespace Sass {
1795
1829
Signature selector_parse_sig = " selector-parse($selector)" ;
1796
1830
BUILT_IN (selector_parse)
1797
1831
{
1798
- To_String to_string (&ctx, false );
1799
- Expression* exp = ARG (" $selector" , Expression);
1800
- string sel_src = exp->perform (&to_string) + " {" ;
1801
- Selector_List* sel = Parser::parse_selector (sel_src.c_str (), ctx);
1832
+ Selector_List* sel = ARGSEL (" $selector" , Selector_List, p_contextualize);
1802
1833
1803
1834
Listize listize (ctx);
1804
1835
return sel->perform (&listize);
0 commit comments