sassc 2.0.1 → 2.1.0.pre1

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 (200) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +7 -3
  5. data/CHANGELOG.md +3 -0
  6. data/CODE_OF_CONDUCT.md +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +23 -8
  9. data/ext/extconf.rb +39 -0
  10. data/ext/libsass/.gitignore +1 -0
  11. data/ext/libsass/GNUmakefile.am +23 -39
  12. data/ext/libsass/Makefile +56 -91
  13. data/ext/libsass/Makefile.conf +16 -2
  14. data/ext/libsass/configure.ac +8 -12
  15. data/ext/libsass/include/sass/base.h +1 -0
  16. data/ext/libsass/include/sass/context.h +1 -1
  17. data/ext/libsass/src/GNUmakefile.am +1 -5
  18. data/ext/libsass/src/ast.cpp +747 -2010
  19. data/ext/libsass/src/ast.hpp +239 -2383
  20. data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
  21. data/ext/libsass/src/ast2c.hpp +39 -0
  22. data/ext/libsass/src/ast_def_macros.hpp +62 -10
  23. data/ext/libsass/src/ast_fwd_decl.cpp +1 -0
  24. data/ext/libsass/src/ast_fwd_decl.hpp +43 -165
  25. data/ext/libsass/src/ast_sel_cmp.cpp +909 -0
  26. data/ext/libsass/src/ast_sel_unify.cpp +280 -0
  27. data/ext/libsass/src/ast_selectors.cpp +1475 -0
  28. data/ext/libsass/src/ast_selectors.hpp +568 -0
  29. data/ext/libsass/src/ast_supports.cpp +130 -0
  30. data/ext/libsass/src/ast_supports.hpp +121 -0
  31. data/ext/libsass/src/ast_values.cpp +967 -0
  32. data/ext/libsass/src/ast_values.hpp +489 -0
  33. data/ext/libsass/src/backtrace.cpp +4 -0
  34. data/ext/libsass/src/base64vlq.cpp +3 -0
  35. data/ext/libsass/src/bind.cpp +18 -17
  36. data/ext/libsass/src/bind.hpp +3 -1
  37. data/ext/libsass/src/c2ast.cpp +64 -0
  38. data/ext/libsass/src/c2ast.hpp +14 -0
  39. data/ext/libsass/src/cencode.c +2 -2
  40. data/ext/libsass/src/check_nesting.cpp +52 -56
  41. data/ext/libsass/src/check_nesting.hpp +35 -34
  42. data/ext/libsass/src/color_maps.cpp +156 -153
  43. data/ext/libsass/src/color_maps.hpp +152 -152
  44. data/ext/libsass/src/constants.cpp +15 -0
  45. data/ext/libsass/src/constants.hpp +13 -0
  46. data/ext/libsass/src/context.cpp +24 -14
  47. data/ext/libsass/src/context.hpp +6 -6
  48. data/ext/libsass/src/cssize.cpp +69 -71
  49. data/ext/libsass/src/cssize.hpp +50 -50
  50. data/ext/libsass/src/debugger.hpp +117 -110
  51. data/ext/libsass/src/emitter.cpp +13 -12
  52. data/ext/libsass/src/emitter.hpp +13 -9
  53. data/ext/libsass/src/environment.cpp +15 -1
  54. data/ext/libsass/src/environment.hpp +6 -0
  55. data/ext/libsass/src/error_handling.cpp +36 -59
  56. data/ext/libsass/src/error_handling.hpp +29 -16
  57. data/ext/libsass/src/eval.cpp +302 -323
  58. data/ext/libsass/src/eval.hpp +64 -55
  59. data/ext/libsass/src/expand.cpp +94 -88
  60. data/ext/libsass/src/expand.hpp +33 -37
  61. data/ext/libsass/src/extend.cpp +38 -36
  62. data/ext/libsass/src/extend.hpp +15 -15
  63. data/ext/libsass/src/file.cpp +34 -2
  64. data/ext/libsass/src/fn_colors.cpp +594 -0
  65. data/ext/libsass/src/fn_colors.hpp +85 -0
  66. data/ext/libsass/src/fn_lists.cpp +284 -0
  67. data/ext/libsass/src/fn_lists.hpp +34 -0
  68. data/ext/libsass/src/fn_maps.cpp +94 -0
  69. data/ext/libsass/src/fn_maps.hpp +30 -0
  70. data/ext/libsass/src/fn_miscs.cpp +256 -0
  71. data/ext/libsass/src/fn_miscs.hpp +40 -0
  72. data/ext/libsass/src/fn_numbers.cpp +220 -0
  73. data/ext/libsass/src/fn_numbers.hpp +45 -0
  74. data/ext/libsass/src/fn_selectors.cpp +235 -0
  75. data/ext/libsass/src/fn_selectors.hpp +35 -0
  76. data/ext/libsass/src/fn_strings.cpp +254 -0
  77. data/ext/libsass/src/fn_strings.hpp +34 -0
  78. data/ext/libsass/src/fn_utils.cpp +156 -0
  79. data/ext/libsass/src/fn_utils.hpp +56 -0
  80. data/ext/libsass/src/inspect.cpp +101 -152
  81. data/ext/libsass/src/inspect.hpp +69 -73
  82. data/ext/libsass/src/json.cpp +2 -2
  83. data/ext/libsass/src/lexer.cpp +6 -3
  84. data/ext/libsass/src/listize.cpp +9 -11
  85. data/ext/libsass/src/listize.hpp +11 -7
  86. data/ext/libsass/src/memory/SharedPtr.cpp +2 -83
  87. data/ext/libsass/src/memory/SharedPtr.hpp +127 -143
  88. data/ext/libsass/src/node.cpp +13 -10
  89. data/ext/libsass/src/node.hpp +3 -3
  90. data/ext/libsass/src/operation.hpp +184 -144
  91. data/ext/libsass/src/operators.cpp +43 -17
  92. data/ext/libsass/src/operators.hpp +5 -5
  93. data/ext/libsass/src/output.cpp +21 -18
  94. data/ext/libsass/src/output.hpp +14 -21
  95. data/ext/libsass/src/parser.cpp +215 -183
  96. data/ext/libsass/src/parser.hpp +28 -24
  97. data/ext/libsass/src/plugins.cpp +5 -1
  98. data/ext/libsass/src/position.cpp +3 -0
  99. data/ext/libsass/src/prelexer.cpp +9 -3
  100. data/ext/libsass/src/prelexer.hpp +9 -9
  101. data/ext/libsass/src/remove_placeholders.cpp +14 -11
  102. data/ext/libsass/src/remove_placeholders.hpp +8 -9
  103. data/ext/libsass/src/sass.cpp +9 -3
  104. data/ext/libsass/src/sass.hpp +12 -9
  105. data/ext/libsass/src/sass2scss.cpp +45 -14
  106. data/ext/libsass/src/sass_context.cpp +18 -15
  107. data/ext/libsass/src/sass_functions.cpp +6 -3
  108. data/ext/libsass/src/sass_functions.hpp +1 -1
  109. data/ext/libsass/src/sass_util.cpp +3 -0
  110. data/ext/libsass/src/sass_values.cpp +21 -13
  111. data/ext/libsass/src/source_map.cpp +5 -2
  112. data/ext/libsass/src/source_map.hpp +2 -2
  113. data/ext/libsass/src/subset_map.cpp +4 -1
  114. data/ext/libsass/src/to_value.cpp +23 -21
  115. data/ext/libsass/src/to_value.hpp +18 -22
  116. data/ext/libsass/src/units.cpp +4 -0
  117. data/ext/libsass/src/units.hpp +1 -0
  118. data/ext/libsass/src/utf8/checked.h +12 -10
  119. data/ext/libsass/src/utf8/core.h +3 -0
  120. data/ext/libsass/src/utf8_string.cpp +3 -0
  121. data/ext/libsass/src/util.cpp +67 -75
  122. data/ext/libsass/src/util.hpp +64 -19
  123. data/ext/libsass/src/util_string.cpp +75 -0
  124. data/ext/libsass/src/util_string.hpp +19 -0
  125. data/ext/libsass/src/values.cpp +22 -13
  126. data/ext/libsass/src/values.hpp +2 -2
  127. data/ext/libsass/win/libsass.targets +30 -4
  128. data/ext/libsass/win/libsass.vcxproj.filters +82 -4
  129. data/lib/sassc.rb +24 -0
  130. data/lib/sassc/engine.rb +2 -2
  131. data/lib/sassc/native.rb +8 -1
  132. data/lib/sassc/version.rb +1 -1
  133. data/sassc.gemspec +19 -11
  134. data/test/engine_test.rb +26 -1
  135. data/test/native_test.rb +1 -1
  136. metadata +66 -72
  137. data/ext/Rakefile +0 -3
  138. data/ext/libsass/.github/CONTRIBUTING.md +0 -65
  139. data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
  140. data/ext/libsass/.travis.yml +0 -64
  141. data/ext/libsass/Readme.md +0 -104
  142. data/ext/libsass/SECURITY.md +0 -10
  143. data/ext/libsass/appveyor.yml +0 -91
  144. data/ext/libsass/docs/README.md +0 -20
  145. data/ext/libsass/docs/api-context-example.md +0 -45
  146. data/ext/libsass/docs/api-context-internal.md +0 -163
  147. data/ext/libsass/docs/api-context.md +0 -295
  148. data/ext/libsass/docs/api-doc.md +0 -215
  149. data/ext/libsass/docs/api-function-example.md +0 -67
  150. data/ext/libsass/docs/api-function-internal.md +0 -8
  151. data/ext/libsass/docs/api-function.md +0 -74
  152. data/ext/libsass/docs/api-importer-example.md +0 -112
  153. data/ext/libsass/docs/api-importer-internal.md +0 -20
  154. data/ext/libsass/docs/api-importer.md +0 -86
  155. data/ext/libsass/docs/api-value-example.md +0 -55
  156. data/ext/libsass/docs/api-value-internal.md +0 -76
  157. data/ext/libsass/docs/api-value.md +0 -154
  158. data/ext/libsass/docs/build-on-darwin.md +0 -27
  159. data/ext/libsass/docs/build-on-gentoo.md +0 -55
  160. data/ext/libsass/docs/build-on-windows.md +0 -139
  161. data/ext/libsass/docs/build-shared-library.md +0 -35
  162. data/ext/libsass/docs/build-with-autotools.md +0 -78
  163. data/ext/libsass/docs/build-with-makefiles.md +0 -68
  164. data/ext/libsass/docs/build-with-mingw.md +0 -107
  165. data/ext/libsass/docs/build-with-visual-studio.md +0 -90
  166. data/ext/libsass/docs/build.md +0 -97
  167. data/ext/libsass/docs/compatibility-plan.md +0 -48
  168. data/ext/libsass/docs/contributing.md +0 -17
  169. data/ext/libsass/docs/custom-functions-internal.md +0 -122
  170. data/ext/libsass/docs/dev-ast-memory.md +0 -223
  171. data/ext/libsass/docs/implementations.md +0 -56
  172. data/ext/libsass/docs/plugins.md +0 -47
  173. data/ext/libsass/docs/setup-environment.md +0 -68
  174. data/ext/libsass/docs/source-map-internals.md +0 -51
  175. data/ext/libsass/docs/trace.md +0 -26
  176. data/ext/libsass/docs/triage.md +0 -17
  177. data/ext/libsass/docs/unicode.md +0 -39
  178. data/ext/libsass/extconf.rb +0 -6
  179. data/ext/libsass/script/bootstrap +0 -13
  180. data/ext/libsass/script/branding +0 -10
  181. data/ext/libsass/script/ci-build-libsass +0 -134
  182. data/ext/libsass/script/ci-build-plugin +0 -62
  183. data/ext/libsass/script/ci-install-compiler +0 -6
  184. data/ext/libsass/script/ci-install-deps +0 -20
  185. data/ext/libsass/script/ci-report-coverage +0 -42
  186. data/ext/libsass/script/spec +0 -5
  187. data/ext/libsass/script/tap-driver +0 -652
  188. data/ext/libsass/script/tap-runner +0 -1
  189. data/ext/libsass/script/test-leaks.pl +0 -103
  190. data/ext/libsass/src/functions.cpp +0 -2234
  191. data/ext/libsass/src/functions.hpp +0 -198
  192. data/ext/libsass/src/to_c.hpp +0 -39
  193. data/ext/libsass/test/test_node.cpp +0 -94
  194. data/ext/libsass/test/test_paths.cpp +0 -28
  195. data/ext/libsass/test/test_selector_difference.cpp +0 -25
  196. data/ext/libsass/test/test_specificity.cpp +0 -25
  197. data/ext/libsass/test/test_subset_map.cpp +0 -472
  198. data/ext/libsass/test/test_superselector.cpp +0 -69
  199. data/ext/libsass/test/test_unification.cpp +0 -31
  200. data/lib/tasks/libsass.rb +0 -33
