sassc 2.0.1 → 2.1.0.pre1

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