sassc 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +5 -0
  4. data/ext/libsass/VERSION +1 -1
  5. data/ext/libsass/include/sass/context.h +3 -0
  6. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  7. data/ext/libsass/src/ast.cpp +117 -117
  8. data/ext/libsass/src/ast.hpp +160 -162
  9. data/ext/libsass/src/ast_def_macros.hpp +10 -10
  10. data/ext/libsass/src/ast_fwd_decl.cpp +2 -2
  11. data/ext/libsass/src/ast_fwd_decl.hpp +61 -52
  12. data/ext/libsass/src/ast_helpers.hpp +5 -5
  13. data/ext/libsass/src/ast_sel_cmp.cpp +18 -18
  14. data/ext/libsass/src/ast_sel_super.cpp +52 -52
  15. data/ext/libsass/src/ast_sel_unify.cpp +16 -16
  16. data/ext/libsass/src/ast_sel_weave.cpp +62 -62
  17. data/ext/libsass/src/ast_selectors.cpp +87 -77
  18. data/ext/libsass/src/ast_selectors.hpp +72 -62
  19. data/ext/libsass/src/ast_supports.cpp +35 -35
  20. data/ext/libsass/src/ast_supports.hpp +29 -29
  21. data/ext/libsass/src/ast_values.cpp +58 -58
  22. data/ext/libsass/src/ast_values.hpp +75 -75
  23. data/ext/libsass/src/backtrace.cpp +9 -9
  24. data/ext/libsass/src/backtrace.hpp +5 -5
  25. data/ext/libsass/src/base64vlq.cpp +2 -2
  26. data/ext/libsass/src/base64vlq.hpp +1 -1
  27. data/ext/libsass/src/bind.cpp +17 -17
  28. data/ext/libsass/src/bind.hpp +1 -1
  29. data/ext/libsass/src/c2ast.cpp +3 -3
  30. data/ext/libsass/src/c2ast.hpp +1 -1
  31. data/ext/libsass/src/check_nesting.cpp +36 -36
  32. data/ext/libsass/src/check_nesting.hpp +2 -2
  33. data/ext/libsass/src/color_maps.cpp +5 -5
  34. data/ext/libsass/src/color_maps.hpp +1 -1
  35. data/ext/libsass/src/context.cpp +63 -60
  36. data/ext/libsass/src/context.hpp +33 -33
  37. data/ext/libsass/src/cssize.cpp +30 -29
  38. data/ext/libsass/src/cssize.hpp +13 -13
  39. data/ext/libsass/src/dart_helpers.hpp +5 -5
  40. data/ext/libsass/src/debugger.hpp +127 -128
  41. data/ext/libsass/src/emitter.cpp +12 -12
  42. data/ext/libsass/src/emitter.hpp +10 -10
  43. data/ext/libsass/src/environment.cpp +27 -27
  44. data/ext/libsass/src/environment.hpp +24 -24
  45. data/ext/libsass/src/error_handling.cpp +42 -42
  46. data/ext/libsass/src/error_handling.hpp +38 -50
  47. data/ext/libsass/src/eval.cpp +138 -132
  48. data/ext/libsass/src/eval.hpp +17 -17
  49. data/ext/libsass/src/eval_selectors.cpp +3 -3
  50. data/ext/libsass/src/expand.cpp +70 -64
  51. data/ext/libsass/src/expand.hpp +12 -12
  52. data/ext/libsass/src/extender.cpp +55 -53
  53. data/ext/libsass/src/extender.hpp +14 -14
  54. data/ext/libsass/src/file.cpp +66 -58
  55. data/ext/libsass/src/file.hpp +23 -25
  56. data/ext/libsass/src/fn_colors.cpp +9 -9
  57. data/ext/libsass/src/fn_lists.cpp +18 -18
  58. data/ext/libsass/src/fn_maps.cpp +3 -3
  59. data/ext/libsass/src/fn_miscs.cpp +15 -15
  60. data/ext/libsass/src/fn_numbers.cpp +7 -7
  61. data/ext/libsass/src/fn_selectors.cpp +8 -8
  62. data/ext/libsass/src/fn_strings.cpp +34 -22
  63. data/ext/libsass/src/fn_utils.cpp +29 -26
  64. data/ext/libsass/src/fn_utils.hpp +10 -10
  65. data/ext/libsass/src/inspect.cpp +35 -34
  66. data/ext/libsass/src/inspect.hpp +21 -21
  67. data/ext/libsass/src/lexer.cpp +3 -1
  68. data/ext/libsass/src/listize.cpp +2 -2
  69. data/ext/libsass/src/mapping.hpp +1 -0
  70. data/ext/libsass/src/memory.hpp +12 -0
  71. data/ext/libsass/src/memory/allocator.cpp +48 -0
  72. data/ext/libsass/src/memory/allocator.hpp +138 -0
  73. data/ext/libsass/src/memory/config.hpp +20 -0
  74. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  75. data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
  76. data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +18 -6
  77. data/ext/libsass/src/operation.hpp +44 -44
  78. data/ext/libsass/src/operators.cpp +18 -18
  79. data/ext/libsass/src/operators.hpp +11 -11
  80. data/ext/libsass/src/ordered_map.hpp +18 -18
  81. data/ext/libsass/src/output.cpp +16 -16
  82. data/ext/libsass/src/output.hpp +5 -5
  83. data/ext/libsass/src/parser.cpp +327 -345
  84. data/ext/libsass/src/parser.hpp +77 -87
  85. data/ext/libsass/src/parser_selectors.cpp +6 -6
  86. data/ext/libsass/src/permutate.hpp +39 -15
  87. data/ext/libsass/src/plugins.cpp +7 -7
  88. data/ext/libsass/src/plugins.hpp +8 -8
  89. data/ext/libsass/src/position.cpp +7 -26
  90. data/ext/libsass/src/position.hpp +44 -21
  91. data/ext/libsass/src/remove_placeholders.cpp +4 -4
  92. data/ext/libsass/src/remove_placeholders.hpp +3 -3
  93. data/ext/libsass/src/sass.cpp +16 -15
  94. data/ext/libsass/src/sass.hpp +9 -5
  95. data/ext/libsass/src/sass_context.cpp +52 -34
  96. data/ext/libsass/src/sass_values.cpp +8 -10
  97. data/ext/libsass/src/settings.hpp +19 -0
  98. data/ext/libsass/src/source.cpp +69 -0
  99. data/ext/libsass/src/source.hpp +95 -0
  100. data/ext/libsass/src/source_data.hpp +32 -0
  101. data/ext/libsass/src/source_map.cpp +22 -18
  102. data/ext/libsass/src/source_map.hpp +12 -9
  103. data/ext/libsass/src/units.cpp +19 -19
  104. data/ext/libsass/src/units.hpp +8 -8
  105. data/ext/libsass/src/utf8_string.cpp +9 -10
  106. data/ext/libsass/src/utf8_string.hpp +7 -6
  107. data/ext/libsass/src/util.cpp +38 -38
  108. data/ext/libsass/src/util.hpp +18 -18
  109. data/ext/libsass/src/util_string.cpp +13 -13
  110. data/ext/libsass/src/util_string.hpp +9 -8
  111. data/ext/libsass/src/values.cpp +12 -12
  112. data/lib/sassc/native.rb +3 -5
  113. data/lib/sassc/version.rb +1 -1
  114. data/test/native_test.rb +4 -4
  115. metadata +14 -5
  116. data/lib/sassc/native/lib_c.rb +0 -21
