sassc 2.2.1 → 2.3.0

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 (113) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +13 -0
  4. data/Rakefile +1 -3
  5. data/ext/extconf.rb +13 -5
  6. data/ext/libsass/VERSION +1 -1
  7. data/ext/libsass/include/sass/base.h +2 -1
  8. data/ext/libsass/include/sass/context.h +1 -0
  9. data/ext/libsass/src/ast.cpp +49 -59
  10. data/ext/libsass/src/ast.hpp +263 -102
  11. data/ext/libsass/src/ast_def_macros.hpp +8 -0
  12. data/ext/libsass/src/ast_fwd_decl.cpp +2 -1
  13. data/ext/libsass/src/ast_fwd_decl.hpp +40 -116
  14. data/ext/libsass/src/ast_helpers.hpp +292 -0
  15. data/ext/libsass/src/ast_sel_cmp.cpp +209 -722
  16. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  17. data/ext/libsass/src/ast_sel_unify.cpp +207 -212
  18. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  19. data/ext/libsass/src/ast_selectors.cpp +559 -1001
  20. data/ext/libsass/src/ast_selectors.hpp +311 -367
  21. data/ext/libsass/src/ast_supports.cpp +1 -17
  22. data/ext/libsass/src/ast_values.cpp +216 -29
  23. data/ext/libsass/src/ast_values.hpp +42 -33
  24. data/ext/libsass/src/bind.cpp +1 -1
  25. data/ext/libsass/src/cencode.c +4 -6
  26. data/ext/libsass/src/check_nesting.cpp +5 -6
  27. data/ext/libsass/src/check_nesting.hpp +4 -0
  28. data/ext/libsass/src/color_maps.cpp +11 -10
  29. data/ext/libsass/src/color_maps.hpp +0 -8
  30. data/ext/libsass/src/constants.cpp +5 -0
  31. data/ext/libsass/src/constants.hpp +6 -0
  32. data/ext/libsass/src/context.cpp +30 -60
  33. data/ext/libsass/src/context.hpp +8 -20
  34. data/ext/libsass/src/cssize.cpp +36 -120
  35. data/ext/libsass/src/cssize.hpp +4 -10
  36. data/ext/libsass/src/dart_helpers.hpp +199 -0
  37. data/ext/libsass/src/debugger.hpp +364 -207
  38. data/ext/libsass/src/emitter.cpp +3 -4
  39. data/ext/libsass/src/emitter.hpp +0 -2
  40. data/ext/libsass/src/environment.hpp +5 -0
  41. data/ext/libsass/src/error_handling.cpp +21 -0
  42. data/ext/libsass/src/error_handling.hpp +25 -3
  43. data/ext/libsass/src/eval.cpp +33 -153
  44. data/ext/libsass/src/eval.hpp +11 -13
  45. data/ext/libsass/src/eval_selectors.cpp +75 -0
  46. data/ext/libsass/src/expand.cpp +214 -167
  47. data/ext/libsass/src/expand.hpp +26 -6
  48. data/ext/libsass/src/extender.cpp +1186 -0
  49. data/ext/libsass/src/extender.hpp +399 -0
  50. data/ext/libsass/src/extension.cpp +43 -0
  51. data/ext/libsass/src/extension.hpp +89 -0
  52. data/ext/libsass/src/file.cpp +15 -14
  53. data/ext/libsass/src/file.hpp +5 -12
  54. data/ext/libsass/src/fn_colors.cpp +12 -10
  55. data/ext/libsass/src/fn_lists.cpp +12 -11
  56. data/ext/libsass/src/fn_miscs.cpp +22 -34
  57. data/ext/libsass/src/fn_numbers.cpp +13 -6
  58. data/ext/libsass/src/fn_selectors.cpp +94 -124
  59. data/ext/libsass/src/fn_strings.cpp +16 -14
  60. data/ext/libsass/src/fn_utils.cpp +5 -6
  61. data/ext/libsass/src/fn_utils.hpp +9 -3
  62. data/ext/libsass/src/inspect.cpp +154 -117
  63. data/ext/libsass/src/inspect.hpp +10 -8
  64. data/ext/libsass/src/lexer.cpp +17 -81
  65. data/ext/libsass/src/lexer.hpp +5 -16
  66. data/ext/libsass/src/listize.cpp +22 -36
  67. data/ext/libsass/src/listize.hpp +8 -9
  68. data/ext/libsass/src/memory/SharedPtr.hpp +39 -5
  69. data/ext/libsass/src/operation.hpp +27 -17
  70. data/ext/libsass/src/operators.cpp +1 -0
  71. data/ext/libsass/src/ordered_map.hpp +112 -0
  72. data/ext/libsass/src/output.cpp +30 -49
  73. data/ext/libsass/src/output.hpp +1 -1
  74. data/ext/libsass/src/parser.cpp +211 -381
  75. data/ext/libsass/src/parser.hpp +17 -15
  76. data/ext/libsass/src/parser_selectors.cpp +189 -0
  77. data/ext/libsass/src/permutate.hpp +140 -0
  78. data/ext/libsass/src/position.hpp +1 -1
  79. data/ext/libsass/src/prelexer.cpp +6 -6
  80. data/ext/libsass/src/remove_placeholders.cpp +55 -56
  81. data/ext/libsass/src/remove_placeholders.hpp +21 -18
  82. data/ext/libsass/src/sass.hpp +1 -0
  83. data/ext/libsass/src/sass2scss.cpp +4 -4
  84. data/ext/libsass/src/sass_context.cpp +42 -91
  85. data/ext/libsass/src/sass_context.hpp +2 -2
  86. data/ext/libsass/src/sass_functions.cpp +1 -1
  87. data/ext/libsass/src/sass_values.cpp +0 -1
  88. data/ext/libsass/src/stylesheet.cpp +22 -0
  89. data/ext/libsass/src/stylesheet.hpp +57 -0
  90. data/ext/libsass/src/to_value.cpp +2 -2
  91. data/ext/libsass/src/to_value.hpp +1 -1
  92. data/ext/libsass/src/units.cpp +5 -3
  93. data/ext/libsass/src/util.cpp +10 -12
  94. data/ext/libsass/src/util.hpp +2 -3
  95. data/ext/libsass/src/util_string.cpp +111 -61
  96. data/ext/libsass/src/util_string.hpp +61 -8
  97. data/lib/sassc/engine.rb +5 -3
  98. data/lib/sassc/functions_handler.rb +8 -8
  99. data/lib/sassc/native.rb +1 -1
  100. data/lib/sassc/script.rb +4 -4
  101. data/lib/sassc/version.rb +1 -1
  102. data/test/functions_test.rb +18 -1
  103. data/test/native_test.rb +1 -1
  104. metadata +17 -12
  105. data/ext/libsass/src/extend.cpp +0 -2132
  106. data/ext/libsass/src/extend.hpp +0 -86
  107. data/ext/libsass/src/node.cpp +0 -322
  108. data/ext/libsass/src/node.hpp +0 -118
  109. data/ext/libsass/src/paths.hpp +0 -71
  110. data/ext/libsass/src/sass_util.cpp +0 -152
  111. data/ext/libsass/src/sass_util.hpp +0 -256
  112. data/ext/libsass/src/subset_map.cpp +0 -58
  113. data/ext/libsass/src/subset_map.hpp +0 -76
