sassc 2.1.0.pre3 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/CHANGELOG.md +24 -0
  4. data/Rakefile +2 -4
  5. data/ext/extconf.rb +13 -5
  6. data/ext/libsass/VERSION +1 -1
  7. data/ext/libsass/include/sass/base.h +2 -1
  8. data/ext/libsass/include/sass/context.h +4 -0
  9. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  10. data/ext/libsass/src/ast.cpp +158 -168
  11. data/ext/libsass/src/ast.hpp +389 -230
  12. data/ext/libsass/src/ast_def_macros.hpp +18 -10
  13. data/ext/libsass/src/ast_fwd_decl.cpp +4 -3
  14. data/ext/libsass/src/ast_fwd_decl.hpp +98 -165
  15. data/ext/libsass/src/ast_helpers.hpp +292 -0
  16. data/ext/libsass/src/ast_sel_cmp.cpp +219 -732
  17. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  18. data/ext/libsass/src/ast_sel_unify.cpp +207 -212
  19. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  20. data/ext/libsass/src/ast_selectors.cpp +594 -1026
  21. data/ext/libsass/src/ast_selectors.hpp +339 -385
  22. data/ext/libsass/src/ast_supports.cpp +36 -52
  23. data/ext/libsass/src/ast_supports.hpp +29 -29
  24. data/ext/libsass/src/ast_values.cpp +271 -84
  25. data/ext/libsass/src/ast_values.hpp +116 -107
  26. data/ext/libsass/src/backtrace.cpp +9 -9
  27. data/ext/libsass/src/backtrace.hpp +5 -5
  28. data/ext/libsass/src/base64vlq.cpp +2 -2
  29. data/ext/libsass/src/base64vlq.hpp +1 -1
  30. data/ext/libsass/src/bind.cpp +18 -18
  31. data/ext/libsass/src/bind.hpp +1 -1
  32. data/ext/libsass/src/c2ast.cpp +3 -3
  33. data/ext/libsass/src/c2ast.hpp +1 -1
  34. data/ext/libsass/src/cencode.c +4 -6
  35. data/ext/libsass/src/check_nesting.cpp +40 -41
  36. data/ext/libsass/src/check_nesting.hpp +6 -2
  37. data/ext/libsass/src/color_maps.cpp +14 -13
  38. data/ext/libsass/src/color_maps.hpp +1 -9
  39. data/ext/libsass/src/constants.cpp +5 -0
  40. data/ext/libsass/src/constants.hpp +6 -0
  41. data/ext/libsass/src/context.cpp +92 -119
  42. data/ext/libsass/src/context.hpp +41 -53
  43. data/ext/libsass/src/cssize.cpp +66 -149
  44. data/ext/libsass/src/cssize.hpp +17 -23
  45. data/ext/libsass/src/dart_helpers.hpp +199 -0
  46. data/ext/libsass/src/debugger.hpp +451 -295
  47. data/ext/libsass/src/emitter.cpp +15 -16
  48. data/ext/libsass/src/emitter.hpp +10 -12
  49. data/ext/libsass/src/environment.cpp +27 -27
  50. data/ext/libsass/src/environment.hpp +29 -24
  51. data/ext/libsass/src/error_handling.cpp +62 -41
  52. data/ext/libsass/src/error_handling.hpp +61 -51
  53. data/ext/libsass/src/eval.cpp +167 -281
  54. data/ext/libsass/src/eval.hpp +27 -29
  55. data/ext/libsass/src/eval_selectors.cpp +75 -0
  56. data/ext/libsass/src/expand.cpp +275 -222
  57. data/ext/libsass/src/expand.hpp +36 -16
  58. data/ext/libsass/src/extender.cpp +1188 -0
  59. data/ext/libsass/src/extender.hpp +399 -0
  60. data/ext/libsass/src/extension.cpp +43 -0
  61. data/ext/libsass/src/extension.hpp +89 -0
  62. data/ext/libsass/src/file.cpp +81 -72
  63. data/ext/libsass/src/file.hpp +28 -37
  64. data/ext/libsass/src/fn_colors.cpp +20 -18
  65. data/ext/libsass/src/fn_lists.cpp +30 -29
  66. data/ext/libsass/src/fn_maps.cpp +3 -3
  67. data/ext/libsass/src/fn_miscs.cpp +34 -46
  68. data/ext/libsass/src/fn_numbers.cpp +20 -13
  69. data/ext/libsass/src/fn_selectors.cpp +98 -128
  70. data/ext/libsass/src/fn_strings.cpp +47 -33
  71. data/ext/libsass/src/fn_utils.cpp +31 -29
  72. data/ext/libsass/src/fn_utils.hpp +17 -11
  73. data/ext/libsass/src/inspect.cpp +186 -148
  74. data/ext/libsass/src/inspect.hpp +31 -29
  75. data/ext/libsass/src/lexer.cpp +20 -82
  76. data/ext/libsass/src/lexer.hpp +5 -16
  77. data/ext/libsass/src/listize.cpp +23 -37
  78. data/ext/libsass/src/listize.hpp +8 -9
  79. data/ext/libsass/src/mapping.hpp +1 -0
  80. data/ext/libsass/src/memory.hpp +12 -0
  81. data/ext/libsass/src/memory/allocator.cpp +48 -0
  82. data/ext/libsass/src/memory/allocator.hpp +138 -0
  83. data/ext/libsass/src/memory/config.hpp +20 -0
  84. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  85. data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
  86. data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +55 -9
  87. data/ext/libsass/src/operation.hpp +71 -61
  88. data/ext/libsass/src/operators.cpp +19 -18
  89. data/ext/libsass/src/operators.hpp +11 -11
  90. data/ext/libsass/src/ordered_map.hpp +112 -0
  91. data/ext/libsass/src/output.cpp +45 -64
  92. data/ext/libsass/src/output.hpp +6 -6
  93. data/ext/libsass/src/parser.cpp +512 -700
  94. data/ext/libsass/src/parser.hpp +89 -97
  95. data/ext/libsass/src/parser_selectors.cpp +189 -0
  96. data/ext/libsass/src/permutate.hpp +164 -0
  97. data/ext/libsass/src/plugins.cpp +7 -7
  98. data/ext/libsass/src/plugins.hpp +8 -8
  99. data/ext/libsass/src/position.cpp +7 -26
  100. data/ext/libsass/src/position.hpp +44 -21
  101. data/ext/libsass/src/prelexer.cpp +6 -6
  102. data/ext/libsass/src/remove_placeholders.cpp +55 -56
  103. data/ext/libsass/src/remove_placeholders.hpp +21 -18
  104. data/ext/libsass/src/sass.cpp +16 -15
  105. data/ext/libsass/src/sass.hpp +10 -5
  106. data/ext/libsass/src/sass2scss.cpp +4 -4
  107. data/ext/libsass/src/sass_context.cpp +91 -122
  108. data/ext/libsass/src/sass_context.hpp +2 -2
  109. data/ext/libsass/src/sass_functions.cpp +1 -1
  110. data/ext/libsass/src/sass_values.cpp +8 -11
  111. data/ext/libsass/src/settings.hpp +19 -0
  112. data/ext/libsass/src/source.cpp +69 -0
  113. data/ext/libsass/src/source.hpp +95 -0
  114. data/ext/libsass/src/source_data.hpp +32 -0
  115. data/ext/libsass/src/source_map.cpp +22 -18
  116. data/ext/libsass/src/source_map.hpp +12 -9
  117. data/ext/libsass/src/stylesheet.cpp +22 -0
  118. data/ext/libsass/src/stylesheet.hpp +57 -0
  119. data/ext/libsass/src/to_value.cpp +2 -2
  120. data/ext/libsass/src/to_value.hpp +1 -1
  121. data/ext/libsass/src/units.cpp +24 -22
  122. data/ext/libsass/src/units.hpp +8 -8
  123. data/ext/libsass/src/utf8_string.cpp +9 -10
  124. data/ext/libsass/src/utf8_string.hpp +7 -6
  125. data/ext/libsass/src/util.cpp +48 -50
  126. data/ext/libsass/src/util.hpp +20 -21
  127. data/ext/libsass/src/util_string.cpp +111 -61
  128. data/ext/libsass/src/util_string.hpp +62 -8
  129. data/ext/libsass/src/values.cpp +12 -12
  130. data/lib/sassc/engine.rb +5 -3
  131. data/lib/sassc/functions_handler.rb +11 -13
  132. data/lib/sassc/native.rb +9 -7
  133. data/lib/sassc/script.rb +4 -6
  134. data/lib/sassc/version.rb +1 -1
  135. data/test/functions_test.rb +38 -1
  136. data/test/native_test.rb +4 -4
  137. metadata +31 -18
  138. data/ext/libsass/src/extend.cpp +0 -2132
  139. data/ext/libsass/src/extend.hpp +0 -86
  140. data/ext/libsass/src/node.cpp +0 -322
  141. data/ext/libsass/src/node.hpp +0 -118
  142. data/ext/libsass/src/paths.hpp +0 -71
  143. data/ext/libsass/src/sass_util.cpp +0 -152
  144. data/ext/libsass/src/sass_util.hpp +0 -256
  145. data/ext/libsass/src/subset_map.cpp +0 -58
  146. data/ext/libsass/src/subset_map.hpp +0 -76
  147. data/lib/sassc/native/lib_c.rb +0 -21