@@ -13,6 +13,7 @@
13
13
  #include "context.hpp"
14
14
  #include "position.hpp"
15
15
  #include "prelexer.hpp"
16
+ #include "source.hpp"
16
17
 
17
18
  #ifndef MAX_NESTING
18
19
  // Note that this limit is not an exact science
@@ -34,41 +35,31 @@ struct Lookahead {
34
35
 
35
36
  namespace Sass {
36
37
 
37
- class Parser : public ParserState {
38
+ class Parser : public SourceSpan {
38
39
  public:
39
40
 
40
41
  enum Scope { Root, Mixin, Function, Media, Control, Properties, Rules, AtRoot };
41
42
 
42
43
  Context& ctx;
43
- std::vector<Block_Obj> block_stack;
44
- std::vector<Scope> stack;
45
- const char* source;
44
+ sass::vector<Block_Obj> block_stack;
45
+ sass::vector<Scope> stack;
46
+ SourceDataObj source;
47
+ const char* begin;
46
48
  const char* position;
47
49
  const char* end;
48
- Position before_token;
49
- Position after_token;
50
- ParserState pstate;
50
+ Offset before_token;
51
+ Offset after_token;
52
+ SourceSpan pstate;
51
53
  Backtraces traces;
52
54
  size_t indentation;
53
55
  size_t nestings;
54
56
  bool allow_parent;
55
-
56
57
  Token lexed;
57
58
 
58
- Parser(Context& ctx, const ParserState& pstate, Backtraces traces, bool allow_parent = true)
59
- : ParserState(pstate), ctx(ctx), block_stack(), stack(0),
60
- source(0), position(0), end(0), before_token(pstate), after_token(pstate),
61
- pstate(pstate), traces(traces), indentation(0), nestings(0), allow_parent(allow_parent)
62
- {
63
- stack.push_back(Scope::Root);
64
- }
59
+ Parser(SourceData* source, Context& ctx, Backtraces, bool allow_parent = true);
65
60
 
66
- // static Parser from_string(const std::string& src, Context& ctx, ParserState pstate = ParserState("[STRING]"));
67
- static Parser from_c_str(const char* src, Context& ctx, Backtraces, ParserState pstate = ParserState("[CSTRING]"), const char* source = nullptr, bool allow_parent = true);
68
- static Parser from_c_str(const char* beg, const char* end, Context& ctx, Backtraces, ParserState pstate = ParserState("[CSTRING]"), const char* source = nullptr, bool allow_parent = true);
69
- static Parser from_token(Token t, Context& ctx, Backtraces, ParserState pstate = ParserState("[TOKEN]"), const char* source = nullptr);
70
61
  // special static parsers to convert strings into certain selectors
71
- static SelectorListObj parse_selector(const char* src, Context& ctx, Backtraces, ParserState pstate = ParserState("[SELECTOR]"), const char* source = nullptr, bool allow_parent = true);
62
+ static SelectorListObj parse_selector(SourceData* source, Context& ctx, Backtraces, bool allow_parent = true);
72
63
 
73
64
  #ifdef __clang__
74
65
 
@@ -84,7 +75,7 @@ namespace Sass {
84
75
 
85
76
 
86
77
  // skip current token and next whitespace
87
- // moves ParserState right before next token
78
+ // moves SourceSpan right before next token
88
79
  void advanceToNextToken();
89
80
 
90
81
  bool peek_newline(const char* start = 0);
@@ -189,7 +180,7 @@ namespace Sass {
189
180
  after_token.add(it_before_token, it_after_token);
190
181
 
191
182
  // ToDo: could probably do this incremental on original object (API wants offset?)
192
- pstate = ParserState(path, source, lexed, before_token, after_token - before_token);
183
+ pstate = SourceSpan(source, before_token, after_token - before_token);
193
184
 
194
185
  // advance internal char iterator
195
186
  return position = it_after_token;
@@ -206,9 +197,9 @@ namespace Sass {
206
197
  Token prev = lexed;
207
198
  // store previous pointer
208
199
  const char* oldpos = position;
209
- Position bt = before_token;
210
- Position at = after_token;
211
- ParserState op = pstate;
200
+ Offset bt = before_token;
201
+ Offset at = after_token;
202
+ SourceSpan op = pstate;
212
203
  // throw away comments
213
204
  // update srcmap position
214
205
  lex < Prelexer::css_comments >();
@@ -240,13 +231,12 @@ namespace Sass {
240
231
 
241
232
  #endif
242
233
 
243
- void error(std::string msg);
244
- void error(std::string msg, Position pos);
234
+ void error(sass::string msg);
245
235
  // generate message with given and expected sample
246
236
  // text before and in the middle are configurable
247
- void css_error(const std::string& msg,
248
- const std::string& prefix = " after ",
249
- const std::string& middle = ", was: ",
237
+ void css_error(const sass::string& msg,
238
+ const sass::string& prefix = " after ",
239
+ const sass::string& middle = ", was: ",
250
240
  const bool trim = true);
251
241
  void read_bom();
252
242
 
@@ -259,34 +249,34 @@ namespace Sass {
259
249
  Arguments_Obj parse_arguments();
260
250
  Argument_Obj parse_argument();
261
251
  Assignment_Obj parse_assignment();
262
- Ruleset_Obj parse_ruleset(Lookahead lookahead);
252
+ StyleRuleObj parse_ruleset(Lookahead lookahead);
263
253
  SelectorListObj parseSelectorList(bool chroot);
264
254
  ComplexSelectorObj parseComplexSelector(bool chroot);
265
255
  Selector_Schema_Obj parse_selector_schema(const char* end_of_selector, bool chroot);
266
256
  CompoundSelectorObj parseCompoundSelector();
267
257
  SimpleSelectorObj parse_simple_selector();
268
- Pseudo_Selector_Obj parse_negated_selector2();
258
+ PseudoSelectorObj parse_negated_selector2();
269
259
  Expression* parse_binominal();
270
260
  SimpleSelectorObj parse_pseudo_selector();
271
- Attribute_Selector_Obj parse_attribute_selector();
261
+ AttributeSelectorObj parse_attribute_selector();
272
262
  Block_Obj parse_block(bool is_root = false);
273
263
  Block_Obj parse_css_block(bool is_root = false);
274
264
  bool parse_block_nodes(bool is_root = false);
275
265
  bool parse_block_node(bool is_root = false);
276
266
 
277
267
  Declaration_Obj parse_declaration();
278
- Expression_Obj parse_map();
279
- Expression_Obj parse_bracket_list();
280
- Expression_Obj parse_list(bool delayed = false);
281
- Expression_Obj parse_comma_list(bool delayed = false);
282
- Expression_Obj parse_space_list();
283
- Expression_Obj parse_disjunction();
284
- Expression_Obj parse_conjunction();
285
- Expression_Obj parse_relation();
286
- Expression_Obj parse_expression();
287
- Expression_Obj parse_operators();
288
- Expression_Obj parse_factor();
289
- Expression_Obj parse_value();
268
+ ExpressionObj parse_map();
269
+ ExpressionObj parse_bracket_list();
270
+ ExpressionObj parse_list(bool delayed = false);
271
+ ExpressionObj parse_comma_list(bool delayed = false);
272
+ ExpressionObj parse_space_list();
273
+ ExpressionObj parse_disjunction();
274
+ ExpressionObj parse_conjunction();
275
+ ExpressionObj parse_relation();
276
+ ExpressionObj parse_expression();
277
+ ExpressionObj parse_operators();
278
+ ExpressionObj parse_factor();
279
+ ExpressionObj parse_value();
290
280
  Function_Call_Obj parse_calc_function();
291
281
  Function_Call_Obj parse_function_call();
292
282
  Function_Call_Obj parse_function_call_schema();
@@ -294,49 +284,49 @@ namespace Sass {
294
284
  String_Obj parse_url_function_argument();
295
285
  String_Obj parse_interpolated_chunk(Token, bool constant = false, bool css = true);
296
286
  String_Obj parse_string();
297
- Value_Obj parse_static_value();
287
+ ValueObj parse_static_value();
298
288
  String_Schema_Obj parse_css_variable_value();
299
289
  String_Obj parse_ie_property();
300
290
  String_Obj parse_ie_keyword_arg();
301
291
  String_Schema_Obj parse_value_schema(const char* stop);
302
292
  String_Obj parse_identifier_schema();
303
293
  If_Obj parse_if_directive(bool else_if = false);
304
- For_Obj parse_for_directive();
305
- Each_Obj parse_each_directive();
306
- While_Obj parse_while_directive();
294
+ ForRuleObj parse_for_directive();
295
+ EachRuleObj parse_each_directive();
296
+ WhileRuleObj parse_while_directive();
307
297
  MediaRule_Obj parseMediaRule();
308
- std::vector<CssMediaQuery_Obj> parseCssMediaQueries();
309
- std::string parseIdentifier();
298
+ sass::vector<CssMediaQuery_Obj> parseCssMediaQueries();
299
+ sass::string parseIdentifier();
310
300
  CssMediaQuery_Obj parseCssMediaQuery();
311
301
  Return_Obj parse_return_directive();
312
302
  Content_Obj parse_content_directive();
313
303
  void parse_charset_directive();
314
304
  List_Obj parse_media_queries();
315
305
  Media_Query_Obj parse_media_query();
316
- Media_Query_Expression_Obj parse_media_expression();
317
- Supports_Block_Obj parse_supports_directive();
318
- Supports_Condition_Obj parse_supports_condition(bool top_level);
319
- Supports_Condition_Obj parse_supports_negation();
320
- Supports_Condition_Obj parse_supports_operator(bool top_level);
321
- Supports_Condition_Obj parse_supports_interpolation();
322
- Supports_Condition_Obj parse_supports_declaration();
323
- Supports_Condition_Obj parse_supports_condition_in_parens(bool parens_required);
324
- At_Root_Block_Obj parse_at_root_block();
306
+ Media_Query_ExpressionObj parse_media_expression();
307
+ SupportsRuleObj parse_supports_directive();
308
+ SupportsConditionObj parse_supports_condition(bool top_level);
309
+ SupportsConditionObj parse_supports_negation();
310
+ SupportsConditionObj parse_supports_operator(bool top_level);
311
+ SupportsConditionObj parse_supports_interpolation();
312
+ SupportsConditionObj parse_supports_declaration();
313
+ SupportsConditionObj parse_supports_condition_in_parens(bool parens_required);
314
+ AtRootRuleObj parse_at_root_block();
325
315
  At_Root_Query_Obj parse_at_root_query();
326
316
  String_Schema_Obj parse_almost_any_value();
327
- Directive_Obj parse_directive();
328
- Warning_Obj parse_warning();
329
- Error_Obj parse_error();
330
- Debug_Obj parse_debug();
317
+ AtRuleObj parse_directive();
318
+ WarningRuleObj parse_warning();
319
+ ErrorRuleObj parse_error();
320
+ DebugRuleObj parse_debug();
331
321
 
332
- Value* color_or_string(const std::string& lexed) const;
322
+ Value* color_or_string(const sass::string& lexed) const;
333
323
 
334
324
  // be more like ruby sass
335
- Expression_Obj lex_almost_any_value_token();
336
- Expression_Obj lex_almost_any_value_chars();
337
- Expression_Obj lex_interp_string();
338
- Expression_Obj lex_interp_uri();
339
- Expression_Obj lex_interpolation();
325
+ ExpressionObj lex_almost_any_value_token();
326
+ ExpressionObj lex_almost_any_value_chars();
327
+ ExpressionObj lex_interp_string();
328
+ ExpressionObj lex_interp_uri();
329
+ ExpressionObj lex_interpolation();
340
330
 
341
331
  // these will throw errors
342
332
  Token lex_variable();
@@ -348,28 +338,28 @@ namespace Sass {
348
338
  Lookahead lookahead_for_selector(const char* start = 0);
349
339
  Lookahead lookahead_for_include(const char* start = 0);
350
340
 
351
- Expression_Obj fold_operands(Expression_Obj base, std::vector<Expression_Obj>& operands, Operand op);
352
- Expression_Obj fold_operands(Expression_Obj base, std::vector<Expression_Obj>& operands, std::vector<Operand>& ops, size_t i = 0);
341
+ ExpressionObj fold_operands(ExpressionObj base, sass::vector<ExpressionObj>& operands, Operand op);
342
+ ExpressionObj fold_operands(ExpressionObj base, sass::vector<ExpressionObj>& operands, sass::vector<Operand>& ops, size_t i = 0);
353
343
 
354
- void throw_syntax_error(std::string message, size_t ln = 0);
355
- void throw_read_error(std::string message, size_t ln = 0);
344
+ void throw_syntax_error(sass::string message, size_t ln = 0);
345
+ void throw_read_error(sass::string message, size_t ln = 0);
356
346
 
357
347
 
358
348
  template <Prelexer::prelexer open, Prelexer::prelexer close>
359
- Expression_Obj lex_interp()
349
+ ExpressionObj lex_interp()
360
350
  {
361
351
  if (lex < open >(false)) {
362
352
  String_Schema_Obj schema = SASS_MEMORY_NEW(String_Schema, pstate);
363
- // std::cerr << "LEX [[" << std::string(lexed) << "]]\n";
353
+ // std::cerr << "LEX [[" << sass::string(lexed) << "]]\n";
364
354
  schema->append(SASS_MEMORY_NEW(String_Constant, pstate, lexed));
365
355
  if (position[0] == '#' && position[1] == '{') {
366
- Expression_Obj itpl = lex_interpolation();
356
+ ExpressionObj itpl = lex_interpolation();
367
357
  if (!itpl.isNull()) schema->append(itpl);
368
358
  while (lex < close >(false)) {
369
- // std::cerr << "LEX [[" << std::string(lexed) << "]]\n";
359
+ // std::cerr << "LEX [[" << sass::string(lexed) << "]]\n";
370
360
  schema->append(SASS_MEMORY_NEW(String_Constant, pstate, lexed));
371
361
  if (position[0] == '#' && position[1] == '{') {
372
- Expression_Obj itpl = lex_interpolation();
362
+ ExpressionObj itpl = lex_interpolation();
373
363
  if (!itpl.isNull()) schema->append(itpl);
374
364
  } else {
375
365
  return schema;
@@ -383,15 +373,15 @@ namespace Sass {
383
373
  }
384
374
 
385
375
  public:
386
- static Number* lexed_number(const ParserState& pstate, const std::string& parsed);
387
- static Number* lexed_dimension(const ParserState& pstate, const std::string& parsed);
388
- static Number* lexed_percentage(const ParserState& pstate, const std::string& parsed);
389
- static Value* lexed_hex_color(const ParserState& pstate, const std::string& parsed);
376
+ static Number* lexed_number(const SourceSpan& pstate, const sass::string& parsed);
377
+ static Number* lexed_dimension(const SourceSpan& pstate, const sass::string& parsed);
378
+ static Number* lexed_percentage(const SourceSpan& pstate, const sass::string& parsed);
379
+ static Value* lexed_hex_color(const SourceSpan& pstate, const sass::string& parsed);
390
380
  private:
391
- Number* lexed_number(const std::string& parsed) { return lexed_number(pstate, parsed); };
392
- Number* lexed_dimension(const std::string& parsed) { return lexed_dimension(pstate, parsed); };
393
- Number* lexed_percentage(const std::string& parsed) { return lexed_percentage(pstate, parsed); };
394
- Value* lexed_hex_color(const std::string& parsed) { return lexed_hex_color(pstate, parsed); };
381
+ Number* lexed_number(const sass::string& parsed) { return lexed_number(pstate, parsed); };
382
+ Number* lexed_dimension(const sass::string& parsed) { return lexed_dimension(pstate, parsed); };
383
+ Number* lexed_percentage(const sass::string& parsed) { return lexed_percentage(pstate, parsed); };
384
+ Value* lexed_hex_color(const sass::string& parsed) { return lexed_hex_color(pstate, parsed); };
395
385
 
396
386
  static const char* re_attr_sensitive_close(const char* src);
397
387
  static const char* re_attr_insensitive_close(const char* src);
@@ -139,16 +139,16 @@ namespace Sass {
139
139
  {
140
140
  // parent selector only allowed at start
141
141
  // upcoming Sass may allow also trailing
142
- ParserState state(pstate);
143
- std::string found("&");
142
+ SourceSpan state(pstate);
143
+ sass::string found("&");
144
144
  if (lex < identifier >()) {
145
- found += std::string(lexed);
145
+ found += sass::string(lexed);
146
146
  }
147
- std::string sel(seq->hasRealParent() ? "&" : "");
147
+ sass::string sel(seq->hasRealParent() ? "&" : "");
148
148
  if (!seq->empty()) { sel = seq->last()->to_string({ NESTED, 5 }); }
149
149
  // ToDo: parser should throw parser exceptions
150
150
  error("Invalid CSS after \"" + sel + "\": expected \"{\", was \"" + found + "\"\n\n"
151
- "\"" + found + "\" may only be used at the beginning of a compound selector.", state);
151
+ "\"" + found + "\" may only be used at the beginning of a compound selector.");
152
152
  }
153
153
  // parse functional
154
154
  else if (match < re_functional >())
@@ -159,7 +159,7 @@ namespace Sass {
159
159
  // parse type selector
160
160
  else if (lex< re_type_selector >(false))
161
161
  {
162
- seq->append(SASS_MEMORY_NEW(Type_Selector, pstate, lexed));
162
+ seq->append(SASS_MEMORY_NEW(TypeSelector, pstate, lexed));
163
163
  }
164
164
  // peek for abort conditions
165
165
  else if (peek< spaces >()) break;
@@ -7,37 +7,42 @@ namespace Sass {
7
7
 
8
8
  // Returns a list of all possible paths through the given lists.
9
9
  //
10
- // For example, given `[[1, 2], [3, 4], [5]]`, this returns:
10
+ // For example, given `[[1, 2], [3, 4], [5, 6]]`, this returns:
11
11
  //
12
12
  // ```
13
13
  // [[1, 3, 5],
14
14
  // [2, 3, 5],
15
15
  // [1, 4, 5],
16
- // [2, 4, 5]]
16
+ // [2, 4, 5],
17
+ // [1, 3, 6],
18
+ // [2, 3, 6],
19
+ // [1, 4, 6],
20
+ // [2, 4, 6]]
17
21
  // ```
18
22
  //
19
23
  // Note: called `paths` in dart-sass
20
24
  template <class T>
21
- std::vector<std::vector<T>> permutate(
22
- const std::vector<std::vector<T>>& in)
25
+ sass::vector<sass::vector<T>> permutate(
26
+ const sass::vector<sass::vector<T>>& in)
23
27
  {
24
28
 
25
29
  size_t L = in.size(), n = 0;
26
30
 
31
+ if (L == 0) return {};
27
32
  // Exit early if any entry is empty
28
33
  for (size_t i = 0; i < L; i += 1) {
29
34
  if (in[i].size() == 0) return {};
30
35
  }
31
36
 
32
37
  size_t* state = new size_t[L + 1];
33
- std::vector<std::vector<T>> out;
38
+ sass::vector<sass::vector<T>> out;
34
39
 
35
40
  // First initialize all states for every permutation group
36
41
  for (size_t i = 0; i < L; i += 1) {
37
42
  state[i] = in[i].size() - 1;
38
43
  }
39
44
  while (true) {
40
- std::vector<T> perm;
45
+ sass::vector<T> perm;
41
46
  // Create one permutation for state
42
47
  for (size_t i = 0; i < L; i += 1) {
43
48
  perm.push_back(in.at(i).at(in[i].size() - state[i] - 1));
@@ -73,19 +78,40 @@ namespace Sass {
73
78
  }
74
79
  // EO permutate
75
80
 
76
- // ToDo: this variant is used in resolve_parent_refs
81
+ // ToDo: this variant is used in resolveParentSelectors
82
+ // Returns a list of all possible paths through the given lists.
83
+ //
84
+ // For example, given `[[1, 2], [3, 4], [5, 6]]`, this returns:
85
+ //
86
+ // ```
87
+ // [[1, 3, 5],
88
+ // [1, 3, 6],
89
+ // [1, 4, 5],
90
+ // [1, 4, 6],
91
+ // [2, 3, 5],
92
+ // [2, 3, 6],
93
+ // [2, 4, 5],
94
+ // [2, 4, 6]]
95
+ // ```
96
+ //
77
97
  template <class T>
78
- std::vector<std::vector<T>>
79
- permutateAlt(const std::vector<std::vector<T>>& in) {
98
+ sass::vector<sass::vector<T>>
99
+ permutateAlt(const sass::vector<sass::vector<T>>& in) {
80
100
 
81
101
  size_t L = in.size();
82
102
  size_t n = in.size() - 1;
103
+
104
+ if (L == 0) return {};
105
+ // Exit early if any entry is empty
106
+ for (size_t i = 0; i < L; i += 1) {
107
+ if (in[i].size() == 0) return {};
108
+ }
109
+
83
110
  size_t* state = new size_t[L];
84
- std::vector< std::vector<T>> out;
111
+ sass::vector<sass::vector<T>> out;
85
112
 
86
113
  // First initialize all states for every permutation group
87
114
  for (size_t i = 0; i < L; i += 1) {
88
- if (in[i].size() == 0) return {};
89
115
  state[i] = in[i].size() - 1;
90
116
  }
91
117
 
@@ -96,7 +122,7 @@ namespace Sass {
96
122
  { // std::cerr << state[p] << " "; }
97
123
  // std::cerr << "\n";
98
124
  */
99
- std::vector<T> perm;
125
+ sass::vector<T> perm;
100
126
  // Create one permutation for state
101
127
  for (size_t i = 0; i < L; i += 1) {
102
128
  perm.push_back(in.at(i).at(in[i].size() - state[i] - 1));
@@ -104,10 +130,8 @@ namespace Sass {
104
130
  // Current group finished
105
131
  if (state[n] == 0) {
106
132
  // Find position of next decrement
107
- while (n > 0 && state[--n] == 0)
108
- {
133
+ while (n > 0 && state[--n] == 0) {}
109
134
 
110
- }
111
135
  // Check for end condition
112
136
  if (state[n] != 0) {
113
137
  // Decrease next on the left side
@@ -44,18 +44,18 @@ namespace Sass {
44
44
  if (!strcmp(our_version, "[na]")) return false;
45
45
 
46
46
  // find the position of the second dot
47
- size_t pos = std::string(our_version).find('.', 0);
48
- if (pos != std::string::npos) pos = std::string(our_version).find('.', pos + 1);
47
+ size_t pos = sass::string(our_version).find('.', 0);
48
+ if (pos != sass::string::npos) pos = sass::string(our_version).find('.', pos + 1);
49
49
 
50
50
  // if we do not have two dots we fallback to compare complete string
51
- if (pos == std::string::npos) { return strcmp(their_version, our_version) ? 0 : 1; }
51
+ if (pos == sass::string::npos) { return strcmp(their_version, our_version) ? 0 : 1; }
52
52
  // otherwise only compare up to the second dot (major versions)
53
53
  else { return strncmp(their_version, our_version, pos) ? 0 : 1; }
54
54
 
55
55
  }
56
56
 
57
57
  // load one specific plugin
58
- bool Plugins::load_plugin (const std::string& path)
58
+ bool Plugins::load_plugin (const sass::string& path)
59
59
  {
60
60
 
61
61
  typedef const char* (*__plugin_version__)(void);
@@ -112,7 +112,7 @@ namespace Sass {
112
112
 
113
113
  }
114
114
 
115
- size_t Plugins::load_plugins(const std::string& path)
115
+ size_t Plugins::load_plugins(const sass::string& path)
116
116
  {
117
117
 
118
118
  // count plugins
@@ -126,7 +126,7 @@ namespace Sass {
126
126
  // use wchar (utf16)
127
127
  WIN32_FIND_DATAW data;
128
128
  // trailing slash is guaranteed
129
- std::string globsrch(path + "*.dll");
129
+ sass::string globsrch(path + "*.dll");
130
130
  // convert to wide chars (utf16) for system call
131
131
  std::wstring wglobsrch(UTF_8::convert_to_utf16(globsrch));
132
132
  HANDLE hFile = FindFirstFileW(wglobsrch.c_str(), &data);
@@ -140,7 +140,7 @@ namespace Sass {
140
140
  try
141
141
  {
142
142
  // the system will report the filenames with wide chars (utf16)
143
- std::string entry = UTF_8::convert_from_utf16(data.cFileName);
143
+ sass::string entry = UTF_8::convert_from_utf16(data.cFileName);
144
144
  // check if file ending matches exactly
145
145
  if (!ends_with(entry, ".dll")) continue;
146
146
  // load the plugin and increase counter