@@ -90,7 +90,7 @@ struct Sass_Context : Sass_Options
90
90
  char* error_file;
91
91
  size_t error_line;
92
92
  size_t error_column;
93
- const char* error_src;
93
+ char* error_src;
94
94
 
95
95
  // report imported files
96
96
  char** included_files;
@@ -126,4 +126,4 @@ struct Sass_Compiler {
126
126
  Sass::Block_Obj root;
127
127
  };
128
128
 
129
- #endif
129
+ #endif
@@ -101,7 +101,7 @@ extern "C" {
101
101
  }
102
102
 
103
103
  // Creator for a single import entry returned by the custom importer inside the list
104
- // We take ownership of the memory for source and srcmap (freed when context is destroyd)
104
+ // We take ownership of the memory for source and srcmap (freed when context is destroyed)
105
105
  Sass_Import_Entry ADDCALL sass_make_import(const char* imp_path, const char* abs_path, char* source, char* srcmap)
106
106
  {
107
107
  Sass_Import* v = (Sass_Import*) calloc(1, sizeof(Sass_Import));
@@ -6,7 +6,6 @@
6
6
  #include <cstring>
7
7
  #include "util.hpp"
8
8
  #include "eval.hpp"
9
- #include "values.hpp"
10
9
  #include "operators.hpp"
11
10
  #include "sass/values.h"
12
11
  #include "sass_values.hpp"
@@ -0,0 +1,22 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
3
+ #include "sass.hpp"
4
+
5
+ #include "stylesheet.hpp"
6
+
7
+ namespace Sass {
8
+
9
+ // Constructor
10
+ Sass::StyleSheet::StyleSheet(const Resource& res, Block_Obj root) :
11
+ Resource(res),
12
+ root(root)
13
+ {
14
+ }
15
+
16
+ StyleSheet::StyleSheet(const StyleSheet& sheet) :
17
+ Resource(sheet),
18
+ root(sheet.root)
19
+ {
20
+ }
21
+
22
+ }
@@ -0,0 +1,57 @@
1
+ #ifndef SASS_STYLESHEET_H
2
+ #define SASS_STYLESHEET_H
3
+
4
+ // sass.hpp must go before all system headers to get the
5
+ // __EXTENSIONS__ fix on Solaris.
6
+ #include "sass.hpp"
7
+
8
+ #include "ast_fwd_decl.hpp"
9
+ #include "extender.hpp"
10
+ #include "file.hpp"
11
+
12
+ namespace Sass {
13
+
14
+ // parsed stylesheet from loaded resource
15
+ // this should be a `Module` for sass 4.0
16
+ class StyleSheet : public Resource {
17
+ public:
18
+
19
+ // The canonical URL for this module's source file. This may be `null`
20
+ // if the module was loaded from a string without a URL provided.
21
+ // Uri get url;
22
+
23
+ // Modules that this module uses.
24
+ // List<Module> get upstream;
25
+
26
+ // The module's variables.
27
+ // Map<String, Value> get variables;
28
+
29
+ // The module's functions. Implementations must ensure
30
+ // that each [Callable] is stored under its own name.
31
+ // Map<String, Callable> get functions;
32
+
33
+ // The module's mixins. Implementations must ensure that
34
+ // each [Callable] is stored under its own name.
35
+ // Map<String, Callable> get mixins;
36
+
37
+ // The extensions defined in this module, which is also able to update
38
+ // [css]'s style rules in-place based on downstream extensions.
39
+ // Extender extender;
40
+
41
+ // The module's CSS tree.
42
+ Block_Obj root;
43
+
44
+ public:
45
+
46
+ // default argument constructor
47
+ StyleSheet(const Resource& res, Block_Obj root);
48
+
49
+ // Copy constructor
50
+ StyleSheet(const StyleSheet& res);
51
+
52
+ };
53
+
54
+
55
+ }
56
+
57
+ #endif
@@ -95,8 +95,8 @@ namespace Sass {
95
95
  return arg->value()->perform(this);
96
96
  }
97
97
 
98
- // Selector_List is converted to a string
99
- Value* To_Value::operator()(Selector_List* s)
98
+ // SelectorList is converted to a string
99
+ Value* To_Value::operator()(SelectorList* s)
100
100
  {
101
101
  return SASS_MEMORY_NEW(String_Quoted,
102
102
  s->pstate(),
@@ -36,7 +36,7 @@ namespace Sass {
36
36
  Value* operator()(Function*);
37
37
 
38
38
  // convert to string via `To_String`
39
- Value* operator()(Selector_List*);
39
+ Value* operator()(SelectorList*);
40
40
  Value* operator()(Binary_Expression*);
41
41
 
42
42
  };
@@ -1,5 +1,7 @@
1
1
  #include "sass.hpp"
2
+ #include <map>
2
3
  #include <stdexcept>
4
+ #include <algorithm>
3
5
  #include "units.hpp"
4
6
  #include "error_handling.hpp"
5
7
 
@@ -328,7 +330,7 @@ namespace Sass {
328
330
  // has the advantage that they will be pre-sorted
329
331
  std::map<std::string, int> exponents;
330
332
 
331
- // initialize by summing up occurences in unit vectors
333
+ // initialize by summing up occurrences in unit vectors
332
334
  // this will already cancel out equivalent units (e.q. px/px)
333
335
  for (size_t i = 0; i < iL; i ++) exponents[numerators[i]] += 1;
334
336
  for (size_t n = 0; n < nL; n ++) exponents[denominators[n]] -= 1;
@@ -394,7 +396,7 @@ namespace Sass {
394
396
  denominators.size() == 0;
395
397
  }
396
398
 
397
- // this does not cover all cases (multiple prefered units)
399
+ // this does not cover all cases (multiple preferred units)
398
400
  double Units::convert_factor(const Units& r) const
399
401
  {
400
402
 
@@ -465,7 +467,7 @@ namespace Sass {
465
467
  {
466
468
  // get and increment afterwards
467
469
  const std::string r_den = *(r_den_it);
468
- // get possible converstion factor for units
470
+ // get possible conversion factor for units
469
471
  double conversion = conversion_factor(l_den, r_den);
470
472
  // skip incompatible denominator
471
473
  if (conversion == 0) {
@@ -2,6 +2,7 @@
2
2
  #include "sass.h"
3
3
  #include "ast.hpp"
4
4
  #include "util.hpp"
5
+ #include "util_string.hpp"
5
6
  #include "lexer.hpp"
6
7
  #include "prelexer.hpp"
7
8
  #include "constants.hpp"
@@ -26,8 +27,8 @@ namespace Sass {
26
27
  #endif
27
28
 
28
29
  // https://github.com/sass/sass/commit/4e3e1d5684cc29073a507578fc977434ff488c93
29
- if (fmod(val, 1) - 0.5 > - std::pow(0.1, precision + 1)) return std::ceil(val);
30
- else if (fmod(val, 1) - 0.5 > std::pow(0.1, precision)) return std::floor(val);
30
+ if (std::fmod(val, 1) - 0.5 > - std::pow(0.1, precision + 1)) return std::ceil(val);
31
+ else if (std::fmod(val, 1) - 0.5 > std::pow(0.1, precision)) return std::floor(val);
31
32
  // work around some compiler issue
32
33
  // cygwin has it not defined in std
33
34
  using namespace std;
@@ -289,7 +290,7 @@ namespace Sass {
289
290
 
290
291
  // parse as many sequence chars as possible
291
292
  // ToDo: Check if ruby aborts after possible max
292
- while (i + len < L && s[i + len] && isxdigit(s[i + len])) ++ len;
293
+ while (i + len < L && s[i + len] && Util::ascii_isxdigit(static_cast<unsigned char>(s[i + len]))) ++ len;
293
294
 
294
295
  if (len > 1) {
295
296
 
@@ -375,7 +376,7 @@ namespace Sass {
375
376
 
376
377
  // parse as many sequence chars as possible
377
378
  // ToDo: Check if ruby aborts after possible max
378
- while (i + len < L && s[i + len] && isxdigit(s[i + len])) ++ len;
379
+ while (i + len < L && s[i + len] && Util::ascii_isxdigit(static_cast<unsigned char>(s[i + len]))) ++ len;
379
380
 
380
381
  // hex string?
381
382
  if (keep_utf8_sequences) {
@@ -535,7 +536,7 @@ namespace Sass {
535
536
 
536
537
  Block_Obj b = r->block();
537
538
 
538
- Selector_List* sl = Cast<Selector_List>(r->selector());
539
+ SelectorList* sl = r->selector();
539
540
  bool hasSelectors = sl ? sl->length() > 0 : false;
540
541
 
541
542
  if (!hasSelectors) {
@@ -625,11 +626,12 @@ namespace Sass {
625
626
  return false;
626
627
  }
627
628
 
628
- bool isPrintable(Media_Block* m, Sass_Output_Style style)
629
+ bool isPrintable(CssMediaRule* m, Sass_Output_Style style)
629
630
  {
630
631
  if (m == nullptr) return false;
631
632
  Block_Obj b = m->block();
632
633
  if (b == nullptr) return false;
634
+ if (m->empty()) return false;
633
635
  for (size_t i = 0, L = b->length(); i < L; ++i) {
634
636
  Statement_Obj stm = b->at(i);
635
637
  if (Cast<Directive>(stm)) return true;
@@ -649,7 +651,7 @@ namespace Sass {
649
651
  return true;
650
652
  }
651
653
  }
652
- else if (Media_Block* mb = Cast<Media_Block>(stm)) {
654
+ else if (CssMediaRule* mb = Cast<CssMediaRule>(stm)) {
653
655
  if (isPrintable(mb, style)) {
654
656
  return true;
655
657
  }
@@ -702,7 +704,7 @@ namespace Sass {
702
704
  return true;
703
705
  }
704
706
  }
705
- else if (Media_Block* m = Cast<Media_Block>(stm)) {
707
+ else if (CssMediaRule * m = Cast<CssMediaRule>(stm)) {
706
708
  if (isPrintable(m, style)) {
707
709
  return true;
708
710
  }
@@ -717,9 +719,5 @@ namespace Sass {
717
719
  return false;
718
720
  }
719
721
 
720
- bool isAscii(const char chr) {
721
- return unsigned(chr) < 128;
722
- }
723
-
724
722
  }
725
723
  }
@@ -8,11 +8,11 @@
8
8
  #include "sass/base.h"
9
9
  #include "ast_fwd_decl.hpp"
10
10
 
11
+ #include <cmath>
11
12
  #include <cstring>
12
13
  #include <vector>
13
14
  #include <string>
14
15
  #include <assert.h>
15
- #include <math.h>
16
16
 
17
17
  #define SASS_ASSERT(cond, msg) assert(cond && msg)
18
18
 
@@ -93,13 +93,12 @@ namespace Sass {
93
93
 
94
94
  bool isPrintable(Ruleset* r, Sass_Output_Style style = NESTED);
95
95
  bool isPrintable(Supports_Block* r, Sass_Output_Style style = NESTED);
96
- bool isPrintable(Media_Block* r, Sass_Output_Style style = NESTED);
96
+ bool isPrintable(CssMediaRule* r, Sass_Output_Style style = NESTED);
97
97
  bool isPrintable(Comment* b, Sass_Output_Style style = NESTED);
98
98
  bool isPrintable(Block_Obj b, Sass_Output_Style style = NESTED);
99
99
  bool isPrintable(String_Constant* s, Sass_Output_Style style = NESTED);
100
100
  bool isPrintable(String_Quoted* s, Sass_Output_Style style = NESTED);
101
101
  bool isPrintable(Declaration* d, Sass_Output_Style style = NESTED);
102
- bool isAscii(const char chr);
103
102
 
104
103
  }
105
104
  }
@@ -1,75 +1,125 @@
1
1
  #include "util_string.hpp"
2
2
 
3
+ #include <iostream>
3
4
  #include <algorithm>
4
5
 
5
6
  namespace Sass {
6
- namespace Util {
7
+ namespace Util {
7
8
 
8
- std::string rtrim(const std::string &str) {
9
- std::string trimmed = str;
10
- size_t pos_ws = trimmed.find_last_not_of(" \t\n\v\f\r");
11
- if (pos_ws != std::string::npos) {
12
- trimmed.erase(pos_ws + 1);
13
- } else {
14
- trimmed.clear();
15
- }
16
- return trimmed;
17
- }
9
+ // ##########################################################################
10
+ // Special case insensitive string matcher. We can optimize
11
+ // the more general compare case quite a bit by requiring
12
+ // consumers to obey some rules (lowercase and no space).
13
+ // - `literal` must only contain lower case ascii characters
14
+ // there is one edge case where this could give false positives
15
+ // test could contain a (non-ascii) char exactly 32 below literal
16
+ // ##########################################################################
17
+ bool equalsLiteral(const char* lit, const std::string& test) {
18
+ // Work directly on characters
19
+ const char* src = test.c_str();
20
+ // There is a small chance that the search string
21
+ // Is longer than the rest of the string to look at
22
+ while (*lit && (*src == *lit || *src + 32 == *lit)) {
23
+ ++src, ++lit;
24
+ }
25
+ // True if literal is at end
26
+ // If not test was too long
27
+ return *lit == 0;
28
+ }
18
29
 
19
- std::string normalize_newlines(const std::string& str) {
20
- std::string result;
21
- result.reserve(str.size());
22
- std::size_t pos = 0;
23
- while (true) {
24
- const std::size_t newline = str.find_first_of("\n\f\r", pos);
25
- if (newline == std::string::npos) break;
26
- result.append(str, pos, newline - pos);
27
- result += '\n';
28
- if (str[newline] == '\r' && str[newline + 1] == '\n') {
29
- pos = newline + 2;
30
- } else {
31
- pos = newline + 1;
30
+ void ascii_str_tolower(std::string* s) {
31
+ for (auto& ch : *s) {
32
+ ch = ascii_tolower(static_cast<unsigned char>(ch));
33
+ }
32
34
  }
33
- }
34
- result.append(str, pos, std::string::npos);
35
- return result;
36
- }
37
35
 
38
- std::string normalize_underscores(const std::string& str) {
39
- std::string normalized = str;
40
- std::replace(normalized.begin(), normalized.end(), '_', '-');
41
- return normalized;
42
- }
36
+ void ascii_str_toupper(std::string* s) {
37
+ for (auto& ch : *s) {
38
+ ch = ascii_toupper(static_cast<unsigned char>(ch));
39
+ }
40
+ }
43
41
 
44
- std::string normalize_decimals(const std::string& str) {
45
- std::string normalized;
46
- if (!str.empty() && str[0] == '.') {
47
- normalized.reserve(str.size() + 1);
48
- normalized += '0';
49
- normalized += str;
50
- } else {
51
- normalized = str;
52
- }
53
- return normalized;
54
- }
42
+ std::string rtrim(std::string str) {
43
+ auto it = std::find_if_not(str.rbegin(), str.rend(), ascii_isspace);
44
+ str.erase(str.rend() - it);
45
+ return str;
46
+ }
55
47
 
56
- char opening_bracket_for(char closing_bracket) {
57
- switch (closing_bracket) {
58
- case ')': return '(';
59
- case ']': return '[';
60
- case '}': return '{';
61
- default: return '\0';
62
- }
63
- }
48
+ // ###########################################################################
49
+ // Returns [name] without a vendor prefix.
50
+ // If [name] has no vendor prefix, it's returned as-is.
51
+ // ###########################################################################
52
+ std::string unvendor(const std::string& name)
53
+ {
54
+ if (name.size() < 2) return name;
55
+ if (name[0] != '-') return name;
56
+ if (name[1] == '-') return name;
57
+ for (size_t i = 2; i < name.size(); i++) {
58
+ if (name[i] == '-') return name.substr(i + 1);
59
+ }
60
+ return name;
61
+ }
62
+ // EO unvendor
63
+
64
+ std::string normalize_newlines(const std::string& str) {
65
+ std::string result;
66
+ result.reserve(str.size());
67
+ std::size_t pos = 0;
68
+ while (true) {
69
+ const std::size_t newline = str.find_first_of("\n\f\r", pos);
70
+ if (newline == std::string::npos) break;
71
+ result.append(str, pos, newline - pos);
72
+ result += '\n';
73
+ if (str[newline] == '\r' && str[newline + 1] == '\n') {
74
+ pos = newline + 2;
75
+ }
76
+ else {
77
+ pos = newline + 1;
78
+ }
79
+ }
80
+ result.append(str, pos, std::string::npos);
81
+ return result;
82
+ }
83
+
84
+ std::string normalize_underscores(const std::string& str) {
85
+ std::string normalized = str;
86
+ std::replace(normalized.begin(), normalized.end(), '_', '-');
87
+ return normalized;
88
+ }
89
+
90
+ std::string normalize_decimals(const std::string& str) {
91
+ std::string normalized;
92
+ if (!str.empty() && str[0] == '.') {
93
+ normalized.reserve(str.size() + 1);
94
+ normalized += '0';
95
+ normalized += str;
96
+ }
97
+ else {
98
+ normalized = str;
99
+ }
100
+ return normalized;
101
+ }
102
+
103
+ char opening_bracket_for(char closing_bracket) {
104
+ switch (closing_bracket) {
105
+ case ')': return '(';
106
+ case ']': return '[';
107
+ case '}': return '{';
108
+ default: return '\0';
109
+ }
110
+ }
111
+
112
+ char closing_bracket_for(char opening_bracket) {
113
+ switch (opening_bracket) {
114
+ case '(': return ')';
115
+ case '[': return ']';
116
+ case '{': return '}';
117
+ default: return '\0';
118
+ }
119
+ }
64
120
 
65
- char closing_bracket_for(char opening_bracket) {
66
- switch (opening_bracket) {
67
- case '(': return ')';
68
- case '[': return ']';
69
- case '{': return '}';
70
- default: return '\0';
71
121
  }
72
- }
122
+ // namespace Util
73
123
 
74
- } // namespace Sass
75
- } // namespace Util
124
+ }
125
+ // namespace Sass