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
@@ -0,0 +1,34 @@
1
+ #ifndef SASS_FN_STRINGS_H
2
+ #define SASS_FN_STRINGS_H
3
+
4
+ #include "fn_utils.hpp"
5
+
6
+ namespace Sass {
7
+
8
+ namespace Functions {
9
+
10
+ extern Signature unquote_sig;
11
+ extern Signature quote_sig;
12
+ extern Signature str_length_sig;
13
+ extern Signature str_insert_sig;
14
+ extern Signature str_index_sig;
15
+ extern Signature str_slice_sig;
16
+ extern Signature to_upper_case_sig;
17
+ extern Signature to_lower_case_sig;
18
+ extern Signature length_sig;
19
+
20
+ BUILT_IN(sass_unquote);
21
+ BUILT_IN(sass_quote);
22
+ BUILT_IN(str_length);
23
+ BUILT_IN(str_insert);
24
+ BUILT_IN(str_index);
25
+ BUILT_IN(str_slice);
26
+ BUILT_IN(to_upper_case);
27
+ BUILT_IN(to_lower_case);
28
+ BUILT_IN(length);
29
+
30
+ }
31
+
32
+ }
33
+
34
+ #endif
@@ -0,0 +1,156 @@
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
+ #include "fn_utils.hpp"
7
+ #include "util_string.hpp"
8
+
9
+ namespace Sass {
10
+
11
+ Definition* make_native_function(Signature sig, Native_Function func, Context& ctx)
12
+ {
13
+ Parser sig_parser = Parser::from_c_str(sig, ctx, ctx.traces, ParserState("[built-in function]"));
14
+ sig_parser.lex<Prelexer::identifier>();
15
+ std::string name(Util::normalize_underscores(sig_parser.lexed));
16
+ Parameters_Obj params = sig_parser.parse_parameters();
17
+ return SASS_MEMORY_NEW(Definition,
18
+ ParserState("[built-in function]"),
19
+ sig,
20
+ name,
21
+ params,
22
+ func,
23
+ false);
24
+ }
25
+
26
+ Definition* make_c_function(Sass_Function_Entry c_func, Context& ctx)
27
+ {
28
+ using namespace Prelexer;
29
+
30
+ const char* sig = sass_function_get_signature(c_func);
31
+ Parser sig_parser = Parser::from_c_str(sig, ctx, ctx.traces, ParserState("[c function]"));
32
+ // allow to overload generic callback plus @warn, @error and @debug with custom functions
33
+ sig_parser.lex < alternatives < identifier, exactly <'*'>,
34
+ exactly < Constants::warn_kwd >,
35
+ exactly < Constants::error_kwd >,
36
+ exactly < Constants::debug_kwd >
37
+ > >();
38
+ std::string name(Util::normalize_underscores(sig_parser.lexed));
39
+ Parameters_Obj params = sig_parser.parse_parameters();
40
+ return SASS_MEMORY_NEW(Definition,
41
+ ParserState("[c function]"),
42
+ sig,
43
+ name,
44
+ params,
45
+ c_func);
46
+ }
47
+
48
+ namespace Functions {
49
+
50
+ std::string function_name(Signature sig)
51
+ {
52
+ std::string str(sig);
53
+ return str.substr(0, str.find('('));
54
+ }
55
+
56
+ Map* get_arg_m(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces)
57
+ {
58
+ AST_Node* value = env[argname];
59
+ if (Map* map = Cast<Map>(value)) return map;
60
+ List* list = Cast<List>(value);
61
+ if (list && list->length() == 0) {
62
+ return SASS_MEMORY_NEW(Map, pstate, 0);
63
+ }
64
+ return get_arg<Map>(argname, env, sig, pstate, traces);
65
+ }
66
+
67
+ double get_arg_r(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, double lo, double hi)
68
+ {
69
+ Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
70
+ Number tmpnr(val);
71
+ tmpnr.reduce();
72
+ double v = tmpnr.value();
73
+ if (!(lo <= v && v <= hi)) {
74
+ std::stringstream msg;
75
+ msg << "argument `" << argname << "` of `" << sig << "` must be between ";
76
+ msg << lo << " and " << hi;
77
+ error(msg.str(), pstate, traces);
78
+ }
79
+ return v;
80
+ }
81
+
82
+ Number* get_arg_n(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces)
83
+ {
84
+ Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
85
+ val = SASS_MEMORY_COPY(val);
86
+ val->reduce();
87
+ return val;
88
+ }
89
+
90
+ double get_arg_val(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces)
91
+ {
92
+ Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
93
+ Number tmpnr(val);
94
+ tmpnr.reduce();
95
+ return tmpnr.value();
96
+ }
97
+
98
+ double color_num(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces)
99
+ {
100
+ Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
101
+ Number tmpnr(val);
102
+ tmpnr.reduce();
103
+ if (tmpnr.unit() == "%") {
104
+ return std::min(std::max(tmpnr.value() * 255 / 100.0, 0.0), 255.0);
105
+ } else {
106
+ return std::min(std::max(tmpnr.value(), 0.0), 255.0);
107
+ }
108
+ }
109
+
110
+ double alpha_num(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces) {
111
+ Number* val = get_arg<Number>(argname, env, sig, pstate, traces);
112
+ Number tmpnr(val);
113
+ tmpnr.reduce();
114
+ if (tmpnr.unit() == "%") {
115
+ return std::min(std::max(tmpnr.value(), 0.0), 100.0);
116
+ } else {
117
+ return std::min(std::max(tmpnr.value(), 0.0), 1.0);
118
+ }
119
+ }
120
+
121
+ Selector_List_Obj get_arg_sels(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, Context& ctx) {
122
+ Expression_Obj exp = ARG(argname, Expression);
123
+ if (exp->concrete_type() == Expression::NULL_VAL) {
124
+ std::stringstream msg;
125
+ msg << argname << ": null is not a valid selector: it must be a string,\n";
126
+ msg << "a list of strings, or a list of lists of strings for `" << function_name(sig) << "'";
127
+ error(msg.str(), exp->pstate(), traces);
128
+ }
129
+ if (String_Constant* str = Cast<String_Constant>(exp)) {
130
+ str->quote_mark(0);
131
+ }
132
+ std::string exp_src = exp->to_string(ctx.c_options);
133
+ return Parser::parse_selector(exp_src.c_str(), ctx, traces, exp->pstate(), pstate.src, /*allow_parent=*/false);
134
+ }
135
+
136
+ Compound_Selector_Obj get_arg_sel(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, Context& ctx) {
137
+ Expression_Obj exp = ARG(argname, Expression);
138
+ if (exp->concrete_type() == Expression::NULL_VAL) {
139
+ std::stringstream msg;
140
+ msg << argname << ": null is not a string for `" << function_name(sig) << "'";
141
+ error(msg.str(), exp->pstate(), traces);
142
+ }
143
+ if (String_Constant* str = Cast<String_Constant>(exp)) {
144
+ str->quote_mark(0);
145
+ }
146
+ std::string exp_src = exp->to_string(ctx.c_options);
147
+ Selector_List_Obj sel_list = Parser::parse_selector(exp_src.c_str(), ctx, traces, exp->pstate(), pstate.src, /*allow_parent=*/false);
148
+ if (sel_list->length() == 0) return {};
149
+ Complex_Selector_Obj first = sel_list->first();
150
+ if (!first->tail()) return first->head();
151
+ return first->tail()->head();
152
+ }
153
+
154
+ }
155
+
156
+ }
@@ -0,0 +1,56 @@
1
+ #ifndef SASS_FN_UTILS_H
2
+ #define SASS_FN_UTILS_H
3
+ #include "units.hpp"
4
+ #include "backtrace.hpp"
5
+ #include "environment.hpp"
6
+ #include "ast_fwd_decl.hpp"
7
+ #include "error_handling.hpp"
8
+
9
+ namespace Sass {
10
+
11
+ #define FN_PROTOTYPE \
12
+ Env& env, \
13
+ Env& d_env, \
14
+ Context& ctx, \
15
+ Signature sig, \
16
+ ParserState pstate, \
17
+ Backtraces& traces, \
18
+ SelectorStack& selector_stack
19
+
20
+ typedef const char* Signature;
21
+ typedef PreValue* (*Native_Function)(FN_PROTOTYPE);
22
+ #define BUILT_IN(name) PreValue* name(FN_PROTOTYPE)
23
+
24
+ #define ARG(argname, argtype) get_arg<argtype>(argname, env, sig, pstate, traces)
25
+ // special function for weird hsla percent (10px == 10% == 10 != 0.1)
26
+ #define ARGVAL(argname) get_arg_val(argname, env, sig, pstate, traces) // double
27
+
28
+ Definition* make_native_function(Signature, Native_Function, Context& ctx);
29
+ Definition* make_c_function(Sass_Function_Entry c_func, Context& ctx);
30
+
31
+ namespace Functions {
32
+
33
+ template <typename T>
34
+ T* get_arg(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces)
35
+ {
36
+ T* val = Cast<T>(env[argname]);
37
+ if (!val) {
38
+ error("argument `" + argname + "` of `" + sig + "` must be a " + T::type_name(), pstate, traces);
39
+ }
40
+ return val;
41
+ }
42
+
43
+ Map* get_arg_m(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // maps only
44
+ Number* get_arg_n(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // numbers only
45
+ double alpha_num(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // colors only
46
+ double color_num(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // colors only
47
+ double get_arg_r(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, double lo, double hi); // colors only
48
+ double get_arg_val(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces); // shared
49
+ Selector_List_Obj get_arg_sels(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, Context& ctx); // selectors only
50
+ Compound_Selector_Obj get_arg_sel(const std::string& argname, Env& env, Signature sig, ParserState pstate, Backtraces traces, Context& ctx); // selectors only
51
+
52
+ }
53
+
54
+ }
55
+
56
+ #endif
@@ -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 <cmath>
3
6
  #include <string>
4
7
  #include <iostream>
@@ -21,7 +24,7 @@ namespace Sass {
21
24
  Inspect::~Inspect() { }
22
25
 
23
26
  // statements
24
- void Inspect::operator()(Block_Ptr block)
27
+ void Inspect::operator()(Block* block)
25
28
  {
26
29
  if (!block->is_root()) {
27
30
  add_open_mapping(block);
@@ -39,25 +42,23 @@ namespace Sass {
39
42
 
40
43
  }
41
44
 
42
- void Inspect::operator()(Ruleset_Ptr ruleset)
45
+ void Inspect::operator()(Ruleset* ruleset)
43
46
  {
44
47
  if (ruleset->selector()) {
45
- opt.in_selector = true;
46
48
  ruleset->selector()->perform(this);
47
- opt.in_selector = false;
48
49
  }
49
50
  if (ruleset->block()) {
50
51
  ruleset->block()->perform(this);
51
52
  }
52
53
  }
53
54
 
54
- void Inspect::operator()(Keyframe_Rule_Ptr rule)
55
+ void Inspect::operator()(Keyframe_Rule* rule)
55
56
  {
56
57
  if (rule->name()) rule->name()->perform(this);
57
58
  if (rule->block()) rule->block()->perform(this);
58
59
  }
59
60
 
60
- void Inspect::operator()(Bubble_Ptr bubble)
61
+ void Inspect::operator()(Bubble* bubble)
61
62
  {
62
63
  append_indentation();
63
64
  append_token("::BUBBLE", bubble);
@@ -66,7 +67,7 @@ namespace Sass {
66
67
  append_scope_closer();
67
68
  }
68
69
 
69
- void Inspect::operator()(Media_Block_Ptr media_block)
70
+ void Inspect::operator()(Media_Block* media_block)
70
71
  {
71
72
  append_indentation();
72
73
  append_token("@media", media_block);
@@ -77,7 +78,7 @@ namespace Sass {
77
78
  media_block->block()->perform(this);
78
79
  }
79
80
 
80
- void Inspect::operator()(Supports_Block_Ptr feature_block)
81
+ void Inspect::operator()(Supports_Block* feature_block)
81
82
  {
82
83
  append_indentation();
83
84
  append_token("@supports", feature_block);
@@ -86,7 +87,7 @@ namespace Sass {
86
87
  feature_block->block()->perform(this);
87
88
  }
88
89
 
89
- void Inspect::operator()(At_Root_Block_Ptr at_root_block)
90
+ void Inspect::operator()(At_Root_Block* at_root_block)
90
91
  {
91
92
  append_indentation();
92
93
  append_token("@at-root ", at_root_block);
@@ -95,7 +96,7 @@ namespace Sass {
95
96
  if(at_root_block->block()) at_root_block->block()->perform(this);
96
97
  }
97
98
 
98
- void Inspect::operator()(Directive_Ptr at_rule)
99
+ void Inspect::operator()(Directive* at_rule)
99
100
  {
100
101
  append_indentation();
101
102
  append_token(at_rule->keyword(), at_rule);
@@ -118,7 +119,7 @@ namespace Sass {
118
119
  }
119
120
  }
120
121
 
121
- void Inspect::operator()(Declaration_Ptr dec)
122
+ void Inspect::operator()(Declaration* dec)
122
123
  {
123
124
  if (dec->value()->concrete_type() == Expression::NULL_VAL) return;
124
125
  bool was_decl = in_declaration;
@@ -150,7 +151,7 @@ namespace Sass {
150
151
  in_declaration = was_decl;
151
152
  }
152
153
 
153
- void Inspect::operator()(Assignment_Ptr assn)
154
+ void Inspect::operator()(Assignment* assn)
154
155
  {
155
156
  append_token(assn->variable(), assn);
156
157
  append_colon_separator();
@@ -162,7 +163,7 @@ namespace Sass {
162
163
  append_delimiter();
163
164
  }
164
165
 
165
- void Inspect::operator()(Import_Ptr import)
166
+ void Inspect::operator()(Import* import)
166
167
  {
167
168
  if (!import->urls().empty()) {
168
169
  append_token("@import", import);
@@ -193,7 +194,7 @@ namespace Sass {
193
194
  }
194
195
  }
195
196
 
196
- void Inspect::operator()(Import_Stub_Ptr import)
197
+ void Inspect::operator()(Import_Stub* import)
197
198
  {
198
199
  append_indentation();
199
200
  append_token("@import", import);
@@ -202,7 +203,7 @@ namespace Sass {
202
203
  append_delimiter();
203
204
  }
204
205
 
205
- void Inspect::operator()(Warning_Ptr warning)
206
+ void Inspect::operator()(Warning* warning)
206
207
  {
207
208
  append_indentation();
208
209
  append_token("@warn", warning);
@@ -211,7 +212,7 @@ namespace Sass {
211
212
  append_delimiter();
212
213
  }
213
214
 
214
- void Inspect::operator()(Error_Ptr error)
215
+ void Inspect::operator()(Error* error)
215
216
  {
216
217
  append_indentation();
217
218
  append_token("@error", error);
@@ -220,7 +221,7 @@ namespace Sass {
220
221
  append_delimiter();
221
222
  }
222
223
 
223
- void Inspect::operator()(Debug_Ptr debug)
224
+ void Inspect::operator()(Debug* debug)
224
225
  {
225
226
  append_indentation();
226
227
  append_token("@debug", debug);
@@ -229,14 +230,14 @@ namespace Sass {
229
230
  append_delimiter();
230
231
  }
231
232
 
232
- void Inspect::operator()(Comment_Ptr comment)
233
+ void Inspect::operator()(Comment* comment)
233
234
  {
234
235
  in_comment = true;
235
236
  comment->text()->perform(this);
236
237
  in_comment = false;
237
238
  }
238
239
 
239
- void Inspect::operator()(If_Ptr cond)
240
+ void Inspect::operator()(If* cond)
240
241
  {
241
242
  append_indentation();
242
243
  append_token("@if", cond);
@@ -251,7 +252,7 @@ namespace Sass {
251
252
  }
252
253
  }
253
254
 
254
- void Inspect::operator()(For_Ptr loop)
255
+ void Inspect::operator()(For* loop)
255
256
  {
256
257
  append_indentation();
257
258
  append_token("@for", loop);
@@ -264,7 +265,7 @@ namespace Sass {
264
265
  loop->block()->perform(this);
265
266
  }
266
267
 
267
- void Inspect::operator()(Each_Ptr loop)
268
+ void Inspect::operator()(Each* loop)
268
269
  {
269
270
  append_indentation();
270
271
  append_token("@each", loop);
@@ -279,7 +280,7 @@ namespace Sass {
279
280
  loop->block()->perform(this);
280
281
  }
281
282
 
282
- void Inspect::operator()(While_Ptr loop)
283
+ void Inspect::operator()(While* loop)
283
284
  {
284
285
  append_indentation();
285
286
  append_token("@while", loop);
@@ -288,7 +289,7 @@ namespace Sass {
288
289
  loop->block()->perform(this);
289
290
  }
290
291
 
291
- void Inspect::operator()(Return_Ptr ret)
292
+ void Inspect::operator()(Return* ret)
292
293
  {
293
294
  append_indentation();
294
295
  append_token("@return", ret);
@@ -297,7 +298,7 @@ namespace Sass {
297
298
  append_delimiter();
298
299
  }
299
300
 
300
- void Inspect::operator()(Extension_Ptr extend)
301
+ void Inspect::operator()(Extension* extend)
301
302
  {
302
303
  append_indentation();
303
304
  append_token("@extend", extend);
@@ -306,7 +307,7 @@ namespace Sass {
306
307
  append_delimiter();
307
308
  }
308
309
 
309
- void Inspect::operator()(Definition_Ptr def)
310
+ void Inspect::operator()(Definition* def)
310
311
  {
311
312
  append_indentation();
312
313
  if (def->type() == Definition::MIXIN) {
@@ -321,7 +322,7 @@ namespace Sass {
321
322
  def->block()->perform(this);
322
323
  }
323
324
 
324
- void Inspect::operator()(Mixin_Call_Ptr call)
325
+ void Inspect::operator()(Mixin_Call* call)
325
326
  {
326
327
  append_indentation();
327
328
  append_token("@include", call);
@@ -337,14 +338,14 @@ namespace Sass {
337
338
  if (!call->block()) append_delimiter();
338
339
  }
339
340
 
340
- void Inspect::operator()(Content_Ptr content)
341
+ void Inspect::operator()(Content* content)
341
342
  {
342
343
  append_indentation();
343
344
  append_token("@content", content);
344
345
  append_delimiter();
345
346
  }
346
347
 
347
- void Inspect::operator()(Map_Ptr map)
348
+ void Inspect::operator()(Map* map)
348
349
  {
349
350
  if (output_style() == TO_SASS && map->empty()) {
350
351
  append_string("()");
@@ -366,15 +367,15 @@ namespace Sass {
366
367
  append_string(")");
367
368
  }
368
369
 
369
- std::string Inspect::lbracket(List_Ptr list) {
370
+ std::string Inspect::lbracket(List* list) {
370
371
  return list->is_bracketed() ? "[" : "(";
371
372
  }
372
373
 
373
- std::string Inspect::rbracket(List_Ptr list) {
374
+ std::string Inspect::rbracket(List* list) {
374
375
  return list->is_bracketed() ? "]" : ")";
375
376
  }
376
377
 
377
- void Inspect::operator()(List_Ptr list)
378
+ void Inspect::operator()(List* list)
378
379
  {
379
380
  if (list->empty() && (output_style() == TO_SASS || list->is_bracketed())) {
380
381
  append_string(lbracket(list));
@@ -462,7 +463,7 @@ namespace Sass {
462
463
 
463
464
  }
464
465
 
465
- void Inspect::operator()(Binary_Expression_Ptr expr)
466
+ void Inspect::operator()(Binary_Expression* expr)
466
467
  {
467
468
  expr->left()->perform(this);
468
469
  if ( in_media_block ||
@@ -499,7 +500,7 @@ namespace Sass {
499
500
  expr->right()->perform(this);
500
501
  }
501
502
 
502
- void Inspect::operator()(Unary_Expression_Ptr expr)
503
+ void Inspect::operator()(Unary_Expression* expr)
503
504
  {
504
505
  if (expr->optype() == Unary_Expression::PLUS) append_string("+");
505
506
  else if (expr->optype() == Unary_Expression::SLASH) append_string("/");
@@ -507,91 +508,42 @@ namespace Sass {
507
508
  expr->operand()->perform(this);
508
509
  }
509
510
 
510
- void Inspect::operator()(Function_Call_Ptr call)
511
+ void Inspect::operator()(Function_Call* call)
511
512
  {
512
513
  append_token(call->name(), call);
513
514
  call->arguments()->perform(this);
514
515
  }
515
516
 
516
- void Inspect::operator()(Function_Call_Schema_Ptr call)
517
- {
518
- call->name()->perform(this);
519
- call->arguments()->perform(this);
520
- }
521
-
522
- void Inspect::operator()(Variable_Ptr var)
517
+ void Inspect::operator()(Variable* var)
523
518
  {
524
519
  append_token(var->name(), var);
525
520
  }
526
521
 
527
- void Inspect::operator()(Number_Ptr n)
522
+ void Inspect::operator()(Number* n)
528
523
  {
529
524
 
530
- std::string res;
531
-
532
525
  // reduce units
533
526
  n->reduce();
534
527
 
535
- // check if the fractional part of the value equals to zero
536
- // neat trick from http://stackoverflow.com/a/1521682/1550314
537
- // double int_part; bool is_int = modf(value, &int_part) == 0.0;
538
-
539
- // this all cannot be done with one run only, since fixed
540
- // output differs from normal output and regular output
541
- // can contain scientific notation which we do not want!
542
-
543
- // first sample
544
528
  std::stringstream ss;
545
- ss.precision(12);
546
- ss << n->value();
547
-
548
- // check if we got scientific notation in result
549
- if (ss.str().find_first_of("e") != std::string::npos) {
550
- ss.clear(); ss.str(std::string());
551
- ss.precision(std::max(12, opt.precision));
552
- ss << std::fixed << n->value();
553
- }
554
-
555
- std::string tmp = ss.str();
556
- size_t pos_point = tmp.find_first_of(".,");
557
- size_t pos_fract = tmp.find_last_not_of("0");
558
- bool is_int = pos_point == pos_fract ||
559
- pos_point == std::string::npos;
529
+ ss.precision(opt.precision);
530
+ ss << std::fixed << n->value();
560
531
 
561
- // reset stream for another run
562
- ss.clear(); ss.str(std::string());
532
+ std::string res = ss.str();
533
+ int s = res.length();
563
534
 
564
- // take a shortcut for integers
565
- if (is_int)
535
+ // delete trailing zeros
536
+ for(s = s - 1; s > 0; --s)
566
537
  {
567
- ss.precision(0);
568
- ss << std::fixed << n->value();
569
- res = std::string(ss.str());
570
- }
571
- // process floats
572
- else
573
- {
574
- // do we have have too much precision?
575
- if (pos_fract < opt.precision + pos_point)
576
- { ss.precision((int)(pos_fract - pos_point)); }
577
- else { ss.precision(opt.precision); }
578
- // round value again
579
- ss << std::fixed << n->value();
580
- res = std::string(ss.str());
581
- // maybe we truncated up to decimal point
582
- size_t pos = res.find_last_not_of("0");
583
- // handle case where we have a "0"
584
- if (pos == std::string::npos) {
585
- res = "0.0";
586
- } else {
587
- bool at_dec_point = res[pos] == '.' ||
588
- res[pos] == ',';
589
- // don't leave a blank point
590
- if (at_dec_point) ++ pos;
591
- res.resize (pos + 1);
592
- }
538
+ if(res[s] == '0') {
539
+ res.erase(s, 1);
540
+ }
541
+ else break;
593
542
  }
594
543
 
544
+ // delete trailing decimal separator
545
+ if(res[s] == '.') res.erase(s, 1);
546
+
595
547
  // some final cosmetics
596
548
  if (res == "0.0") res = "0";
597
549
  else if (res == "") res = "0";
@@ -599,10 +551,12 @@ namespace Sass {
599
551
  else if (res == "-0.0") res = "0";
600
552
  else if (opt.output_style == COMPRESSED)
601
553
  {
602
- // check if handling negative nr
603
- size_t off = res[0] == '-' ? 1 : 0;
604
- // remove leading zero from floating point in compressed mode
605
- if (n->zero() && res[off] == '0' && res[off+1] == '.') res.erase(off, 1);
554
+ if (n->zero()) {
555
+ // check if handling negative nr
556
+ size_t off = res[0] == '-' ? 1 : 0;
557
+ // remove leading zero from floating point in compressed mode
558
+ if (res[off] == '0' && res[off+1] == '.') res.erase(off, 1);
559
+ }
606
560
  }
607
561
 
608
562
  // add unit now
@@ -620,7 +574,7 @@ namespace Sass {
620
574
  else return c;
621
575
  }
622
576
 
623
- void Inspect::operator()(Color_Ptr c)
577
+ void Inspect::operator()(Color_RGBA* c)
624
578
  {
625
579
  // output the final token
626
580
  std::stringstream ss;
@@ -629,11 +583,6 @@ namespace Sass {
629
583
  // maybe an unknown token
630
584
  std::string name = c->disp();
631
585
 
632
- if (opt.in_selector && name != "") {
633
- append_token(name, c);
634
- return;
635
- }
636
-
637
586
  // resolved color
638
587
  std::string res_name = name;
639
588
 
@@ -644,7 +593,7 @@ namespace Sass {
644
593
 
645
594
  // get color from given name (if one was given at all)
646
595
  if (name != "" && name_to_color(name)) {
647
- Color_Ptr_Const n = name_to_color(name);
596
+ const Color_RGBA* n = name_to_color(name);
648
597
  r = Sass::round(cap_channel<0xff>(n->r()), opt.precision);
649
598
  g = Sass::round(cap_channel<0xff>(n->g()), opt.precision);
650
599
  b = Sass::round(cap_channel<0xff>(n->b()), opt.precision);
@@ -658,6 +607,9 @@ namespace Sass {
658
607
  }
659
608
 
660
609
  std::stringstream hexlet;
610
+ // dart sass compressed all colors in regular css always
611
+ // ruby sass and libsass does it only when not delayed
612
+ // since color math is going to be removed, this can go too
661
613
  bool compressed = opt.output_style == COMPRESSED;
662
614
  hexlet << '#' << std::setw(1) << std::setfill('0');
663
615
  // create a short color hexlet if there is any need for it
@@ -681,9 +633,6 @@ namespace Sass {
681
633
  if (name != "") {
682
634
  ss << name;
683
635
  }
684
- else if (r == 0 && g == 0 && b == 0 && a == 0) {
685
- ss << "transparent";
686
- }
687
636
  else if (a >= 1) {
688
637
  if (res_name != "") {
689
638
  if (compressed && hexlet.str().size() < res_name.size()) {
@@ -711,13 +660,19 @@ namespace Sass {
711
660
 
712
661
  }
713
662
 
714
- void Inspect::operator()(Boolean_Ptr b)
663
+ void Inspect::operator()(Color_HSLA* c)
664
+ {
665
+ Color_RGBA_Obj rgba = c->toRGBA();
666
+ operator()(rgba);
667
+ }
668
+
669
+ void Inspect::operator()(Boolean* b)
715
670
  {
716
671
  // output the final token
717
672
  append_token(b->value() ? "true" : "false", b);
718
673
  }
719
674
 
720
- void Inspect::operator()(String_Schema_Ptr ss)
675
+ void Inspect::operator()(String_Schema* ss)
721
676
  {
722
677
  // Evaluation should turn these into String_Constants,
723
678
  // so this method is only for inspection purposes.
@@ -728,12 +683,12 @@ namespace Sass {
728
683
  }
729
684
  }
730
685
 
731
- void Inspect::operator()(String_Constant_Ptr s)
686
+ void Inspect::operator()(String_Constant* s)
732
687
  {
733
688
  append_token(s->value(), s);
734
689
  }
735
690
 
736
- void Inspect::operator()(String_Quoted_Ptr s)
691
+ void Inspect::operator()(String_Quoted* s)
737
692
  {
738
693
  if (const char q = s->quote_mark()) {
739
694
  append_token(quote(s->value(), q), s);
@@ -742,17 +697,17 @@ namespace Sass {
742
697
  }
743
698
  }
744
699
 
745
- void Inspect::operator()(Custom_Error_Ptr e)
700
+ void Inspect::operator()(Custom_Error* e)
746
701
  {
747
702
  append_token(e->message(), e);
748
703
  }
749
704
 
750
- void Inspect::operator()(Custom_Warning_Ptr w)
705
+ void Inspect::operator()(Custom_Warning* w)
751
706
  {
752
707
  append_token(w->message(), w);
753
708
  }
754
709
 
755
- void Inspect::operator()(Supports_Operator_Ptr so)
710
+ void Inspect::operator()(Supports_Operator* so)
756
711
  {
757
712
 
758
713
  if (so->needs_parens(so->left())) append_string("(");
@@ -774,7 +729,7 @@ namespace Sass {
774
729
  if (so->needs_parens(so->right())) append_string(")");
775
730
  }
776
731
 
777
- void Inspect::operator()(Supports_Negation_Ptr sn)
732
+ void Inspect::operator()(Supports_Negation* sn)
778
733
  {
779
734
  append_token("not", sn);
780
735
  append_mandatory_space();
@@ -783,7 +738,7 @@ namespace Sass {
783
738
  if (sn->needs_parens(sn->condition())) append_string(")");
784
739
  }
785
740
 
786
- void Inspect::operator()(Supports_Declaration_Ptr sd)
741
+ void Inspect::operator()(Supports_Declaration* sd)
787
742
  {
788
743
  append_string("(");
789
744
  sd->feature()->perform(this);
@@ -792,12 +747,12 @@ namespace Sass {
792
747
  append_string(")");
793
748
  }
794
749
 
795
- void Inspect::operator()(Supports_Interpolation_Ptr sd)
750
+ void Inspect::operator()(Supports_Interpolation* sd)
796
751
  {
797
752
  sd->value()->perform(this);
798
753
  }
799
754
 
800
- void Inspect::operator()(Media_Query_Ptr mq)
755
+ void Inspect::operator()(Media_Query* mq)
801
756
  {
802
757
  size_t i = 0;
803
758
  if (mq->media_type()) {
@@ -814,7 +769,7 @@ namespace Sass {
814
769
  }
815
770
  }
816
771
 
817
- void Inspect::operator()(Media_Query_Expression_Ptr mqe)
772
+ void Inspect::operator()(Media_Query_Expression* mqe)
818
773
  {
819
774
  if (mqe->is_interpolated()) {
820
775
  mqe->feature()->perform(this);
@@ -830,7 +785,7 @@ namespace Sass {
830
785
  }
831
786
  }
832
787
 
833
- void Inspect::operator()(At_Root_Query_Ptr ae)
788
+ void Inspect::operator()(At_Root_Query* ae)
834
789
  {
835
790
  if (ae->feature()) {
836
791
  append_string("(");
@@ -843,7 +798,7 @@ namespace Sass {
843
798
  }
844
799
  }
845
800
 
846
- void Inspect::operator()(Function_Ptr f)
801
+ void Inspect::operator()(Function* f)
847
802
  {
848
803
  append_token("get-function", f);
849
804
  append_string("(");
@@ -851,14 +806,14 @@ namespace Sass {
851
806
  append_string(")");
852
807
  }
853
808
 
854
- void Inspect::operator()(Null_Ptr n)
809
+ void Inspect::operator()(Null* n)
855
810
  {
856
811
  // output the final token
857
812
  append_token("null", n);
858
813
  }
859
814
 
860
815
  // parameters and arguments
861
- void Inspect::operator()(Parameter_Ptr p)
816
+ void Inspect::operator()(Parameter* p)
862
817
  {
863
818
  append_token(p->name(), p);
864
819
  if (p->default_value()) {
@@ -870,7 +825,7 @@ namespace Sass {
870
825
  }
871
826
  }
872
827
 
873
- void Inspect::operator()(Parameters_Ptr p)
828
+ void Inspect::operator()(Parameters* p)
874
829
  {
875
830
  append_string("(");
876
831
  if (!p->empty()) {
@@ -883,7 +838,7 @@ namespace Sass {
883
838
  append_string(")");
884
839
  }
885
840
 
886
- void Inspect::operator()(Argument_Ptr a)
841
+ void Inspect::operator()(Argument* a)
887
842
  {
888
843
  if (!a->name().empty()) {
889
844
  append_token(a->name(), a);
@@ -895,7 +850,7 @@ namespace Sass {
895
850
  return;
896
851
  }
897
852
  if (a->value()->concrete_type() == Expression::STRING) {
898
- String_Constant_Ptr s = Cast<String_Constant>(a->value());
853
+ String_Constant* s = Cast<String_Constant>(a->value());
899
854
  if (s) s->perform(this);
900
855
  } else {
901
856
  a->value()->perform(this);
@@ -905,7 +860,7 @@ namespace Sass {
905
860
  }
906
861
  }
907
862
 
908
- void Inspect::operator()(Arguments_Ptr a)
863
+ void Inspect::operator()(Arguments* a)
909
864
  {
910
865
  append_string("(");
911
866
  if (!a->empty()) {
@@ -919,19 +874,17 @@ namespace Sass {
919
874
  append_string(")");
920
875
  }
921
876
 
922
- void Inspect::operator()(Selector_Schema_Ptr s)
877
+ void Inspect::operator()(Selector_Schema* s)
923
878
  {
924
- opt.in_selector = true;
925
879
  s->contents()->perform(this);
926
- opt.in_selector = false;
927
880
  }
928
881
 
929
- void Inspect::operator()(Parent_Selector_Ptr p)
882
+ void Inspect::operator()(Parent_Selector* p)
930
883
  {
931
- if (p->is_real_parent_ref()) append_string("&");
884
+ if (p->real()) append_string("&");
932
885
  }
933
886
 
934
- void Inspect::operator()(Placeholder_Selector_Ptr s)
887
+ void Inspect::operator()(Placeholder_Selector* s)
935
888
  {
936
889
  append_token(s->name(), s);
937
890
  if (s->has_line_break()) append_optional_linefeed();
@@ -939,26 +892,26 @@ namespace Sass {
939
892
 
940
893
  }
941
894
 
942
- void Inspect::operator()(Element_Selector_Ptr s)
895
+ void Inspect::operator()(Type_Selector* s)
943
896
  {
944
897
  append_token(s->ns_name(), s);
945
898
  }
946
899
 
947
- void Inspect::operator()(Class_Selector_Ptr s)
900
+ void Inspect::operator()(Class_Selector* s)
948
901
  {
949
902
  append_token(s->ns_name(), s);
950
903
  if (s->has_line_break()) append_optional_linefeed();
951
904
  if (s->has_line_break()) append_indentation();
952
905
  }
953
906
 
954
- void Inspect::operator()(Id_Selector_Ptr s)
907
+ void Inspect::operator()(Id_Selector* s)
955
908
  {
956
909
  append_token(s->ns_name(), s);
957
910
  if (s->has_line_break()) append_optional_linefeed();
958
911
  if (s->has_line_break()) append_indentation();
959
912
  }
960
913
 
961
- void Inspect::operator()(Attribute_Selector_Ptr s)
914
+ void Inspect::operator()(Attribute_Selector* s)
962
915
  {
963
916
  append_string("[");
964
917
  add_open_mapping(s);
@@ -977,7 +930,7 @@ namespace Sass {
977
930
  append_string("]");
978
931
  }
979
932
 
980
- void Inspect::operator()(Pseudo_Selector_Ptr s)
933
+ void Inspect::operator()(Pseudo_Selector* s)
981
934
  {
982
935
  append_token(s->ns_name(), s);
983
936
  if (s->expression()) {
@@ -987,7 +940,7 @@ namespace Sass {
987
940
  }
988
941
  }
989
942
 
990
- void Inspect::operator()(Wrapped_Selector_Ptr s)
943
+ void Inspect::operator()(Wrapped_Selector* s)
991
944
  {
992
945
  if (s->name() == " ") {
993
946
  append_string("");
@@ -1005,7 +958,7 @@ namespace Sass {
1005
958
  }
1006
959
  }
1007
960
 
1008
- void Inspect::operator()(Compound_Selector_Ptr s)
961
+ void Inspect::operator()(Compound_Selector* s)
1009
962
  {
1010
963
  for (size_t i = 0, L = s->length(); i < L; ++i) {
1011
964
  (*s)[i]->perform(this);
@@ -1017,7 +970,7 @@ namespace Sass {
1017
970
  }
1018
971
  }
1019
972
 
1020
- void Inspect::operator()(Complex_Selector_Ptr c)
973
+ void Inspect::operator()(Complex_Selector* c)
1021
974
  {
1022
975
  Compound_Selector_Obj head = c->head();
1023
976
  Complex_Selector_Obj tail = c->tail();
@@ -1057,7 +1010,7 @@ namespace Sass {
1057
1010
  case Complex_Selector::REFERENCE:
1058
1011
  append_mandatory_space();
1059
1012
  append_string("/");
1060
- c->reference()->perform(this);
1013
+ if (c->reference()) c->reference()->perform(this);
1061
1014
  append_string("/");
1062
1015
  append_mandatory_space();
1063
1016
  break;
@@ -1081,7 +1034,7 @@ namespace Sass {
1081
1034
  }
1082
1035
  }
1083
1036
 
1084
- void Inspect::operator()(Selector_List_Ptr g)
1037
+ void Inspect::operator()(Selector_List* g)
1085
1038
  {
1086
1039
 
1087
1040
  if (g->empty()) {
@@ -1131,8 +1084,4 @@ namespace Sass {
1131
1084
 
1132
1085
  }
1133
1086
 
1134
- void Inspect::fallback_impl(AST_Node_Ptr n)
1135
- {
1136
- }
1137
-
1138
1087
  }