sassc 2.1.0.pre3 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/CHANGELOG.md +24 -0
  4. data/Rakefile +2 -4
  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 +4 -0
  9. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  10. data/ext/libsass/src/ast.cpp +158 -168
  11. data/ext/libsass/src/ast.hpp +389 -230
  12. data/ext/libsass/src/ast_def_macros.hpp +18 -10
  13. data/ext/libsass/src/ast_fwd_decl.cpp +4 -3
  14. data/ext/libsass/src/ast_fwd_decl.hpp +98 -165
  15. data/ext/libsass/src/ast_helpers.hpp +292 -0
  16. data/ext/libsass/src/ast_sel_cmp.cpp +219 -732
  17. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  18. data/ext/libsass/src/ast_sel_unify.cpp +207 -212
  19. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  20. data/ext/libsass/src/ast_selectors.cpp +594 -1026
  21. data/ext/libsass/src/ast_selectors.hpp +339 -385
  22. data/ext/libsass/src/ast_supports.cpp +36 -52
  23. data/ext/libsass/src/ast_supports.hpp +29 -29
  24. data/ext/libsass/src/ast_values.cpp +271 -84
  25. data/ext/libsass/src/ast_values.hpp +116 -107
  26. data/ext/libsass/src/backtrace.cpp +9 -9
  27. data/ext/libsass/src/backtrace.hpp +5 -5
  28. data/ext/libsass/src/base64vlq.cpp +2 -2
  29. data/ext/libsass/src/base64vlq.hpp +1 -1
  30. data/ext/libsass/src/bind.cpp +18 -18
  31. data/ext/libsass/src/bind.hpp +1 -1
  32. data/ext/libsass/src/c2ast.cpp +3 -3
  33. data/ext/libsass/src/c2ast.hpp +1 -1
  34. data/ext/libsass/src/cencode.c +4 -6
  35. data/ext/libsass/src/check_nesting.cpp +40 -41
  36. data/ext/libsass/src/check_nesting.hpp +6 -2
  37. data/ext/libsass/src/color_maps.cpp +14 -13
  38. data/ext/libsass/src/color_maps.hpp +1 -9
  39. data/ext/libsass/src/constants.cpp +5 -0
  40. data/ext/libsass/src/constants.hpp +6 -0
  41. data/ext/libsass/src/context.cpp +92 -119
  42. data/ext/libsass/src/context.hpp +41 -53
  43. data/ext/libsass/src/cssize.cpp +66 -149
  44. data/ext/libsass/src/cssize.hpp +17 -23
  45. data/ext/libsass/src/dart_helpers.hpp +199 -0
  46. data/ext/libsass/src/debugger.hpp +451 -295
  47. data/ext/libsass/src/emitter.cpp +15 -16
  48. data/ext/libsass/src/emitter.hpp +10 -12
  49. data/ext/libsass/src/environment.cpp +27 -27
  50. data/ext/libsass/src/environment.hpp +29 -24
  51. data/ext/libsass/src/error_handling.cpp +62 -41
  52. data/ext/libsass/src/error_handling.hpp +61 -51
  53. data/ext/libsass/src/eval.cpp +167 -281
  54. data/ext/libsass/src/eval.hpp +27 -29
  55. data/ext/libsass/src/eval_selectors.cpp +75 -0
  56. data/ext/libsass/src/expand.cpp +275 -222
  57. data/ext/libsass/src/expand.hpp +36 -16
  58. data/ext/libsass/src/extender.cpp +1188 -0
  59. data/ext/libsass/src/extender.hpp +399 -0
  60. data/ext/libsass/src/extension.cpp +43 -0
  61. data/ext/libsass/src/extension.hpp +89 -0
  62. data/ext/libsass/src/file.cpp +81 -72
  63. data/ext/libsass/src/file.hpp +28 -37
  64. data/ext/libsass/src/fn_colors.cpp +20 -18
  65. data/ext/libsass/src/fn_lists.cpp +30 -29
  66. data/ext/libsass/src/fn_maps.cpp +3 -3
  67. data/ext/libsass/src/fn_miscs.cpp +34 -46
  68. data/ext/libsass/src/fn_numbers.cpp +20 -13
  69. data/ext/libsass/src/fn_selectors.cpp +98 -128
  70. data/ext/libsass/src/fn_strings.cpp +47 -33
  71. data/ext/libsass/src/fn_utils.cpp +31 -29
  72. data/ext/libsass/src/fn_utils.hpp +17 -11
  73. data/ext/libsass/src/inspect.cpp +186 -148
  74. data/ext/libsass/src/inspect.hpp +31 -29
  75. data/ext/libsass/src/lexer.cpp +20 -82
  76. data/ext/libsass/src/lexer.hpp +5 -16
  77. data/ext/libsass/src/listize.cpp +23 -37
  78. data/ext/libsass/src/listize.hpp +8 -9
  79. data/ext/libsass/src/mapping.hpp +1 -0
  80. data/ext/libsass/src/memory.hpp +12 -0
  81. data/ext/libsass/src/memory/allocator.cpp +48 -0
  82. data/ext/libsass/src/memory/allocator.hpp +138 -0
  83. data/ext/libsass/src/memory/config.hpp +20 -0
  84. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  85. data/ext/libsass/src/memory/{SharedPtr.cpp → shared_ptr.cpp} +2 -2
  86. data/ext/libsass/src/memory/{SharedPtr.hpp → shared_ptr.hpp} +55 -9
  87. data/ext/libsass/src/operation.hpp +71 -61
  88. data/ext/libsass/src/operators.cpp +19 -18
  89. data/ext/libsass/src/operators.hpp +11 -11
  90. data/ext/libsass/src/ordered_map.hpp +112 -0
  91. data/ext/libsass/src/output.cpp +45 -64
  92. data/ext/libsass/src/output.hpp +6 -6
  93. data/ext/libsass/src/parser.cpp +512 -700
  94. data/ext/libsass/src/parser.hpp +89 -97
  95. data/ext/libsass/src/parser_selectors.cpp +189 -0
  96. data/ext/libsass/src/permutate.hpp +164 -0
  97. data/ext/libsass/src/plugins.cpp +7 -7
  98. data/ext/libsass/src/plugins.hpp +8 -8
  99. data/ext/libsass/src/position.cpp +7 -26
  100. data/ext/libsass/src/position.hpp +44 -21
  101. data/ext/libsass/src/prelexer.cpp +6 -6
  102. data/ext/libsass/src/remove_placeholders.cpp +55 -56
  103. data/ext/libsass/src/remove_placeholders.hpp +21 -18
  104. data/ext/libsass/src/sass.cpp +16 -15
  105. data/ext/libsass/src/sass.hpp +10 -5
  106. data/ext/libsass/src/sass2scss.cpp +4 -4
  107. data/ext/libsass/src/sass_context.cpp +91 -122
  108. data/ext/libsass/src/sass_context.hpp +2 -2
  109. data/ext/libsass/src/sass_functions.cpp +1 -1
  110. data/ext/libsass/src/sass_values.cpp +8 -11
  111. data/ext/libsass/src/settings.hpp +19 -0
  112. data/ext/libsass/src/source.cpp +69 -0
  113. data/ext/libsass/src/source.hpp +95 -0
  114. data/ext/libsass/src/source_data.hpp +32 -0
  115. data/ext/libsass/src/source_map.cpp +22 -18
  116. data/ext/libsass/src/source_map.hpp +12 -9
  117. data/ext/libsass/src/stylesheet.cpp +22 -0
  118. data/ext/libsass/src/stylesheet.hpp +57 -0
  119. data/ext/libsass/src/to_value.cpp +2 -2
  120. data/ext/libsass/src/to_value.hpp +1 -1
  121. data/ext/libsass/src/units.cpp +24 -22
  122. data/ext/libsass/src/units.hpp +8 -8
  123. data/ext/libsass/src/utf8_string.cpp +9 -10
  124. data/ext/libsass/src/utf8_string.hpp +7 -6
  125. data/ext/libsass/src/util.cpp +48 -50
  126. data/ext/libsass/src/util.hpp +20 -21
  127. data/ext/libsass/src/util_string.cpp +111 -61
  128. data/ext/libsass/src/util_string.hpp +62 -8
  129. data/ext/libsass/src/values.cpp +12 -12
  130. data/lib/sassc/engine.rb +5 -3
  131. data/lib/sassc/functions_handler.rb +11 -13
  132. data/lib/sassc/native.rb +9 -7
  133. data/lib/sassc/script.rb +4 -6
  134. data/lib/sassc/version.rb +1 -1
  135. data/test/functions_test.rb +38 -1
  136. data/test/native_test.rb +4 -4
  137. metadata +31 -18
  138. data/ext/libsass/src/extend.cpp +0 -2132
  139. data/ext/libsass/src/extend.hpp +0 -86
  140. data/ext/libsass/src/node.cpp +0 -322
  141. data/ext/libsass/src/node.hpp +0 -118
  142. data/ext/libsass/src/paths.hpp +0 -71
  143. data/ext/libsass/src/sass_util.cpp +0 -152
  144. data/ext/libsass/src/sass_util.hpp +0 -256
  145. data/ext/libsass/src/subset_map.cpp +0 -58
  146. data/ext/libsass/src/subset_map.hpp +0 -76
  147. data/lib/sassc/native/lib_c.rb +0 -21
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c292d43734810782d28442d9ce558bd6d15f8c1726f9f9cf7ab734e60154616a
4
- data.tar.gz: 10fdd3957c9e01b3e4eff3c7485af87a1acfdba6fd704cca71e1473dd115941e
3
+ metadata.gz: 75155de90eb3449ed2a1214ca6ab2b82ffe69b144c2a8eaf8a6a4fd522b58ea4
4
+ data.tar.gz: 8575ebe24a2d56a9bea0e4574ebd23753e283d3b34bf571489f318a357bce2b9
5
5
  SHA512:
6
- metadata.gz: 42faa474b08b2f1a561097698ea879dc3760bb4d0554d33e2f4f2250ca2f72f13c41e8d1c130905258846e64eba6d6e6f17d3fac747e216adcff9dc13be0c394
7
- data.tar.gz: 0aa4d3f26dfe102fcff5863a352ef60527467ccff6590338db20bf3c653dc1059bc7bfb28b4b90222341d412da94924a75f878cb373f21dfdc5d4b1abb034317
6
+ metadata.gz: ae3eb9431fb5d9de9e1c1759844e1144aba73f59b7de40e1b06d77ba5567bc894a2f0a4ef2d3b6dcce9226044d52de5eeacb7759e715f3eb1bd4818b56b9876c
7
+ data.tar.gz: e4a07f5789ec2d9f4dbf04bfaf13b5d12224cf4ffd9f72721fac8edfd10eb2b7085af53d70248ce78112ee7af0ea06fb5e452388997eab810d07bd5a7de08a5c
@@ -10,5 +10,7 @@ rvm:
10
10
  - 2.4.6
11
11
  - 2.5.5
12
12
  - 2.6.3
13
+ - 2.7.0
14
+ - truffleruby
13
15
  notifications:
14
16
  email: false
@@ -1,3 +1,27 @@
1
+ - **2.4.0**
2
+ - [Update libsass to 3.6.4](https://github.com/sass/sassc-ruby/pull/199)
3
+ - [Use FFI::MemoryPointer instead of libc's malloc()](https://github.com/sass/sassc-ruby/pull/205)
4
+ - [Test against Ruby 2.7.0](https://github.com/sass/sassc-ruby/pull/193)
5
+
6
+ - **2.3.0**
7
+ - [Fix rake gem:native task](https://github.com/sass/sassc-ruby/pull/196)
8
+ - [disable lto flag for darwin + nix](https://github.com/sass/sassc-ruby/pull/166)
9
+ - [Sort input file list](https://github.com/sass/sassc-ruby/pull/178)
10
+ - [Set appropriate encoding for source_map](https://github.com/sass/sassc-ruby/pull/152)
11
+ - [allow passing functions directly](https://github.com/sass/sassc-ruby/pull/162)
12
+ - [always dispose data context](https://github.com/sass/sassc-ruby/pull/161)
13
+ - [Update libsass to 3.6.3](https://github.com/sass/sassc-ruby/pull/164)
14
+ - [Restore strip symbols](https://github.com/sass/sassc-ruby/pull/184)
15
+ - [Default --march-tune-native to false](https://github.com/sass/sassc-ruby/pull/158)
16
+ - [Fix compile issue on Mac OS X](https://github.com/sass/sassc-ruby/pull/174)
17
+ - [Test on TruffleRuby in TravisCI](https://github.com/sass/sassc-ruby/pull/171)
18
+ - [Use RbConfig::MAKEFILE_CONFIG['DLEXT'] instead of hardcoding extensions](https://github.com/sass/sassc-ruby/pull/173)
19
+ - **2.2.1**
20
+ - [Fix LoadError on some non-rvm environments](https://github.com/sass/sassc-ruby/pull/156)
21
+ - **2.2.0**
22
+ - [Do not build precompiled gems for Linux](https://github.com/sass/sassc-ruby/pull/145)
23
+ - **2.1.0**
24
+ - Equivalent to 2.1.0.pre3
1
25
  - **2.1.0.pre3**
2
26
  - [extconf.rb: Always write VERSION if we have .git](https://github.com/sass/sassc-ruby/pull/131)
3
27
  - [Update libsass to 3.6.1](https://github.com/sass/sassc-ruby/pull/130)
data/Rakefile CHANGED
@@ -18,7 +18,7 @@ Rake::ExtensionTask.new('libsass', gem_spec) do |ext|
18
18
  ext.ext_dir = 'ext'
19
19
  ext.lib_dir = 'lib/sassc'
20
20
  ext.cross_compile = true
21
- ext.cross_platform = %w[x86-mingw32 x64-mingw32 x86-linux x86_64-linux]
21
+ ext.cross_platform = %w[x86-mingw32 x64-mingw32]
22
22
 
23
23
  # Link C++ stdlib statically when building binary gems.
24
24
  ext.cross_config_options << '--enable-static-stdlib'
@@ -36,9 +36,7 @@ task 'gem:native' do
36
36
 
37
37
  # The RUBY_CC_VERSION here doesn't matter for the final package.
38
38
  # Only one version should be specified, as the shared library is Ruby-agnostic.
39
- #
40
- # g++-multilib is installed for 64->32-bit cross-compilation.
41
- RakeCompilerDock.sh "sudo apt-get install -y g++-multilib && bundle && gem i rake --no-document && "\
39
+ RakeCompilerDock.sh "gem i rake bundler --no-document && bundle && "\
42
40
  "rake clean && rake cross native gem MAKE='nice make -j`nproc`' "\
43
41
  "RUBY_CC_VERSION=2.6.0 CLEAN=1"
44
42
  end
@@ -19,13 +19,17 @@ if enable_config('static-stdlib', false)
19
19
  $LDFLAGS << ' -static-libgcc -static-libstdc++'
20
20
  end
21
21
 
22
- # Set to false when building binary gems
23
- if enable_config('march-tune-native', true)
22
+ if enable_config('march-tune-native', false)
24
23
  $CFLAGS << ' -march=native -mtune=native'
25
24
  $CXXFLAGS << ' -march=native -mtune=native'
26
25
  end
27
26
 
28
- if enable_config('lto', true)
27
+ # darwin nix clang doesn't support lto
28
+ # disable -lto flag for darwin + nix
29
+ # see: https://github.com/sass/sassc-ruby/issues/148
30
+ enable_lto_by_default = (Gem::Platform.local.os == "darwin" && !ENV['NIX_CC'].nil?)
31
+
32
+ if enable_config('lto', enable_lto_by_default)
29
33
  $CFLAGS << ' -flto'
30
34
  $CXXFLAGS << ' -flto'
31
35
  $LDFLAGS << ' -flto'
@@ -56,10 +60,14 @@ $INCFLAGS << " -I$(srcdir)/libsass/include"
56
60
  $VPATH << "$(srcdir)/libsass/src"
57
61
  Dir.chdir(__dir__) do
58
62
  $VPATH += Dir['libsass/src/*/'].map { |p| "$(srcdir)/#{p}" }
59
- $srcs = Dir['libsass/src/**/*.{c,cpp}']
63
+ $srcs = Dir['libsass/src/**/*.{c,cpp}'].sort
60
64
  end
61
65
 
62
- MakeMakefile::LINK_SO << "\nstrip -x $@"
66
+ # libsass.bundle malformed object (unknown load command 7) on Mac OS X
67
+ # See https://github.com/sass/sassc-ruby/pull/174
68
+ if enable_config('strip', RbConfig::CONFIG['host_os'].downcase !~ /darwin/)
69
+ MakeMakefile::LINK_SO << "\nstrip -x $@"
70
+ end
63
71
 
64
72
  # Don't link libruby.
65
73
  $LIBRUBYARG = nil
@@ -1 +1 @@
1
- 3.6.1
1
+ 3.6.4
@@ -68,7 +68,8 @@ enum Sass_Output_Style {
68
68
  SASS_STYLE_COMPRESSED,
69
69
  // only used internaly
70
70
  SASS_STYLE_INSPECT,
71
- SASS_STYLE_TO_SASS
71
+ SASS_STYLE_TO_SASS,
72
+ SASS_STYLE_TO_CSS
72
73
  };
73
74
 
74
75
  // to allocate buffer to be filled
@@ -125,6 +125,9 @@ ADDAPI char** ADDCALL sass_context_get_included_files (struct Sass_Context* ctx)
125
125
  // Getters for options include path array
126
126
  ADDAPI size_t ADDCALL sass_option_get_include_path_size(struct Sass_Options* options);
127
127
  ADDAPI const char* ADDCALL sass_option_get_include_path(struct Sass_Options* options, size_t i);
128
+ // Plugin paths to load dynamic libraries work the same
129
+ ADDAPI size_t ADDCALL sass_option_get_plugin_path_size(struct Sass_Options* options);
130
+ ADDAPI const char* ADDCALL sass_option_get_plugin_path(struct Sass_Options* options, size_t i);
128
131
 
129
132
  // Calculate the size of the stored null terminated array
130
133
  ADDAPI size_t ADDCALL sass_context_get_included_files_size (struct Sass_Context* ctx);
@@ -134,6 +137,7 @@ ADDAPI char* ADDCALL sass_context_take_error_json (struct Sass_Context* ctx);
134
137
  ADDAPI char* ADDCALL sass_context_take_error_text (struct Sass_Context* ctx);
135
138
  ADDAPI char* ADDCALL sass_context_take_error_message (struct Sass_Context* ctx);
136
139
  ADDAPI char* ADDCALL sass_context_take_error_file (struct Sass_Context* ctx);
140
+ ADDAPI char* ADDCALL sass_context_take_error_src (struct Sass_Context* ctx);
137
141
  ADDAPI char* ADDCALL sass_context_take_output_string (struct Sass_Context* ctx);
138
142
  ADDAPI char* ADDCALL sass_context_take_source_map_string (struct Sass_Context* ctx);
139
143
  ADDAPI char** ADDCALL sass_context_take_included_files (struct Sass_Context* ctx);
@@ -0,0 +1,91 @@
1
+ //-----------------------------------------------------------------------------
2
+ // MurmurHash2 was written by Austin Appleby, and is placed in the public
3
+ // domain. The author hereby disclaims copyright to this source code.
4
+ //-----------------------------------------------------------------------------
5
+ // LibSass only needs MurmurHash2, so we made this header only
6
+ //-----------------------------------------------------------------------------
7
+
8
+ #ifndef _MURMURHASH2_H_
9
+ #define _MURMURHASH2_H_
10
+
11
+ //-----------------------------------------------------------------------------
12
+ // Platform-specific functions and macros
13
+
14
+ // Microsoft Visual Studio
15
+
16
+ #if defined(_MSC_VER) && (_MSC_VER < 1600)
17
+
18
+ typedef unsigned char uint8_t;
19
+ typedef unsigned int uint32_t;
20
+ typedef unsigned __int64 uint64_t;
21
+
22
+ // Other compilers
23
+
24
+ #else // defined(_MSC_VER)
25
+
26
+ #include <stdint.h>
27
+
28
+ #endif // !defined(_MSC_VER)
29
+
30
+ //-----------------------------------------------------------------------------
31
+
32
+ inline uint32_t MurmurHash2 ( const void * key, int len, uint32_t seed )
33
+ {
34
+ // 'm' and 'r' are mixing constants generated offline.
35
+ // They're not really 'magic', they just happen to work well.
36
+
37
+ const uint32_t m = 0x5bd1e995;
38
+ const int r = 24;
39
+
40
+ // Initialize the hash to a 'random' value
41
+
42
+ uint32_t h = seed ^ len;
43
+
44
+ // Mix 4 bytes at a time into the hash
45
+
46
+ const unsigned char * data = (const unsigned char *)key;
47
+
48
+ while(len >= 4)
49
+ {
50
+ uint32_t k = *(uint32_t*)data;
51
+
52
+ k *= m;
53
+ k ^= k >> r;
54
+ k *= m;
55
+
56
+ h *= m;
57
+ h ^= k;
58
+
59
+ data += 4;
60
+ len -= 4;
61
+ }
62
+
63
+ // Handle the last few bytes of the input array
64
+
65
+ switch(len)
66
+ {
67
+ case 3:
68
+ h ^= data[2] << 16;
69
+ /* fall through */
70
+ case 2:
71
+ h ^= data[1] << 8;
72
+ /* fall through */
73
+ case 1:
74
+ h ^= data[0];
75
+ h *= m;
76
+ };
77
+
78
+ // Do a few final mixes of the hash to ensure the last few
79
+ // bytes are well-incorporated.
80
+
81
+ h ^= h >> 13;
82
+ h *= m;
83
+ h ^= h >> 15;
84
+
85
+ return h;
86
+ }
87
+
88
+ //-----------------------------------------------------------------------------
89
+
90
+ #endif // _MURMURHASH2_H_
91
+
@@ -1,23 +1,12 @@
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 "ast.hpp"
3
- #include "context.hpp"
4
- #include "node.hpp"
5
- #include "eval.hpp"
6
- #include "extend.hpp"
7
- #include "emitter.hpp"
8
- #include "color_maps.hpp"
9
- #include "ast_fwd_decl.hpp"
10
- #include <set>
11
- #include <iomanip>
12
- #include <iostream>
13
- #include <algorithm>
14
- #include <functional>
15
- #include <cctype>
16
- #include <locale>
17
6
 
18
7
  namespace Sass {
19
8
 
20
- static Null sass_null(ParserState("null"));
9
+ static Null sass_null(SourceSpan("null"));
21
10
 
22
11
  const char* sass_op_to_name(enum Sass_OP op) {
23
12
  switch (op) {
@@ -64,12 +53,12 @@ namespace Sass {
64
53
  /////////////////////////////////////////////////////////////////////////
65
54
  /////////////////////////////////////////////////////////////////////////
66
55
 
67
- void AST_Node::update_pstate(const ParserState& pstate)
56
+ void AST_Node::update_pstate(const SourceSpan& pstate)
68
57
  {
69
- pstate_.offset += pstate - pstate_ + pstate.offset;
58
+ pstate_.offset += pstate.position - pstate_.position + pstate.offset;
70
59
  }
71
60
 
72
- const std::string AST_Node::to_string(Sass_Inspect_Options opt) const
61
+ sass::string AST_Node::to_string(Sass_Inspect_Options opt) const
73
62
  {
74
63
  Sass_Output_Options out(opt);
75
64
  Emitter emitter(out);
@@ -80,25 +69,27 @@ namespace Sass {
80
69
  return i.get_buffer();
81
70
  }
82
71
 
83
- const std::string AST_Node::to_string() const
72
+ sass::string AST_Node::to_css(Sass_Inspect_Options opt) const
84
73
  {
85
- return to_string({ NESTED, 5 });
74
+ opt.output_style = TO_CSS;
75
+ Sass_Output_Options out(opt);
76
+ Emitter emitter(out);
77
+ Inspect i(emitter);
78
+ i.in_declaration = true;
79
+ // ToDo: inspect should be const
80
+ const_cast<AST_Node*>(this)->perform(&i);
81
+ return i.get_buffer();
86
82
  }
87
83
 
88
- /////////////////////////////////////////////////////////////////////////
89
- /////////////////////////////////////////////////////////////////////////
90
-
91
- Expression_Obj Hashed::at(Expression_Obj k) const
84
+ sass::string AST_Node::to_string() const
92
85
  {
93
- if (elements_.count(k))
94
- { return elements_.at(k); }
95
- else { return {}; }
86
+ return to_string({ NESTED, 5 });
96
87
  }
97
88
 
98
89
  /////////////////////////////////////////////////////////////////////////
99
90
  /////////////////////////////////////////////////////////////////////////
100
91
 
101
- Statement::Statement(ParserState pstate, Type st, size_t t)
92
+ Statement::Statement(SourceSpan pstate, Type st, size_t t)
102
93
  : AST_Node(pstate), statement_type_(st), tabs_(t), group_end_(false)
103
94
  { }
104
95
  Statement::Statement(const Statement* ptr)
@@ -126,7 +117,7 @@ namespace Sass {
126
117
  /////////////////////////////////////////////////////////////////////////
127
118
  /////////////////////////////////////////////////////////////////////////
128
119
 
129
- Block::Block(ParserState pstate, size_t s, bool r)
120
+ Block::Block(SourceSpan pstate, size_t s, bool r)
130
121
  : Statement(pstate),
131
122
  Vectorized<Statement_Obj>(s),
132
123
  is_root_(r)
@@ -137,6 +128,14 @@ namespace Sass {
137
128
  is_root_(ptr->is_root_)
138
129
  { }
139
130
 
131
+ bool Block::isInvisible() const
132
+ {
133
+ for (auto& item : elements()) {
134
+ if (!item->is_invisible()) return false;
135
+ }
136
+ return true;
137
+ }
138
+
140
139
  bool Block::has_content()
141
140
  {
142
141
  for (size_t i = 0, L = elements().size(); i < L; ++i) {
@@ -148,14 +147,14 @@ namespace Sass {
148
147
  /////////////////////////////////////////////////////////////////////////
149
148
  /////////////////////////////////////////////////////////////////////////
150
149
 
151
- Has_Block::Has_Block(ParserState pstate, Block_Obj b)
150
+ ParentStatement::ParentStatement(SourceSpan pstate, Block_Obj b)
152
151
  : Statement(pstate), block_(b)
153
152
  { }
154
- Has_Block::Has_Block(const Has_Block* ptr)
153
+ ParentStatement::ParentStatement(const ParentStatement* ptr)
155
154
  : Statement(ptr), block_(ptr->block_)
156
155
  { }
157
156
 
158
- bool Has_Block::has_content()
157
+ bool ParentStatement::has_content()
159
158
  {
160
159
  return (block_ && block_->has_content()) || Statement::has_content();
161
160
  }
@@ -163,19 +162,20 @@ namespace Sass {
163
162
  /////////////////////////////////////////////////////////////////////////
164
163
  /////////////////////////////////////////////////////////////////////////
165
164
 
166
- Ruleset::Ruleset(ParserState pstate, Selector_List_Obj s, Block_Obj b)
167
- : Has_Block(pstate, b), selector_(s), is_root_(false)
165
+ StyleRule::StyleRule(SourceSpan pstate, SelectorListObj s, Block_Obj b)
166
+ : ParentStatement(pstate, b), selector_(s), schema_(), is_root_(false)
168
167
  { statement_type(RULESET); }
169
- Ruleset::Ruleset(const Ruleset* ptr)
170
- : Has_Block(ptr),
168
+ StyleRule::StyleRule(const StyleRule* ptr)
169
+ : ParentStatement(ptr),
171
170
  selector_(ptr->selector_),
171
+ schema_(ptr->schema_),
172
172
  is_root_(ptr->is_root_)
173
173
  { statement_type(RULESET); }
174
174
 
175
- bool Ruleset::is_invisible() const {
176
- if (Selector_List* sl = Cast<Selector_List>(selector())) {
177
- for (size_t i = 0, L = sl->length(); i < L; ++i)
178
- if (!(*sl)[i]->has_placeholder()) return false;
175
+ bool StyleRule::is_invisible() const {
176
+ if (const SelectorList * sl = Cast<SelectorList>(selector())) {
177
+ for (size_t i = 0, L = sl->length(); i < L; i += 1)
178
+ if (!(*sl)[i]->isInvisible()) return false;
179
179
  }
180
180
  return true;
181
181
  }
@@ -183,7 +183,7 @@ namespace Sass {
183
183
  /////////////////////////////////////////////////////////////////////////
184
184
  /////////////////////////////////////////////////////////////////////////
185
185
 
186
- Bubble::Bubble(ParserState pstate, Statement_Obj n, Statement_Obj g, size_t t)
186
+ Bubble::Bubble(SourceSpan pstate, Statement_Obj n, Statement_Obj g, size_t t)
187
187
  : Statement(pstate, Statement::BUBBLE, t), node_(n), group_end_(g == nullptr)
188
188
  { }
189
189
  Bubble::Bubble(const Bubble* ptr)
@@ -200,11 +200,11 @@ namespace Sass {
200
200
  /////////////////////////////////////////////////////////////////////////
201
201
  /////////////////////////////////////////////////////////////////////////
202
202
 
203
- Trace::Trace(ParserState pstate, std::string n, Block_Obj b, char type)
204
- : Has_Block(pstate, b), type_(type), name_(n)
203
+ Trace::Trace(SourceSpan pstate, sass::string n, Block_Obj b, char type)
204
+ : ParentStatement(pstate, b), type_(type), name_(n)
205
205
  { }
206
206
  Trace::Trace(const Trace* ptr)
207
- : Has_Block(ptr),
207
+ : ParentStatement(ptr),
208
208
  type_(ptr->type_),
209
209
  name_(ptr->name_)
210
210
  { }
@@ -212,48 +212,25 @@ namespace Sass {
212
212
  /////////////////////////////////////////////////////////////////////////
213
213
  /////////////////////////////////////////////////////////////////////////
214
214
 
215
- Media_Block::Media_Block(ParserState pstate, List_Obj mqs, Block_Obj b)
216
- : Has_Block(pstate, b), media_queries_(mqs)
217
- { statement_type(MEDIA); }
218
- Media_Block::Media_Block(const Media_Block* ptr)
219
- : Has_Block(ptr), media_queries_(ptr->media_queries_)
220
- { statement_type(MEDIA); }
221
-
222
- bool Media_Block::is_invisible() const {
223
- for (size_t i = 0, L = block()->length(); i < L; ++i) {
224
- Statement_Obj stm = block()->at(i);
225
- if (!stm->is_invisible()) return false;
226
- }
227
- return true;
228
- }
229
-
230
- bool Media_Block::bubbles()
231
- {
232
- return true;
233
- }
234
-
235
- /////////////////////////////////////////////////////////////////////////
236
- /////////////////////////////////////////////////////////////////////////
237
-
238
- Directive::Directive(ParserState pstate, std::string kwd, Selector_List_Obj sel, Block_Obj b, Expression_Obj val)
239
- : Has_Block(pstate, b), keyword_(kwd), selector_(sel), value_(val) // set value manually if needed
215
+ AtRule::AtRule(SourceSpan pstate, sass::string kwd, SelectorListObj sel, Block_Obj b, ExpressionObj val)
216
+ : ParentStatement(pstate, b), keyword_(kwd), selector_(sel), value_(val) // set value manually if needed
240
217
  { statement_type(DIRECTIVE); }
241
- Directive::Directive(const Directive* ptr)
242
- : Has_Block(ptr),
218
+ AtRule::AtRule(const AtRule* ptr)
219
+ : ParentStatement(ptr),
243
220
  keyword_(ptr->keyword_),
244
221
  selector_(ptr->selector_),
245
222
  value_(ptr->value_) // set value manually if needed
246
223
  { statement_type(DIRECTIVE); }
247
224
 
248
- bool Directive::bubbles() { return is_keyframes() || is_media(); }
225
+ bool AtRule::bubbles() { return is_keyframes() || is_media(); }
249
226
 
250
- bool Directive::is_media() {
227
+ bool AtRule::is_media() {
251
228
  return keyword_.compare("@-webkit-media") == 0 ||
252
229
  keyword_.compare("@-moz-media") == 0 ||
253
230
  keyword_.compare("@-o-media") == 0 ||
254
231
  keyword_.compare("@media") == 0;
255
232
  }
256
- bool Directive::is_keyframes() {
233
+ bool AtRule::is_keyframes() {
257
234
  return keyword_.compare("@-webkit-keyframes") == 0 ||
258
235
  keyword_.compare("@-moz-keyframes") == 0 ||
259
236
  keyword_.compare("@-o-keyframes") == 0 ||
@@ -263,21 +240,21 @@ namespace Sass {
263
240
  /////////////////////////////////////////////////////////////////////////
264
241
  /////////////////////////////////////////////////////////////////////////
265
242
 
266
- Keyframe_Rule::Keyframe_Rule(ParserState pstate, Block_Obj b)
267
- : Has_Block(pstate, b), name_()
243
+ Keyframe_Rule::Keyframe_Rule(SourceSpan pstate, Block_Obj b)
244
+ : ParentStatement(pstate, b), name_()
268
245
  { statement_type(KEYFRAMERULE); }
269
246
  Keyframe_Rule::Keyframe_Rule(const Keyframe_Rule* ptr)
270
- : Has_Block(ptr), name_(ptr->name_)
247
+ : ParentStatement(ptr), name_(ptr->name_)
271
248
  { statement_type(KEYFRAMERULE); }
272
249
 
273
250
  /////////////////////////////////////////////////////////////////////////
274
251
  /////////////////////////////////////////////////////////////////////////
275
252
 
276
- Declaration::Declaration(ParserState pstate, String_Obj prop, Expression_Obj val, bool i, bool c, Block_Obj b)
277
- : Has_Block(pstate, b), property_(prop), value_(val), is_important_(i), is_custom_property_(c), is_indented_(false)
253
+ Declaration::Declaration(SourceSpan pstate, String_Obj prop, ExpressionObj val, bool i, bool c, Block_Obj b)
254
+ : ParentStatement(pstate, b), property_(prop), value_(val), is_important_(i), is_custom_property_(c), is_indented_(false)
278
255
  { statement_type(DECLARATION); }
279
256
  Declaration::Declaration(const Declaration* ptr)
280
- : Has_Block(ptr),
257
+ : ParentStatement(ptr),
281
258
  property_(ptr->property_),
282
259
  value_(ptr->value_),
283
260
  is_important_(ptr->is_important_),
@@ -294,7 +271,7 @@ namespace Sass {
294
271
  /////////////////////////////////////////////////////////////////////////
295
272
  /////////////////////////////////////////////////////////////////////////
296
273
 
297
- Assignment::Assignment(ParserState pstate, std::string var, Expression_Obj val, bool is_default, bool is_global)
274
+ Assignment::Assignment(SourceSpan pstate, sass::string var, ExpressionObj val, bool is_default, bool is_global)
298
275
  : Statement(pstate), variable_(var), value_(val), is_default_(is_default), is_global_(is_global)
299
276
  { statement_type(ASSIGNMENT); }
300
277
  Assignment::Assignment(const Assignment* ptr)
@@ -308,10 +285,10 @@ namespace Sass {
308
285
  /////////////////////////////////////////////////////////////////////////
309
286
  /////////////////////////////////////////////////////////////////////////
310
287
 
311
- Import::Import(ParserState pstate)
288
+ Import::Import(SourceSpan pstate)
312
289
  : Statement(pstate),
313
- urls_(std::vector<Expression_Obj>()),
314
- incs_(std::vector<Include>()),
290
+ urls_(sass::vector<ExpressionObj>()),
291
+ incs_(sass::vector<Include>()),
315
292
  import_queries_()
316
293
  { statement_type(IMPORT); }
317
294
  Import::Import(const Import* ptr)
@@ -321,56 +298,56 @@ namespace Sass {
321
298
  import_queries_(ptr->import_queries_)
322
299
  { statement_type(IMPORT); }
323
300
 
324
- std::vector<Include>& Import::incs() { return incs_; }
325
- std::vector<Expression_Obj>& Import::urls() { return urls_; }
301
+ sass::vector<Include>& Import::incs() { return incs_; }
302
+ sass::vector<ExpressionObj>& Import::urls() { return urls_; }
326
303
 
327
304
  /////////////////////////////////////////////////////////////////////////
328
305
  /////////////////////////////////////////////////////////////////////////
329
306
 
330
- Import_Stub::Import_Stub(ParserState pstate, Include res)
307
+ Import_Stub::Import_Stub(SourceSpan pstate, Include res)
331
308
  : Statement(pstate), resource_(res)
332
309
  { statement_type(IMPORT_STUB); }
333
310
  Import_Stub::Import_Stub(const Import_Stub* ptr)
334
311
  : Statement(ptr), resource_(ptr->resource_)
335
312
  { statement_type(IMPORT_STUB); }
336
313
  Include Import_Stub::resource() { return resource_; };
337
- std::string Import_Stub::imp_path() { return resource_.imp_path; };
338
- std::string Import_Stub::abs_path() { return resource_.abs_path; };
314
+ sass::string Import_Stub::imp_path() { return resource_.imp_path; };
315
+ sass::string Import_Stub::abs_path() { return resource_.abs_path; };
339
316
 
340
317
  /////////////////////////////////////////////////////////////////////////
341
318
  /////////////////////////////////////////////////////////////////////////
342
319
 
343
- Warning::Warning(ParserState pstate, Expression_Obj msg)
320
+ WarningRule::WarningRule(SourceSpan pstate, ExpressionObj msg)
344
321
  : Statement(pstate), message_(msg)
345
322
  { statement_type(WARNING); }
346
- Warning::Warning(const Warning* ptr)
323
+ WarningRule::WarningRule(const WarningRule* ptr)
347
324
  : Statement(ptr), message_(ptr->message_)
348
325
  { statement_type(WARNING); }
349
326
 
350
327
  /////////////////////////////////////////////////////////////////////////
351
328
  /////////////////////////////////////////////////////////////////////////
352
329
 
353
- Error::Error(ParserState pstate, Expression_Obj msg)
330
+ ErrorRule::ErrorRule(SourceSpan pstate, ExpressionObj msg)
354
331
  : Statement(pstate), message_(msg)
355
332
  { statement_type(ERROR); }
356
- Error::Error(const Error* ptr)
333
+ ErrorRule::ErrorRule(const ErrorRule* ptr)
357
334
  : Statement(ptr), message_(ptr->message_)
358
335
  { statement_type(ERROR); }
359
336
 
360
337
  /////////////////////////////////////////////////////////////////////////
361
338
  /////////////////////////////////////////////////////////////////////////
362
339
 
363
- Debug::Debug(ParserState pstate, Expression_Obj val)
340
+ DebugRule::DebugRule(SourceSpan pstate, ExpressionObj val)
364
341
  : Statement(pstate), value_(val)
365
342
  { statement_type(DEBUGSTMT); }
366
- Debug::Debug(const Debug* ptr)
343
+ DebugRule::DebugRule(const DebugRule* ptr)
367
344
  : Statement(ptr), value_(ptr->value_)
368
345
  { statement_type(DEBUGSTMT); }
369
346
 
370
347
  /////////////////////////////////////////////////////////////////////////
371
348
  /////////////////////////////////////////////////////////////////////////
372
349
 
373
- Comment::Comment(ParserState pstate, String_Obj txt, bool is_important)
350
+ Comment::Comment(SourceSpan pstate, String_Obj txt, bool is_important)
374
351
  : Statement(pstate), text_(txt), is_important_(is_important)
375
352
  { statement_type(COMMENT); }
376
353
  Comment::Comment(const Comment* ptr)
@@ -387,30 +364,30 @@ namespace Sass {
387
364
  /////////////////////////////////////////////////////////////////////////
388
365
  /////////////////////////////////////////////////////////////////////////
389
366
 
390
- If::If(ParserState pstate, Expression_Obj pred, Block_Obj con, Block_Obj alt)
391
- : Has_Block(pstate, con), predicate_(pred), alternative_(alt)
367
+ If::If(SourceSpan pstate, ExpressionObj pred, Block_Obj con, Block_Obj alt)
368
+ : ParentStatement(pstate, con), predicate_(pred), alternative_(alt)
392
369
  { statement_type(IF); }
393
370
  If::If(const If* ptr)
394
- : Has_Block(ptr),
371
+ : ParentStatement(ptr),
395
372
  predicate_(ptr->predicate_),
396
373
  alternative_(ptr->alternative_)
397
374
  { statement_type(IF); }
398
375
 
399
376
  bool If::has_content()
400
377
  {
401
- return Has_Block::has_content() || (alternative_ && alternative_->has_content());
378
+ return ParentStatement::has_content() || (alternative_ && alternative_->has_content());
402
379
  }
403
380
 
404
381
  /////////////////////////////////////////////////////////////////////////
405
382
  /////////////////////////////////////////////////////////////////////////
406
383
 
407
- For::For(ParserState pstate,
408
- std::string var, Expression_Obj lo, Expression_Obj hi, Block_Obj b, bool inc)
409
- : Has_Block(pstate, b),
384
+ ForRule::ForRule(SourceSpan pstate,
385
+ sass::string var, ExpressionObj lo, ExpressionObj hi, Block_Obj b, bool inc)
386
+ : ParentStatement(pstate, b),
410
387
  variable_(var), lower_bound_(lo), upper_bound_(hi), is_inclusive_(inc)
411
388
  { statement_type(FOR); }
412
- For::For(const For* ptr)
413
- : Has_Block(ptr),
389
+ ForRule::ForRule(const ForRule* ptr)
390
+ : ParentStatement(ptr),
414
391
  variable_(ptr->variable_),
415
392
  lower_bound_(ptr->lower_bound_),
416
393
  upper_bound_(ptr->upper_bound_),
@@ -420,27 +397,27 @@ namespace Sass {
420
397
  /////////////////////////////////////////////////////////////////////////
421
398
  /////////////////////////////////////////////////////////////////////////
422
399
 
423
- Each::Each(ParserState pstate, std::vector<std::string> vars, Expression_Obj lst, Block_Obj b)
424
- : Has_Block(pstate, b), variables_(vars), list_(lst)
400
+ EachRule::EachRule(SourceSpan pstate, sass::vector<sass::string> vars, ExpressionObj lst, Block_Obj b)
401
+ : ParentStatement(pstate, b), variables_(vars), list_(lst)
425
402
  { statement_type(EACH); }
426
- Each::Each(const Each* ptr)
427
- : Has_Block(ptr), variables_(ptr->variables_), list_(ptr->list_)
403
+ EachRule::EachRule(const EachRule* ptr)
404
+ : ParentStatement(ptr), variables_(ptr->variables_), list_(ptr->list_)
428
405
  { statement_type(EACH); }
429
406
 
430
407
  /////////////////////////////////////////////////////////////////////////
431
408
  /////////////////////////////////////////////////////////////////////////
432
409
 
433
- While::While(ParserState pstate, Expression_Obj pred, Block_Obj b)
434
- : Has_Block(pstate, b), predicate_(pred)
410
+ WhileRule::WhileRule(SourceSpan pstate, ExpressionObj pred, Block_Obj b)
411
+ : ParentStatement(pstate, b), predicate_(pred)
435
412
  { statement_type(WHILE); }
436
- While::While(const While* ptr)
437
- : Has_Block(ptr), predicate_(ptr->predicate_)
413
+ WhileRule::WhileRule(const WhileRule* ptr)
414
+ : ParentStatement(ptr), predicate_(ptr->predicate_)
438
415
  { statement_type(WHILE); }
439
416
 
440
417
  /////////////////////////////////////////////////////////////////////////
441
418
  /////////////////////////////////////////////////////////////////////////
442
419
 
443
- Return::Return(ParserState pstate, Expression_Obj val)
420
+ Return::Return(SourceSpan pstate, ExpressionObj val)
444
421
  : Statement(pstate), value_(val)
445
422
  { statement_type(RETURN); }
446
423
  Return::Return(const Return* ptr)
@@ -450,18 +427,26 @@ namespace Sass {
450
427
  /////////////////////////////////////////////////////////////////////////
451
428
  /////////////////////////////////////////////////////////////////////////
452
429
 
453
- Extension::Extension(ParserState pstate, Selector_List_Obj s)
454
- : Statement(pstate), selector_(s)
430
+ ExtendRule::ExtendRule(SourceSpan pstate, SelectorListObj s)
431
+ : Statement(pstate), isOptional_(false), selector_(s), schema_()
455
432
  { statement_type(EXTEND); }
456
- Extension::Extension(const Extension* ptr)
457
- : Statement(ptr), selector_(ptr->selector_)
433
+ ExtendRule::ExtendRule(SourceSpan pstate, Selector_Schema_Obj s)
434
+ : Statement(pstate), isOptional_(false), selector_(), schema_(s)
435
+ {
436
+ statement_type(EXTEND);
437
+ }
438
+ ExtendRule::ExtendRule(const ExtendRule* ptr)
439
+ : Statement(ptr),
440
+ isOptional_(ptr->isOptional_),
441
+ selector_(ptr->selector_),
442
+ schema_(ptr->schema_)
458
443
  { statement_type(EXTEND); }
459
444
 
460
445
  /////////////////////////////////////////////////////////////////////////
461
446
  /////////////////////////////////////////////////////////////////////////
462
447
 
463
448
  Definition::Definition(const Definition* ptr)
464
- : Has_Block(ptr),
449
+ : ParentStatement(ptr),
465
450
  name_(ptr->name_),
466
451
  parameters_(ptr->parameters_),
467
452
  environment_(ptr->environment_),
@@ -473,12 +458,12 @@ namespace Sass {
473
458
  signature_(ptr->signature_)
474
459
  { }
475
460
 
476
- Definition::Definition(ParserState pstate,
477
- std::string n,
461
+ Definition::Definition(SourceSpan pstate,
462
+ sass::string n,
478
463
  Parameters_Obj params,
479
464
  Block_Obj b,
480
465
  Type t)
481
- : Has_Block(pstate, b),
466
+ : ParentStatement(pstate, b),
482
467
  name_(n),
483
468
  parameters_(params),
484
469
  environment_(0),
@@ -490,13 +475,13 @@ namespace Sass {
490
475
  signature_(0)
491
476
  { }
492
477
 
493
- Definition::Definition(ParserState pstate,
478
+ Definition::Definition(SourceSpan pstate,
494
479
  Signature sig,
495
- std::string n,
480
+ sass::string n,
496
481
  Parameters_Obj params,
497
482
  Native_Function func_ptr,
498
483
  bool overload_stub)
499
- : Has_Block(pstate, {}),
484
+ : ParentStatement(pstate, {}),
500
485
  name_(n),
501
486
  parameters_(params),
502
487
  environment_(0),
@@ -508,12 +493,12 @@ namespace Sass {
508
493
  signature_(sig)
509
494
  { }
510
495
 
511
- Definition::Definition(ParserState pstate,
496
+ Definition::Definition(SourceSpan pstate,
512
497
  Signature sig,
513
- std::string n,
498
+ sass::string n,
514
499
  Parameters_Obj params,
515
500
  Sass_Function_Entry c_func)
516
- : Has_Block(pstate, {}),
501
+ : ParentStatement(pstate, {}),
517
502
  name_(n),
518
503
  parameters_(params),
519
504
  environment_(0),
@@ -528,11 +513,11 @@ namespace Sass {
528
513
  /////////////////////////////////////////////////////////////////////////
529
514
  /////////////////////////////////////////////////////////////////////////
530
515
 
531
- Mixin_Call::Mixin_Call(ParserState pstate, std::string n, Arguments_Obj args, Parameters_Obj b_params, Block_Obj b)
532
- : Has_Block(pstate, b), name_(n), arguments_(args), block_parameters_(b_params)
516
+ Mixin_Call::Mixin_Call(SourceSpan pstate, sass::string n, Arguments_Obj args, Parameters_Obj b_params, Block_Obj b)
517
+ : ParentStatement(pstate, b), name_(n), arguments_(args), block_parameters_(b_params)
533
518
  { }
534
519
  Mixin_Call::Mixin_Call(const Mixin_Call* ptr)
535
- : Has_Block(ptr),
520
+ : ParentStatement(ptr),
536
521
  name_(ptr->name_),
537
522
  arguments_(ptr->arguments_),
538
523
  block_parameters_(ptr->block_parameters_)
@@ -541,7 +526,7 @@ namespace Sass {
541
526
  /////////////////////////////////////////////////////////////////////////
542
527
  /////////////////////////////////////////////////////////////////////////
543
528
 
544
- Content::Content(ParserState pstate, Arguments_Obj args)
529
+ Content::Content(SourceSpan pstate, Arguments_Obj args)
545
530
  : Statement(pstate),
546
531
  arguments_(args)
547
532
  { statement_type(CONTENT); }
@@ -553,7 +538,7 @@ namespace Sass {
553
538
  /////////////////////////////////////////////////////////////////////////
554
539
  /////////////////////////////////////////////////////////////////////////
555
540
 
556
- Expression::Expression(ParserState pstate, bool d, bool e, bool i, Type ct)
541
+ Expression::Expression(SourceSpan pstate, bool d, bool e, bool i, Type ct)
557
542
  : AST_Node(pstate),
558
543
  is_delayed_(d),
559
544
  is_expanded_(e),
@@ -572,7 +557,7 @@ namespace Sass {
572
557
  /////////////////////////////////////////////////////////////////////////
573
558
  /////////////////////////////////////////////////////////////////////////
574
559
 
575
- Unary_Expression::Unary_Expression(ParserState pstate, Type t, Expression_Obj o)
560
+ Unary_Expression::Unary_Expression(SourceSpan pstate, Type t, ExpressionObj o)
576
561
  : Expression(pstate), optype_(t), operand_(o), hash_(0)
577
562
  { }
578
563
  Unary_Expression::Unary_Expression(const Unary_Expression* ptr)
@@ -581,7 +566,7 @@ namespace Sass {
581
566
  operand_(ptr->operand_),
582
567
  hash_(ptr->hash_)
583
568
  { }
584
- const std::string Unary_Expression::type_name() {
569
+ const sass::string Unary_Expression::type_name() {
585
570
  switch (optype_) {
586
571
  case PLUS: return "plus";
587
572
  case MINUS: return "minus";
@@ -617,7 +602,7 @@ namespace Sass {
617
602
  /////////////////////////////////////////////////////////////////////////
618
603
  /////////////////////////////////////////////////////////////////////////
619
604
 
620
- Argument::Argument(ParserState pstate, Expression_Obj val, std::string n, bool rest, bool keyword)
605
+ Argument::Argument(SourceSpan pstate, ExpressionObj val, sass::string n, bool rest, bool keyword)
621
606
  : Expression(pstate), value_(val), name_(n), is_rest_argument_(rest), is_keyword_argument_(keyword), hash_(0)
622
607
  {
623
608
  if (!name_.empty() && is_rest_argument_) {
@@ -661,7 +646,7 @@ namespace Sass {
661
646
  size_t Argument::hash() const
662
647
  {
663
648
  if (hash_ == 0) {
664
- hash_ = std::hash<std::string>()(name());
649
+ hash_ = std::hash<sass::string>()(name());
665
650
  hash_combine(hash_, value()->hash());
666
651
  }
667
652
  return hash_;
@@ -670,7 +655,7 @@ namespace Sass {
670
655
  /////////////////////////////////////////////////////////////////////////
671
656
  /////////////////////////////////////////////////////////////////////////
672
657
 
673
- Arguments::Arguments(ParserState pstate)
658
+ Arguments::Arguments(SourceSpan pstate)
674
659
  : Expression(pstate),
675
660
  Vectorized<Argument_Obj>(),
676
661
  has_named_arguments_(false),
@@ -753,13 +738,13 @@ namespace Sass {
753
738
  /////////////////////////////////////////////////////////////////////////
754
739
  /////////////////////////////////////////////////////////////////////////
755
740
 
756
- Media_Query::Media_Query(ParserState pstate, String_Obj t, size_t s, bool n, bool r)
757
- : Expression(pstate), Vectorized<Media_Query_Expression_Obj>(s),
741
+ Media_Query::Media_Query(SourceSpan pstate, String_Obj t, size_t s, bool n, bool r)
742
+ : Expression(pstate), Vectorized<Media_Query_ExpressionObj>(s),
758
743
  media_type_(t), is_negated_(n), is_restricted_(r)
759
744
  { }
760
745
  Media_Query::Media_Query(const Media_Query* ptr)
761
746
  : Expression(ptr),
762
- Vectorized<Media_Query_Expression_Obj>(*ptr),
747
+ Vectorized<Media_Query_ExpressionObj>(*ptr),
763
748
  media_type_(ptr->media_type_),
764
749
  is_negated_(ptr->is_negated_),
765
750
  is_restricted_(ptr->is_restricted_)
@@ -768,8 +753,8 @@ namespace Sass {
768
753
  /////////////////////////////////////////////////////////////////////////
769
754
  /////////////////////////////////////////////////////////////////////////
770
755
 
771
- Media_Query_Expression::Media_Query_Expression(ParserState pstate,
772
- Expression_Obj f, Expression_Obj v, bool i)
756
+ Media_Query_Expression::Media_Query_Expression(SourceSpan pstate,
757
+ ExpressionObj f, ExpressionObj v, bool i)
773
758
  : Expression(pstate), feature_(f), value_(v), is_interpolated_(i)
774
759
  { }
775
760
  Media_Query_Expression::Media_Query_Expression(const Media_Query_Expression* ptr)
@@ -782,7 +767,7 @@ namespace Sass {
782
767
  /////////////////////////////////////////////////////////////////////////
783
768
  /////////////////////////////////////////////////////////////////////////
784
769
 
785
- At_Root_Query::At_Root_Query(ParserState pstate, Expression_Obj f, Expression_Obj v, bool i)
770
+ At_Root_Query::At_Root_Query(SourceSpan pstate, ExpressionObj f, ExpressionObj v, bool i)
786
771
  : Expression(pstate), feature_(f), value_(v)
787
772
  { }
788
773
  At_Root_Query::At_Root_Query(const At_Root_Query* ptr)
@@ -791,11 +776,11 @@ namespace Sass {
791
776
  value_(ptr->value_)
792
777
  { }
793
778
 
794
- bool At_Root_Query::exclude(std::string str)
779
+ bool At_Root_Query::exclude(sass::string str)
795
780
  {
796
781
  bool with = feature() && unquote(feature()->to_string()).compare("with") == 0;
797
782
  List* l = static_cast<List*>(value().ptr());
798
- std::string v;
783
+ sass::string v;
799
784
 
800
785
  if (with)
801
786
  {
@@ -822,18 +807,18 @@ namespace Sass {
822
807
  /////////////////////////////////////////////////////////////////////////
823
808
  /////////////////////////////////////////////////////////////////////////
824
809
 
825
- At_Root_Block::At_Root_Block(ParserState pstate, Block_Obj b, At_Root_Query_Obj e)
826
- : Has_Block(pstate, b), expression_(e)
810
+ AtRootRule::AtRootRule(SourceSpan pstate, Block_Obj b, At_Root_Query_Obj e)
811
+ : ParentStatement(pstate, b), expression_(e)
827
812
  { statement_type(ATROOT); }
828
- At_Root_Block::At_Root_Block(const At_Root_Block* ptr)
829
- : Has_Block(ptr), expression_(ptr->expression_)
813
+ AtRootRule::AtRootRule(const AtRootRule* ptr)
814
+ : ParentStatement(ptr), expression_(ptr->expression_)
830
815
  { statement_type(ATROOT); }
831
816
 
832
- bool At_Root_Block::bubbles() {
817
+ bool AtRootRule::bubbles() {
833
818
  return true;
834
819
  }
835
820
 
836
- bool At_Root_Block::exclude_node(Statement_Obj s) {
821
+ bool AtRootRule::exclude_node(Statement_Obj s) {
837
822
  if (expression() == nullptr)
838
823
  {
839
824
  return s->statement_type() == Statement::RULESET;
@@ -841,9 +826,9 @@ namespace Sass {
841
826
 
842
827
  if (s->statement_type() == Statement::DIRECTIVE)
843
828
  {
844
- if (Directive_Obj dir = Cast<Directive>(s))
829
+ if (AtRuleObj dir = Cast<AtRule>(s))
845
830
  {
846
- std::string keyword(dir->keyword());
831
+ sass::string keyword(dir->keyword());
847
832
  if (keyword.length() > 0) keyword.erase(0, 1);
848
833
  return expression()->exclude(keyword);
849
834
  }
@@ -860,7 +845,7 @@ namespace Sass {
860
845
  {
861
846
  return expression()->exclude("supports");
862
847
  }
863
- if (Directive_Obj dir = Cast<Directive>(s))
848
+ if (AtRuleObj dir = Cast<AtRule>(s))
864
849
  {
865
850
  if (dir->is_keyframes()) return expression()->exclude("keyframes");
866
851
  }
@@ -870,7 +855,7 @@ namespace Sass {
870
855
  /////////////////////////////////////////////////////////////////////////
871
856
  /////////////////////////////////////////////////////////////////////////
872
857
 
873
- Parameter::Parameter(ParserState pstate, std::string n, Expression_Obj def, bool rest)
858
+ Parameter::Parameter(SourceSpan pstate, sass::string n, ExpressionObj def, bool rest)
874
859
  : AST_Node(pstate), name_(n), default_value_(def), is_rest_parameter_(rest)
875
860
  { }
876
861
  Parameter::Parameter(const Parameter* ptr)
@@ -883,7 +868,7 @@ namespace Sass {
883
868
  /////////////////////////////////////////////////////////////////////////
884
869
  /////////////////////////////////////////////////////////////////////////
885
870
 
886
- Parameters::Parameters(ParserState pstate)
871
+ Parameters::Parameters(SourceSpan pstate)
887
872
  : AST_Node(pstate),
888
873
  Vectorized<Parameter_Obj>(),
889
874
  has_optional_parameters_(false),
@@ -923,23 +908,28 @@ namespace Sass {
923
908
  /////////////////////////////////////////////////////////////////////////
924
909
  /////////////////////////////////////////////////////////////////////////
925
910
 
926
- IMPLEMENT_AST_OPERATORS(Ruleset);
927
- IMPLEMENT_AST_OPERATORS(Media_Block);
911
+ // If you forget to add a class here you will get
912
+ // undefined reference to `vtable for Sass::Class'
913
+
914
+ IMPLEMENT_AST_OPERATORS(StyleRule);
915
+ IMPLEMENT_AST_OPERATORS(MediaRule);
916
+ IMPLEMENT_AST_OPERATORS(CssMediaRule);
917
+ IMPLEMENT_AST_OPERATORS(CssMediaQuery);
928
918
  IMPLEMENT_AST_OPERATORS(Import);
929
919
  IMPLEMENT_AST_OPERATORS(Import_Stub);
930
- IMPLEMENT_AST_OPERATORS(Directive);
931
- IMPLEMENT_AST_OPERATORS(At_Root_Block);
932
- IMPLEMENT_AST_OPERATORS(While);
933
- IMPLEMENT_AST_OPERATORS(Each);
934
- IMPLEMENT_AST_OPERATORS(For);
920
+ IMPLEMENT_AST_OPERATORS(AtRule);
921
+ IMPLEMENT_AST_OPERATORS(AtRootRule);
922
+ IMPLEMENT_AST_OPERATORS(WhileRule);
923
+ IMPLEMENT_AST_OPERATORS(EachRule);
924
+ IMPLEMENT_AST_OPERATORS(ForRule);
935
925
  IMPLEMENT_AST_OPERATORS(If);
936
926
  IMPLEMENT_AST_OPERATORS(Mixin_Call);
937
- IMPLEMENT_AST_OPERATORS(Extension);
927
+ IMPLEMENT_AST_OPERATORS(ExtendRule);
938
928
  IMPLEMENT_AST_OPERATORS(Media_Query);
939
929
  IMPLEMENT_AST_OPERATORS(Media_Query_Expression);
940
- IMPLEMENT_AST_OPERATORS(Debug);
941
- IMPLEMENT_AST_OPERATORS(Error);
942
- IMPLEMENT_AST_OPERATORS(Warning);
930
+ IMPLEMENT_AST_OPERATORS(DebugRule);
931
+ IMPLEMENT_AST_OPERATORS(ErrorRule);
932
+ IMPLEMENT_AST_OPERATORS(WarningRule);
943
933
  IMPLEMENT_AST_OPERATORS(Assignment);
944
934
  IMPLEMENT_AST_OPERATORS(Return);
945
935
  IMPLEMENT_AST_OPERATORS(At_Root_Query);