sassc 1.8.1 → 1.8.2

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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -1
  3. data/ext/libsass/Makefile +10 -6
  4. data/ext/libsass/Readme.md +4 -4
  5. data/ext/libsass/appveyor.yml +16 -1
  6. data/ext/libsass/docs/README.md +1 -1
  7. data/ext/libsass/docs/api-context-example.md +1 -1
  8. data/ext/libsass/docs/api-context.md +1 -1
  9. data/ext/libsass/docs/api-doc.md +1 -1
  10. data/ext/libsass/docs/api-function-example.md +12 -3
  11. data/ext/libsass/docs/api-function-internal.md +4 -4
  12. data/ext/libsass/docs/api-function.md +15 -13
  13. data/ext/libsass/docs/api-importer-internal.md +9 -4
  14. data/ext/libsass/docs/api-value.md +1 -1
  15. data/ext/libsass/docs/build-shared-library.md +3 -3
  16. data/ext/libsass/docs/custom-functions-internal.md +1 -1
  17. data/ext/libsass/docs/{plugins.go → plugins.md} +0 -0
  18. data/ext/libsass/script/ci-build-libsass +25 -36
  19. data/ext/libsass/script/ci-install-deps +3 -8
  20. data/ext/libsass/script/ci-report-coverage +17 -13
  21. data/ext/libsass/src/ast.cpp +102 -7
  22. data/ext/libsass/src/ast.hpp +53 -27
  23. data/ext/libsass/src/ast_def_macros.hpp +8 -0
  24. data/ext/libsass/src/ast_fwd_decl.hpp +3 -2
  25. data/ext/libsass/src/backtrace.hpp +1 -1
  26. data/ext/libsass/src/bind.cpp +28 -17
  27. data/ext/libsass/src/bind.hpp +1 -1
  28. data/ext/libsass/src/context.cpp +441 -184
  29. data/ext/libsass/src/context.hpp +79 -82
  30. data/ext/libsass/src/debugger.hpp +3 -1
  31. data/ext/libsass/src/emitter.cpp +18 -17
  32. data/ext/libsass/src/emitter.hpp +5 -2
  33. data/ext/libsass/src/error_handling.cpp +78 -7
  34. data/ext/libsass/src/error_handling.hpp +50 -9
  35. data/ext/libsass/src/eval.cpp +100 -36
  36. data/ext/libsass/src/eval.hpp +5 -5
  37. data/ext/libsass/src/expand.cpp +32 -3
  38. data/ext/libsass/src/extend.cpp +1 -1
  39. data/ext/libsass/src/file.cpp +39 -27
  40. data/ext/libsass/src/file.hpp +67 -13
  41. data/ext/libsass/src/functions.cpp +39 -32
  42. data/ext/libsass/src/inspect.cpp +21 -21
  43. data/ext/libsass/src/json.cpp +1 -1
  44. data/ext/libsass/src/lexer.hpp +33 -4
  45. data/ext/libsass/src/output.cpp +11 -11
  46. data/ext/libsass/src/parser.cpp +28 -130
  47. data/ext/libsass/src/parser.hpp +0 -4
  48. data/ext/libsass/src/prelexer.cpp +8 -5
  49. data/ext/libsass/src/prelexer.hpp +1 -3
  50. data/ext/libsass/src/sass_context.cpp +52 -241
  51. data/ext/libsass/src/sass_context.hpp +156 -0
  52. data/ext/libsass/src/sass_functions.cpp +1 -26
  53. data/ext/libsass/src/sass_functions.hpp +32 -0
  54. data/ext/libsass/src/sass_interface.cpp +14 -48
  55. data/ext/libsass/src/sass_values.cpp +3 -77
  56. data/ext/libsass/src/sass_values.hpp +81 -0
  57. data/ext/libsass/src/source_map.cpp +7 -7
  58. data/ext/libsass/src/source_map.hpp +1 -4
  59. data/ext/libsass/src/to_string.cpp +4 -3
  60. data/ext/libsass/src/to_string.hpp +2 -1
  61. data/ext/libsass/src/util.cpp +34 -16
  62. data/ext/libsass/src/util.hpp +10 -8
  63. data/lib/sassc/version.rb +1 -1
  64. data/lib/tasks/libsass.rb +1 -1
  65. data/test/custom_importer_test.rb +6 -4
  66. data/test/engine_test.rb +5 -3
  67. data/test/functions_test.rb +1 -0
  68. data/test/native_test.rb +1 -1
  69. metadata +6 -4
  70. data/ext/libsass/script/coveralls-debug +0 -32
