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,9 +1,14 @@
1
1
  #ifndef SASS_OPERATION_H
2
2
  #define SASS_OPERATION_H
3
3
 
4
+ // sass.hpp must go before all system headers to get the
5
+ // __EXTENSIONS__ fix on Solaris.
6
+ #include "sass.hpp"
7
+
4
8
  // base classes to implement curiously recurring template pattern (CRTP)
5
9
  // https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
6
10
 
11
+ #include <typeinfo>
7
12
  #include <stdexcept>
8
13
 
9
14
  #include "ast_fwd_decl.hpp"
@@ -14,13 +19,13 @@ namespace Sass {
14
19
  #define ATTACH_ABSTRACT_CRTP_PERFORM_METHODS()\
15
20
  virtual void perform(Operation<void>* op) = 0; \
16
21
  virtual Value* perform(Operation<Value*>* op) = 0; \
17
- virtual std::string perform(Operation<std::string>* op) = 0; \
22
+ virtual sass::string perform(Operation<sass::string>* op) = 0; \
18
23
  virtual AST_Node* perform(Operation<AST_Node*>* op) = 0; \
19
24
  virtual Selector* perform(Operation<Selector*>* op) = 0; \
20
25
  virtual Statement* perform(Operation<Statement*>* op) = 0; \
21
26
  virtual Expression* perform(Operation<Expression*>* op) = 0; \
22
27
  virtual union Sass_Value* perform(Operation<union Sass_Value*>* op) = 0; \
23
- virtual Supports_Condition* perform(Operation<Supports_Condition*>* op) = 0; \
28
+ virtual SupportsCondition* perform(Operation<SupportsCondition*>* op) = 0; \
24
29
 
25
30
  // you must add operators to every class
26
31
  // ensures `this` of actual instance type
@@ -29,13 +34,13 @@ namespace Sass {
29
34
  #define ATTACH_CRTP_PERFORM_METHODS()\
30
35
  virtual void perform(Operation<void>* op) override { return (*op)(this); } \
31
36
  virtual Value* perform(Operation<Value*>* op) override { return (*op)(this); } \
32
- virtual std::string perform(Operation<std::string>* op) override { return (*op)(this); } \
37
+ virtual sass::string perform(Operation<sass::string>* op) override { return (*op)(this); } \
33
38
  virtual AST_Node* perform(Operation<AST_Node*>* op) override { return (*op)(this); } \
34
39
  virtual Selector* perform(Operation<Selector*>* op) override { return (*op)(this); } \
35
40
  virtual Statement* perform(Operation<Statement*>* op) override { return (*op)(this); } \
36
41
  virtual Expression* perform(Operation<Expression*>* op) override { return (*op)(this); } \
37
42
  virtual union Sass_Value* perform(Operation<union Sass_Value*>* op) override { return (*op)(this); } \
38
- virtual Supports_Condition* perform(Operation<Supports_Condition*>* op) override { return (*op)(this); } \
43
+ virtual SupportsCondition* perform(Operation<SupportsCondition*>* op) override { return (*op)(this); } \
39
44
 
40
45
  template<typename T>
41
46
  class Operation {
@@ -43,29 +48,31 @@ namespace Sass {
43
48
  virtual T operator()(AST_Node* x) = 0;
44
49
  // statements
45
50
  virtual T operator()(Block* x) = 0;
46
- virtual T operator()(Ruleset* x) = 0;
51
+ virtual T operator()(StyleRule* x) = 0;
47
52
  virtual T operator()(Bubble* x) = 0;
48
53
  virtual T operator()(Trace* x) = 0;
49
- virtual T operator()(Supports_Block* x) = 0;
50
- virtual T operator()(Media_Block* x) = 0;
51
- virtual T operator()(At_Root_Block* x) = 0;
52
- virtual T operator()(Directive* x) = 0;
54
+ virtual T operator()(SupportsRule* x) = 0;
55
+ virtual T operator()(MediaRule* x) = 0;
56
+ virtual T operator()(CssMediaRule* x) = 0;
57
+ virtual T operator()(CssMediaQuery* x) = 0;
58
+ virtual T operator()(AtRootRule* x) = 0;
59
+ virtual T operator()(AtRule* x) = 0;
53
60
  virtual T operator()(Keyframe_Rule* x) = 0;
54
61
  virtual T operator()(Declaration* x) = 0;
55
62
  virtual T operator()(Assignment* x) = 0;
56
63
  virtual T operator()(Import* x) = 0;
57
64
  virtual T operator()(Import_Stub* x) = 0;
58
- virtual T operator()(Warning* x) = 0;
59
- virtual T operator()(Error* x) = 0;
60
- virtual T operator()(Debug* x) = 0;
65
+ virtual T operator()(WarningRule* x) = 0;
66
+ virtual T operator()(ErrorRule* x) = 0;
67
+ virtual T operator()(DebugRule* x) = 0;
61
68
  virtual T operator()(Comment* x) = 0;
62
69
  virtual T operator()(If* x) = 0;
63
- virtual T operator()(For* x) = 0;
64
- virtual T operator()(Each* x) = 0;
65
- virtual T operator()(While* x) = 0;
70
+ virtual T operator()(ForRule* x) = 0;
71
+ virtual T operator()(EachRule* x) = 0;
72
+ virtual T operator()(WhileRule* x) = 0;
66
73
  virtual T operator()(Return* x) = 0;
67
74
  virtual T operator()(Content* x) = 0;
68
- virtual T operator()(Extension* x) = 0;
75
+ virtual T operator()(ExtendRule* x) = 0;
69
76
  virtual T operator()(Definition* x) = 0;
70
77
  virtual T operator()(Mixin_Call* x) = 0;
71
78
  // expressions
@@ -87,15 +94,14 @@ namespace Sass {
87
94
  virtual T operator()(String_Schema* x) = 0;
88
95
  virtual T operator()(String_Quoted* x) = 0;
89
96
  virtual T operator()(String_Constant* x) = 0;
90
- virtual T operator()(Supports_Condition* x) = 0;
91
- virtual T operator()(Supports_Operator* x) = 0;
92
- virtual T operator()(Supports_Negation* x) = 0;
93
- virtual T operator()(Supports_Declaration* x) = 0;
97
+ virtual T operator()(SupportsCondition* x) = 0;
98
+ virtual T operator()(SupportsOperation* x) = 0;
99
+ virtual T operator()(SupportsNegation* x) = 0;
100
+ virtual T operator()(SupportsDeclaration* x) = 0;
94
101
  virtual T operator()(Supports_Interpolation* x) = 0;
95
- virtual T operator()(Media_Query* x) = 0;
102
+ virtual T operator()(Media_Query* x) = 0;
96
103
  virtual T operator()(Media_Query_Expression* x) = 0;
97
104
  virtual T operator()(At_Root_Query* x) = 0;
98
- virtual T operator()(Parent_Selector* x) = 0;
99
105
  virtual T operator()(Parent_Reference* x) = 0;
100
106
  // parameters and arguments
101
107
  virtual T operator()(Parameter* x) = 0;
@@ -104,51 +110,55 @@ namespace Sass {
104
110
  virtual T operator()(Arguments* x) = 0;
105
111
  // selectors
106
112
  virtual T operator()(Selector_Schema* x) = 0;
107
- virtual T operator()(Placeholder_Selector* x) = 0;
108
- virtual T operator()(Type_Selector* x) = 0;
109
- virtual T operator()(Class_Selector* x) = 0;
110
- virtual T operator()(Id_Selector* x) = 0;
111
- virtual T operator()(Attribute_Selector* x) = 0;
112
- virtual T operator()(Pseudo_Selector* x) = 0;
113
- virtual T operator()(Wrapped_Selector* x) = 0;
114
- virtual T operator()(Compound_Selector* x)= 0;
115
- virtual T operator()(Complex_Selector* x) = 0;
116
- virtual T operator()(Selector_List* x) = 0;
113
+ virtual T operator()(PlaceholderSelector* x) = 0;
114
+ virtual T operator()(TypeSelector* x) = 0;
115
+ virtual T operator()(ClassSelector* x) = 0;
116
+ virtual T operator()(IDSelector* x) = 0;
117
+ virtual T operator()(AttributeSelector* x) = 0;
118
+ virtual T operator()(PseudoSelector* x) = 0;
119
+ virtual T operator()(SelectorComponent* x) = 0;
120
+ virtual T operator()(SelectorCombinator* x) = 0;
121
+ virtual T operator()(CompoundSelector* x) = 0;
122
+ virtual T operator()(ComplexSelector* x) = 0;
123
+ virtual T operator()(SelectorList* x) = 0;
124
+
117
125
  };
118
126
 
119
127
  // example: Operation_CRTP<Expression*, Eval>
120
128
  // T is the base return type of all visitors
121
129
  // D is the class derived visitor class
122
- // normaly you want to implement all operators
130
+ // normally you want to implement all operators
123
131
  template <typename T, typename D>
124
132
  class Operation_CRTP : public Operation<T> {
125
133
  public:
126
134
  T operator()(AST_Node* x) { return static_cast<D*>(this)->fallback(x); }
127
135
  // statements
128
136
  T operator()(Block* x) { return static_cast<D*>(this)->fallback(x); }
129
- T operator()(Ruleset* x) { return static_cast<D*>(this)->fallback(x); }
137
+ T operator()(StyleRule* x) { return static_cast<D*>(this)->fallback(x); }
130
138
  T operator()(Bubble* x) { return static_cast<D*>(this)->fallback(x); }
131
139
  T operator()(Trace* x) { return static_cast<D*>(this)->fallback(x); }
132
- T operator()(Supports_Block* x) { return static_cast<D*>(this)->fallback(x); }
133
- T operator()(Media_Block* x) { return static_cast<D*>(this)->fallback(x); }
134
- T operator()(At_Root_Block* x) { return static_cast<D*>(this)->fallback(x); }
135
- T operator()(Directive* x) { return static_cast<D*>(this)->fallback(x); }
140
+ T operator()(SupportsRule* x) { return static_cast<D*>(this)->fallback(x); }
141
+ T operator()(MediaRule* x) { return static_cast<D*>(this)->fallback(x); }
142
+ T operator()(CssMediaRule* x) { return static_cast<D*>(this)->fallback(x); }
143
+ T operator()(CssMediaQuery* x) { return static_cast<D*>(this)->fallback(x); }
144
+ T operator()(AtRootRule* x) { return static_cast<D*>(this)->fallback(x); }
145
+ T operator()(AtRule* x) { return static_cast<D*>(this)->fallback(x); }
136
146
  T operator()(Keyframe_Rule* x) { return static_cast<D*>(this)->fallback(x); }
137
147
  T operator()(Declaration* x) { return static_cast<D*>(this)->fallback(x); }
138
148
  T operator()(Assignment* x) { return static_cast<D*>(this)->fallback(x); }
139
149
  T operator()(Import* x) { return static_cast<D*>(this)->fallback(x); }
140
150
  T operator()(Import_Stub* x) { return static_cast<D*>(this)->fallback(x); }
141
- T operator()(Warning* x) { return static_cast<D*>(this)->fallback(x); }
142
- T operator()(Error* x) { return static_cast<D*>(this)->fallback(x); }
143
- T operator()(Debug* x) { return static_cast<D*>(this)->fallback(x); }
151
+ T operator()(WarningRule* x) { return static_cast<D*>(this)->fallback(x); }
152
+ T operator()(ErrorRule* x) { return static_cast<D*>(this)->fallback(x); }
153
+ T operator()(DebugRule* x) { return static_cast<D*>(this)->fallback(x); }
144
154
  T operator()(Comment* x) { return static_cast<D*>(this)->fallback(x); }
145
155
  T operator()(If* x) { return static_cast<D*>(this)->fallback(x); }
146
- T operator()(For* x) { return static_cast<D*>(this)->fallback(x); }
147
- T operator()(Each* x) { return static_cast<D*>(this)->fallback(x); }
148
- T operator()(While* x) { return static_cast<D*>(this)->fallback(x); }
156
+ T operator()(ForRule* x) { return static_cast<D*>(this)->fallback(x); }
157
+ T operator()(EachRule* x) { return static_cast<D*>(this)->fallback(x); }
158
+ T operator()(WhileRule* x) { return static_cast<D*>(this)->fallback(x); }
149
159
  T operator()(Return* x) { return static_cast<D*>(this)->fallback(x); }
150
160
  T operator()(Content* x) { return static_cast<D*>(this)->fallback(x); }
151
- T operator()(Extension* x) { return static_cast<D*>(this)->fallback(x); }
161
+ T operator()(ExtendRule* x) { return static_cast<D*>(this)->fallback(x); }
152
162
  T operator()(Definition* x) { return static_cast<D*>(this)->fallback(x); }
153
163
  T operator()(Mixin_Call* x) { return static_cast<D*>(this)->fallback(x); }
154
164
  // expressions
@@ -170,15 +180,14 @@ namespace Sass {
170
180
  T operator()(String_Schema* x) { return static_cast<D*>(this)->fallback(x); }
171
181
  T operator()(String_Constant* x) { return static_cast<D*>(this)->fallback(x); }
172
182
  T operator()(String_Quoted* x) { return static_cast<D*>(this)->fallback(x); }
173
- T operator()(Supports_Condition* x) { return static_cast<D*>(this)->fallback(x); }
174
- T operator()(Supports_Operator* x) { return static_cast<D*>(this)->fallback(x); }
175
- T operator()(Supports_Negation* x) { return static_cast<D*>(this)->fallback(x); }
176
- T operator()(Supports_Declaration* x) { return static_cast<D*>(this)->fallback(x); }
183
+ T operator()(SupportsCondition* x) { return static_cast<D*>(this)->fallback(x); }
184
+ T operator()(SupportsOperation* x) { return static_cast<D*>(this)->fallback(x); }
185
+ T operator()(SupportsNegation* x) { return static_cast<D*>(this)->fallback(x); }
186
+ T operator()(SupportsDeclaration* x) { return static_cast<D*>(this)->fallback(x); }
177
187
  T operator()(Supports_Interpolation* x) { return static_cast<D*>(this)->fallback(x); }
178
188
  T operator()(Media_Query* x) { return static_cast<D*>(this)->fallback(x); }
179
189
  T operator()(Media_Query_Expression* x) { return static_cast<D*>(this)->fallback(x); }
180
190
  T operator()(At_Root_Query* x) { return static_cast<D*>(this)->fallback(x); }
181
- T operator()(Parent_Selector* x) { return static_cast<D*>(this)->fallback(x); }
182
191
  T operator()(Parent_Reference* x) { return static_cast<D*>(this)->fallback(x); }
183
192
  // parameters and arguments
184
193
  T operator()(Parameter* x) { return static_cast<D*>(this)->fallback(x); }
@@ -187,20 +196,21 @@ namespace Sass {
187
196
  T operator()(Arguments* x) { return static_cast<D*>(this)->fallback(x); }
188
197
  // selectors
189
198
  T operator()(Selector_Schema* x) { return static_cast<D*>(this)->fallback(x); }
190
- T operator()(Placeholder_Selector* x) { return static_cast<D*>(this)->fallback(x); }
191
- T operator()(Type_Selector* x) { return static_cast<D*>(this)->fallback(x); }
192
- T operator()(Class_Selector* x) { return static_cast<D*>(this)->fallback(x); }
193
- T operator()(Id_Selector* x) { return static_cast<D*>(this)->fallback(x); }
194
- T operator()(Attribute_Selector* x) { return static_cast<D*>(this)->fallback(x); }
195
- T operator()(Pseudo_Selector* x) { return static_cast<D*>(this)->fallback(x); }
196
- T operator()(Wrapped_Selector* x) { return static_cast<D*>(this)->fallback(x); }
197
- T operator()(Compound_Selector* x){ return static_cast<D*>(this)->fallback(x); }
198
- T operator()(Complex_Selector* x) { return static_cast<D*>(this)->fallback(x); }
199
- T operator()(Selector_List* x) { return static_cast<D*>(this)->fallback(x); }
199
+ T operator()(PlaceholderSelector* x) { return static_cast<D*>(this)->fallback(x); }
200
+ T operator()(TypeSelector* x) { return static_cast<D*>(this)->fallback(x); }
201
+ T operator()(ClassSelector* x) { return static_cast<D*>(this)->fallback(x); }
202
+ T operator()(IDSelector* x) { return static_cast<D*>(this)->fallback(x); }
203
+ T operator()(AttributeSelector* x) { return static_cast<D*>(this)->fallback(x); }
204
+ T operator()(PseudoSelector* x) { return static_cast<D*>(this)->fallback(x); }
205
+ T operator()(SelectorComponent* x) { return static_cast<D*>(this)->fallback(x); }
206
+ T operator()(SelectorCombinator* x) { return static_cast<D*>(this)->fallback(x); }
207
+ T operator()(CompoundSelector* x) { return static_cast<D*>(this)->fallback(x); }
208
+ T operator()(ComplexSelector* x) { return static_cast<D*>(this)->fallback(x); }
209
+ T operator()(SelectorList* x) { return static_cast<D*>(this)->fallback(x); }
200
210
 
201
211
  // fallback with specific type U
202
212
  // will be called if not overloaded
203
- template <typename U> T fallback(U x)
213
+ template <typename U> inline T fallback(U x)
204
214
  {
205
215
  throw std::runtime_error(
206
216
  std::string(typeid(*this).name()) + ": CRTP not implemented for " + typeid(x).name());
@@ -2,6 +2,7 @@
2
2
  // __EXTENSIONS__ fix on Solaris.
3
3
  #include "sass.hpp"
4
4
 
5
+ #include <cmath>
5
6
  #include "operators.hpp"
6
7
 
7
8
  namespace Sass {
@@ -30,7 +31,7 @@ namespace Sass {
30
31
  };
31
32
 
32
33
  /* static function, has no pstate or traces */
33
- bool eq(Expression_Obj lhs, Expression_Obj rhs)
34
+ bool eq(ExpressionObj lhs, ExpressionObj rhs)
34
35
  {
35
36
  // operation is undefined if one is not a number
36
37
  if (!lhs || !rhs) throw Exception::UndefinedOperation(lhs, rhs, Sass_OP::EQ);
@@ -39,7 +40,7 @@ namespace Sass {
39
40
  }
40
41
 
41
42
  /* static function, throws OperationError, has no pstate or traces */
42
- bool cmp(Expression_Obj lhs, Expression_Obj rhs, const Sass_OP op)
43
+ bool cmp(ExpressionObj lhs, ExpressionObj rhs, const Sass_OP op)
43
44
  {
44
45
  // can only compare numbers!?
45
46
  Number_Obj l = Cast<Number>(lhs);
@@ -51,14 +52,14 @@ namespace Sass {
51
52
  }
52
53
 
53
54
  /* static functions, throws OperationError, has no pstate or traces */
54
- bool lt(Expression_Obj lhs, Expression_Obj rhs) { return cmp(lhs, rhs, Sass_OP::LT); }
55
- bool neq(Expression_Obj lhs, Expression_Obj rhs) { return eq(lhs, rhs) == false; }
56
- bool gt(Expression_Obj lhs, Expression_Obj rhs) { return !cmp(lhs, rhs, Sass_OP::GT) && neq(lhs, rhs); }
57
- bool lte(Expression_Obj lhs, Expression_Obj rhs) { return cmp(lhs, rhs, Sass_OP::LTE) || eq(lhs, rhs); }
58
- bool gte(Expression_Obj lhs, Expression_Obj rhs) { return !cmp(lhs, rhs, Sass_OP::GTE) || eq(lhs, rhs); }
55
+ bool lt(ExpressionObj lhs, ExpressionObj rhs) { return cmp(lhs, rhs, Sass_OP::LT); }
56
+ bool neq(ExpressionObj lhs, ExpressionObj rhs) { return eq(lhs, rhs) == false; }
57
+ bool gt(ExpressionObj lhs, ExpressionObj rhs) { return !cmp(lhs, rhs, Sass_OP::GT) && neq(lhs, rhs); }
58
+ bool lte(ExpressionObj lhs, ExpressionObj rhs) { return cmp(lhs, rhs, Sass_OP::LTE) || eq(lhs, rhs); }
59
+ bool gte(ExpressionObj lhs, ExpressionObj rhs) { return !cmp(lhs, rhs, Sass_OP::GTE) || eq(lhs, rhs); }
59
60
 
60
61
  /* colour math deprecation warning */
61
- void op_color_deprecation(enum Sass_OP op, std::string lsh, std::string rhs, const ParserState& pstate)
62
+ void op_color_deprecation(enum Sass_OP op, sass::string lsh, sass::string rhs, const SourceSpan& pstate)
62
63
  {
63
64
  deprecated(
64
65
  "The operation `" + lsh + " " + sass_op_to_name(op) + " " + rhs +
@@ -69,20 +70,20 @@ namespace Sass {
69
70
  }
70
71
 
71
72
  /* static function, throws OperationError, has no traces but optional pstate for returned value */
72
- Value* op_strings(Sass::Operand operand, Value& lhs, Value& rhs, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed)
73
+ Value* op_strings(Sass::Operand operand, Value& lhs, Value& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
73
74
  {
74
75
  enum Sass_OP op = operand.operand;
75
76
 
76
77
  String_Quoted* lqstr = Cast<String_Quoted>(&lhs);
77
78
  String_Quoted* rqstr = Cast<String_Quoted>(&rhs);
78
79
 
79
- std::string lstr(lqstr ? lqstr->value() : lhs.to_string(opt));
80
- std::string rstr(rqstr ? rqstr->value() : rhs.to_string(opt));
80
+ sass::string lstr(lqstr ? lqstr->value() : lhs.to_string(opt));
81
+ sass::string rstr(rqstr ? rqstr->value() : rhs.to_string(opt));
81
82
 
82
83
  if (Cast<Null>(&lhs)) throw Exception::InvalidNullOperation(&lhs, &rhs, op);
83
84
  if (Cast<Null>(&rhs)) throw Exception::InvalidNullOperation(&lhs, &rhs, op);
84
85
 
85
- std::string sep;
86
+ sass::string sep;
86
87
  switch (op) {
87
88
  case Sass_OP::ADD: sep = ""; break;
88
89
  case Sass_OP::SUB: sep = "-"; break;
@@ -120,7 +121,7 @@ namespace Sass {
120
121
 
121
122
  /* ToDo: allow to operate also with hsla colors */
122
123
  /* static function, throws OperationError, has no traces but optional pstate for returned value */
123
- Value* op_colors(enum Sass_OP op, const Color_RGBA& lhs, const Color_RGBA& rhs, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed)
124
+ Value* op_colors(enum Sass_OP op, const Color_RGBA& lhs, const Color_RGBA& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
124
125
  {
125
126
 
126
127
  if (lhs.a() != rhs.a()) {
@@ -141,7 +142,7 @@ namespace Sass {
141
142
  }
142
143
 
143
144
  /* static function, throws OperationError, has no traces but optional pstate for returned value */
144
- Value* op_numbers(enum Sass_OP op, const Number& lhs, const Number& rhs, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed)
145
+ Value* op_numbers(enum Sass_OP op, const Number& lhs, const Number& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
145
146
  {
146
147
  double lval = lhs.value();
147
148
  double rval = rhs.value();
@@ -151,7 +152,7 @@ namespace Sass {
151
152
  }
152
153
 
153
154
  if (op == Sass_OP::DIV && rval == 0) {
154
- std::string result(lval ? "Infinity" : "NaN");
155
+ sass::string result(lval ? "Infinity" : "NaN");
155
156
  return SASS_MEMORY_NEW(String_Quoted, pstate, result);
156
157
  }
157
158
 
@@ -211,7 +212,7 @@ namespace Sass {
211
212
  }
212
213
 
213
214
  /* static function, throws OperationError, has no traces but optional pstate for returned value */
214
- Value* op_number_color(enum Sass_OP op, const Number& lhs, const Color_RGBA& rhs, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed)
215
+ Value* op_number_color(enum Sass_OP op, const Number& lhs, const Color_RGBA& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
215
216
  {
216
217
  double lval = lhs.value();
217
218
 
@@ -228,7 +229,7 @@ namespace Sass {
228
229
  }
229
230
  case Sass_OP::SUB:
230
231
  case Sass_OP::DIV: {
231
- std::string color(rhs.to_string(opt));
232
+ sass::string color(rhs.to_string(opt));
232
233
  op_color_deprecation(op, lhs.to_string(), color, pstate);
233
234
  return SASS_MEMORY_NEW(String_Quoted,
234
235
  pstate,
@@ -242,7 +243,7 @@ namespace Sass {
242
243
  }
243
244
 
244
245
  /* static function, throws OperationError, has no traces but optional pstate for returned value */
245
- Value* op_color_number(enum Sass_OP op, const Color_RGBA& lhs, const Number& rhs, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed)
246
+ Value* op_color_number(enum Sass_OP op, const Color_RGBA& lhs, const Number& rhs, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed)
246
247
  {
247
248
  double rval = rhs.value();
248
249
 
@@ -9,19 +9,19 @@ namespace Sass {
9
9
  namespace Operators {
10
10
 
11
11
  // equality operator using AST Node operator==
12
- bool eq(Expression_Obj, Expression_Obj);
13
- bool neq(Expression_Obj, Expression_Obj);
12
+ bool eq(ExpressionObj, ExpressionObj);
13
+ bool neq(ExpressionObj, ExpressionObj);
14
14
  // specific operators based on cmp and eq
15
- bool lt(Expression_Obj, Expression_Obj);
16
- bool gt(Expression_Obj, Expression_Obj);
17
- bool lte(Expression_Obj, Expression_Obj);
18
- bool gte(Expression_Obj, Expression_Obj);
15
+ bool lt(ExpressionObj, ExpressionObj);
16
+ bool gt(ExpressionObj, ExpressionObj);
17
+ bool lte(ExpressionObj, ExpressionObj);
18
+ bool gte(ExpressionObj, ExpressionObj);
19
19
  // arithmetic for all the combinations that matter
20
- Value* op_strings(Sass::Operand, Value&, Value&, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed = false);
21
- Value* op_colors(enum Sass_OP, const Color_RGBA&, const Color_RGBA&, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed = false);
22
- Value* op_numbers(enum Sass_OP, const Number&, const Number&, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed = false);
23
- Value* op_number_color(enum Sass_OP, const Number&, const Color_RGBA&, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed = false);
24
- Value* op_color_number(enum Sass_OP, const Color_RGBA&, const Number&, struct Sass_Inspect_Options opt, const ParserState& pstate, bool delayed = false);
20
+ Value* op_strings(Sass::Operand, Value&, Value&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
21
+ Value* op_colors(enum Sass_OP, const Color_RGBA&, const Color_RGBA&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
22
+ Value* op_numbers(enum Sass_OP, const Number&, const Number&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
23
+ Value* op_number_color(enum Sass_OP, const Number&, const Color_RGBA&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
24
+ Value* op_color_number(enum Sass_OP, const Color_RGBA&, const Number&, struct Sass_Inspect_Options opt, const SourceSpan& pstate, bool delayed = false);
25
25
 
26
26
  };
27
27
 
@@ -0,0 +1,112 @@
1
+ #ifndef SASS_ORDERED_MAP_H
2
+ #define SASS_ORDERED_MAP_H
3
+
4
+ namespace Sass {
5
+
6
+ // ##########################################################################
7
+ // Very simple and limited container for insert ordered hash map.
8
+ // Piggy-back implementation on std::unordered_map and sass::vector
9
+ // ##########################################################################
10
+ template<
11
+ class Key,
12
+ class T,
13
+ class Hash = std::hash<Key>,
14
+ class KeyEqual = std::equal_to<Key>,
15
+ class Allocator = std::allocator<std::pair<const Key, T>>
16
+ >
17
+ class ordered_map {
18
+
19
+ private:
20
+
21
+ using map_type = typename std::unordered_map< Key, T, Hash, KeyEqual, Allocator>;
22
+ using map_iterator = typename std::unordered_map< Key, T, Hash, KeyEqual, Allocator>::iterator;
23
+ using map_const_iterator = typename std::unordered_map< Key, T, Hash, KeyEqual, Allocator>::const_iterator;
24
+
25
+ // The main unordered map
26
+ map_type _map;
27
+
28
+ // Keep insertion order
29
+ sass::vector<Key> _keys;
30
+ sass::vector<T> _values;
31
+
32
+ const KeyEqual _keyEqual;
33
+
34
+ public:
35
+
36
+ ordered_map() :
37
+ _keyEqual(KeyEqual())
38
+ {
39
+ }
40
+
41
+ ordered_map& operator= (const ordered_map& other) {
42
+ _map = other._map;
43
+ _keys = other._keys;
44
+ _values = other._values;
45
+ return *this;
46
+ }
47
+
48
+ std::pair<Key, T> front() {
49
+ return std::make_pair(
50
+ _keys.front(),
51
+ _values.front()
52
+ );
53
+ }
54
+
55
+ bool empty() const {
56
+ return _keys.empty();
57
+ }
58
+
59
+ void insert(const Key& key, const T& val) {
60
+ if (!hasKey(key)) {
61
+ _values.push_back(val);
62
+ _keys.push_back(key);
63
+ }
64
+ _map[key] = val;
65
+ }
66
+
67
+ bool hasKey(const Key& key) const {
68
+ return _map.find(key) != _map.end();
69
+ }
70
+
71
+ bool erase(const Key& key) {
72
+ _map.erase(key);
73
+ // find the position in the array
74
+ for (size_t i = 0; i < _keys.size(); i += 1) {
75
+ if (_keyEqual(key, _keys[i])) {
76
+ _keys.erase(_keys.begin() + i);
77
+ _values.erase(_values.begin() + i);
78
+ return true;
79
+ }
80
+ }
81
+ return false;
82
+ }
83
+
84
+ const sass::vector<Key>& keys() const { return _keys; }
85
+ const sass::vector<T>& values() const { return _values; }
86
+
87
+ const T& get(const Key& key) {
88
+ if (hasKey(key)) {
89
+ return _map[key];
90
+ }
91
+ throw std::runtime_error("Key does not exist");
92
+ }
93
+
94
+ using iterator = typename sass::vector<Key>::iterator;
95
+ using const_iterator = typename sass::vector<Key>::const_iterator;
96
+ using reverse_iterator = typename sass::vector<Key>::reverse_iterator;
97
+ using const_reverse_iterator = typename sass::vector<Key>::const_reverse_iterator;
98
+
99
+ typename sass::vector<Key>::iterator end() { return _keys.end(); }
100
+ typename sass::vector<Key>::iterator begin() { return _keys.begin(); }
101
+ typename sass::vector<Key>::reverse_iterator rend() { return _keys.rend(); }
102
+ typename sass::vector<Key>::reverse_iterator rbegin() { return _keys.rbegin(); }
103
+ typename sass::vector<Key>::const_iterator end() const { return _keys.end(); }
104
+ typename sass::vector<Key>::const_iterator begin() const { return _keys.begin(); }
105
+ typename sass::vector<Key>::const_reverse_iterator rend() const { return _keys.rend(); }
106
+ typename sass::vector<Key>::const_reverse_iterator rbegin() const { return _keys.rbegin(); }
107
+
108
+ };
109
+
110
+ }
111
+
112
+ #endif