sassc 2.0.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (260) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +9 -3
  5. data/CHANGELOG.md +36 -0
  6. data/CODE_OF_CONDUCT.md +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +43 -7
  9. data/ext/depend +4 -0
  10. data/ext/extconf.rb +92 -0
  11. data/ext/libsass/VERSION +1 -0
  12. data/ext/libsass/include/sass/base.h +9 -1
  13. data/ext/libsass/include/sass/context.h +5 -1
  14. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  15. data/ext/libsass/src/ast.cpp +755 -2028
  16. data/ext/libsass/src/ast.hpp +492 -2477
  17. data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
  18. data/ext/libsass/src/ast2c.hpp +39 -0
  19. data/ext/libsass/src/ast_def_macros.hpp +70 -10
  20. data/ext/libsass/src/ast_fwd_decl.cpp +5 -3
  21. data/ext/libsass/src/ast_fwd_decl.hpp +107 -296
  22. data/ext/libsass/src/ast_helpers.hpp +292 -0
  23. data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
  24. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  25. data/ext/libsass/src/ast_sel_unify.cpp +275 -0
  26. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  27. data/ext/libsass/src/ast_selectors.cpp +1043 -0
  28. data/ext/libsass/src/ast_selectors.hpp +522 -0
  29. data/ext/libsass/src/ast_supports.cpp +114 -0
  30. data/ext/libsass/src/ast_supports.hpp +121 -0
  31. data/ext/libsass/src/ast_values.cpp +1154 -0
  32. data/ext/libsass/src/ast_values.hpp +498 -0
  33. data/ext/libsass/src/backtrace.cpp +11 -7
  34. data/ext/libsass/src/backtrace.hpp +5 -5
  35. data/ext/libsass/src/base64vlq.cpp +5 -2
  36. data/ext/libsass/src/base64vlq.hpp +1 -1
  37. data/ext/libsass/src/bind.cpp +35 -34
  38. data/ext/libsass/src/bind.hpp +3 -1
  39. data/ext/libsass/src/c2ast.cpp +64 -0
  40. data/ext/libsass/src/c2ast.hpp +14 -0
  41. data/ext/libsass/src/cencode.c +4 -6
  42. data/ext/libsass/src/check_nesting.cpp +83 -88
  43. data/ext/libsass/src/check_nesting.hpp +39 -34
  44. data/ext/libsass/src/color_maps.cpp +168 -164
  45. data/ext/libsass/src/color_maps.hpp +152 -160
  46. data/ext/libsass/src/constants.cpp +20 -0
  47. data/ext/libsass/src/constants.hpp +19 -0
  48. data/ext/libsass/src/context.cpp +104 -121
  49. data/ext/libsass/src/context.hpp +43 -55
  50. data/ext/libsass/src/cssize.cpp +103 -188
  51. data/ext/libsass/src/cssize.hpp +45 -51
  52. data/ext/libsass/src/dart_helpers.hpp +199 -0
  53. data/ext/libsass/src/debugger.hpp +524 -361
  54. data/ext/libsass/src/emitter.cpp +26 -26
  55. data/ext/libsass/src/emitter.hpp +20 -18
  56. data/ext/libsass/src/environment.cpp +41 -27
  57. data/ext/libsass/src/environment.hpp +33 -22
  58. data/ext/libsass/src/error_handling.cpp +92 -94
  59. data/ext/libsass/src/error_handling.hpp +73 -50
  60. data/ext/libsass/src/eval.cpp +380 -515
  61. data/ext/libsass/src/eval.hpp +64 -57
  62. data/ext/libsass/src/eval_selectors.cpp +75 -0
  63. data/ext/libsass/src/expand.cpp +322 -263
  64. data/ext/libsass/src/expand.hpp +55 -39
  65. data/ext/libsass/src/extender.cpp +1188 -0
  66. data/ext/libsass/src/extender.hpp +399 -0
  67. data/ext/libsass/src/extension.cpp +43 -0
  68. data/ext/libsass/src/extension.hpp +89 -0
  69. data/ext/libsass/src/file.cpp +134 -88
  70. data/ext/libsass/src/file.hpp +28 -37
  71. data/ext/libsass/src/fn_colors.cpp +596 -0
  72. data/ext/libsass/src/fn_colors.hpp +85 -0
  73. data/ext/libsass/src/fn_lists.cpp +285 -0
  74. data/ext/libsass/src/fn_lists.hpp +34 -0
  75. data/ext/libsass/src/fn_maps.cpp +94 -0
  76. data/ext/libsass/src/fn_maps.hpp +30 -0
  77. data/ext/libsass/src/fn_miscs.cpp +244 -0
  78. data/ext/libsass/src/fn_miscs.hpp +40 -0
  79. data/ext/libsass/src/fn_numbers.cpp +227 -0
  80. data/ext/libsass/src/fn_numbers.hpp +45 -0
  81. data/ext/libsass/src/fn_selectors.cpp +205 -0
  82. data/ext/libsass/src/fn_selectors.hpp +35 -0
  83. data/ext/libsass/src/fn_strings.cpp +268 -0
  84. data/ext/libsass/src/fn_strings.hpp +34 -0
  85. data/ext/libsass/src/fn_utils.cpp +158 -0
  86. data/ext/libsass/src/fn_utils.hpp +62 -0
  87. data/ext/libsass/src/inspect.cpp +253 -266
  88. data/ext/libsass/src/inspect.hpp +72 -74
  89. data/ext/libsass/src/json.cpp +2 -2
  90. data/ext/libsass/src/lexer.cpp +25 -84
  91. data/ext/libsass/src/lexer.hpp +5 -16
  92. data/ext/libsass/src/listize.cpp +27 -43
  93. data/ext/libsass/src/listize.hpp +14 -11
  94. data/ext/libsass/src/mapping.hpp +1 -0
  95. data/ext/libsass/src/memory.hpp +12 -0
  96. data/ext/libsass/src/memory/allocator.cpp +48 -0
  97. data/ext/libsass/src/memory/allocator.hpp +138 -0
  98. data/ext/libsass/src/memory/config.hpp +20 -0
  99. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  100. data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
  101. data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
  102. data/ext/libsass/src/operation.hpp +193 -143
  103. data/ext/libsass/src/operators.cpp +56 -29
  104. data/ext/libsass/src/operators.hpp +11 -11
  105. data/ext/libsass/src/ordered_map.hpp +112 -0
  106. data/ext/libsass/src/output.cpp +59 -75
  107. data/ext/libsass/src/output.hpp +15 -22
  108. data/ext/libsass/src/parser.cpp +662 -818
  109. data/ext/libsass/src/parser.hpp +96 -100
  110. data/ext/libsass/src/parser_selectors.cpp +189 -0
  111. data/ext/libsass/src/permutate.hpp +164 -0
  112. data/ext/libsass/src/plugins.cpp +12 -8
  113. data/ext/libsass/src/plugins.hpp +8 -8
  114. data/ext/libsass/src/position.cpp +10 -26
  115. data/ext/libsass/src/position.hpp +44 -21
  116. data/ext/libsass/src/prelexer.cpp +14 -8
  117. data/ext/libsass/src/prelexer.hpp +9 -9
  118. data/ext/libsass/src/remove_placeholders.cpp +59 -57
  119. data/ext/libsass/src/remove_placeholders.hpp +20 -18
  120. data/ext/libsass/src/sass.cpp +25 -18
  121. data/ext/libsass/src/sass.hpp +22 -14
  122. data/ext/libsass/src/sass2scss.cpp +49 -18
  123. data/ext/libsass/src/sass_context.cpp +104 -132
  124. data/ext/libsass/src/sass_context.hpp +2 -2
  125. data/ext/libsass/src/sass_functions.cpp +7 -4
  126. data/ext/libsass/src/sass_functions.hpp +1 -1
  127. data/ext/libsass/src/sass_values.cpp +26 -21
  128. data/ext/libsass/src/settings.hpp +19 -0
  129. data/ext/libsass/src/source.cpp +69 -0
  130. data/ext/libsass/src/source.hpp +95 -0
  131. data/ext/libsass/src/source_data.hpp +32 -0
  132. data/ext/libsass/src/source_map.cpp +27 -20
  133. data/ext/libsass/src/source_map.hpp +14 -11
  134. data/ext/libsass/src/stylesheet.cpp +22 -0
  135. data/ext/libsass/src/stylesheet.hpp +57 -0
  136. data/ext/libsass/src/to_value.cpp +24 -22
  137. data/ext/libsass/src/to_value.hpp +18 -22
  138. data/ext/libsass/src/units.cpp +28 -22
  139. data/ext/libsass/src/units.hpp +9 -8
  140. data/ext/libsass/src/utf8/checked.h +12 -10
  141. data/ext/libsass/src/utf8/core.h +3 -0
  142. data/ext/libsass/src/utf8_string.cpp +12 -10
  143. data/ext/libsass/src/utf8_string.hpp +7 -6
  144. data/ext/libsass/src/util.cpp +97 -107
  145. data/ext/libsass/src/util.hpp +74 -30
  146. data/ext/libsass/src/util_string.cpp +125 -0
  147. data/ext/libsass/src/util_string.hpp +73 -0
  148. data/ext/libsass/src/values.cpp +33 -24
  149. data/ext/libsass/src/values.hpp +2 -2
  150. data/lib/sassc.rb +24 -0
  151. data/lib/sassc/engine.rb +7 -5
  152. data/lib/sassc/functions_handler.rb +11 -13
  153. data/lib/sassc/native.rb +10 -9
  154. data/lib/sassc/native/native_functions_api.rb +0 -5
  155. data/lib/sassc/script.rb +4 -6
  156. data/lib/sassc/version.rb +1 -1
  157. data/sassc.gemspec +32 -12
  158. data/test/engine_test.rb +32 -2
  159. data/test/functions_test.rb +38 -1
  160. data/test/native_test.rb +4 -4
  161. metadata +95 -109
  162. data/ext/Rakefile +0 -3
  163. data/ext/libsass/.editorconfig +0 -15
  164. data/ext/libsass/.gitattributes +0 -2
  165. data/ext/libsass/.github/CONTRIBUTING.md +0 -65
  166. data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
  167. data/ext/libsass/.gitignore +0 -85
  168. data/ext/libsass/.travis.yml +0 -64
  169. data/ext/libsass/COPYING +0 -25
  170. data/ext/libsass/GNUmakefile.am +0 -88
  171. data/ext/libsass/INSTALL +0 -1
  172. data/ext/libsass/LICENSE +0 -25
  173. data/ext/libsass/Makefile +0 -351
  174. data/ext/libsass/Makefile.conf +0 -55
  175. data/ext/libsass/Readme.md +0 -104
  176. data/ext/libsass/SECURITY.md +0 -10
  177. data/ext/libsass/appveyor.yml +0 -91
  178. data/ext/libsass/configure.ac +0 -138
  179. data/ext/libsass/contrib/libsass.spec +0 -66
  180. data/ext/libsass/docs/README.md +0 -20
  181. data/ext/libsass/docs/api-context-example.md +0 -45
  182. data/ext/libsass/docs/api-context-internal.md +0 -163
  183. data/ext/libsass/docs/api-context.md +0 -295
  184. data/ext/libsass/docs/api-doc.md +0 -215
  185. data/ext/libsass/docs/api-function-example.md +0 -67
  186. data/ext/libsass/docs/api-function-internal.md +0 -8
  187. data/ext/libsass/docs/api-function.md +0 -74
  188. data/ext/libsass/docs/api-importer-example.md +0 -112
  189. data/ext/libsass/docs/api-importer-internal.md +0 -20
  190. data/ext/libsass/docs/api-importer.md +0 -86
  191. data/ext/libsass/docs/api-value-example.md +0 -55
  192. data/ext/libsass/docs/api-value-internal.md +0 -76
  193. data/ext/libsass/docs/api-value.md +0 -154
  194. data/ext/libsass/docs/build-on-darwin.md +0 -27
  195. data/ext/libsass/docs/build-on-gentoo.md +0 -55
  196. data/ext/libsass/docs/build-on-windows.md +0 -139
  197. data/ext/libsass/docs/build-shared-library.md +0 -35
  198. data/ext/libsass/docs/build-with-autotools.md +0 -78
  199. data/ext/libsass/docs/build-with-makefiles.md +0 -68
  200. data/ext/libsass/docs/build-with-mingw.md +0 -107
  201. data/ext/libsass/docs/build-with-visual-studio.md +0 -90
  202. data/ext/libsass/docs/build.md +0 -97
  203. data/ext/libsass/docs/compatibility-plan.md +0 -48
  204. data/ext/libsass/docs/contributing.md +0 -17
  205. data/ext/libsass/docs/custom-functions-internal.md +0 -122
  206. data/ext/libsass/docs/dev-ast-memory.md +0 -223
  207. data/ext/libsass/docs/implementations.md +0 -56
  208. data/ext/libsass/docs/plugins.md +0 -47
  209. data/ext/libsass/docs/setup-environment.md +0 -68
  210. data/ext/libsass/docs/source-map-internals.md +0 -51
  211. data/ext/libsass/docs/trace.md +0 -26
  212. data/ext/libsass/docs/triage.md +0 -17
  213. data/ext/libsass/docs/unicode.md +0 -39
  214. data/ext/libsass/extconf.rb +0 -6
  215. data/ext/libsass/include/sass/version.h.in +0 -12
  216. data/ext/libsass/m4/.gitkeep +0 -0
  217. data/ext/libsass/m4/m4-ax_cxx_compile_stdcxx_11.m4 +0 -167
  218. data/ext/libsass/res/resource.rc +0 -35
  219. data/ext/libsass/script/bootstrap +0 -13
  220. data/ext/libsass/script/branding +0 -10
  221. data/ext/libsass/script/ci-build-libsass +0 -134
  222. data/ext/libsass/script/ci-build-plugin +0 -62
  223. data/ext/libsass/script/ci-install-compiler +0 -6
  224. data/ext/libsass/script/ci-install-deps +0 -20
  225. data/ext/libsass/script/ci-report-coverage +0 -42
  226. data/ext/libsass/script/spec +0 -5
  227. data/ext/libsass/script/tap-driver +0 -652
  228. data/ext/libsass/script/tap-runner +0 -1
  229. data/ext/libsass/script/test-leaks.pl +0 -103
  230. data/ext/libsass/src/GNUmakefile.am +0 -54
  231. data/ext/libsass/src/extend.cpp +0 -2130
  232. data/ext/libsass/src/extend.hpp +0 -86
  233. data/ext/libsass/src/functions.cpp +0 -2234
  234. data/ext/libsass/src/functions.hpp +0 -198
  235. data/ext/libsass/src/memory/SharedPtr.cpp +0 -114
  236. data/ext/libsass/src/memory/SharedPtr.hpp +0 -206
  237. data/ext/libsass/src/node.cpp +0 -319
  238. data/ext/libsass/src/node.hpp +0 -118
  239. data/ext/libsass/src/paths.hpp +0 -71
  240. data/ext/libsass/src/sass_util.cpp +0 -149
  241. data/ext/libsass/src/sass_util.hpp +0 -256
  242. data/ext/libsass/src/subset_map.cpp +0 -55
  243. data/ext/libsass/src/subset_map.hpp +0 -76
  244. data/ext/libsass/src/support/libsass.pc.in +0 -11
  245. data/ext/libsass/src/to_c.hpp +0 -39
  246. data/ext/libsass/test/test_node.cpp +0 -94
  247. data/ext/libsass/test/test_paths.cpp +0 -28
  248. data/ext/libsass/test/test_selector_difference.cpp +0 -25
  249. data/ext/libsass/test/test_specificity.cpp +0 -25
  250. data/ext/libsass/test/test_subset_map.cpp +0 -472
  251. data/ext/libsass/test/test_superselector.cpp +0 -69
  252. data/ext/libsass/test/test_unification.cpp +0 -31
  253. data/ext/libsass/version.sh +0 -10
  254. data/ext/libsass/win/libsass.sln +0 -39
  255. data/ext/libsass/win/libsass.sln.DotSettings +0 -9
  256. data/ext/libsass/win/libsass.targets +0 -118
  257. data/ext/libsass/win/libsass.vcxproj +0 -188
  258. data/ext/libsass/win/libsass.vcxproj.filters +0 -357
  259. data/lib/sassc/native/lib_c.rb +0 -21
  260. data/lib/tasks/libsass.rb +0 -33
