sassc 2.2.1 → 2.3.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 (113) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +13 -0
  4. data/Rakefile +1 -3
  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 +1 -0
  9. data/ext/libsass/src/ast.cpp +49 -59
  10. data/ext/libsass/src/ast.hpp +263 -102
  11. data/ext/libsass/src/ast_def_macros.hpp +8 -0
  12. data/ext/libsass/src/ast_fwd_decl.cpp +2 -1
  13. data/ext/libsass/src/ast_fwd_decl.hpp +40 -116
  14. data/ext/libsass/src/ast_helpers.hpp +292 -0
  15. data/ext/libsass/src/ast_sel_cmp.cpp +209 -722
  16. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  17. data/ext/libsass/src/ast_sel_unify.cpp +207 -212
  18. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  19. data/ext/libsass/src/ast_selectors.cpp +559 -1001
  20. data/ext/libsass/src/ast_selectors.hpp +311 -367
  21. data/ext/libsass/src/ast_supports.cpp +1 -17
  22. data/ext/libsass/src/ast_values.cpp +216 -29
  23. data/ext/libsass/src/ast_values.hpp +42 -33
  24. data/ext/libsass/src/bind.cpp +1 -1
  25. data/ext/libsass/src/cencode.c +4 -6
  26. data/ext/libsass/src/check_nesting.cpp +5 -6
  27. data/ext/libsass/src/check_nesting.hpp +4 -0
  28. data/ext/libsass/src/color_maps.cpp +11 -10
  29. data/ext/libsass/src/color_maps.hpp +0 -8
  30. data/ext/libsass/src/constants.cpp +5 -0
  31. data/ext/libsass/src/constants.hpp +6 -0
  32. data/ext/libsass/src/context.cpp +30 -60
  33. data/ext/libsass/src/context.hpp +8 -20
  34. data/ext/libsass/src/cssize.cpp +36 -120
  35. data/ext/libsass/src/cssize.hpp +4 -10
  36. data/ext/libsass/src/dart_helpers.hpp +199 -0
  37. data/ext/libsass/src/debugger.hpp +364 -207
  38. data/ext/libsass/src/emitter.cpp +3 -4
  39. data/ext/libsass/src/emitter.hpp +0 -2
  40. data/ext/libsass/src/environment.hpp +5 -0
  41. data/ext/libsass/src/error_handling.cpp +21 -0
  42. data/ext/libsass/src/error_handling.hpp +25 -3
  43. data/ext/libsass/src/eval.cpp +33 -153
  44. data/ext/libsass/src/eval.hpp +11 -13
  45. data/ext/libsass/src/eval_selectors.cpp +75 -0
  46. data/ext/libsass/src/expand.cpp +214 -167
  47. data/ext/libsass/src/expand.hpp +26 -6
  48. data/ext/libsass/src/extender.cpp +1186 -0
  49. data/ext/libsass/src/extender.hpp +399 -0
  50. data/ext/libsass/src/extension.cpp +43 -0
  51. data/ext/libsass/src/extension.hpp +89 -0
  52. data/ext/libsass/src/file.cpp +15 -14
  53. data/ext/libsass/src/file.hpp +5 -12
  54. data/ext/libsass/src/fn_colors.cpp +12 -10
  55. data/ext/libsass/src/fn_lists.cpp +12 -11
  56. data/ext/libsass/src/fn_miscs.cpp +22 -34
  57. data/ext/libsass/src/fn_numbers.cpp +13 -6
  58. data/ext/libsass/src/fn_selectors.cpp +94 -124
  59. data/ext/libsass/src/fn_strings.cpp +16 -14
  60. data/ext/libsass/src/fn_utils.cpp +5 -6
  61. data/ext/libsass/src/fn_utils.hpp +9 -3
  62. data/ext/libsass/src/inspect.cpp +154 -117
  63. data/ext/libsass/src/inspect.hpp +10 -8
  64. data/ext/libsass/src/lexer.cpp +17 -81
  65. data/ext/libsass/src/lexer.hpp +5 -16
  66. data/ext/libsass/src/listize.cpp +22 -36
  67. data/ext/libsass/src/listize.hpp +8 -9
  68. data/ext/libsass/src/memory/SharedPtr.hpp +39 -5
  69. data/ext/libsass/src/operation.hpp +27 -17
  70. data/ext/libsass/src/operators.cpp +1 -0
  71. data/ext/libsass/src/ordered_map.hpp +112 -0
  72. data/ext/libsass/src/output.cpp +30 -49
  73. data/ext/libsass/src/output.hpp +1 -1
  74. data/ext/libsass/src/parser.cpp +211 -381
  75. data/ext/libsass/src/parser.hpp +17 -15
  76. data/ext/libsass/src/parser_selectors.cpp +189 -0
  77. data/ext/libsass/src/permutate.hpp +140 -0
  78. data/ext/libsass/src/position.hpp +1 -1
  79. data/ext/libsass/src/prelexer.cpp +6 -6
  80. data/ext/libsass/src/remove_placeholders.cpp +55 -56
  81. data/ext/libsass/src/remove_placeholders.hpp +21 -18
  82. data/ext/libsass/src/sass.hpp +1 -0
  83. data/ext/libsass/src/sass2scss.cpp +4 -4
  84. data/ext/libsass/src/sass_context.cpp +42 -91
  85. data/ext/libsass/src/sass_context.hpp +2 -2
  86. data/ext/libsass/src/sass_functions.cpp +1 -1
  87. data/ext/libsass/src/sass_values.cpp +0 -1
  88. data/ext/libsass/src/stylesheet.cpp +22 -0
  89. data/ext/libsass/src/stylesheet.hpp +57 -0
  90. data/ext/libsass/src/to_value.cpp +2 -2
  91. data/ext/libsass/src/to_value.hpp +1 -1
  92. data/ext/libsass/src/units.cpp +5 -3
  93. data/ext/libsass/src/util.cpp +10 -12
  94. data/ext/libsass/src/util.hpp +2 -3
  95. data/ext/libsass/src/util_string.cpp +111 -61
  96. data/ext/libsass/src/util_string.hpp +61 -8
  97. data/lib/sassc/engine.rb +5 -3
  98. data/lib/sassc/functions_handler.rb +8 -8
  99. data/lib/sassc/native.rb +1 -1
  100. data/lib/sassc/script.rb +4 -4
  101. data/lib/sassc/version.rb +1 -1
  102. data/test/functions_test.rb +18 -1
  103. data/test/native_test.rb +1 -1
  104. metadata +17 -12
  105. data/ext/libsass/src/extend.cpp +0 -2132
  106. data/ext/libsass/src/extend.hpp +0 -86
  107. data/ext/libsass/src/node.cpp +0 -322
  108. data/ext/libsass/src/node.hpp +0 -118
  109. data/ext/libsass/src/paths.hpp +0 -71
  110. data/ext/libsass/src/sass_util.cpp +0 -152
  111. data/ext/libsass/src/sass_util.hpp +0 -256
  112. data/ext/libsass/src/subset_map.cpp +0 -58
  113. data/ext/libsass/src/subset_map.hpp +0 -76