@@ -1751,7 +1751,7 @@ namespace Sass {
1751
1751
  std::stringstream err;
1752
1752
  std::string cwd(Sass::File::get_cwd());
1753
1753
  ParserState pstate(ext.second->pstate());
1754
- std::string rel_path(Sass::File::resolve_relative_path(pstate.path, cwd, cwd));
1754
+ std::string rel_path(Sass::File::abs2rel(pstate.path, cwd, cwd));
1755
1755
  err << "You may not @extend an outer selector from within @media.\n";
1756
1756
  err << "You may only @extend selectors within the same directive.\n";
1757
1757
  err << "From \"@extend " << ext.second->perform(&to_string) << "\"";
@@ -126,7 +126,7 @@ namespace Sass {
126
126
  else return path.substr(pos+1);
127
127
  }
128
128
 
129
- // do a locigal clean up of the path
129
+ // do a logical clean up of the path
130
130
  // no physical check on the filesystem
131
131
  std::string make_canonical_path (std::string path)
132
132
  {
@@ -192,59 +192,71 @@ namespace Sass {
192
192
  return l + r;
193
193
  }
194
194
 
195
+ std::string path_for_console(const std::string& rel_path, const std::string& abs_path, const std::string& orig_path)
196
+ {
197
+ // magic algorith goes here!!
198
+
199
+ // if the file is outside this directory show the absolute path
200
+ if (rel_path.substr(0, 3) == "../") {
201
+ return orig_path;
202
+ }
203
+ // this seems to work most of the time
204
+ return abs_path == orig_path ? abs_path : rel_path;
205
+ }
206
+
195
207
  // create an absolute path by resolving relative paths with cwd
196
- std::string make_absolute_path(const std::string& path, const std::string& cwd)
208
+ std::string rel2abs(const std::string& path, const std::string& base, const std::string& cwd)
197
209
  {
198
- return make_canonical_path((is_absolute_path(path) ? path : join_paths(cwd, path)));
210
+ return make_canonical_path(join_paths(join_paths(cwd, base), path));
199
211
  }
200
212
 
201
213
  // create a path that is relative to the given base directory
202
214
  // path and base will first be resolved against cwd to make them absolute
203
- std::string resolve_relative_path(const std::string& uri, const std::string& base, const std::string& cwd)
215
+ std::string abs2rel(const std::string& path, const std::string& base, const std::string& cwd)
204
216
  {
205
217
 
206
- std::string absolute_uri = make_absolute_path(uri, cwd);
207
- std::string absolute_base = make_absolute_path(base, cwd);
218
+ std::string abs_path = rel2abs(path, cwd);
219
+ std::string abs_base = rel2abs(base, cwd);
208
220
 
209
221
  size_t proto = 0;
210
222
  // check if we have a protocol
211
- if (uri[proto] && Prelexer::is_alpha(uri[proto])) {
223
+ if (path[proto] && Prelexer::is_alpha(path[proto])) {
212
224
  // skip over all alphanumeric characters
213
- while (uri[proto] && Prelexer::is_alnum(uri[proto++])) {}
225
+ while (path[proto] && Prelexer::is_alnum(path[proto++])) {}
214
226
  // then skip over the mandatory colon
215
- if (proto && uri[proto] == ':') ++ proto;
227
+ if (proto && path[proto] == ':') ++ proto;
216
228
  }
217
229
 
218
230
  // distinguish between windows absolute paths and valid protocols
219
231
  // we assume that protocols must at least have two chars to be valid
220
- if (proto && uri[proto++] == '/' && proto > 3) return uri;
232
+ if (proto && path[proto++] == '/' && proto > 3) return path;
221
233
 
222
234
  #ifdef _WIN32
223
235
  // absolute link must have a drive letter, and we know that we
224
236
  // can only create relative links if both are on the same drive
225
- if (absolute_base[0] != absolute_uri[0]) return absolute_uri;
237
+ if (abs_base[0] != abs_path[0]) return abs_path;
226
238
  #endif
227
239
 
228
240
  std::string stripped_uri = "";
229
241
  std::string stripped_base = "";
230
242
 
231
243
  size_t index = 0;
232
- size_t minSize = std::min(absolute_uri.size(), absolute_base.size());
244
+ size_t minSize = std::min(abs_path.size(), abs_base.size());
233
245
  for (size_t i = 0; i < minSize; ++i) {
234
246
  #ifdef FS_CASE_SENSITIVE
235
- if (absolute_uri[i] != absolute_base[i]) break;
247
+ if (abs_path[i] != abs_base[i]) break;
236
248
  #else
237
249
  // compare the charactes in a case insensitive manner
238
250
  // windows fs is only case insensitive in ascii ranges
239
- if (tolower(absolute_uri[i]) != tolower(absolute_base[i])) break;
251
+ if (tolower(abs_path[i]) != tolower(abs_base[i])) break;
240
252
  #endif
241
- if (absolute_uri[i] == '/') index = i + 1;
253
+ if (abs_path[i] == '/') index = i + 1;
242
254
  }
243
- for (size_t i = index; i < absolute_uri.size(); ++i) {
244
- stripped_uri += absolute_uri[i];
255
+ for (size_t i = index; i < abs_path.size(); ++i) {
256
+ stripped_uri += abs_path[i];
245
257
  }
246
- for (size_t i = index; i < absolute_base.size(); ++i) {
247
- stripped_base += absolute_base[i];
258
+ for (size_t i = index; i < abs_base.size(); ++i) {
259
+ stripped_base += abs_base[i];
248
260
  }
249
261
 
250
262
  size_t left = 0;
@@ -278,7 +290,7 @@ namespace Sass {
278
290
  // (2) underscore + given
279
291
  // (3) underscore + given + extension
280
292
  // (4) given + extension
281
- std::vector<Sass_Queued> resolve_file(const std::string& root, const std::string& file)
293
+ std::vector<Include> resolve_includes(const std::string& root, const std::string& file)
282
294
  {
283
295
  std::string filename = join_paths(root, file);
284
296
  // supported extensions
@@ -288,29 +300,29 @@ namespace Sass {
288
300
  // split the filename
289
301
  std::string base(dir_name(file));
290
302
  std::string name(base_name(file));
291
- std::vector<Sass_Queued> resolved;
303
+ std::vector<Include> includes;
292
304
  // create full path (maybe relative)
293
305
  std::string rel_path(join_paths(base, name));
294
306
  std::string abs_path(join_paths(root, rel_path));
295
- if (file_exists(abs_path)) resolved.push_back(Sass_Queued(rel_path, abs_path, 0));
307
+ if (file_exists(abs_path)) includes.push_back({{ rel_path, root }, abs_path });
296
308
  // next test variation with underscore
297
309
  rel_path = join_paths(base, "_" + name);
298
310
  abs_path = join_paths(root, rel_path);
299
- if (file_exists(abs_path)) resolved.push_back(Sass_Queued(rel_path, abs_path, 0));
311
+ if (file_exists(abs_path)) includes.push_back({{ rel_path, root }, abs_path });
300
312
  // next test exts plus underscore
301
313
  for(auto ext : exts) {
302
314
  rel_path = join_paths(base, "_" + name + ext);
303
315
  abs_path = join_paths(root, rel_path);
304
- if (file_exists(abs_path)) resolved.push_back(Sass_Queued(rel_path, abs_path, 0));
316
+ if (file_exists(abs_path)) includes.push_back({{ rel_path, root }, abs_path });
305
317
  }
306
318
  // next test plain name with exts
307
319
  for(auto ext : exts) {
308
320
  rel_path = join_paths(base, name + ext);
309
321
  abs_path = join_paths(root, rel_path);
310
- if (file_exists(abs_path)) resolved.push_back(Sass_Queued(rel_path, abs_path, 0));
322
+ if (file_exists(abs_path)) includes.push_back({{ rel_path, root }, abs_path });
311
323
  }
312
324
  // nothing found
313
- return resolved;
325
+ return includes;
314
326
  }
315
327
 
316
328
  // helper function to resolve a filename
@@ -319,7 +331,7 @@ namespace Sass {
319
331
  // search in every include path for a match
320
332
  for (size_t i = 0, S = paths.size(); i < S; ++i)
321
333
  {
322
- std::vector<Sass_Queued> resolved(resolve_file(paths[i], file));
334
+ std::vector<Include> resolved(resolve_includes(paths[i], file));
323
335
  if (resolved.size()) return resolved[0].abs_path;
324
336
  }
325
337
  // nothing found
@@ -6,16 +6,9 @@
6
6
 
7
7
  namespace Sass {
8
8
 
9
+ class Block;
9
10
  class Context;
10
11
 
11
- struct Sass_Queued {
12
- std::string abs_path;
13
- std::string load_path;
14
- const char* source;
15
- public:
16
- Sass_Queued(const std::string& load_path, const std::string& abs_path, const char* source);
17
- };
18
-
19
12
  namespace File {
20
13
 
21
14
  // return the current directory
@@ -43,15 +36,16 @@ namespace Sass {
43
36
  // but only if right side is not absolute yet
44
37
  std::string join_paths(std::string root, std::string name);
45
38
 
39
+ // if the relative path is outside of the cwd we want want to
40
+ // show the absolute path in console messages
41
+ std::string path_for_console(const std::string& rel_path, const std::string& abs_path, const std::string& orig_path);
42
+
46
43
  // create an absolute path by resolving relative paths with cwd
47
- std::string make_absolute_path(const std::string& path, const std::string& cwd = ".");
44
+ std::string rel2abs(const std::string& path, const std::string& base = ".", const std::string& cwd = get_cwd());
48
45
 
49
46
  // create a path that is relative to the given base directory
50
47
  // path and base will first be resolved against cwd to make them absolute
51
- std::string resolve_relative_path(const std::string& path, const std::string& base, const std::string& cwd = ".");
52
-
53
- // try to find/resolve the filename
54
- std::vector<Sass_Queued> resolve_file(const std::string& root, const std::string& file);
48
+ std::string abs2rel(const std::string& path, const std::string& base = ".", const std::string& cwd = get_cwd());
55
49
 
56
50
  // helper function to resolve a filename
57
51
  std::string find_file(const std::string& file, const std::vector<std::string> paths);
@@ -64,6 +58,66 @@ namespace Sass {
64
58
  char* read_file(const std::string& file);
65
59
 
66
60
  }
61
+
62
+ // requested import
63
+ class Importer {
64
+ public:
65
+ // requested import path
66
+ std::string imp_path;
67
+ // parent context path
68
+ std::string ctx_path;
69
+ // base derived from context path
70
+ // this really just acts as a cache
71
+ std::string base_path;
72
+ public:
73
+ Importer(std::string imp_path, std::string ctx_path)
74
+ : imp_path(File::make_canonical_path(imp_path)),
75
+ ctx_path(File::make_canonical_path(ctx_path)),
76
+ base_path(File::dir_name(ctx_path))
77
+ { }
78
+ };
79
+
80
+ // a resolved include (final import)
81
+ class Include : public Importer {
82
+ public:
83
+ // resolved absolute path
84
+ std::string abs_path;
85
+ public:
86
+ Include(const Importer& imp, std::string abs_path)
87
+ : Importer(imp), abs_path(abs_path)
88
+ { }
89
+ };
90
+
91
+ // a loaded resource
92
+ class Resource {
93
+ public:
94
+ // the file contents
95
+ char* contents;
96
+ // conected sourcemap
97
+ char* srcmap;
98
+ public:
99
+ Resource(char* contents, char* srcmap)
100
+ : contents(contents), srcmap(srcmap)
101
+ { }
102
+ };
103
+
104
+ // parsed stylesheet from loaded resource
105
+ class StyleSheet : public Resource {
106
+ public:
107
+ // parsed root block
108
+ Block* root;
109
+ public:
110
+ StyleSheet(const Resource& res, Block* root)
111
+ : Resource(res), root(root)
112
+ { }
113
+ };
114
+
115
+ namespace File {
116
+
117
+ std::vector<Include> resolve_includes(const std::string& root, const std::string& file);
118
+
119
+ }
120
+
67
121
  }
68
122
 
69
123
  #endif
@@ -11,9 +11,9 @@
11
11
  #include "util.hpp"
12
12
  #include "expand.hpp"
13
13
  #include "utf8_string.hpp"
14
+ #include "sass/base.h"
14
15
  #include "utf8.h"
15
16
 
16
- #include <atomic>
17
17
  #include <cstdlib>
18
18
  #include <cmath>
19
19
  #include <cctype>
@@ -311,9 +311,9 @@ namespace Sass {
311
311
 
312
312
  return SASS_MEMORY_NEW(ctx.mem, Color,
313
313
  pstate,
314
- std::round(w1*color1->r() + w2*color2->r()),
315
- std::round(w1*color1->g() + w2*color2->g()),
316
- std::round(w1*color1->b() + w2*color2->b()),
314
+ Sass::round(w1*color1->r() + w2*color2->r()),
315
+ Sass::round(w1*color1->g() + w2*color2->g()),
316
+ Sass::round(w1*color1->b() + w2*color2->b()),
317
317
  color1->a()*p + color2->a()*(1-p));
318
318
  }
319
319
 
@@ -331,7 +331,7 @@ namespace Sass {
331
331
 
332
332
  double max = std::max(r, std::max(g, b));
333
333
  double min = std::min(r, std::min(g, b));
334
- double del = max - min;
334
+ double delta = max - min;
335
335
 
336
336
  double h = 0, s = 0, l = (max + min) / 2.0;
337
337
 
@@ -339,12 +339,12 @@ namespace Sass {
339
339
  h = s = 0; // achromatic
340
340
  }
341
341
  else {
342
- if (l < 0.5) s = del / (max + min);
343
- else s = del / (2.0 - max - min);
342
+ if (l < 0.5) s = delta / (max + min);
343
+ else s = delta / (2.0 - max - min);
344
344
 
345
- if (r == max) h = (g - b) / del + (g < b ? 6 : 0);
346
- else if (g == max) h = (b - r) / del + 2;
347
- else if (b == max) h = (r - g) / del + 4;
345
+ if (r == max) h = (g - b) / delta + (g < b ? 6 : 0);
346
+ else if (g == max) h = (b - r) / delta + 2;
347
+ else if (b == max) h = (r - g) / delta + 4;
348
348
  }
349
349
 
350
350
  HSL hsl_struct;
@@ -357,8 +357,8 @@ namespace Sass {
357
357
 
358
358
  // hue to RGB helper function
359
359
  double h_to_rgb(double m1, double m2, double h) {
360
- if (h < 0) h += 1;
361
- if (h > 1) h -= 1;
360
+ while (h < 0) h += 1;
361
+ while (h > 1) h -= 1;
362
362
  if (h*6.0 < 1) return m1 + (m2 - m1)*h*6;
363
363
  if (h*2.0 < 1) return m2;
364
364
  if (h*3.0 < 2) return m1 + (m2 - m1) * (2.0/3.0 - h)*6;
@@ -384,9 +384,9 @@ namespace Sass {
384
384
  else m2 = (l+s)-(l*s);
385
385
  double m1 = (l*2.0)-m2;
386
386
  // round the results -- consider moving this into the Color constructor
387
- double r = (h_to_rgb(m1, m2, h+1.0/3.0) * 255.0);
387
+ double r = (h_to_rgb(m1, m2, h + 1.0/3.0) * 255.0);
388
388
  double g = (h_to_rgb(m1, m2, h) * 255.0);
389
- double b = (h_to_rgb(m1, m2, h-1.0/3.0) * 255.0);
389
+ double b = (h_to_rgb(m1, m2, h - 1.0/3.0) * 255.0);
390
390
 
391
391
  return SASS_MEMORY_NEW(ctx.mem, Color, pstate, r, g, b, a);
392
392
  }
@@ -854,10 +854,10 @@ namespace Sass {
854
854
 
855
855
  std::stringstream ss;
856
856
  ss << '#' << std::setw(2) << std::setfill('0');
857
- ss << std::hex << std::setw(2) << static_cast<unsigned long>(std::floor(a+0.5));
858
- ss << std::hex << std::setw(2) << static_cast<unsigned long>(std::floor(r+0.5));
859
- ss << std::hex << std::setw(2) << static_cast<unsigned long>(std::floor(g+0.5));
860
- ss << std::hex << std::setw(2) << static_cast<unsigned long>(std::floor(b+0.5));
857
+ ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(a));
858
+ ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(r));
859
+ ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(g));
860
+ ss << std::hex << std::setw(2) << static_cast<unsigned long>(Sass::round(b));
861
861
 
862
862
  std::string result(ss.str());
863
863
  for (size_t i = 0, L = result.length(); i < L; ++i) {
@@ -874,10 +874,7 @@ namespace Sass {
874
874
  BUILT_IN(sass_unquote)
875
875
  {
876
876
  AST_Node* arg = env["$string"];
877
- if (dynamic_cast<Null*>(arg)) {
878
- return SASS_MEMORY_NEW(ctx.mem, Null, pstate);
879
- }
880
- else if (String_Quoted* string_quoted = dynamic_cast<String_Quoted*>(arg)) {
877
+ if (String_Quoted* string_quoted = dynamic_cast<String_Quoted*>(arg)) {
881
878
  String_Constant* result = SASS_MEMORY_NEW(ctx.mem, String_Constant, pstate, string_quoted->value());
882
879
  // remember if the string was quoted (color tokens)
883
880
  result->sass_fix_1291(string_quoted->quote_mark() != 0);
@@ -887,9 +884,11 @@ namespace Sass {
887
884
  return (Expression*) arg;
888
885
  }
889
886
  else {
890
- To_String to_string(&ctx);
887
+ To_String to_string(&ctx, false, true);
891
888
  std::string val(arg->perform(&to_string));
892
- deprecated("Passing " + val + ", a non-string value, to unquote()", pstate);
889
+ val = dynamic_cast<Null*>(arg) ? "null" : val;
890
+
891
+ deprecated_function("Passing " + val + ", a non-string value, to unquote()", pstate);
893
892
  return (Expression*) arg;
894
893
  }
895
894
  }
@@ -1089,7 +1088,7 @@ namespace Sass {
1089
1088
  Number* n = ARG("$number", Number);
1090
1089
  Number* r = SASS_MEMORY_NEW(ctx.mem, Number, *n);
1091
1090
  r->pstate(pstate);
1092
- r->value(std::floor(r->value() + 0.5));
1091
+ r->value(Sass::round(r->value()));
1093
1092
  return r;
1094
1093
  }
1095
1094
 
@@ -1156,7 +1155,10 @@ namespace Sass {
1156
1155
  Signature random_sig = "random($limit:false)";
1157
1156
  BUILT_IN(random)
1158
1157
  {
1159
- Number* l = dynamic_cast<Number*>(env["$limit"]);
1158
+ AST_Node* arg = env["$limit"];
1159
+ Value* v = dynamic_cast<Value*>(arg);
1160
+ Number* l = dynamic_cast<Number*>(arg);
1161
+ Boolean* b = dynamic_cast<Boolean*>(arg);
1160
1162
  if (l) {
1161
1163
  double v = l->value();
1162
1164
  if (v < 1) {
@@ -1174,11 +1176,16 @@ namespace Sass {
1174
1176
  uint_fast32_t distributed = static_cast<uint_fast32_t>(distributor(rand));
1175
1177
  return SASS_MEMORY_NEW(ctx.mem, Number, pstate, (double)distributed);
1176
1178
  }
1177
- else {
1179
+ else if (b) {
1178
1180
  std::uniform_real_distribution<> distributor(0, 1);
1179
1181
  double distributed = static_cast<double>(distributor(rand));
1180
1182
  return SASS_MEMORY_NEW(ctx.mem, Number, pstate, distributed);
1181
- }
1183
+ } else if (v) {
1184
+ throw Exception::InvalidArgumentType(pstate, "random", "$limit", "number", v);
1185
+ } else {
1186
+ throw Exception::InvalidArgumentType(pstate, "random", "$limit", "number");
1187
+ }
1188
+ return 0;
1182
1189
  }
1183
1190
 
1184
1191
  /////////////////
@@ -1668,13 +1675,13 @@ namespace Sass {
1668
1675
  } else {
1669
1676
  bool parentheses = v->concrete_type() == Expression::MAP ||
1670
1677
  v->concrete_type() == Expression::LIST;
1671
- Output_Style old_style;
1672
- old_style = ctx.output_style;
1673
- ctx.output_style = NESTED;
1678
+ Sass_Output_Style old_style;
1679
+ old_style = ctx.c_options->output_style;
1680
+ ctx.c_options->output_style = SASS_STYLE_NESTED;
1674
1681
  To_String to_string(&ctx, false);
1675
1682
  std::string inspect = v->perform(&to_string);
1676
1683
  if (inspect.empty() && parentheses) inspect = "()";
1677
- ctx.output_style = old_style;
1684
+ ctx.c_options->output_style = old_style;
1678
1685
  return SASS_MEMORY_NEW(ctx.mem, String_Quoted, pstate, inspect);
1679
1686
  }
1680
1687
  // return v;
@@ -26,11 +26,11 @@ namespace Sass {
26
26
  add_open_mapping(block);
27
27
  append_scope_opener();
28
28
  }
29
- if (output_style() == NESTED) indentation += block->tabs();
29
+ if (output_style() == SASS_STYLE_NESTED) indentation += block->tabs();
30
30
  for (size_t i = 0, L = block->length(); i < L; ++i) {
31
31
  (*block)[i]->perform(this);
32
32
  }
33
- if (output_style() == NESTED) indentation -= block->tabs();
33
+ if (output_style() == SASS_STYLE_NESTED) indentation -= block->tabs();
34
34
  if (!block->is_root()) {
35
35
  append_scope_closer();
36
36
  add_close_mapping(block);
@@ -123,7 +123,7 @@ namespace Sass {
123
123
  if (dec->value()->concrete_type() == Expression::NULL_VAL) return;
124
124
  bool was_decl = in_declaration;
125
125
  in_declaration = true;
126
- if (output_style() == NESTED)
126
+ if (output_style() == SASS_STYLE_NESTED)
127
127
  indentation += dec->tabs();
128
128
  append_indentation();
129
129
  dec->property()->perform(this);
@@ -141,7 +141,7 @@ namespace Sass {
141
141
  append_string("!important");
142
142
  }
143
143
  append_delimiter();
144
- if (output_style() == NESTED)
144
+ if (output_style() == SASS_STYLE_NESTED)
145
145
  indentation -= dec->tabs();
146
146
  in_declaration = was_decl;
147
147
  }
@@ -198,7 +198,7 @@ namespace Sass {
198
198
  append_indentation();
199
199
  append_token("@import", import);
200
200
  append_mandatory_space();
201
- append_string(import->file_name());
201
+ append_string(import->imp_path());
202
202
  append_delimiter();
203
203
  }
204
204
 
@@ -363,7 +363,7 @@ namespace Sass {
363
363
  void Inspect::operator()(List* list)
364
364
  {
365
365
  std::string sep(list->separator() == SASS_SPACE ? " " : ",");
366
- if (output_style() != COMPRESSED && sep == ",") sep += " ";
366
+ if ((output_style() != SASS_STYLE_COMPRESSED || in_debug) && sep == ",") sep += " ";
367
367
  else if (in_media_block && sep != " ") sep += " "; // verified
368
368
  if (list->empty()) return;
369
369
  bool items_output = false;
@@ -459,8 +459,8 @@ namespace Sass {
459
459
  void Inspect::operator()(Number* n)
460
460
  {
461
461
  // use values to_string facility
462
- bool compressed = ctx->output_style == COMPRESSED;
463
- std::string res = n->to_string(compressed, (int)ctx->precision);
462
+ bool compressed = ctx->output_style() == SASS_STYLE_COMPRESSED;
463
+ std::string res(n->to_string(compressed, (int)ctx->c_options->precision));
464
464
  // output the final token
465
465
  append_token(res, n);
466
466
  }
@@ -468,8 +468,8 @@ namespace Sass {
468
468
  void Inspect::operator()(Color* c)
469
469
  {
470
470
  // use values to_string facility
471
- bool compressed = ctx->output_style == COMPRESSED;
472
- std::string res = c->to_string(compressed, (int)ctx->precision);
471
+ bool compressed = ctx->output_style() == SASS_STYLE_COMPRESSED;
472
+ std::string res(c->to_string(compressed, (int)ctx->c_options->precision));
473
473
  // output the final token
474
474
  append_token(res, c);
475
475
  }
@@ -477,8 +477,8 @@ namespace Sass {
477
477
  void Inspect::operator()(Boolean* b)
478
478
  {
479
479
  // use values to_string facility
480
- bool compressed = ctx->output_style == COMPRESSED;
481
- std::string res = b->to_string(compressed, (int)ctx->precision);
480
+ bool compressed = ctx->output_style() == SASS_STYLE_COMPRESSED;
481
+ std::string res(b->to_string(compressed, (int)ctx->c_options->precision));
482
482
  // output the final token
483
483
  append_token(res, b);
484
484
  }
@@ -497,8 +497,8 @@ namespace Sass {
497
497
  void Inspect::operator()(String_Constant* s)
498
498
  {
499
499
  // get options from optional? context
500
- int precision = ctx ? (int)ctx->precision : 5;
501
- bool compressed = ctx ? ctx->output_style == COMPRESSED : false;
500
+ int precision = ctx ? (int)ctx->c_options->precision : 5;
501
+ bool compressed = ctx ? ctx->output_style() == SASS_STYLE_COMPRESSED : false;
502
502
  // use values to_string facility
503
503
  std::string res(s->to_string(compressed, precision));
504
504
  // output the final token
@@ -508,8 +508,8 @@ namespace Sass {
508
508
  void Inspect::operator()(String_Quoted* s)
509
509
  {
510
510
  // get options from optional? context
511
- int precision = ctx ? (int)ctx->precision : 5;
512
- bool compressed = ctx ? ctx->output_style == COMPRESSED : false;
511
+ int precision = ctx ? (int)ctx->c_options->precision : 5;
512
+ bool compressed = ctx ? ctx->output_style() == SASS_STYLE_COMPRESSED : false;
513
513
  // use values to_string facility
514
514
  std::string res(s->to_string(compressed, precision));
515
515
  // output the final token
@@ -612,8 +612,8 @@ namespace Sass {
612
612
  void Inspect::operator()(Null* n)
613
613
  {
614
614
  // use values to_string facility
615
- bool compressed = ctx->output_style == COMPRESSED;
616
- std::string res = n->to_string(compressed, (int)ctx->precision);
615
+ bool compressed = output_style() == SASS_STYLE_COMPRESSED;
616
+ std::string res(n->to_string(compressed, (int)ctx->c_options->precision));
617
617
  // output the final token
618
618
  append_token(res, n);
619
619
  }
@@ -752,7 +752,7 @@ namespace Sass {
752
752
  (*s)[i]->perform(this);
753
753
  }
754
754
  if (s->has_line_break()) {
755
- if (output_style() != COMPACT) {
755
+ if (output_style() != SASS_STYLE_COMPACT) {
756
756
  append_optional_linefeed();
757
757
  }
758
758
  }
@@ -774,7 +774,7 @@ namespace Sass {
774
774
  if (head && head->length() != 0) head->perform(this);
775
775
  bool is_empty = !head || head->length() == 0 || head->is_empty_reference();
776
776
  bool is_tail = head && !head->is_empty_reference() && tail;
777
- if (output_style() == COMPRESSED && comb != Complex_Selector::ANCESTOR_OF) scheduled_space = 0;
777
+ if (output_style() == SASS_STYLE_COMPRESSED && comb != Complex_Selector::ANCESTOR_OF) scheduled_space = 0;
778
778
 
779
779
  switch (comb) {
780
780
  case Complex_Selector::ANCESTOR_OF:
@@ -810,7 +810,7 @@ namespace Sass {
810
810
  }
811
811
  if (tail) tail->perform(this);
812
812
  if (!tail && c->has_line_break()) {
813
- if (output_style() == COMPACT) {
813
+ if (output_style() == SASS_STYLE_COMPACT) {
814
814
  append_mandatory_space();
815
815
  }
816
816
  }