@@ -1,6 +1,10 @@
1
1
  #ifndef SASS_PARSER_H
2
2
  #define SASS_PARSER_H
3
3
 
4
+ // sass.hpp must go before all system headers to get the
5
+ // __EXTENSIONS__ fix on Solaris.
6
+ #include "sass.hpp"
7
+
4
8
  #include <string>
5
9
  #include <vector>
6
10
 
@@ -9,6 +13,7 @@
9
13
  #include "context.hpp"
10
14
  #include "position.hpp"
11
15
  #include "prelexer.hpp"
16
+ #include "source.hpp"
12
17
 
13
18
  #ifndef MAX_NESTING
14
19
  // Note that this limit is not an exact science
@@ -30,41 +35,31 @@ struct Lookahead {
30
35
 
31
36
  namespace Sass {
32
37
 
33
- class Parser : public ParserState {
38
+ class Parser : public SourceSpan {
34
39
  public:
35
40
 
36
41
  enum Scope { Root, Mixin, Function, Media, Control, Properties, Rules, AtRoot };
37
42
 
38
43
  Context& ctx;
39
- std::vector<Block_Obj> block_stack;
40
- std::vector<Scope> stack;
41
- Media_Block_Ptr last_media_block;
42
- const char* source;
44
+ sass::vector<Block_Obj> block_stack;
45
+ sass::vector<Scope> stack;
46
+ SourceDataObj source;
47
+ const char* begin;
43
48
  const char* position;
44
49
  const char* end;
45
- Position before_token;
46
- Position after_token;
47
- ParserState pstate;
50
+ Offset before_token;
51
+ Offset after_token;
52
+ SourceSpan pstate;
48
53
  Backtraces traces;
49
54
  size_t indentation;
50
55
  size_t nestings;
51
-
56
+ bool allow_parent;
52
57
  Token lexed;
53
58
 
54
- Parser(Context& ctx, const ParserState& pstate, Backtraces traces)
55
- : ParserState(pstate), ctx(ctx), block_stack(), stack(0), last_media_block(),
56
- source(0), position(0), end(0), before_token(pstate), after_token(pstate),
57
- pstate(pstate), traces(traces), indentation(0), nestings(0)
58
- {
59
- stack.push_back(Scope::Root);
60
- }
59
+ Parser(SourceData* source, Context& ctx, Backtraces, bool allow_parent = true);
61
60
 
62
- // static Parser from_string(const std::string& src, Context& ctx, ParserState pstate = ParserState("[STRING]"));
63
- static Parser from_c_str(const char* src, Context& ctx, Backtraces, ParserState pstate = ParserState("[CSTRING]"), const char* source = 0);
64
- static Parser from_c_str(const char* beg, const char* end, Context& ctx, Backtraces, ParserState pstate = ParserState("[CSTRING]"), const char* source = 0);
65
- static Parser from_token(Token t, Context& ctx, Backtraces, ParserState pstate = ParserState("[TOKEN]"), const char* source = 0);
66
61
  // special static parsers to convert strings into certain selectors
67
- static Selector_List_Obj parse_selector(const char* src, Context& ctx, Backtraces, ParserState pstate = ParserState("[SELECTOR]"), const char* source = 0);
62
+ static SelectorListObj parse_selector(SourceData* source, Context& ctx, Backtraces, bool allow_parent = true);
68
63
 
69
64
  #ifdef __clang__
70
65
 
@@ -80,7 +75,7 @@ namespace Sass {
80
75
 
81
76
 
82
77
  // skip current token and next whitespace
83
- // moves ParserState right before next token
78
+ // moves SourceSpan right before next token
84
79
  void advanceToNextToken();
85
80
 
86
81
  bool peek_newline(const char* start = 0);
@@ -184,8 +179,8 @@ namespace Sass {
184
179
  // update after_token position for current token
185
180
  after_token.add(it_before_token, it_after_token);
186
181
 
187
- // ToDo: could probably do this incremetal on original object (API wants offset?)
188
- pstate = ParserState(path, source, lexed, before_token, after_token - before_token);
182
+ // ToDo: could probably do this incremental on original object (API wants offset?)
183
+ pstate = SourceSpan(source, before_token, after_token - before_token);
189
184
 
190
185
  // advance internal char iterator
191
186
  return position = it_after_token;
@@ -202,9 +197,9 @@ namespace Sass {
202
197
  Token prev = lexed;
203
198
  // store previous pointer
204
199
  const char* oldpos = position;
205
- Position bt = before_token;
206
- Position at = after_token;
207
- ParserState op = pstate;
200
+ Offset bt = before_token;
201
+ Offset at = after_token;
202
+ SourceSpan op = pstate;
208
203
  // throw away comments
209
204
  // update srcmap position
210
205
  lex < Prelexer::css_comments >();
@@ -236,13 +231,12 @@ namespace Sass {
236
231
 
237
232
  #endif
238
233
 
239
- void error(std::string msg);
240
- void error(std::string msg, Position pos);
234
+ void error(sass::string msg);
241
235
  // generate message with given and expected sample
242
236
  // text before and in the middle are configurable
243
- void css_error(const std::string& msg,
244
- const std::string& prefix = " after ",
245
- const std::string& middle = ", was: ",
237
+ void css_error(const sass::string& msg,
238
+ const sass::string& prefix = " after ",
239
+ const sass::string& middle = ", was: ",
246
240
  const bool trim = true);
247
241
  void read_bom();
248
242
 
@@ -255,115 +249,117 @@ namespace Sass {
255
249
  Arguments_Obj parse_arguments();
256
250
  Argument_Obj parse_argument();
257
251
  Assignment_Obj parse_assignment();
258
- Ruleset_Obj parse_ruleset(Lookahead lookahead);
259
- Selector_List_Obj parse_selector_list(bool chroot);
260
- Complex_Selector_Obj parse_complex_selector(bool chroot);
252
+ StyleRuleObj parse_ruleset(Lookahead lookahead);
253
+ SelectorListObj parseSelectorList(bool chroot);
254
+ ComplexSelectorObj parseComplexSelector(bool chroot);
261
255
  Selector_Schema_Obj parse_selector_schema(const char* end_of_selector, bool chroot);
262
- Compound_Selector_Obj parse_compound_selector();
263
- Simple_Selector_Obj parse_simple_selector();
264
- Wrapped_Selector_Obj parse_negated_selector();
265
- Simple_Selector_Obj parse_pseudo_selector();
266
- Attribute_Selector_Obj parse_attribute_selector();
256
+ CompoundSelectorObj parseCompoundSelector();
257
+ SimpleSelectorObj parse_simple_selector();
258
+ PseudoSelectorObj parse_negated_selector2();
259
+ Expression* parse_binominal();
260
+ SimpleSelectorObj parse_pseudo_selector();
261
+ AttributeSelectorObj parse_attribute_selector();
267
262
  Block_Obj parse_block(bool is_root = false);
268
263
  Block_Obj parse_css_block(bool is_root = false);
269
264
  bool parse_block_nodes(bool is_root = false);
270
265
  bool parse_block_node(bool is_root = false);
271
266
 
272
- bool parse_number_prefix();
273
267
  Declaration_Obj parse_declaration();
274
- Expression_Obj parse_map();
275
- Expression_Obj parse_bracket_list();
276
- Expression_Obj parse_list(bool delayed = false);
277
- Expression_Obj parse_comma_list(bool delayed = false);
278
- Expression_Obj parse_space_list();
279
- Expression_Obj parse_disjunction();
280
- Expression_Obj parse_conjunction();
281
- Expression_Obj parse_relation();
282
- Expression_Obj parse_expression();
283
- Expression_Obj parse_operators();
284
- Expression_Obj parse_factor();
285
- Expression_Obj parse_value();
268
+ ExpressionObj parse_map();
269
+ ExpressionObj parse_bracket_list();
270
+ ExpressionObj parse_list(bool delayed = false);
271
+ ExpressionObj parse_comma_list(bool delayed = false);
272
+ ExpressionObj parse_space_list();
273
+ ExpressionObj parse_disjunction();
274
+ ExpressionObj parse_conjunction();
275
+ ExpressionObj parse_relation();
276
+ ExpressionObj parse_expression();
277
+ ExpressionObj parse_operators();
278
+ ExpressionObj parse_factor();
279
+ ExpressionObj parse_value();
286
280
  Function_Call_Obj parse_calc_function();
287
281
  Function_Call_Obj parse_function_call();
288
- Function_Call_Schema_Obj parse_function_call_schema();
282
+ Function_Call_Obj parse_function_call_schema();
289
283
  String_Obj parse_url_function_string();
290
284
  String_Obj parse_url_function_argument();
291
285
  String_Obj parse_interpolated_chunk(Token, bool constant = false, bool css = true);
292
286
  String_Obj parse_string();
293
- String_Constant_Obj parse_static_value();
294
- String_Schema_Obj parse_css_variable_value(bool top_level = true);
295
- String_Schema_Obj parse_css_variable_value_token(bool top_level = true);
287
+ ValueObj parse_static_value();
288
+ String_Schema_Obj parse_css_variable_value();
296
289
  String_Obj parse_ie_property();
297
290
  String_Obj parse_ie_keyword_arg();
298
291
  String_Schema_Obj parse_value_schema(const char* stop);
299
292
  String_Obj parse_identifier_schema();
300
293
  If_Obj parse_if_directive(bool else_if = false);
301
- For_Obj parse_for_directive();
302
- Each_Obj parse_each_directive();
303
- While_Obj parse_while_directive();
294
+ ForRuleObj parse_for_directive();
295
+ EachRuleObj parse_each_directive();
296
+ WhileRuleObj parse_while_directive();
297
+ MediaRule_Obj parseMediaRule();
298
+ sass::vector<CssMediaQuery_Obj> parseCssMediaQueries();
299
+ sass::string parseIdentifier();
300
+ CssMediaQuery_Obj parseCssMediaQuery();
304
301
  Return_Obj parse_return_directive();
305
302
  Content_Obj parse_content_directive();
306
303
  void parse_charset_directive();
307
- Media_Block_Obj parse_media_block();
308
304
  List_Obj parse_media_queries();
309
305
  Media_Query_Obj parse_media_query();
310
- Media_Query_Expression_Obj parse_media_expression();
311
- Supports_Block_Obj parse_supports_directive();
312
- Supports_Condition_Obj parse_supports_condition();
313
- Supports_Condition_Obj parse_supports_negation();
314
- Supports_Condition_Obj parse_supports_operator();
315
- Supports_Condition_Obj parse_supports_interpolation();
316
- Supports_Condition_Obj parse_supports_declaration();
317
- Supports_Condition_Obj parse_supports_condition_in_parens();
318
- At_Root_Block_Obj parse_at_root_block();
306
+ Media_Query_ExpressionObj parse_media_expression();
307
+ SupportsRuleObj parse_supports_directive();
308
+ SupportsConditionObj parse_supports_condition(bool top_level);
309
+ SupportsConditionObj parse_supports_negation();
310
+ SupportsConditionObj parse_supports_operator(bool top_level);
311
+ SupportsConditionObj parse_supports_interpolation();
312
+ SupportsConditionObj parse_supports_declaration();
313
+ SupportsConditionObj parse_supports_condition_in_parens(bool parens_required);
314
+ AtRootRuleObj parse_at_root_block();
319
315
  At_Root_Query_Obj parse_at_root_query();
320
316
  String_Schema_Obj parse_almost_any_value();
321
- Directive_Obj parse_special_directive();
322
- Directive_Obj parse_prefixed_directive();
323
- Directive_Obj parse_directive();
324
- Warning_Obj parse_warning();
325
- Error_Obj parse_error();
326
- Debug_Obj parse_debug();
317
+ AtRuleObj parse_directive();
318
+ WarningRuleObj parse_warning();
319
+ ErrorRuleObj parse_error();
320
+ DebugRuleObj parse_debug();
321
+
322
+ Value* color_or_string(const sass::string& lexed) const;
327
323
 
328
324
  // be more like ruby sass
329
- Expression_Obj lex_almost_any_value_token();
330
- Expression_Obj lex_almost_any_value_chars();
331
- Expression_Obj lex_interp_string();
332
- Expression_Obj lex_interp_uri();
333
- Expression_Obj lex_interpolation();
325
+ ExpressionObj lex_almost_any_value_token();
326
+ ExpressionObj lex_almost_any_value_chars();
327
+ ExpressionObj lex_interp_string();
328
+ ExpressionObj lex_interp_uri();
329
+ ExpressionObj lex_interpolation();
334
330
 
335
331
  // these will throw errors
336
332
  Token lex_variable();
337
333
  Token lex_identifier();
338
334
 
339
- void parse_block_comments();
335
+ void parse_block_comments(bool store = true);
340
336
 
341
337
  Lookahead lookahead_for_value(const char* start = 0);
342
338
  Lookahead lookahead_for_selector(const char* start = 0);
343
339
  Lookahead lookahead_for_include(const char* start = 0);
344
340
 
345
- Expression_Obj fold_operands(Expression_Obj base, std::vector<Expression_Obj>& operands, Operand op);
346
- Expression_Obj fold_operands(Expression_Obj base, std::vector<Expression_Obj>& operands, std::vector<Operand>& ops, size_t i = 0);
341
+ ExpressionObj fold_operands(ExpressionObj base, sass::vector<ExpressionObj>& operands, Operand op);
342
+ ExpressionObj fold_operands(ExpressionObj base, sass::vector<ExpressionObj>& operands, sass::vector<Operand>& ops, size_t i = 0);
347
343
 
348
- void throw_syntax_error(std::string message, size_t ln = 0);
349
- void throw_read_error(std::string message, size_t ln = 0);
344
+ void throw_syntax_error(sass::string message, size_t ln = 0);
345
+ void throw_read_error(sass::string message, size_t ln = 0);
350
346
 
351
347
 
352
348
  template <Prelexer::prelexer open, Prelexer::prelexer close>
353
- Expression_Obj lex_interp()
349
+ ExpressionObj lex_interp()
354
350
  {
355
351
  if (lex < open >(false)) {
356
352
  String_Schema_Obj schema = SASS_MEMORY_NEW(String_Schema, pstate);
357
- // std::cerr << "LEX [[" << std::string(lexed) << "]]\n";
353
+ // std::cerr << "LEX [[" << sass::string(lexed) << "]]\n";
358
354
  schema->append(SASS_MEMORY_NEW(String_Constant, pstate, lexed));
359
355
  if (position[0] == '#' && position[1] == '{') {
360
- Expression_Obj itpl = lex_interpolation();
356
+ ExpressionObj itpl = lex_interpolation();
361
357
  if (!itpl.isNull()) schema->append(itpl);
362
358
  while (lex < close >(false)) {
363
- // std::cerr << "LEX [[" << std::string(lexed) << "]]\n";
359
+ // std::cerr << "LEX [[" << sass::string(lexed) << "]]\n";
364
360
  schema->append(SASS_MEMORY_NEW(String_Constant, pstate, lexed));
365
361
  if (position[0] == '#' && position[1] == '{') {
366
- Expression_Obj itpl = lex_interpolation();
362
+ ExpressionObj itpl = lex_interpolation();
367
363
  if (!itpl.isNull()) schema->append(itpl);
368
364
  } else {
369
365
  return schema;
@@ -373,19 +369,19 @@ namespace Sass {
373
369
  return SASS_MEMORY_NEW(String_Constant, pstate, lexed);
374
370
  }
375
371
  }
376
- return 0;
372
+ return {};
377
373
  }
378
374
 
379
375
  public:
380
- static Number_Ptr lexed_number(const ParserState& pstate, const std::string& parsed);
381
- static Number_Ptr lexed_dimension(const ParserState& pstate, const std::string& parsed);
382
- static Number_Ptr lexed_percentage(const ParserState& pstate, const std::string& parsed);
383
- static Expression_Ptr lexed_hex_color(const ParserState& pstate, const std::string& parsed);
376
+ static Number* lexed_number(const SourceSpan& pstate, const sass::string& parsed);
377
+ static Number* lexed_dimension(const SourceSpan& pstate, const sass::string& parsed);
378
+ static Number* lexed_percentage(const SourceSpan& pstate, const sass::string& parsed);
379
+ static Value* lexed_hex_color(const SourceSpan& pstate, const sass::string& parsed);
384
380
  private:
385
- Number_Ptr lexed_number(const std::string& parsed) { return lexed_number(pstate, parsed); };
386
- Number_Ptr lexed_dimension(const std::string& parsed) { return lexed_dimension(pstate, parsed); };
387
- Number_Ptr lexed_percentage(const std::string& parsed) { return lexed_percentage(pstate, parsed); };
388
- Expression_Ptr lexed_hex_color(const std::string& parsed) { return lexed_hex_color(pstate, parsed); };
381
+ Number* lexed_number(const sass::string& parsed) { return lexed_number(pstate, parsed); };
382
+ Number* lexed_dimension(const sass::string& parsed) { return lexed_dimension(pstate, parsed); };
383
+ Number* lexed_percentage(const sass::string& parsed) { return lexed_percentage(pstate, parsed); };
384
+ Value* lexed_hex_color(const sass::string& parsed) { return lexed_hex_color(pstate, parsed); };
389
385
 
390
386
  static const char* re_attr_sensitive_close(const char* src);
391
387
  static const char* re_attr_insensitive_close(const char* src);
@@ -0,0 +1,189 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
3
+ #include "sass.hpp"
4
+
5
+ #include "parser.hpp"
6
+
7
+ namespace Sass {
8
+
9
+ using namespace Prelexer;
10
+ using namespace Constants;
11
+
12
+ ComplexSelectorObj Parser::parseComplexSelector(bool chroot)
13
+ {
14
+
15
+ NESTING_GUARD(nestings);
16
+
17
+ lex < block_comment >();
18
+ advanceToNextToken();
19
+
20
+ ComplexSelectorObj sel = SASS_MEMORY_NEW(ComplexSelector, pstate);
21
+
22
+ if (peek < end_of_file >()) return sel;
23
+
24
+ while (true) {
25
+
26
+ lex < block_comment >();
27
+ advanceToNextToken();
28
+
29
+ // check for child (+) combinator
30
+ if (lex < exactly < selector_combinator_child > >()) {
31
+ sel->append(SASS_MEMORY_NEW(SelectorCombinator, pstate, SelectorCombinator::CHILD, peek_newline()));
32
+ }
33
+ // check for general sibling (~) combinator
34
+ else if (lex < exactly < selector_combinator_general > >()) {
35
+ sel->append(SASS_MEMORY_NEW(SelectorCombinator, pstate, SelectorCombinator::GENERAL, peek_newline()));
36
+ }
37
+ // check for adjecant sibling (+) combinator
38
+ else if (lex < exactly < selector_combinator_adjacent > >()) {
39
+ sel->append(SASS_MEMORY_NEW(SelectorCombinator, pstate, SelectorCombinator::ADJACENT, peek_newline()));
40
+ }
41
+ // check if we can parse a compound selector
42
+ else if (CompoundSelectorObj compound = parseCompoundSelector()) {
43
+ sel->append(compound);
44
+ }
45
+ else {
46
+ break;
47
+ }
48
+ }
49
+
50
+ if (sel->empty()) return {};
51
+
52
+ // check if we parsed any parent references
53
+ sel->chroots(sel->has_real_parent_ref() || chroot);
54
+
55
+ sel->update_pstate(pstate);
56
+
57
+ return sel;
58
+
59
+ }
60
+
61
+ SelectorListObj Parser::parseSelectorList(bool chroot)
62
+ {
63
+
64
+ bool reloop;
65
+ bool had_linefeed = false;
66
+ NESTING_GUARD(nestings);
67
+ SelectorListObj list = SASS_MEMORY_NEW(SelectorList, pstate);
68
+
69
+ if (peek_css< alternatives < end_of_file, exactly <'{'>, exactly <','> > >()) {
70
+ css_error("Invalid CSS", " after ", ": expected selector, was ");
71
+ }
72
+
73
+ do {
74
+ reloop = false;
75
+
76
+ had_linefeed = had_linefeed || peek_newline();
77
+
78
+ if (peek_css< alternatives < class_char < selector_list_delims > > >())
79
+ break; // in case there are superfluous commas at the end
80
+
81
+ // now parse the complex selector
82
+ ComplexSelectorObj complex = parseComplexSelector(chroot);
83
+ if (complex.isNull()) return list.detach();
84
+ complex->hasPreLineFeed(had_linefeed);
85
+
86
+ had_linefeed = false;
87
+
88
+ while (peek_css< exactly<','> >())
89
+ {
90
+ lex< css_comments >(false);
91
+ // consume everything up and including the comma separator
92
+ reloop = lex< exactly<','> >() != 0;
93
+ // remember line break (also between some commas)
94
+ had_linefeed = had_linefeed || peek_newline();
95
+ // remember line break (also between some commas)
96
+ }
97
+ list->append(complex);
98
+
99
+ } while (reloop);
100
+
101
+ while (lex_css< kwd_optional >()) {
102
+ list->is_optional(true);
103
+ }
104
+
105
+ // update for end position
106
+ list->update_pstate(pstate);
107
+
108
+ return list.detach();
109
+ }
110
+
111
+ // parse one compound selector, which is basically
112
+ // a list of simple selectors (directly adjacent)
113
+ // lex them exactly (without skipping white-space)
114
+ CompoundSelectorObj Parser::parseCompoundSelector()
115
+ {
116
+ // init an empty compound selector wrapper
117
+ CompoundSelectorObj seq = SASS_MEMORY_NEW(CompoundSelector, pstate);
118
+
119
+ // skip initial white-space
120
+ lex < block_comment >();
121
+ advanceToNextToken();
122
+
123
+ if (lex< exactly<'&'> >(false))
124
+ {
125
+ // ToDo: check the conditions and try to simplify flag passing
126
+ if (!allow_parent) error("Parent selectors aren't allowed here.");
127
+ // Create and append a new parent selector object
128
+ seq->hasRealParent(true);
129
+ }
130
+
131
+ // parse list
132
+ while (true)
133
+ {
134
+ // remove all block comments
135
+ // leaves trailing white-space
136
+ lex < block_comment >();
137
+ // parse parent selector
138
+ if (lex< exactly<'&'> >(false))
139
+ {
140
+ // parent selector only allowed at start
141
+ // upcoming Sass may allow also trailing
142
+ SourceSpan state(pstate);
143
+ sass::string found("&");
144
+ if (lex < identifier >()) {
145
+ found += sass::string(lexed);
146
+ }
147
+ sass::string sel(seq->hasRealParent() ? "&" : "");
148
+ if (!seq->empty()) { sel = seq->last()->to_string({ NESTED, 5 }); }
149
+ // ToDo: parser should throw parser exceptions
150
+ error("Invalid CSS after \"" + sel + "\": expected \"{\", was \"" + found + "\"\n\n"
151
+ "\"" + found + "\" may only be used at the beginning of a compound selector.");
152
+ }
153
+ // parse functional
154
+ else if (match < re_functional >())
155
+ {
156
+ seq->append(parse_simple_selector());
157
+ }
158
+
159
+ // parse type selector
160
+ else if (lex< re_type_selector >(false))
161
+ {
162
+ seq->append(SASS_MEMORY_NEW(TypeSelector, pstate, lexed));
163
+ }
164
+ // peek for abort conditions
165
+ else if (peek< spaces >()) break;
166
+ else if (peek< end_of_file >()) { break; }
167
+ else if (peek_css < class_char < selector_combinator_ops > >()) break;
168
+ else if (peek_css < class_char < complex_selector_delims > >()) break;
169
+ // otherwise parse another simple selector
170
+ else {
171
+ SimpleSelectorObj sel = parse_simple_selector();
172
+ if (!sel) return {};
173
+ seq->append(sel);
174
+ }
175
+ }
176
+ // EO while true
177
+
178
+ if (seq && !peek_css<alternatives<end_of_file,exactly<'{'>>>()) {
179
+ seq->hasPostLineBreak(peek_newline());
180
+ }
181
+
182
+ // We may have set hasRealParent
183
+ if (seq && seq->empty() && !seq->hasRealParent()) return {};
184
+
185
+ return seq;
186
+ }
187
+
188
+
189
+ }