@@ -1,24 +1,8 @@
1
1
  // sass.hpp must go before all system headers to get the
2
2
  // __EXTENSIONS__ fix on Solaris.
3
3
  #include "sass.hpp"
4
-
5
4
  #include "ast.hpp"
6
- #include "context.hpp"
7
- #include "node.hpp"
8
- #include "eval.hpp"
9
- #include "extend.hpp"
10
- #include "emitter.hpp"
11
- #include "color_maps.hpp"
12
- #include "ast_fwd_decl.hpp"
13
- #include <set>
14
- #include <iomanip>
15
- #include <iostream>
16
- #include <algorithm>
17
- #include <functional>
18
- #include <cctype>
19
- #include <locale>
20
-
21
- #include "ast_values.hpp"
5
+
22
6
 
23
7
  namespace Sass {
24
8
 
@@ -1,24 +1,7 @@
1
1
  // sass.hpp must go before all system headers to get the
2
2
  // __EXTENSIONS__ fix on Solaris.
3
3
  #include "sass.hpp"
4
-
5
4
  #include "ast.hpp"
6
- #include "context.hpp"
7
- #include "node.hpp"
8
- #include "eval.hpp"
9
- #include "extend.hpp"
10
- #include "emitter.hpp"
11
- #include "color_maps.hpp"
12
- #include "ast_fwd_decl.hpp"
13
- #include <set>
14
- #include <iomanip>
15
- #include <iostream>
16
- #include <algorithm>
17
- #include <functional>
18
- #include <cctype>
19
- #include <locale>
20
-
21
- #include "ast_values.hpp"
22
5
 
23
6
  namespace Sass {
24
7
 
@@ -85,6 +68,24 @@ namespace Sass {
85
68
  // don't set children
86
69
  }
87
70
 
71
+ bool List::operator< (const Expression& rhs) const
72
+ {
73
+ if (auto r = Cast<List>(&rhs)) {
74
+ if (length() < r->length()) return true;
75
+ if (length() > r->length()) return false;
76
+ const auto& left = elements();
77
+ const auto& right = r->elements();
78
+ for (size_t i = 0; i < left.size(); i += 1) {
79
+ if (*left[i] < *right[i]) return true;
80
+ if (*left[i] == *right[i]) continue;
81
+ return false;
82
+ }
83
+ return false;
84
+ }
85
+ // compare/sort by type
86
+ return type() < rhs.type();
87
+ }
88
+
88
89
  bool List::operator== (const Expression& rhs) const
89
90
  {
90
91
  if (auto r = Cast<List>(&rhs)) {
@@ -143,6 +144,31 @@ namespace Sass {
143
144
  Hashed(*ptr)
144
145
  { concrete_type(MAP); }
145
146
 
147
+ bool Map::operator< (const Expression& rhs) const
148
+ {
149
+ if (auto r = Cast<Map>(&rhs)) {
150
+ if (length() < r->length()) return true;
151
+ if (length() > r->length()) return false;
152
+ const auto& lkeys = keys();
153
+ const auto& rkeys = r->keys();
154
+ for (size_t i = 0; i < lkeys.size(); i += 1) {
155
+ if (*lkeys[i] < *rkeys[i]) return true;
156
+ if (*lkeys[i] == *rkeys[i]) continue;
157
+ return false;
158
+ }
159
+ const auto& lvals = values();
160
+ const auto& rvals = r->values();
161
+ for (size_t i = 0; i < lvals.size(); i += 1) {
162
+ if (*lvals[i] < *rvals[i]) return true;
163
+ if (*lvals[i] == *rvals[i]) continue;
164
+ return false;
165
+ }
166
+ return false;
167
+ }
168
+ // compare/sort by type
169
+ return type() < rhs.type();
170
+ }
171
+
146
172
  bool Map::operator== (const Expression& rhs) const
147
173
  {
148
174
  if (auto r = Cast<Map>(&rhs)) {
@@ -232,6 +258,17 @@ namespace Sass {
232
258
  is_delayed(delayed);
233
259
  }
234
260
 
261
+ bool Binary_Expression::operator<(const Expression& rhs) const
262
+ {
263
+ if (auto m = Cast<Binary_Expression>(&rhs)) {
264
+ return type() < m->type() ||
265
+ *left() < *m->left() ||
266
+ *right() < *m->right();
267
+ }
268
+ // compare/sort by type
269
+ return type() < rhs.type();
270
+ }
271
+
235
272
  bool Binary_Expression::operator==(const Expression& rhs) const
236
273
  {
237
274
  if (auto m = Cast<Binary_Expression>(&rhs)) {
@@ -263,6 +300,22 @@ namespace Sass {
263
300
  : Value(ptr), definition_(ptr->definition_), is_css_(ptr->is_css_)
264
301
  { concrete_type(FUNCTION_VAL); }
265
302
 
303
+ bool Function::operator< (const Expression& rhs) const
304
+ {
305
+ if (auto r = Cast<Function>(&rhs)) {
306
+ auto d1 = Cast<Definition>(definition());
307
+ auto d2 = Cast<Definition>(r->definition());
308
+ if (d1 == nullptr) return d2 != nullptr;
309
+ else if (d2 == nullptr) return false;
310
+ if (is_css() == r->is_css()) {
311
+ return d1 < d2;
312
+ }
313
+ return r->is_css();
314
+ }
315
+ // compare/sort by type
316
+ return type() < rhs.type();
317
+ }
318
+
266
319
  bool Function::operator== (const Expression& rhs) const
267
320
  {
268
321
  if (auto r = Cast<Function>(&rhs)) {
@@ -436,6 +489,14 @@ namespace Sass {
436
489
  return hash_;
437
490
  }
438
491
 
492
+ bool Number::operator< (const Expression& rhs) const
493
+ {
494
+ if (auto n = Cast<Number>(&rhs)) {
495
+ return *this < *n;
496
+ }
497
+ return false;
498
+ }
499
+
439
500
  bool Number::operator== (const Expression& rhs) const
440
501
  {
441
502
  if (auto n = Cast<Number>(&rhs)) {
@@ -475,7 +536,7 @@ namespace Sass {
475
536
  l.normalize(); r.normalize();
476
537
  Units &lhs_unit = l, &rhs_unit = r;
477
538
  if (!(lhs_unit == rhs_unit)) {
478
- /* ToDo: do we always get usefull backtraces? */
539
+ /* ToDo: do we always get useful backtraces? */
479
540
  throw Exception::IncompatibleUnits(rhs, *this);
480
541
  }
481
542
  if (lhs_unit == rhs_unit) {
@@ -502,6 +563,21 @@ namespace Sass {
502
563
  hash_(ptr->hash_)
503
564
  { concrete_type(COLOR); }
504
565
 
566
+ bool Color::operator< (const Expression& rhs) const
567
+ {
568
+ if (auto r = Cast<Color_RGBA>(&rhs)) {
569
+ return *this < *r;
570
+ }
571
+ else if (auto r = Cast<Color_HSLA>(&rhs)) {
572
+ return *this < *r;
573
+ }
574
+ else if (auto r = Cast<Color>(&rhs)) {
575
+ return a_ < r->a();
576
+ }
577
+ // compare/sort by type
578
+ return type() < rhs.type();
579
+ }
580
+
505
581
  bool Color::operator== (const Expression& rhs) const
506
582
  {
507
583
  if (auto r = Cast<Color_RGBA>(&rhs)) {
@@ -531,6 +607,23 @@ namespace Sass {
531
607
  b_(ptr->b_)
532
608
  { concrete_type(COLOR); }
533
609
 
610
+ bool Color_RGBA::operator< (const Expression& rhs) const
611
+ {
612
+ if (auto r = Cast<Color_RGBA>(&rhs)) {
613
+ if (r_ < r->r()) return true;
614
+ if (r_ > r->r()) return false;
615
+ if (g_ < r->g()) return true;
616
+ if (g_ > r->g()) return false;
617
+ if (b_ < r->b()) return true;
618
+ if (b_ > r->b()) return false;
619
+ if (a_ < r->a()) return true;
620
+ if (a_ > r->a()) return false;
621
+ return false; // is equal
622
+ }
623
+ // compare/sort by type
624
+ return type() < rhs.type();
625
+ }
626
+
534
627
  bool Color_RGBA::operator== (const Expression& rhs) const
535
628
  {
536
629
  if (auto r = Cast<Color_RGBA>(&rhs)) {
@@ -616,6 +709,23 @@ namespace Sass {
616
709
  // hash_(ptr->hash_)
617
710
  { concrete_type(COLOR); }
618
711
 
712
+ bool Color_HSLA::operator< (const Expression& rhs) const
713
+ {
714
+ if (auto r = Cast<Color_HSLA>(&rhs)) {
715
+ if (h_ < r->h()) return true;
716
+ if (h_ > r->h()) return false;
717
+ if (s_ < r->s()) return true;
718
+ if (s_ > r->s()) return false;
719
+ if (l_ < r->l()) return true;
720
+ if (l_ > r->l()) return false;
721
+ if (a_ < r->a()) return true;
722
+ if (a_ > r->a()) return false;
723
+ return false; // is equal
724
+ }
725
+ // compare/sort by type
726
+ return type() < rhs.type();
727
+ }
728
+
619
729
  bool Color_HSLA::operator== (const Expression& rhs) const
620
730
  {
621
731
  if (auto r = Cast<Color_HSLA>(&rhs)) {
@@ -687,6 +797,15 @@ namespace Sass {
687
797
  : Value(ptr), message_(ptr->message_)
688
798
  { concrete_type(C_ERROR); }
689
799
 
800
+ bool Custom_Error::operator< (const Expression& rhs) const
801
+ {
802
+ if (auto r = Cast<Custom_Error>(&rhs)) {
803
+ return message() < r->message();
804
+ }
805
+ // compare/sort by type
806
+ return type() < rhs.type();
807
+ }
808
+
690
809
  bool Custom_Error::operator== (const Expression& rhs) const
691
810
  {
692
811
  if (auto r = Cast<Custom_Error>(&rhs)) {
@@ -706,6 +825,15 @@ namespace Sass {
706
825
  : Value(ptr), message_(ptr->message_)
707
826
  { concrete_type(C_WARNING); }
708
827
 
828
+ bool Custom_Warning::operator< (const Expression& rhs) const
829
+ {
830
+ if (auto r = Cast<Custom_Warning>(&rhs)) {
831
+ return message() < r->message();
832
+ }
833
+ // compare/sort by type
834
+ return type() < rhs.type();
835
+ }
836
+
709
837
  bool Custom_Warning::operator== (const Expression& rhs) const
710
838
  {
711
839
  if (auto r = Cast<Custom_Warning>(&rhs)) {
@@ -728,15 +856,23 @@ namespace Sass {
728
856
  hash_(ptr->hash_)
729
857
  { concrete_type(BOOLEAN); }
730
858
 
731
- bool Boolean::operator== (const Expression& rhs) const
859
+ bool Boolean::operator< (const Expression& rhs) const
732
860
  {
733
861
  if (auto r = Cast<Boolean>(&rhs)) {
734
- return (value() == r->value());
862
+ return (value() < r->value());
735
863
  }
736
864
  return false;
737
865
  }
738
866
 
739
- size_t Boolean::hash() const
867
+ bool Boolean::operator== (const Expression& rhs) const
868
+ {
869
+ if (auto r = Cast<Boolean>(&rhs)) {
870
+ return (value() == r->value());
871
+ }
872
+ return false;
873
+ }
874
+
875
+ size_t Boolean::hash() const
740
876
  {
741
877
  if (hash_ == 0) {
742
878
  hash_ = std::hash<bool>()(value_);
@@ -784,6 +920,23 @@ namespace Sass {
784
920
  return length() && last()->is_right_interpolant();
785
921
  }
786
922
 
923
+ bool String_Schema::operator< (const Expression& rhs) const
924
+ {
925
+ if (auto r = Cast<String_Schema>(&rhs)) {
926
+ if (length() < r->length()) return true;
927
+ if (length() > r->length()) return false;
928
+ for (size_t i = 0, L = length(); i < L; ++i) {
929
+ if (*get(i) < *r->get(i)) return true;
930
+ if (*get(i) == *r->get(i)) continue;
931
+ return false;
932
+ }
933
+ // Is equal
934
+ return false;
935
+ }
936
+ // compare/sort by type
937
+ return type() < rhs.type();
938
+ }
939
+
787
940
  bool String_Schema::operator== (const Expression& rhs) const
788
941
  {
789
942
  if (auto r = Cast<String_Schema>(&rhs)) {
@@ -824,22 +977,21 @@ namespace Sass {
824
977
  /////////////////////////////////////////////////////////////////////////
825
978
 
826
979
  String_Constant::String_Constant(ParserState pstate, std::string val, bool css)
827
- : String(pstate), quote_mark_(0), can_compress_whitespace_(false), value_(read_css_string(val, css)), hash_(0)
980
+ : String(pstate), quote_mark_(0), value_(read_css_string(val, css)), hash_(0)
828
981
  { }
829
982
  String_Constant::String_Constant(ParserState pstate, const char* beg, bool css)
830
- : String(pstate), quote_mark_(0), can_compress_whitespace_(false), value_(read_css_string(std::string(beg), css)), hash_(0)
983
+ : String(pstate), quote_mark_(0), value_(read_css_string(std::string(beg), css)), hash_(0)
831
984
  { }
832
985
  String_Constant::String_Constant(ParserState pstate, const char* beg, const char* end, bool css)
833
- : String(pstate), quote_mark_(0), can_compress_whitespace_(false), value_(read_css_string(std::string(beg, end-beg), css)), hash_(0)
986
+ : String(pstate), quote_mark_(0), value_(read_css_string(std::string(beg, end-beg), css)), hash_(0)
834
987
  { }
835
988
  String_Constant::String_Constant(ParserState pstate, const Token& tok, bool css)
836
- : String(pstate), quote_mark_(0), can_compress_whitespace_(false), value_(read_css_string(std::string(tok.begin, tok.end), css)), hash_(0)
989
+ : String(pstate), quote_mark_(0), value_(read_css_string(std::string(tok.begin, tok.end), css)), hash_(0)
837
990
  { }
838
991
 
839
992
  String_Constant::String_Constant(const String_Constant* ptr)
840
993
  : String(ptr),
841
994
  quote_mark_(ptr->quote_mark_),
842
- can_compress_whitespace_(ptr->can_compress_whitespace_),
843
995
  value_(ptr->value_),
844
996
  hash_(ptr->hash_)
845
997
  { }
@@ -848,11 +1000,24 @@ namespace Sass {
848
1000
  return value_.empty() && quote_mark_ == 0;
849
1001
  }
850
1002
 
1003
+ bool String_Constant::operator< (const Expression& rhs) const
1004
+ {
1005
+ if (auto qstr = Cast<String_Quoted>(&rhs)) {
1006
+ return value() < qstr->value();
1007
+ }
1008
+ else if (auto cstr = Cast<String_Constant>(&rhs)) {
1009
+ return value() < cstr->value();
1010
+ }
1011
+ // compare/sort by type
1012
+ return type() < rhs.type();
1013
+ }
1014
+
851
1015
  bool String_Constant::operator== (const Expression& rhs) const
852
1016
  {
853
1017
  if (auto qstr = Cast<String_Quoted>(&rhs)) {
854
1018
  return value() == qstr->value();
855
- } else if (auto cstr = Cast<String_Constant>(&rhs)) {
1019
+ }
1020
+ else if (auto cstr = Cast<String_Constant>(&rhs)) {
856
1021
  return value() == cstr->value();
857
1022
  }
858
1023
  return false;
@@ -894,11 +1059,24 @@ namespace Sass {
894
1059
  : String_Constant(ptr)
895
1060
  { }
896
1061
 
1062
+ bool String_Quoted::operator< (const Expression& rhs) const
1063
+ {
1064
+ if (auto qstr = Cast<String_Quoted>(&rhs)) {
1065
+ return value() < qstr->value();
1066
+ }
1067
+ else if (auto cstr = Cast<String_Constant>(&rhs)) {
1068
+ return value() < cstr->value();
1069
+ }
1070
+ // compare/sort by type
1071
+ return type() < rhs.type();
1072
+ }
1073
+
897
1074
  bool String_Quoted::operator== (const Expression& rhs) const
898
1075
  {
899
1076
  if (auto qstr = Cast<String_Quoted>(&rhs)) {
900
1077
  return value() == qstr->value();
901
- } else if (auto cstr = Cast<String_Constant>(&rhs)) {
1078
+ }
1079
+ else if (auto cstr = Cast<String_Constant>(&rhs)) {
902
1080
  return value() == cstr->value();
903
1081
  }
904
1082
  return false;
@@ -919,9 +1097,18 @@ namespace Sass {
919
1097
  Null::Null(const Null* ptr) : Value(ptr)
920
1098
  { concrete_type(NULL_VAL); }
921
1099
 
1100
+ bool Null::operator< (const Expression& rhs) const
1101
+ {
1102
+ if (Cast<Null>(&rhs)) {
1103
+ return false;
1104
+ }
1105
+ // compare/sort by type
1106
+ return type() < rhs.type();
1107
+ }
1108
+
922
1109
  bool Null::operator== (const Expression& rhs) const
923
1110
  {
924
- return Cast<Null>(&rhs) != NULL;
1111
+ return Cast<Null>(&rhs) != nullptr;
925
1112
  }
926
1113
 
927
1114
  size_t Null::hash() const
@@ -4,35 +4,7 @@
4
4
  // sass.hpp must go before all system headers to get the
5
5
  // __EXTENSIONS__ fix on Solaris.
6
6
  #include "sass.hpp"
7
-
8
- #include <set>
9
- #include <deque>
10
- #include <vector>
11
- #include <string>
12
- #include <sstream>
13
- #include <iostream>
14
- #include <typeinfo>
15
- #include <algorithm>
16
- #include "sass/base.h"
17
- #include "ast_fwd_decl.hpp"
18
-
19
- #include "util.hpp"
20
- #include "units.hpp"
21
- #include "context.hpp"
22
- #include "position.hpp"
23
- #include "constants.hpp"
24
- #include "operation.hpp"
25
- #include "position.hpp"
26
- #include "inspect.hpp"
27
- #include "source_map.hpp"
28
- #include "environment.hpp"
29
- #include "error_handling.hpp"
30
- #include "ast_def_macros.hpp"
31
- #include "ast_fwd_decl.hpp"
32
- #include "source_map.hpp"
33
- #include "fn_utils.hpp"
34
-
35
- #include "sass.h"
7
+ #include "ast.hpp"
36
8
 
37
9
  namespace Sass {
38
10
 
@@ -52,8 +24,23 @@ namespace Sass {
52
24
  class Value : public PreValue {
53
25
  public:
54
26
  Value(ParserState pstate, bool d = false, bool e = false, bool i = false, Type ct = NONE);
55
- ATTACH_VIRTUAL_AST_OPERATIONS(Value);
27
+
28
+ // Some obects are not meant to be compared
29
+ // ToDo: maybe fallback to pointer comparison?
30
+ virtual bool operator< (const Expression& rhs) const override = 0;
56
31
  virtual bool operator== (const Expression& rhs) const override = 0;
32
+
33
+ // We can give some reasonable implementations by using
34
+ // inverst operators on the specialized implementations
35
+ virtual bool operator> (const Expression& rhs) const {
36
+ return rhs < *this;
37
+ }
38
+ virtual bool operator!= (const Expression& rhs) const {
39
+ return !(*this == rhs);
40
+ }
41
+
42
+ ATTACH_VIRTUAL_AST_OPERATIONS(Value);
43
+
57
44
  };
58
45
 
59
46
  ///////////////////////////////////////////////////////////////////////
@@ -81,6 +68,8 @@ namespace Sass {
81
68
  virtual size_t hash() const override;
82
69
  virtual size_t size() const;
83
70
  virtual void set_delayed(bool delayed) override;
71
+
72
+ virtual bool operator< (const Expression& rhs) const override;
84
73
  virtual bool operator== (const Expression& rhs) const override;
85
74
 
86
75
  ATTACH_AST_OPERATIONS(List)
@@ -90,7 +79,7 @@ namespace Sass {
90
79
  ///////////////////////////////////////////////////////////////////////
91
80
  // Key value paris.
92
81
  ///////////////////////////////////////////////////////////////////////
93
- class Map : public Value, public Hashed {
82
+ class Map : public Value, public Hashed<Expression_Obj, Expression_Obj, Map_Obj> {
94
83
  void adjust_after_pushing(std::pair<Expression_Obj, Expression_Obj> p) override { is_expanded(false); }
95
84
  public:
96
85
  Map(ParserState pstate, size_t size = 0);
@@ -100,6 +89,8 @@ namespace Sass {
100
89
  List_Obj to_list(ParserState& pstate);
101
90
 
102
91
  virtual size_t hash() const override;
92
+
93
+ virtual bool operator< (const Expression& rhs) const override;
103
94
  virtual bool operator== (const Expression& rhs) const override;
104
95
 
105
96
  ATTACH_AST_OPERATIONS(Map)
@@ -130,6 +121,7 @@ namespace Sass {
130
121
 
131
122
  virtual void set_delayed(bool delayed) override;
132
123
 
124
+ virtual bool operator< (const Expression& rhs) const override;
133
125
  virtual bool operator==(const Expression& rhs) const override;
134
126
 
135
127
  virtual size_t hash() const override;
@@ -154,6 +146,7 @@ namespace Sass {
154
146
 
155
147
  std::string name();
156
148
 
149
+ bool operator< (const Expression& rhs) const override;
157
150
  bool operator== (const Expression& rhs) const override;
158
151
 
159
152
  ATTACH_AST_OPERATIONS(Function)
@@ -230,6 +223,7 @@ namespace Sass {
230
223
 
231
224
  bool operator< (const Number& rhs) const;
232
225
  bool operator== (const Number& rhs) const;
226
+ bool operator< (const Expression& rhs) const override;
233
227
  bool operator== (const Expression& rhs) const override;
234
228
  ATTACH_AST_OPERATIONS(Number)
235
229
  ATTACH_CRTP_PERFORM_METHODS()
@@ -251,6 +245,7 @@ namespace Sass {
251
245
 
252
246
  virtual size_t hash() const override = 0;
253
247
 
248
+ bool operator< (const Expression& rhs) const override;
254
249
  bool operator== (const Expression& rhs) const override;
255
250
 
256
251
  virtual Color_RGBA* copyAsRGBA() const = 0;
@@ -283,6 +278,7 @@ namespace Sass {
283
278
  Color_HSLA* copyAsHSLA() const override;
284
279
  Color_HSLA* toHSLA() override { return copyAsHSLA(); }
285
280
 
281
+ bool operator< (const Expression& rhs) const override;
286
282
  bool operator== (const Expression& rhs) const override;
287
283
 
288
284
  ATTACH_AST_OPERATIONS(Color_RGBA)
@@ -311,6 +307,7 @@ namespace Sass {
311
307
  Color_HSLA* copyAsHSLA() const override;
312
308
  Color_HSLA* toHSLA() override { return this; }
313
309
 
310
+ bool operator< (const Expression& rhs) const override;
314
311
  bool operator== (const Expression& rhs) const override;
315
312
 
316
313
  ATTACH_AST_OPERATIONS(Color_HSLA)
@@ -324,6 +321,7 @@ namespace Sass {
324
321
  ADD_CONSTREF(std::string, message)
325
322
  public:
326
323
  Custom_Error(ParserState pstate, std::string msg);
324
+ bool operator< (const Expression& rhs) const override;
327
325
  bool operator== (const Expression& rhs) const override;
328
326
  ATTACH_AST_OPERATIONS(Custom_Error)
329
327
  ATTACH_CRTP_PERFORM_METHODS()
@@ -336,6 +334,7 @@ namespace Sass {
336
334
  ADD_CONSTREF(std::string, message)
337
335
  public:
338
336
  Custom_Warning(ParserState pstate, std::string msg);
337
+ bool operator< (const Expression& rhs) const override;
339
338
  bool operator== (const Expression& rhs) const override;
340
339
  ATTACH_AST_OPERATIONS(Custom_Warning)
341
340
  ATTACH_CRTP_PERFORM_METHODS()
@@ -358,6 +357,7 @@ namespace Sass {
358
357
 
359
358
  bool is_false() override { return !value_; }
360
359
 
360
+ bool operator< (const Expression& rhs) const override;
361
361
  bool operator== (const Expression& rhs) const override;
362
362
 
363
363
  ATTACH_AST_OPERATIONS(Boolean)
@@ -377,6 +377,9 @@ namespace Sass {
377
377
  virtual bool operator<(const Expression& rhs) const override {
378
378
  return this->to_string() < rhs.to_string();
379
379
  };
380
+ virtual bool operator==(const Expression& rhs) const override {
381
+ return this->to_string() == rhs.to_string();
382
+ };
380
383
  ATTACH_VIRTUAL_AST_OPERATIONS(String);
381
384
  ATTACH_CRTP_PERFORM_METHODS()
382
385
  };
@@ -403,6 +406,7 @@ namespace Sass {
403
406
  size_t hash() const override;
404
407
  virtual void set_delayed(bool delayed) override;
405
408
 
409
+ bool operator< (const Expression& rhs) const override;
406
410
  bool operator==(const Expression& rhs) const override;
407
411
  ATTACH_AST_OPERATIONS(String_Schema)
408
412
  ATTACH_CRTP_PERFORM_METHODS()
@@ -413,7 +417,6 @@ namespace Sass {
413
417
  ////////////////////////////////////////////////////////
414
418
  class String_Constant : public String {
415
419
  ADD_PROPERTY(char, quote_mark)
416
- ADD_PROPERTY(bool, can_compress_whitespace)
417
420
  HASH_CONSTREF(std::string, value)
418
421
  protected:
419
422
  mutable size_t hash_;
@@ -427,6 +430,7 @@ namespace Sass {
427
430
  bool is_invisible() const override;
428
431
  virtual void rtrim() override;
429
432
  size_t hash() const override;
433
+ bool operator< (const Expression& rhs) const override;
430
434
  bool operator==(const Expression& rhs) const override;
431
435
  // quotes are forced on inspection
432
436
  virtual std::string inspect() const override;
@@ -442,6 +446,7 @@ namespace Sass {
442
446
  String_Quoted(ParserState pstate, std::string val, char q = 0,
443
447
  bool keep_utf8_escapes = false, bool skip_unquoting = false,
444
448
  bool strict_unquoting = true, bool css = true);
449
+ bool operator< (const Expression& rhs) const override;
445
450
  bool operator==(const Expression& rhs) const override;
446
451
  // quotes are forced on inspection
447
452
  std::string inspect() const override;
@@ -463,6 +468,7 @@ namespace Sass {
463
468
 
464
469
  size_t hash() const override;
465
470
 
471
+ bool operator< (const Expression& rhs) const override;
466
472
  bool operator== (const Expression& rhs) const override;
467
473
 
468
474
  ATTACH_AST_OPERATIONS(Null)
@@ -477,8 +483,11 @@ namespace Sass {
477
483
  Parent_Reference(ParserState pstate);
478
484
  std::string type() const override { return "parent"; }
479
485
  static std::string type_name() { return "parent"; }
486
+ bool operator< (const Expression& rhs) const override {
487
+ return false; // they are always equal
488
+ }
480
489
  bool operator==(const Expression& rhs) const override {
481
- return true; // can they ever be not equal?
490
+ return true; // they are always equal
482
491
  };
483
492
  ATTACH_AST_OPERATIONS(Parent_Reference)
484
493
  ATTACH_CRTP_PERFORM_METHODS()