@@ -15,7 +15,7 @@ namespace Sass {
15
15
  class Eval;
16
16
  struct Backtrace;
17
17
 
18
- class Expand : public Operation_CRTP<Statement_Ptr, Expand> {
18
+ class Expand : public Operation_CRTP<Statement*, Expand> {
19
19
  public:
20
20
 
21
21
  Env* environment();
@@ -30,51 +30,47 @@ namespace Sass {
30
30
  bool old_at_root_without_rule;
31
31
 
32
32
  // it's easier to work with vectors
33
- std::vector<Env*> env_stack;
34
- std::vector<Block_Ptr> block_stack;
35
- std::vector<AST_Node_Obj> call_stack;
36
- std::vector<Selector_List_Obj> selector_stack;
37
- std::vector<Media_Block_Ptr> media_block_stack;
33
+ EnvStack env_stack;
34
+ BlockStack block_stack;
35
+ CallStack call_stack;
36
+ SelectorStack selector_stack;
37
+ MediaStack media_stack;
38
38
 
39
39
  Boolean_Obj bool_true;
40
40
 
41
- Statement_Ptr fallback_impl(AST_Node_Ptr n);
42
-
43
41
  private:
44
42
  void expand_selector_list(Selector_Obj, Selector_List_Obj extender);
45
43
 
46
44
  public:
47
- Expand(Context&, Env*, std::vector<Selector_List_Obj>* stack = NULL);
45
+ Expand(Context&, Env*, SelectorStack* stack = NULL);
48
46
  ~Expand() { }
49
47
 
50
- Block_Ptr operator()(Block_Ptr);
51
- Statement_Ptr operator()(Ruleset_Ptr);
52
- Statement_Ptr operator()(Media_Block_Ptr);
53
- Statement_Ptr operator()(Supports_Block_Ptr);
54
- Statement_Ptr operator()(At_Root_Block_Ptr);
55
- Statement_Ptr operator()(Directive_Ptr);
56
- Statement_Ptr operator()(Declaration_Ptr);
57
- Statement_Ptr operator()(Assignment_Ptr);
58
- Statement_Ptr operator()(Import_Ptr);
59
- Statement_Ptr operator()(Import_Stub_Ptr);
60
- Statement_Ptr operator()(Warning_Ptr);
61
- Statement_Ptr operator()(Error_Ptr);
62
- Statement_Ptr operator()(Debug_Ptr);
63
- Statement_Ptr operator()(Comment_Ptr);
64
- Statement_Ptr operator()(If_Ptr);
65
- Statement_Ptr operator()(For_Ptr);
66
- Statement_Ptr operator()(Each_Ptr);
67
- Statement_Ptr operator()(While_Ptr);
68
- Statement_Ptr operator()(Return_Ptr);
69
- Statement_Ptr operator()(Extension_Ptr);
70
- Statement_Ptr operator()(Definition_Ptr);
71
- Statement_Ptr operator()(Mixin_Call_Ptr);
72
- Statement_Ptr operator()(Content_Ptr);
73
-
74
- template <typename U>
75
- Statement_Ptr fallback(U x) { return fallback_impl(x); }
76
-
77
- void append_block(Block_Ptr);
48
+ Block* operator()(Block*);
49
+ Statement* operator()(Ruleset*);
50
+ Statement* operator()(Media_Block*);
51
+ Statement* operator()(Supports_Block*);
52
+ Statement* operator()(At_Root_Block*);
53
+ Statement* operator()(Directive*);
54
+ Statement* operator()(Declaration*);
55
+ Statement* operator()(Assignment*);
56
+ Statement* operator()(Import*);
57
+ Statement* operator()(Import_Stub*);
58
+ Statement* operator()(Warning*);
59
+ Statement* operator()(Error*);
60
+ Statement* operator()(Debug*);
61
+ Statement* operator()(Comment*);
62
+ Statement* operator()(If*);
63
+ Statement* operator()(For*);
64
+ Statement* operator()(Each*);
65
+ Statement* operator()(While*);
66
+ Statement* operator()(Return*);
67
+ Statement* operator()(Extension*);
68
+ Statement* operator()(Definition*);
69
+ Statement* operator()(Mixin_Call*);
70
+ Statement* operator()(Content*);
71
+
72
+ void append_block(Block*);
73
+
78
74
  };
79
75
 
80
76
  }
@@ -1,4 +1,7 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
1
3
  #include "sass.hpp"
4
+
2
5
  #include "extend.hpp"
3
6
  #include "context.hpp"
4
7
  #include "backtrace.hpp"
@@ -111,7 +114,7 @@ namespace Sass {
111
114
  }
112
115
 
113
116
  // Print a string representation of a Compound_Selector
114
- static void printCompoundSelector(Compound_Selector_Ptr pCompoundSelector, const char* message=NULL, bool newline=true) {
117
+ static void printCompoundSelector(Compound_Selector* pCompoundSelector, const char* message=NULL, bool newline=true) {
115
118
 
116
119
  if (message) {
117
120
  std::cerr << message;
@@ -132,7 +135,7 @@ namespace Sass {
132
135
  std::ostream& operator<<(std::ostream& os, Complex_Selector& complexSelector) {
133
136
 
134
137
  os << "[";
135
- Complex_Selector_Ptr pIter = &complexSelector;
138
+ Complex_Selector* pIter = &complexSelector;
136
139
  bool first = true;
137
140
  while (pIter) {
138
141
  if (pIter->combinator() != Complex_Selector::ANCESTOR_OF) {
@@ -163,7 +166,7 @@ namespace Sass {
163
166
 
164
167
 
165
168
  // Print a string representation of a Complex_Selector
166
- static void printComplexSelector(Complex_Selector_Ptr pComplexSelector, const char* message=NULL, bool newline=true) {
169
+ static void printComplexSelector(Complex_Selector* pComplexSelector, const char* message=NULL, bool newline=true) {
167
170
 
168
171
  if (message) {
169
172
  std::cerr << message;
@@ -194,8 +197,8 @@ namespace Sass {
194
197
  std::cerr << ", ";
195
198
  }
196
199
  std::cerr << "[";
197
- Compound_Selector_Ptr pSels = pair.first;
198
- Complex_Selector_Ptr pNewSelector = pair.second;
200
+ Compound_Selector* pSels = pair.first;
201
+ Complex_Selector* pNewSelector = pair.second;
199
202
  std::cerr << "[" << *pSels << "], ";
200
203
  printComplexSelector(pNewSelector, NULL, false);
201
204
  }
@@ -218,7 +221,7 @@ namespace Sass {
218
221
  typedef std::deque<std::string> SourceStrings;
219
222
  SourceStrings sourceStrings;
220
223
  for (ComplexSelectorSet::iterator iterator = sources.begin(), iteratorEnd = sources.end(); iterator != iteratorEnd; ++iterator) {
221
- Complex_Selector_Ptr pSource = *iterator;
224
+ Complex_Selector* pSource = *iterator;
222
225
  std::stringstream sstream;
223
226
  sstream << complexSelectorToNode(pSource);
224
227
  sourceStrings.push_back(sstream.str());
@@ -280,13 +283,13 @@ namespace Sass {
280
283
  }
281
284
  #endif
282
285
 
283
- static bool parentSuperselector(Complex_Selector_Ptr pOne, Complex_Selector_Ptr pTwo) {
286
+ static bool parentSuperselector(Complex_Selector* pOne, Complex_Selector* pTwo) {
284
287
  // TODO: figure out a better way to create a Complex_Selector from scratch
285
288
  // TODO: There's got to be a better way. This got ugly quick...
286
- Element_Selector_Obj fakeParent = SASS_MEMORY_NEW(Element_Selector, ParserState("[FAKE]"), "temp");
289
+ Type_Selector_Obj fakeParent = SASS_MEMORY_NEW(Type_Selector, ParserState("[FAKE]"), "temp");
287
290
  Compound_Selector_Obj fakeHead = SASS_MEMORY_NEW(Compound_Selector, ParserState("[FAKE]"), 1 /*size*/);
288
291
  fakeHead->elements().push_back(fakeParent);
289
- Complex_Selector_Obj fakeParentContainer = SASS_MEMORY_NEW(Complex_Selector, ParserState("[FAKE]"), Complex_Selector::ANCESTOR_OF, fakeHead /*head*/, NULL /*tail*/);
292
+ Complex_Selector_Obj fakeParentContainer = SASS_MEMORY_NEW(Complex_Selector, ParserState("[FAKE]"), Complex_Selector::ANCESTOR_OF, fakeHead /*head*/, {} /*tail*/);
290
293
 
291
294
  pOne->set_innermost(fakeParentContainer, Complex_Selector::ANCESTOR_OF);
292
295
  pTwo->set_innermost(fakeParentContainer, Complex_Selector::ANCESTOR_OF);
@@ -440,8 +443,8 @@ namespace Sass {
440
443
  //DEBUG_PRINTLN(LCS, "LCS: X=" << x << " Y=" << y)
441
444
  // TODO: make printComplexSelectorDeque and use DEBUG_EXEC AND DEBUG_PRINTLN HERE to get equivalent output
442
445
 
443
- x.push_front(NULL);
444
- y.push_front(NULL);
446
+ x.push_front({});
447
+ y.push_front({});
445
448
 
446
449
  LCSTable table;
447
450
  lcs_table(x, y, comparator, table);
@@ -643,10 +646,10 @@ namespace Sass {
643
646
  static bool parentSuperselector(const Node& one, const Node& two) {
644
647
  // TODO: figure out a better way to create a Complex_Selector from scratch
645
648
  // TODO: There's got to be a better way. This got ugly quick...
646
- Element_Selector_Obj fakeParent = SASS_MEMORY_NEW(Element_Selector, ParserState("[FAKE]"), "temp");
649
+ Type_Selector_Obj fakeParent = SASS_MEMORY_NEW(Type_Selector, ParserState("[FAKE]"), "temp");
647
650
  Compound_Selector_Obj fakeHead = SASS_MEMORY_NEW(Compound_Selector, ParserState("[FAKE]"), 1 /*size*/);
648
651
  fakeHead->elements().push_back(fakeParent);
649
- Complex_Selector_Obj fakeParentContainer = SASS_MEMORY_NEW(Complex_Selector, ParserState("[FAKE]"), Complex_Selector::ANCESTOR_OF, fakeHead /*head*/, NULL /*tail*/);
652
+ Complex_Selector_Obj fakeParentContainer = SASS_MEMORY_NEW(Complex_Selector, ParserState("[FAKE]"), Complex_Selector::ANCESTOR_OF, fakeHead /*head*/, {} /*tail*/);
650
653
 
651
654
  Complex_Selector_Obj pOneWithFakeParent = nodeToComplexSelector(one);
652
655
  pOneWithFakeParent->set_innermost(fakeParentContainer, Complex_Selector::ANCESTOR_OF);
@@ -977,7 +980,7 @@ namespace Sass {
977
980
 
978
981
  Complex_Selector_Obj pMergedWrapper = SASS_MEMORY_CLONE(sel1.selector()); // Clone the Complex_Selector to get back to something we can transform to a node once we replace the head with the unification result
979
982
  // TODO: does subject matter? Ruby: return unless merged = sel1.unify(sel2.members, sel2.subject?)
980
- Compound_Selector_Ptr pMerged = sel1.selector()->head()->unify_with(sel2.selector()->head());
983
+ Compound_Selector* pMerged = sel1.selector()->head()->unify_with(sel2.selector()->head());
981
984
  pMergedWrapper->head(pMerged);
982
985
 
983
986
  DEBUG_EXEC(ALL, printCompoundSelector(pMerged, "MERGED: "))
@@ -1034,7 +1037,7 @@ namespace Sass {
1034
1037
 
1035
1038
  Complex_Selector_Obj pMergedWrapper = SASS_MEMORY_CLONE(plusSel.selector()); // Clone the Complex_Selector to get back to something we can transform to a node once we replace the head with the unification result
1036
1039
  // TODO: does subject matter? Ruby: merged = plus_sel.unify(tilde_sel.members, tilde_sel.subject?)
1037
- Compound_Selector_Ptr pMerged = plusSel.selector()->head()->unify_with(tildeSel.selector()->head());
1040
+ Compound_Selector* pMerged = plusSel.selector()->head()->unify_with(tildeSel.selector()->head());
1038
1041
  pMergedWrapper->head(pMerged);
1039
1042
 
1040
1043
  DEBUG_EXEC(ALL, printCompoundSelector(pMerged, "MERGED: "))
@@ -1083,7 +1086,7 @@ namespace Sass {
1083
1086
 
1084
1087
  Complex_Selector_Obj pMergedWrapper = SASS_MEMORY_CLONE(sel1.selector()); // Clone the Complex_Selector to get back to something we can transform to a node once we replace the head with the unification result
1085
1088
  // TODO: does subject matter? Ruby: return unless merged = sel1.unify(sel2.members, sel2.subject?)
1086
- Compound_Selector_Ptr pMerged = sel1.selector()->head()->unify_with(sel2.selector()->head());
1089
+ Compound_Selector* pMerged = sel1.selector()->head()->unify_with(sel2.selector()->head());
1087
1090
  pMergedWrapper->head(pMerged);
1088
1091
 
1089
1092
  DEBUG_EXEC(ALL, printCompoundSelector(pMerged, "MERGED: "))
@@ -1517,7 +1520,7 @@ namespace Sass {
1517
1520
  return pSelector;
1518
1521
  }
1519
1522
  };
1520
- Node Extend::extendCompoundSelector(Compound_Selector_Ptr pSelector, CompoundSelectorSet& seen, bool isReplace) {
1523
+ Node Extend::extendCompoundSelector(Compound_Selector* pSelector, CompoundSelectorSet& seen, bool isReplace) {
1521
1524
 
1522
1525
  /* this turned out to be too much overhead
1523
1526
  probably due to holding a "Node" object
@@ -1561,7 +1564,7 @@ namespace Sass {
1561
1564
  DEBUG_EXEC(EXTEND_COMPOUND, printCompoundSelector(pSels, "SELS: "))
1562
1565
 
1563
1566
  // The selector up to where the @extend is (ie, the thing to merge)
1564
- Complex_Selector_Ptr pExtComplexSelector = seq;
1567
+ Complex_Selector* pExtComplexSelector = seq;
1565
1568
 
1566
1569
  // TODO: This can return a Compound_Selector with no elements. Should that just be returning NULL?
1567
1570
  // RUBY: self_without_sel = Sass::Util.array_minus(members, sels)
@@ -1595,7 +1598,7 @@ namespace Sass {
1595
1598
  // out and aren't operated on.
1596
1599
  Complex_Selector_Obj pNewSelector = SASS_MEMORY_CLONE(pExtComplexSelector); // ->first();
1597
1600
 
1598
- Complex_Selector_Obj pNewInnerMost = SASS_MEMORY_NEW(Complex_Selector, pSelector->pstate(), Complex_Selector::ANCESTOR_OF, pUnifiedSelector, NULL);
1601
+ Complex_Selector_Obj pNewInnerMost = SASS_MEMORY_NEW(Complex_Selector, pSelector->pstate(), Complex_Selector::ANCESTOR_OF, pUnifiedSelector, {});
1599
1602
 
1600
1603
  Complex_Selector::Combinator combinator = pNewSelector->clear_innermost();
1601
1604
  pNewSelector->set_innermost(pNewInnerMost, combinator);
@@ -1685,7 +1688,7 @@ namespace Sass {
1685
1688
 
1686
1689
 
1687
1690
  // check if selector has something to be extended by subset_map
1688
- bool Extend::complexSelectorHasExtension(Complex_Selector_Ptr selector, CompoundSelectorSet& seen) {
1691
+ bool Extend::complexSelectorHasExtension(Complex_Selector* selector, CompoundSelectorSet& seen) {
1689
1692
 
1690
1693
  bool hasExtension = false;
1691
1694
 
@@ -1741,7 +1744,7 @@ namespace Sass {
1741
1744
  the combinator and compound selector are one unit
1742
1745
  next [[sseq_or_op]] unless sseq_or_op.is_a?(SimpleSequence)
1743
1746
  */
1744
- Node Extend::extendComplexSelector(Complex_Selector_Ptr selector, CompoundSelectorSet& seen, bool isReplace, bool isOriginal) {
1747
+ Node Extend::extendComplexSelector(Complex_Selector* selector, CompoundSelectorSet& seen, bool isReplace, bool isOriginal) {
1745
1748
 
1746
1749
  // check if we already extended this selector
1747
1750
  // we can do this since subset_map is "static"
@@ -1851,8 +1854,7 @@ namespace Sass {
1851
1854
  // Ruby Equivalent: flatten
1852
1855
  Node flattened(flatten(trimmed, 1));
1853
1856
 
1854
- DEBUG_PRINTLN(EXTEND_COMPLEX, ">>>>> EXTENDED: " << extendedSelectors)
1855
- DEBUG_PRINTLN(EXTEND_COMPLEX, "EXTEND COMPLEX END: " << complexSelector)
1857
+ DEBUG_PRINTLN(EXTEND_COMPLEX, "FLATTENED: " << flattened)
1856
1858
 
1857
1859
  // memory results in a map table - since extending is very expensive
1858
1860
  memoizeComplex.insert(std::pair<Complex_Selector_Obj, Node>(selector, flattened));
@@ -1868,7 +1870,7 @@ namespace Sass {
1868
1870
  */
1869
1871
  // We get a selector list with has something to extend and a subset_map with
1870
1872
  // all extenders. Pick the ones that match our selectors in the list.
1871
- Selector_List_Ptr Extend::extendSelectorList(Selector_List_Obj pSelectorList, bool isReplace, bool& extendedSomething, CompoundSelectorSet& seen) {
1873
+ Selector_List* Extend::extendSelectorList(Selector_List_Obj pSelectorList, bool isReplace, bool& extendedSomething, CompoundSelectorSet& seen) {
1872
1874
 
1873
1875
  Selector_List_Obj pNewSelectors = SASS_MEMORY_NEW(Selector_List, pSelectorList->pstate(), pSelectorList->length());
1874
1876
 
@@ -1943,7 +1945,7 @@ namespace Sass {
1943
1945
  // special case for ruby ass
1944
1946
  if (sl->empty()) {
1945
1947
  // this seems inconsistent but it is how ruby sass seems to remove parentheses
1946
- cpy_head->append(SASS_MEMORY_NEW(Element_Selector, hs->pstate(), ws->name()));
1948
+ cpy_head->append(SASS_MEMORY_NEW(Type_Selector, hs->pstate(), ws->name()));
1947
1949
  }
1948
1950
  // has wrapped not selectors
1949
1951
  else if (ws->name() == ":not") {
@@ -1956,10 +1958,10 @@ namespace Sass {
1956
1958
  Wrapped_Selector_Obj cpy_ws = SASS_MEMORY_COPY(ws);
1957
1959
  Selector_List_Obj cpy_ws_sl = SASS_MEMORY_NEW(Selector_List, sl->pstate());
1958
1960
  // remove parent selectors from inner selector
1959
- Compound_Selector_Obj ext_head = NULL;
1961
+ Compound_Selector_Obj ext_head;
1960
1962
  if (ext_cs->first()) ext_head = ext_cs->first()->head();
1961
1963
  if (ext_head && ext_head && ext_head->length() > 0) {
1962
- cpy_ws_sl->append(ext_cs->first());
1964
+ cpy_ws_sl->append(ext_cs->mutable_first());
1963
1965
  }
1964
1966
  // assign list to clone
1965
1967
  cpy_ws->selector(cpy_ws_sl);
@@ -2040,7 +2042,7 @@ namespace Sass {
2040
2042
  // was is @extend that matches our selector. If we find one, we will go further
2041
2043
  // and call the extend magic for our selector. The subset_map contains all blocks
2042
2044
  // where @extend was found. Pick the ones that match our selector!
2043
- void Extend::extendObjectWithSelectorAndBlock(Ruleset_Ptr pObject) {
2045
+ void Extend::extendObjectWithSelectorAndBlock(Ruleset* pObject) {
2044
2046
 
2045
2047
  DEBUG_PRINTLN(EXTEND_OBJECT, "FOUND SELECTOR: " << Cast<Selector_List>(pObject->selector())->to_string())
2046
2048
 
@@ -2075,7 +2077,7 @@ namespace Sass {
2075
2077
  eval = &e;
2076
2078
  }
2077
2079
 
2078
- void Extend::operator()(Block_Ptr b)
2080
+ void Extend::operator()(Block* b)
2079
2081
  {
2080
2082
  for (size_t i = 0, L = b->length(); i < L; ++i) {
2081
2083
  Statement_Obj stm = b->at(i);
@@ -2086,8 +2088,8 @@ namespace Sass {
2086
2088
  if (b->is_root()) {
2087
2089
  // debug_subset_map(subset_map);
2088
2090
  for(auto const &it : subset_map.values()) {
2089
- Complex_Selector_Ptr sel = NULL;
2090
- Compound_Selector_Ptr ext = NULL;
2091
+ const Complex_Selector* sel = nullptr;
2092
+ const Compound_Selector* ext = nullptr;
2091
2093
  if (it.first) sel = it.first->first();
2092
2094
  if (it.second) ext = it.second;
2093
2095
  if (ext && (ext->extended() || ext->is_optional())) continue;
@@ -2104,25 +2106,25 @@ namespace Sass {
2104
2106
 
2105
2107
  }
2106
2108
 
2107
- void Extend::operator()(Ruleset_Ptr pRuleset)
2109
+ void Extend::operator()(Ruleset* pRuleset)
2108
2110
  {
2109
2111
  extendObjectWithSelectorAndBlock( pRuleset );
2110
2112
  pRuleset->block()->perform(this);
2111
2113
  }
2112
2114
 
2113
- void Extend::operator()(Supports_Block_Ptr pFeatureBlock)
2115
+ void Extend::operator()(Supports_Block* pFeatureBlock)
2114
2116
  {
2115
2117
  pFeatureBlock->block()->perform(this);
2116
2118
  }
2117
2119
 
2118
- void Extend::operator()(Media_Block_Ptr pMediaBlock)
2120
+ void Extend::operator()(Media_Block* pMediaBlock)
2119
2121
  {
2120
2122
  pMediaBlock->block()->perform(this);
2121
2123
  }
2122
2124
 
2123
- void Extend::operator()(Directive_Ptr a)
2125
+ void Extend::operator()(Directive* a)
2124
2126
  {
2125
- // Selector_List_Ptr ls = Cast<Selector_List>(a->selector());
2127
+ // Selector_List* ls = Cast<Selector_List>(a->selector());
2126
2128
  // selector_stack.push_back(ls);
2127
2129
  if (a->block()) a->block()->perform(this);
2128
2130
  // exp.selector_stack.pop_back();
@@ -20,8 +20,6 @@ namespace Sass {
20
20
  Subset_Map& subset_map;
21
21
  Eval* eval;
22
22
 
23
- void fallback_impl(AST_Node_Ptr n) { }
24
-
25
23
  private:
26
24
 
27
25
  std::unordered_map<
@@ -48,22 +46,22 @@ namespace Sass {
48
46
  > memoizeCompound;
49
47
  */
50
48
 
51
- void extendObjectWithSelectorAndBlock(Ruleset_Ptr pObject);
52
- Node extendComplexSelector(Complex_Selector_Ptr sel, CompoundSelectorSet& seen, bool isReplace, bool isOriginal);
53
- Node extendCompoundSelector(Compound_Selector_Ptr sel, CompoundSelectorSet& seen, bool isReplace);
54
- bool complexSelectorHasExtension(Complex_Selector_Ptr selector, CompoundSelectorSet& seen);
49
+ void extendObjectWithSelectorAndBlock(Ruleset* pObject);
50
+ Node extendComplexSelector(Complex_Selector* sel, CompoundSelectorSet& seen, bool isReplace, bool isOriginal);
51
+ Node extendCompoundSelector(Compound_Selector* sel, CompoundSelectorSet& seen, bool isReplace);
52
+ bool complexSelectorHasExtension(Complex_Selector* selector, CompoundSelectorSet& seen);
55
53
  Node trim(Node& seqses, bool isReplace);
56
54
  Node weave(Node& path);
57
55
 
58
56
  public:
59
57
  void setEval(Eval& eval);
60
- Selector_List_Ptr extendSelectorList(Selector_List_Obj pSelectorList, bool isReplace, bool& extendedSomething, CompoundSelectorSet& seen);
61
- Selector_List_Ptr extendSelectorList(Selector_List_Obj pSelectorList, bool isReplace = false) {
58
+ Selector_List* extendSelectorList(Selector_List_Obj pSelectorList, bool isReplace, bool& extendedSomething, CompoundSelectorSet& seen);
59
+ Selector_List* extendSelectorList(Selector_List_Obj pSelectorList, bool isReplace = false) {
62
60
  bool extendedSomething = false;
63
61
  CompoundSelectorSet seen;
64
62
  return extendSelectorList(pSelectorList, isReplace, extendedSomething, seen);
65
63
  }
66
- Selector_List_Ptr extendSelectorList(Selector_List_Obj pSelectorList, CompoundSelectorSet& seen) {
64
+ Selector_List* extendSelectorList(Selector_List_Obj pSelectorList, CompoundSelectorSet& seen) {
67
65
  bool isReplace = false;
68
66
  bool extendedSomething = false;
69
67
  return extendSelectorList(pSelectorList, isReplace, extendedSomething, seen);
@@ -71,14 +69,16 @@ namespace Sass {
71
69
  Extend(Subset_Map&);
72
70
  ~Extend() { }
73
71
 
74
- void operator()(Block_Ptr);
75
- void operator()(Ruleset_Ptr);
76
- void operator()(Supports_Block_Ptr);
77
- void operator()(Media_Block_Ptr);
78
- void operator()(Directive_Ptr);
72
+ void operator()(Block*);
73
+ void operator()(Ruleset*);
74
+ void operator()(Supports_Block*);
75
+ void operator()(Media_Block*);
76
+ void operator()(Directive*);
79
77
 
78
+ // ignore missed types
80
79
  template <typename U>
81
- void fallback(U x) { return fallback_impl(x); }
80
+ void fallback(U x) {}
81
+
82
82
  };
83
83
 
84
84
  }
@@ -1,4 +1,7 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
1
3
  #include "sass.hpp"
4
+
2
5
  #ifdef _WIN32
3
6
  # ifdef __MINGW32__
4
7
  # ifndef off64_t
@@ -21,6 +24,8 @@
21
24
  #include "prelexer.hpp"
22
25
  #include "utf8_string.hpp"
23
26
  #include "sass_functions.hpp"
27
+ #include "error_handling.hpp"
28
+ #include "util.hpp"
24
29
  #include "sass2scss.h"
25
30
 
26
31
  #ifdef _WIN32
@@ -79,7 +84,10 @@ namespace Sass {
79
84
  wchar_t resolved[32768];
80
85
  // windows unicode filepaths are encoded in utf16
81
86
  std::string abspath(join_paths(get_cwd(), path));
82
- std::wstring wpath(UTF_8::convert_to_utf16("\\\\?\\" + abspath));
87
+ if (!(abspath[0] == '/' && abspath[1] == '/')) {
88
+ abspath = "//?/" + abspath;
89
+ }
90
+ std::wstring wpath(UTF_8::convert_to_utf16(abspath));
83
91
  std::replace(wpath.begin(), wpath.end(), '/', '\\');
84
92
  DWORD rv = GetFullPathNameW(wpath.c_str(), 32767, resolved, NULL);
85
93
  if (rv > 32767) throw Exception::OperationError("Path is too long");
@@ -323,6 +331,8 @@ namespace Sass {
323
331
  // (2) underscore + given
324
332
  // (3) underscore + given + extension
325
333
  // (4) given + extension
334
+ // (5) given + _index.scss
335
+ // (6) given + _index.sass
326
336
  std::vector<Include> resolve_includes(const std::string& root, const std::string& file, const std::vector<std::string>& exts)
327
337
  {
328
338
  std::string filename = join_paths(root, file);
@@ -350,6 +360,25 @@ namespace Sass {
350
360
  abs_path = join_paths(root, rel_path);
351
361
  if (file_exists(abs_path)) includes.push_back({{ rel_path, root }, abs_path });
352
362
  }
363
+ // index files
364
+ if (includes.size() == 0) {
365
+ // ignore directories that look like @import'able filename
366
+ for(auto ext : exts) {
367
+ if (ends_with(name, ext)) return includes;
368
+ }
369
+ // next test underscore index exts
370
+ for(auto ext : exts) {
371
+ rel_path = join_paths(base, join_paths(name, "_index" + ext));
372
+ abs_path = join_paths(root, rel_path);
373
+ if (file_exists(abs_path)) includes.push_back({{ rel_path, root }, abs_path });
374
+ }
375
+ // next test plain index exts
376
+ for(auto ext : exts) {
377
+ rel_path = join_paths(base, join_paths(name, "index" + ext));
378
+ abs_path = join_paths(root, rel_path);
379
+ if (file_exists(abs_path)) includes.push_back({{ rel_path, root }, abs_path });
380
+ }
381
+ }
353
382
  // nothing found
354
383
  return includes;
355
384
  }
@@ -411,7 +440,10 @@ namespace Sass {
411
440
  wchar_t resolved[32768];
412
441
  // windows unicode filepaths are encoded in utf16
413
442
  std::string abspath(join_paths(get_cwd(), path));
414
- std::wstring wpath(UTF_8::convert_to_utf16("\\\\?\\" + abspath));
443
+ if (!(abspath[0] == '/' && abspath[1] == '/')) {
444
+ abspath = "//?/" + abspath;
445
+ }
446
+ std::wstring wpath(UTF_8::convert_to_utf16(abspath));
415
447
  std::replace(wpath.begin(), wpath.end(), '/', '\\');
416
448
  DWORD rv = GetFullPathNameW(wpath.c_str(), 32767, resolved, NULL);
417
449
  if (rv > 32767) throw Exception::OperationError("Path is too long");