@@ -1,45 +1,37 @@
1
1
  #ifndef SASS_CONTEXT_H
2
2
  #define SASS_CONTEXT_H
3
3
 
4
- #include <string>
5
- #include <vector>
6
- #include <map>
4
+ // sass.hpp must go before all system headers to get the
5
+ // __EXTENSIONS__ fix on Solaris.
6
+ #include "sass.hpp"
7
+ #include "ast.hpp"
8
+
7
9
 
8
10
  #define BUFFERSIZE 255
9
11
  #include "b64/encode.h"
10
12
 
11
- #include "ast_fwd_decl.hpp"
12
- #include "kwd_arg_macros.hpp"
13
- #include "ast_fwd_decl.hpp"
14
13
  #include "sass_context.hpp"
15
- #include "environment.hpp"
16
- #include "source_map.hpp"
17
- #include "subset_map.hpp"
18
- #include "backtrace.hpp"
19
- #include "output.hpp"
14
+ #include "stylesheet.hpp"
20
15
  #include "plugins.hpp"
21
- #include "file.hpp"
22
-
23
-
24
- struct Sass_Function;
16
+ #include "output.hpp"
25
17
 
26
18
  namespace Sass {
27
19
 
28
20
  class Context {
29
21
  public:
30
- void import_url (Import* imp, std::string load_path, const std::string& ctx_path);
31
- bool call_headers(const std::string& load_path, const char* ctx_path, ParserState& pstate, Import* imp)
22
+ void import_url (Import* imp, sass::string load_path, const sass::string& ctx_path);
23
+ bool call_headers(const sass::string& load_path, const char* ctx_path, SourceSpan& pstate, Import* imp)
32
24
  { return call_loader(load_path, ctx_path, pstate, imp, c_headers, false); };
33
- bool call_importers(const std::string& load_path, const char* ctx_path, ParserState& pstate, Import* imp)
25
+ bool call_importers(const sass::string& load_path, const char* ctx_path, SourceSpan& pstate, Import* imp)
34
26
  { return call_loader(load_path, ctx_path, pstate, imp, c_importers, true); };
35
27
 
36
28
  private:
37
- bool call_loader(const std::string& load_path, const char* ctx_path, ParserState& pstate, Import* imp, std::vector<Sass_Importer_Entry> importers, bool only_one = true);
29
+ bool call_loader(const sass::string& load_path, const char* ctx_path, SourceSpan& pstate, Import* imp, sass::vector<Sass_Importer_Entry> importers, bool only_one = true);
38
30
 
39
31
  public:
40
- const std::string CWD;
32
+ const sass::string CWD;
41
33
  struct Sass_Options& c_options;
42
- std::string entry_path;
34
+ sass::string entry_path;
43
35
  size_t head_imports;
44
36
  Plugins plugins;
45
37
  Output emitter;
@@ -49,45 +41,41 @@ namespace Sass {
49
41
  CallStack ast_gc;
50
42
  // resources add under our control
51
43
  // these are guaranteed to be freed
52
- std::vector<char*> strings;
53
- std::vector<Resource> resources;
54
- std::map<const std::string, StyleSheet> sheets;
55
- Subset_Map subset_map;
44
+ sass::vector<char*> strings;
45
+ sass::vector<Resource> resources;
46
+ std::map<const sass::string, StyleSheet> sheets;
56
47
  ImporterStack import_stack;
57
- std::vector<Sass_Callee> callee_stack;
58
- std::vector<Backtrace> traces;
48
+ sass::vector<Sass_Callee> callee_stack;
49
+ sass::vector<Backtrace> traces;
50
+ Extender extender;
59
51
 
60
52
  struct Sass_Compiler* c_compiler;
61
53
 
62
54
  // absolute paths to includes
63
- std::vector<std::string> included_files;
55
+ sass::vector<sass::string> included_files;
64
56
  // relative includes for sourcemap
65
- std::vector<std::string> srcmap_links;
57
+ sass::vector<sass::string> srcmap_links;
66
58
  // vectors above have same size
67
59
 
68
- std::vector<std::string> plugin_paths; // relative paths to load plugins
69
- std::vector<std::string> include_paths; // lookup paths for includes
70
-
71
-
72
-
73
-
60
+ sass::vector<sass::string> plugin_paths; // relative paths to load plugins
61
+ sass::vector<sass::string> include_paths; // lookup paths for includes
74
62
 
75
- void apply_custom_headers(Block_Obj root, const char* path, ParserState pstate);
63
+ void apply_custom_headers(Block_Obj root, const char* path, SourceSpan pstate);
76
64
 
77
- std::vector<Sass_Importer_Entry> c_headers;
78
- std::vector<Sass_Importer_Entry> c_importers;
79
- std::vector<Sass_Function_Entry> c_functions;
65
+ sass::vector<Sass_Importer_Entry> c_headers;
66
+ sass::vector<Sass_Importer_Entry> c_importers;
67
+ sass::vector<Sass_Function_Entry> c_functions;
80
68
 
81
69
  void add_c_header(Sass_Importer_Entry header);
82
70
  void add_c_importer(Sass_Importer_Entry importer);
83
71
  void add_c_function(Sass_Function_Entry function);
84
72
 
85
- const std::string indent; // String to be used for indentation
86
- const std::string linefeed; // String to be used for line feeds
87
- const std::string input_path; // for relative paths in src-map
88
- const std::string output_path; // for relative paths to the output
89
- const std::string source_map_file; // path to source map file (enables feature)
90
- const std::string source_map_root; // path for sourceRoot property (pass-through)
73
+ const sass::string indent; // String to be used for indentation
74
+ const sass::string linefeed; // String to be used for line feeds
75
+ const sass::string input_path; // for relative paths in src-map
76
+ const sass::string output_path; // for relative paths to the output
77
+ const sass::string source_map_file; // path to source map file (enables feature)
78
+ const sass::string source_map_root; // path for sourceRoot property (pass-through)
91
79
 
92
80
  virtual ~Context();
93
81
  Context(struct Sass_Context&);
@@ -97,29 +85,29 @@ namespace Sass {
97
85
  virtual char* render_srcmap();
98
86
 
99
87
  void register_resource(const Include&, const Resource&);
100
- void register_resource(const Include&, const Resource&, ParserState&);
101
- std::vector<Include> find_includes(const Importer& import);
102
- Include load_import(const Importer&, ParserState pstate);
88
+ void register_resource(const Include&, const Resource&, SourceSpan&);
89
+ sass::vector<Include> find_includes(const Importer& import);
90
+ Include load_import(const Importer&, SourceSpan pstate);
103
91
 
104
92
  Sass_Output_Style output_style() { return c_options.output_style; };
105
- std::vector<std::string> get_included_files(bool skip = false, size_t headers = 0);
93
+ sass::vector<sass::string> get_included_files(bool skip = false, size_t headers = 0);
106
94
 
107
95
  private:
108
96
  void collect_plugin_paths(const char* paths_str);
109
97
  void collect_plugin_paths(string_list* paths_array);
110
98
  void collect_include_paths(const char* paths_str);
111
99
  void collect_include_paths(string_list* paths_array);
112
- std::string format_embedded_source_map();
113
- std::string format_source_mapping_url(const std::string& out_path);
100
+ sass::string format_embedded_source_map();
101
+ sass::string format_source_mapping_url(const sass::string& out_path);
114
102
 
115
103
 
116
104
  // void register_built_in_functions(Env* env);
117
105
  // void register_function(Signature sig, Native_Function f, Env* env);
118
106
  // void register_function(Signature sig, Native_Function f, size_t arity, Env* env);
119
- // void register_overload_stub(std::string name, Env* env);
107
+ // void register_overload_stub(sass::string name, Env* env);
120
108
 
121
109
  public:
122
- const std::string& cwd() { return CWD; };
110
+ const sass::string& cwd() { return CWD; };
123
111
  };
124
112
 
125
113
  class File_Context : public Context {
@@ -12,10 +12,9 @@
12
12
  namespace Sass {
13
13
 
14
14
  Cssize::Cssize(Context& ctx)
15
- : ctx(ctx),
16
- traces(ctx.traces),
15
+ : traces(ctx.traces),
17
16
  block_stack(BlockStack()),
18
- p_stack(std::vector<Statement*>())
17
+ p_stack(sass::vector<Statement*>())
19
18
  { }
20
19
 
21
20
  Statement* Cssize::parent()
@@ -81,17 +80,17 @@ namespace Sass {
81
80
  return 0;
82
81
  }
83
82
 
84
- Statement* Cssize::operator()(Directive* r)
83
+ Statement* Cssize::operator()(AtRule* r)
85
84
  {
86
85
  if (!r->block() || !r->block()->length()) return r;
87
86
 
88
87
  if (parent()->statement_type() == Statement::RULESET)
89
88
  {
90
- return (r->is_keyframes()) ? SASS_MEMORY_NEW(Bubble, r->pstate(), r) : bubble(r);
89
+ return r->is_keyframes() ? SASS_MEMORY_NEW(Bubble, r->pstate(), r) : bubble(r);
91
90
  }
92
91
 
93
92
  p_stack.push_back(r);
94
- Directive_Obj rr = SASS_MEMORY_NEW(Directive,
93
+ AtRuleObj rr = SASS_MEMORY_NEW(AtRule,
95
94
  r->pstate(),
96
95
  r->keyword(),
97
96
  r->selector(),
@@ -108,7 +107,7 @@ namespace Sass {
108
107
  Bubble_Obj s_obj = Cast<Bubble>(s);
109
108
  s = s_obj->node();
110
109
  if (s->statement_type() != Statement::DIRECTIVE) directive_exists = false;
111
- else directive_exists = (Cast<Directive>(s)->keyword() == rr->keyword());
110
+ else directive_exists = (Cast<AtRule>(s)->keyword() == rr->keyword());
112
111
  }
113
112
 
114
113
  }
@@ -116,7 +115,7 @@ namespace Sass {
116
115
  Block* result = SASS_MEMORY_NEW(Block, rr->pstate());
117
116
  if (!(directive_exists || rr->is_keyframes()))
118
117
  {
119
- Directive* empty_node = Cast<Directive>(rr);
118
+ AtRule* empty_node = Cast<AtRule>(rr);
120
119
  empty_node->block(SASS_MEMORY_NEW(Block, rr->block() ? rr->block()->pstate() : rr->pstate()));
121
120
  result->append(empty_node);
122
121
  }
@@ -143,20 +142,20 @@ namespace Sass {
143
142
  return debubble(rr->block(), rr);
144
143
  }
145
144
 
146
- Statement* Cssize::operator()(Ruleset* r)
145
+ Statement* Cssize::operator()(StyleRule* r)
147
146
  {
148
147
  p_stack.push_back(r);
149
148
  // this can return a string schema
150
149
  // string schema is not a statement!
151
150
  // r->block() is already a string schema
152
- // and that is comming from propset expand
151
+ // and that is coming from propset expand
153
152
  Block* bb = operator()(r->block());
154
153
  // this should protect us (at least a bit) from our mess
155
154
  // fixing this properly is harder that it should be ...
156
155
  if (Cast<Statement>(bb) == NULL) {
157
156
  error("Illegal nesting: Only properties may be nested beneath properties.", r->block()->pstate(), traces);
158
157
  }
159
- Ruleset_Obj rr = SASS_MEMORY_NEW(Ruleset,
158
+ StyleRuleObj rr = SASS_MEMORY_NEW(StyleRule,
160
159
  r->pstate(),
161
160
  r->selector(),
162
161
  bb);
@@ -215,20 +214,23 @@ namespace Sass {
215
214
  return 0;
216
215
  }
217
216
 
218
- Statement* Cssize::operator()(Media_Block* m)
217
+ Statement* Cssize::operator()(CssMediaRule* m)
219
218
  {
220
219
  if (parent()->statement_type() == Statement::RULESET)
221
- { return bubble(m); }
220
+ {
221
+ return bubble(m);
222
+ }
222
223
 
223
224
  if (parent()->statement_type() == Statement::MEDIA)
224
- { return SASS_MEMORY_NEW(Bubble, m->pstate(), m); }
225
+ {
226
+ return SASS_MEMORY_NEW(Bubble, m->pstate(), m);
227
+ }
225
228
 
226
229
  p_stack.push_back(m);
227
230
 
228
- Media_Block_Obj mm = SASS_MEMORY_NEW(Media_Block,
229
- m->pstate(),
230
- m->media_queries(),
231
- operator()(m->block()));
231
+ CssMediaRuleObj mm = SASS_MEMORY_NEW(CssMediaRule, m->pstate(), m->block());
232
+ mm->concat(m->elements());
233
+ mm->block(operator()(m->block()));
232
234
  mm->tabs(m->tabs());
233
235
 
234
236
  p_stack.pop_back();
@@ -236,7 +238,7 @@ namespace Sass {
236
238
  return debubble(mm->block(), mm);
237
239
  }
238
240
 
239
- Statement* Cssize::operator()(Supports_Block* m)
241
+ Statement* Cssize::operator()(SupportsRule* m)
240
242
  {
241
243
  if (!m->block()->length())
242
244
  { return m; }
@@ -246,7 +248,7 @@ namespace Sass {
246
248
 
247
249
  p_stack.push_back(m);
248
250
 
249
- Supports_Block_Obj mm = SASS_MEMORY_NEW(Supports_Block,
251
+ SupportsRuleObj mm = SASS_MEMORY_NEW(SupportsRule,
250
252
  m->pstate(),
251
253
  m->condition(),
252
254
  operator()(m->block()));
@@ -257,7 +259,7 @@ namespace Sass {
257
259
  return debubble(mm->block(), mm);
258
260
  }
259
261
 
260
- Statement* Cssize::operator()(At_Root_Block* m)
262
+ Statement* Cssize::operator()(AtRootRule* m)
261
263
  {
262
264
  bool tmp = false;
263
265
  for (size_t i = 0, L = p_stack.size(); i < L; ++i) {
@@ -285,17 +287,17 @@ namespace Sass {
285
287
  return bubble(m);
286
288
  }
287
289
 
288
- Statement* Cssize::bubble(Directive* m)
290
+ Statement* Cssize::bubble(AtRule* m)
289
291
  {
290
292
  Block* bb = SASS_MEMORY_NEW(Block, this->parent()->pstate());
291
- Has_Block_Obj new_rule = Cast<Has_Block>(SASS_MEMORY_COPY(this->parent()));
293
+ ParentStatementObj new_rule = Cast<ParentStatement>(SASS_MEMORY_COPY(this->parent()));
292
294
  new_rule->block(bb);
293
295
  new_rule->tabs(this->parent()->tabs());
294
296
  new_rule->block()->concat(m->block());
295
297
 
296
298
  Block_Obj wrapper_block = SASS_MEMORY_NEW(Block, m->block() ? m->block()->pstate() : m->pstate());
297
299
  wrapper_block->append(new_rule);
298
- Directive_Obj mm = SASS_MEMORY_NEW(Directive,
300
+ AtRuleObj mm = SASS_MEMORY_NEW(AtRule,
299
301
  m->pstate(),
300
302
  m->keyword(),
301
303
  m->selector(),
@@ -306,11 +308,11 @@ namespace Sass {
306
308
  return bubble;
307
309
  }
308
310
 
309
- Statement* Cssize::bubble(At_Root_Block* m)
311
+ Statement* Cssize::bubble(AtRootRule* m)
310
312
  {
311
313
  if (!m || !m->block()) return NULL;
312
314
  Block* bb = SASS_MEMORY_NEW(Block, this->parent()->pstate());
313
- Has_Block_Obj new_rule = Cast<Has_Block>(SASS_MEMORY_COPY(this->parent()));
315
+ ParentStatementObj new_rule = Cast<ParentStatement>(SASS_MEMORY_COPY(this->parent()));
314
316
  Block* wrapper_block = SASS_MEMORY_NEW(Block, m->block()->pstate());
315
317
  if (new_rule) {
316
318
  new_rule->block(bb);
@@ -319,7 +321,7 @@ namespace Sass {
319
321
  wrapper_block->append(new_rule);
320
322
  }
321
323
 
322
- At_Root_Block* mm = SASS_MEMORY_NEW(At_Root_Block,
324
+ AtRootRule* mm = SASS_MEMORY_NEW(AtRootRule,
323
325
  m->pstate(),
324
326
  wrapper_block,
325
327
  m->expression());
@@ -327,12 +329,12 @@ namespace Sass {
327
329
  return bubble;
328
330
  }
329
331
 
330
- Statement* Cssize::bubble(Supports_Block* m)
332
+ Statement* Cssize::bubble(SupportsRule* m)
331
333
  {
332
- Ruleset_Obj parent = Cast<Ruleset>(SASS_MEMORY_COPY(this->parent()));
334
+ StyleRuleObj parent = Cast<StyleRule>(SASS_MEMORY_COPY(this->parent()));
333
335
 
334
336
  Block* bb = SASS_MEMORY_NEW(Block, parent->block()->pstate());
335
- Ruleset* new_rule = SASS_MEMORY_NEW(Ruleset,
337
+ StyleRule* new_rule = SASS_MEMORY_NEW(StyleRule,
336
338
  parent->pstate(),
337
339
  parent->selector(),
338
340
  bb);
@@ -341,7 +343,7 @@ namespace Sass {
341
343
 
342
344
  Block* wrapper_block = SASS_MEMORY_NEW(Block, m->block()->pstate());
343
345
  wrapper_block->append(new_rule);
344
- Supports_Block* mm = SASS_MEMORY_NEW(Supports_Block,
346
+ SupportsRule* mm = SASS_MEMORY_NEW(SupportsRule,
345
347
  m->pstate(),
346
348
  m->condition(),
347
349
  wrapper_block);
@@ -352,24 +354,24 @@ namespace Sass {
352
354
  return bubble;
353
355
  }
354
356
 
355
- Statement* Cssize::bubble(Media_Block* m)
357
+ Statement* Cssize::bubble(CssMediaRule* m)
356
358
  {
357
- Ruleset_Obj parent = Cast<Ruleset>(SASS_MEMORY_COPY(this->parent()));
359
+ StyleRuleObj parent = Cast<StyleRule>(SASS_MEMORY_COPY(this->parent()));
358
360
 
359
361
  Block* bb = SASS_MEMORY_NEW(Block, parent->block()->pstate());
360
- Ruleset* new_rule = SASS_MEMORY_NEW(Ruleset,
361
- parent->pstate(),
362
- parent->selector(),
363
- bb);
362
+ StyleRule* new_rule = SASS_MEMORY_NEW(StyleRule,
363
+ parent->pstate(),
364
+ parent->selector(),
365
+ bb);
364
366
  new_rule->tabs(parent->tabs());
365
367
  new_rule->block()->concat(m->block());
366
368
 
367
369
  Block* wrapper_block = SASS_MEMORY_NEW(Block, m->block()->pstate());
368
370
  wrapper_block->append(new_rule);
369
- Media_Block_Obj mm = SASS_MEMORY_NEW(Media_Block,
370
- m->pstate(),
371
- m->media_queries(),
372
- wrapper_block);
371
+ CssMediaRuleObj mm = SASS_MEMORY_NEW(CssMediaRule,
372
+ m->pstate(),
373
+ wrapper_block);
374
+ mm->concat(m->elements());
373
375
 
374
376
  mm->tabs(m->tabs());
375
377
 
@@ -378,15 +380,15 @@ namespace Sass {
378
380
 
379
381
  bool Cssize::bubblable(Statement* s)
380
382
  {
381
- return Cast<Ruleset>(s) || s->bubbles();
383
+ return Cast<StyleRule>(s) || (s && s->bubbles());
382
384
  }
383
385
 
384
- Block* Cssize::flatten(Block* b)
386
+ Block* Cssize::flatten(const Block* b)
385
387
  {
386
388
  Block* result = SASS_MEMORY_NEW(Block, b->pstate(), 0, b->is_root());
387
389
  for (size_t i = 0, L = b->length(); i < L; ++i) {
388
390
  Statement* ss = b->at(i);
389
- if (Block* bb = Cast<Block>(ss)) {
391
+ if (const Block* bb = Cast<Block>(ss)) {
390
392
  Block_Obj bs = flatten(bb);
391
393
  for (size_t j = 0, K = bs->length(); j < K; ++j) {
392
394
  result->append(bs->at(j));
@@ -399,9 +401,9 @@ namespace Sass {
399
401
  return result;
400
402
  }
401
403
 
402
- std::vector<std::pair<bool, Block_Obj>> Cssize::slice_by_bubble(Block* b)
404
+ sass::vector<std::pair<bool, Block_Obj>> Cssize::slice_by_bubble(Block* b)
403
405
  {
404
- std::vector<std::pair<bool, Block_Obj>> results;
406
+ sass::vector<std::pair<bool, Block_Obj>> results;
405
407
 
406
408
  for (size_t i = 0, L = b->length(); i < L; ++i) {
407
409
  Statement_Obj value = b->at(i);
@@ -424,8 +426,8 @@ namespace Sass {
424
426
 
425
427
  Block* Cssize::debubble(Block* children, Statement* parent)
426
428
  {
427
- Has_Block_Obj previous_parent;
428
- std::vector<std::pair<bool, Block_Obj>> baz = slice_by_bubble(children);
429
+ ParentStatementObj previous_parent;
430
+ sass::vector<std::pair<bool, Block_Obj>> baz = slice_by_bubble(children);
429
431
  Block_Obj result = SASS_MEMORY_NEW(Block, children->pstate());
430
432
 
431
433
  for (size_t i = 0, L = baz.size(); i < L; ++i) {
@@ -440,7 +442,7 @@ namespace Sass {
440
442
  previous_parent->block()->concat(slice);
441
443
  }
442
444
  else {
443
- previous_parent = Cast<Has_Block>(SASS_MEMORY_COPY(parent));
445
+ previous_parent = SASS_MEMORY_COPY(parent);
444
446
  previous_parent->block(slice);
445
447
  previous_parent->tabs(parent->tabs());
446
448
 
@@ -451,36 +453,24 @@ namespace Sass {
451
453
 
452
454
  for (size_t j = 0, K = slice->length(); j < K; ++j)
453
455
  {
454
- Statement* ss;
456
+ Statement_Obj ss;
455
457
  Statement_Obj stm = slice->at(j);
456
458
  // this has to go now here (too bad)
457
459
  Bubble_Obj node = Cast<Bubble>(stm);
458
- Media_Block* m1 = NULL;
459
- Media_Block* m2 = NULL;
460
- if (parent) m1 = Cast<Media_Block>(parent);
461
- if (node) m2 = Cast<Media_Block>(node->node());
462
- if (!parent ||
463
- parent->statement_type() != Statement::MEDIA ||
464
- node->node()->statement_type() != Statement::MEDIA ||
465
- (m1 && m2 && *m1->media_queries() == *m2->media_queries())
466
- )
467
- {
468
- ss = node->node();
469
- }
470
- else
471
- {
472
- List_Obj mq = merge_media_queries(
473
- Cast<Media_Block>(node->node()),
474
- Cast<Media_Block>(parent)
475
- );
476
- if (!mq->length()) continue;
477
- if (Media_Block* b = Cast<Media_Block>(node->node())) {
478
- b->media_queries(mq);
479
- }
460
+
461
+ CssMediaRule* rule1 = NULL;
462
+ CssMediaRule* rule2 = NULL;
463
+ if (parent) rule1 = Cast<CssMediaRule>(parent);
464
+ if (node) rule2 = Cast<CssMediaRule>(node->node());
465
+ if (rule1 || rule2) {
480
466
  ss = node->node();
481
467
  }
482
468
 
483
- if (!ss) continue;
469
+ ss = node->node();
470
+
471
+ if (!ss) {
472
+ continue;
473
+ }
484
474
 
485
475
  ss->tabs(ss->tabs() + node->tabs());
486
476
  ss->group_end(node->group_end());
@@ -489,7 +479,8 @@ namespace Sass {
489
479
  children->pstate(),
490
480
  children->length(),
491
481
  children->is_root());
492
- bb->append(ss->perform(this));
482
+ auto evaled = ss->perform(this);
483
+ if (evaled) bb->append(evaled);
493
484
 
494
485
  Block_Obj wrapper_block = SASS_MEMORY_NEW(Block,
495
486
  children->pstate(),
@@ -516,7 +507,7 @@ namespace Sass {
516
507
  {
517
508
  for (size_t i = 0, L = b->length(); i < L; ++i) {
518
509
  Statement_Obj ith = b->at(i)->perform(this);
519
- if (Block* bb = Cast<Block>(ith)) {
510
+ if (Block_Obj bb = Cast<Block>(ith)) {
520
511
  for (size_t j = 0, K = bb->length(); j < K; ++j) {
521
512
  cur->append(bb->at(j));
522
513
  }
@@ -527,78 +518,4 @@ namespace Sass {
527
518
  }
528
519
  }
529
520
 
530
- List* Cssize::merge_media_queries(Media_Block* m1, Media_Block* m2)
531
- {
532
- List* qq = SASS_MEMORY_NEW(List,
533
- m1->media_queries()->pstate(),
534
- m1->media_queries()->length(),
535
- SASS_COMMA);
536
-
537
- for (size_t i = 0, L = m1->media_queries()->length(); i < L; i++) {
538
- for (size_t j = 0, K = m2->media_queries()->length(); j < K; j++) {
539
- Expression_Obj l1 = m1->media_queries()->at(i);
540
- Expression_Obj l2 = m2->media_queries()->at(j);
541
- Media_Query* mq1 = Cast<Media_Query>(l1);
542
- Media_Query* mq2 = Cast<Media_Query>(l2);
543
- Media_Query* mq = merge_media_query(mq1, mq2);
544
- if (mq) qq->append(mq);
545
- }
546
- }
547
-
548
- return qq;
549
- }
550
-
551
-
552
- Media_Query* Cssize::merge_media_query(Media_Query* mq1, Media_Query* mq2)
553
- {
554
-
555
- std::string type;
556
- std::string mod;
557
-
558
- std::string m1 = std::string(mq1->is_restricted() ? "only" : mq1->is_negated() ? "not" : "");
559
- std::string t1 = mq1->media_type() ? mq1->media_type()->to_string(ctx.c_options) : "";
560
- std::string m2 = std::string(mq2->is_restricted() ? "only" : mq2->is_negated() ? "not" : "");
561
- std::string t2 = mq2->media_type() ? mq2->media_type()->to_string(ctx.c_options) : "";
562
-
563
-
564
- if (t1.empty()) t1 = t2;
565
- if (t2.empty()) t2 = t1;
566
-
567
- if ((m1 == "not") ^ (m2 == "not")) {
568
- if (t1 == t2) {
569
- return 0;
570
- }
571
- type = m1 == "not" ? t2 : t1;
572
- mod = m1 == "not" ? m2 : m1;
573
- }
574
- else if (m1 == "not" && m2 == "not") {
575
- if (t1 != t2) {
576
- return 0;
577
- }
578
- type = t1;
579
- mod = "not";
580
- }
581
- else if (t1 != t2) {
582
- return 0;
583
- } else {
584
- type = t1;
585
- mod = m1.empty() ? m2 : m1;
586
- }
587
-
588
- Media_Query* mm = SASS_MEMORY_NEW(Media_Query,
589
- mq1->pstate(),
590
- {},
591
- mq1->length() + mq2->length(),
592
- mod == "not",
593
- mod == "only");
594
-
595
- if (!type.empty()) {
596
- mm->media_type(SASS_MEMORY_NEW(String_Quoted, mq1->pstate(), type));
597
- }
598
-
599
- mm->concat(mq2);
600
- mm->concat(mq1);
601
-
602
- return mm;
603
- }
604
521
  }