sassc 2.3.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
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