sassc 0.0.9 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -1
  3. data/ext/libsass/.gitignore +13 -6
  4. data/ext/libsass/Makefile +42 -26
  5. data/ext/libsass/Makefile.am +43 -30
  6. data/ext/libsass/Readme.md +4 -2
  7. data/ext/libsass/appveyor.yml +10 -14
  8. data/ext/libsass/ast.cpp +54 -44
  9. data/ext/libsass/ast.hpp +404 -236
  10. data/ext/libsass/ast_def_macros.hpp +5 -0
  11. data/ext/libsass/ast_factory.hpp +6 -3
  12. data/ext/libsass/ast_fwd_decl.hpp +12 -0
  13. data/ext/libsass/b64/encode.h +2 -2
  14. data/ext/libsass/backtrace.hpp +13 -17
  15. data/ext/libsass/base64vlq.hpp +4 -1
  16. data/ext/libsass/bind.cpp +12 -15
  17. data/ext/libsass/bind.hpp +6 -6
  18. data/ext/libsass/color_names.hpp +4 -1
  19. data/ext/libsass/configure.ac +7 -21
  20. data/ext/libsass/constants.cpp +6 -4
  21. data/ext/libsass/constants.hpp +10 -4
  22. data/ext/libsass/context.cpp +89 -58
  23. data/ext/libsass/context.hpp +28 -35
  24. data/ext/libsass/contextualize.cpp +20 -10
  25. data/ext/libsass/contextualize.hpp +8 -23
  26. data/ext/libsass/contrib/libsass.spec +66 -0
  27. data/ext/libsass/cssize.cpp +547 -0
  28. data/ext/libsass/cssize.hpp +82 -0
  29. data/ext/libsass/debug.hpp +3 -3
  30. data/ext/libsass/debugger.hpp +358 -0
  31. data/ext/libsass/emitter.cpp +255 -0
  32. data/ext/libsass/emitter.hpp +83 -0
  33. data/ext/libsass/environment.hpp +7 -3
  34. data/ext/libsass/error_handling.cpp +11 -14
  35. data/ext/libsass/error_handling.hpp +9 -7
  36. data/ext/libsass/eval.cpp +253 -161
  37. data/ext/libsass/eval.hpp +13 -13
  38. data/ext/libsass/expand.cpp +135 -64
  39. data/ext/libsass/expand.hpp +11 -13
  40. data/ext/libsass/extend.cpp +66 -20
  41. data/ext/libsass/extend.hpp +6 -11
  42. data/ext/libsass/file.cpp +31 -26
  43. data/ext/libsass/file.hpp +6 -1
  44. data/ext/libsass/functions.cpp +270 -287
  45. data/ext/libsass/functions.hpp +8 -11
  46. data/ext/libsass/inspect.cpp +385 -255
  47. data/ext/libsass/inspect.hpp +15 -26
  48. data/ext/libsass/kwd_arg_macros.hpp +5 -0
  49. data/ext/libsass/mapping.hpp +4 -3
  50. data/ext/libsass/memory_manager.hpp +5 -2
  51. data/ext/libsass/node.cpp +50 -50
  52. data/ext/libsass/node.hpp +26 -27
  53. data/ext/libsass/operation.hpp +15 -4
  54. data/ext/libsass/output.cpp +401 -0
  55. data/ext/libsass/output.hpp +56 -0
  56. data/ext/libsass/parser.cpp +573 -399
  57. data/ext/libsass/parser.hpp +122 -88
  58. data/ext/libsass/paths.hpp +7 -2
  59. data/ext/libsass/plugins.cpp +155 -0
  60. data/ext/libsass/plugins.hpp +56 -0
  61. data/ext/libsass/position.cpp +128 -0
  62. data/ext/libsass/position.hpp +108 -11
  63. data/ext/libsass/prelexer.cpp +184 -110
  64. data/ext/libsass/prelexer.hpp +131 -24
  65. data/ext/libsass/remove_placeholders.cpp +1 -1
  66. data/ext/libsass/remove_placeholders.hpp +6 -6
  67. data/ext/libsass/sass.cpp +3 -3
  68. data/ext/libsass/sass.h +12 -4
  69. data/ext/libsass/sass2scss.cpp +3 -2
  70. data/ext/libsass/sass2scss.h +5 -0
  71. data/ext/libsass/sass_context.cpp +136 -37
  72. data/ext/libsass/sass_context.h +19 -10
  73. data/ext/libsass/sass_functions.cpp +29 -2
  74. data/ext/libsass/sass_functions.h +8 -2
  75. data/ext/libsass/sass_interface.cpp +32 -23
  76. data/ext/libsass/sass_interface.h +9 -4
  77. data/ext/libsass/sass_util.cpp +19 -23
  78. data/ext/libsass/sass_util.hpp +28 -27
  79. data/ext/libsass/sass_values.cpp +6 -4
  80. data/ext/libsass/sass_values.h +3 -3
  81. data/ext/libsass/script/ci-build-libsass +13 -1
  82. data/ext/libsass/script/ci-report-coverage +2 -1
  83. data/ext/libsass/source_map.cpp +79 -28
  84. data/ext/libsass/source_map.hpp +35 -16
  85. data/ext/libsass/subset_map.hpp +6 -4
  86. data/ext/libsass/to_c.hpp +4 -4
  87. data/ext/libsass/to_string.cpp +13 -8
  88. data/ext/libsass/to_string.hpp +6 -4
  89. data/ext/libsass/units.cpp +2 -1
  90. data/ext/libsass/units.hpp +6 -1
  91. data/ext/libsass/utf8_string.cpp +0 -5
  92. data/ext/libsass/utf8_string.hpp +3 -2
  93. data/ext/libsass/util.cpp +461 -49
  94. data/ext/libsass/util.hpp +34 -13
  95. data/ext/libsass/version.sh +10 -0
  96. data/ext/libsass/win/libsass.filters +20 -11
  97. data/ext/libsass/win/libsass.vcxproj +11 -8
  98. data/lib/sassc/importer.rb +1 -8
  99. data/lib/sassc/native.rb +7 -0
  100. data/lib/sassc/native/native_context_api.rb +5 -5
  101. data/lib/sassc/version.rb +1 -1
  102. data/test/native_test.rb +1 -1
  103. metadata +14 -10
  104. data/ext/libsass/copy_c_str.cpp +0 -13
  105. data/ext/libsass/copy_c_str.hpp +0 -5
  106. data/ext/libsass/output_compressed.cpp +0 -401
  107. data/ext/libsass/output_compressed.hpp +0 -95
  108. data/ext/libsass/output_nested.cpp +0 -364
  109. data/ext/libsass/output_nested.hpp +0 -108
  110. data/ext/libsass/test-driver +0 -127
  111. data/ext/libsass/token.hpp +0 -32
@@ -1,24 +1,23 @@
1
+ #ifndef SASS_SASS_UTIL_H
2
+ #define SASS_SASS_UTIL_H
3
+
1
4
  #include <deque>
2
5
  #include <iostream>
3
6
 
4
- #ifndef SASS_AST
5
7
  #include "ast.hpp"
6
- #endif
7
-
8
8
  #include "node.hpp"
9
9
  #include "debug.hpp"
10
10
 
11
-
12
11
  namespace Sass {
13
12
 
14
-
13
+
15
14
  using namespace std;
16
15
 
17
16
 
18
17
  /*
19
18
  This is for ports of functions in the Sass:Util module.
20
19
  */
21
-
20
+
22
21
 
23
22
  /*
24
23
  # Return a Node collection of all possible paths through the given Node collection of Node collections.
@@ -34,8 +33,8 @@ namespace Sass {
34
33
  # # [2, 4, 5]]
35
34
  */
36
35
  Node paths(const Node& arrs, Context& ctx);
37
-
38
-
36
+
37
+
39
38
  /*
40
39
  This class is a default implementation of a Node comparator that can be passed to the lcs function below.
41
40
  It uses operator== for equality comparision. It then returns one if the Nodes are equal.
@@ -54,13 +53,13 @@ namespace Sass {
54
53
  }
55
54
  };
56
55
 
57
-
56
+
58
57
  typedef vector<vector<int> > LCSTable;
59
-
60
-
58
+
59
+
61
60
  /*
62
61
  This is the equivalent of ruby's Sass::Util.lcs_backtrace.
63
-
62
+
64
63
  # Computes a single longest common subsequence for arrays x and y.
65
64
  # Algorithm from http://en.wikipedia.org/wiki/Longest_common_subsequence_problem#Reading_out_an_LCS
66
65
  */
@@ -72,7 +71,7 @@ namespace Sass {
72
71
  DEBUG_PRINTLN(LCS, "RETURNING EMPTY")
73
72
  return Node::createCollection();
74
73
  }
75
-
74
+
76
75
  NodeDeque& xChildren = *(x.collection());
77
76
  NodeDeque& yChildren = *(y.collection());
78
77
 
@@ -83,20 +82,20 @@ namespace Sass {
83
82
  result.collection()->push_back(compareOut);
84
83
  return result;
85
84
  }
86
-
85
+
87
86
  if (c[i][j - 1] > c[i - 1][j]) {
88
87
  DEBUG_PRINTLN(LCS, "RETURNING AFTER TABLE COMPARE")
89
88
  return lcs_backtrace(c, x, y, i, j - 1, comparator);
90
89
  }
91
-
90
+
92
91
  DEBUG_PRINTLN(LCS, "FINAL RETURN")
93
92
  return lcs_backtrace(c, x, y, i - 1, j, comparator);
94
93
  }
95
-
94
+
96
95
 
97
96
  /*
98
97
  This is the equivalent of ruby's Sass::Util.lcs_table.
99
-
98
+
100
99
  # Calculates the memoization table for the Least Common Subsequence algorithm.
101
100
  # Algorithm from http://en.wikipedia.org/wiki/Longest_common_subsequence_problem#Computing_the_length_of_the_LCS
102
101
  */
@@ -108,7 +107,7 @@ namespace Sass {
108
107
  NodeDeque& yChildren = *(y.collection());
109
108
 
110
109
  LCSTable c(xChildren.size(), vector<int>(yChildren.size()));
111
-
110
+
112
111
  // These shouldn't be necessary since the vector will be initialized to 0 already.
113
112
  // x.size.times {|i| c[i][0] = 0}
114
113
  // y.size.times {|j| c[0][j] = 0}
@@ -131,7 +130,7 @@ namespace Sass {
131
130
 
132
131
  /*
133
132
  This is the equivalent of ruby's Sass::Util.lcs.
134
-
133
+
135
134
  # Computes a single longest common subsequence for `x` and `y`.
136
135
  # If there are more than one longest common subsequences,
137
136
  # the one returned is that which starts first in `x`.
@@ -150,14 +149,14 @@ namespace Sass {
150
149
  Node newX = Node::createCollection();
151
150
  newX.collection()->push_back(Node::createNil());
152
151
  newX.plus(x);
153
-
152
+
154
153
  Node newY = Node::createCollection();
155
154
  newY.collection()->push_back(Node::createNil());
156
155
  newY.plus(y);
157
-
156
+
158
157
  LCSTable table;
159
158
  lcs_table(newX, newY, comparator, table);
160
-
159
+
161
160
  return lcs_backtrace(table, newX, newY, static_cast<int>(newX.collection()->size()) - 1, static_cast<int>(newY.collection()->size()) - 1, comparator);
162
161
  }
163
162
 
@@ -167,7 +166,7 @@ namespace Sass {
167
166
  Sass::Util.flatten requires the number of levels to flatten, while
168
167
  [].flatten doesn't and will flatten the entire array. This function
169
168
  supports both.
170
-
169
+
171
170
  # Flattens the first `n` nested arrays. If n == -1, all arrays will be flattened
172
171
  #
173
172
  # @param arr [NodeCollection] The array to flatten
@@ -189,10 +188,10 @@ namespace Sass {
189
188
  # @return [Array<[Object, Array]>] An array of pairs.
190
189
 
191
190
  TODO: update @param and @return once I know what those are.
192
-
191
+
193
192
  The following is the modified version of the ruby code that was more portable to C++. You
194
193
  should be able to drop it into ruby 3.2.19 and get the same results from ruby sass.
195
-
194
+
196
195
  def group_by_to_a(enum, &block)
197
196
  order = {}
198
197
 
@@ -230,7 +229,7 @@ namespace Sass {
230
229
 
231
230
  for (typename vector<EnumType>::iterator enumIter = enumeration.begin(), enumIterEnd = enumeration.end(); enumIter != enumIterEnd; enumIter++) {
232
231
  EnumType& e = *enumIter;
233
-
232
+
234
233
  KeyType key = keyFunc(e);
235
234
 
236
235
  if (grouped.find(key) == grouped.end()) {
@@ -244,7 +243,7 @@ namespace Sass {
244
243
  collection.push_back(e);
245
244
  }
246
245
  }
247
-
246
+
248
247
  for (unsigned int index = 0; index < order.size(); index++) {
249
248
  KeyType& key = order.at(index);
250
249
  vector<EnumType>& values = grouped.at(key);
@@ -257,3 +256,5 @@ namespace Sass {
257
256
 
258
257
 
259
258
  }
259
+
260
+ #endif
@@ -6,10 +6,12 @@
6
6
 
7
7
  #include <cstdlib>
8
8
  #include <cstring>
9
+ #include "util.hpp"
9
10
  #include "sass_values.h"
10
11
 
11
12
  extern "C" {
12
13
  using namespace std;
14
+ using namespace Sass;
13
15
 
14
16
  struct Sass_Unknown {
15
17
  enum Sass_Tag tag;
@@ -164,7 +166,7 @@ extern "C" {
164
166
  if (v == 0) return 0;
165
167
  v->number.tag = SASS_NUMBER;
166
168
  v->number.value = val;
167
- v->number.unit = strdup(unit);
169
+ v->number.unit = unit ? sass_strdup(unit) : 0;
168
170
  if (v->number.unit == 0) { free(v); return 0; }
169
171
  return v;
170
172
  }
@@ -186,7 +188,7 @@ extern "C" {
186
188
  Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
187
189
  if (v == 0) return 0;
188
190
  v->string.tag = SASS_STRING;
189
- v->string.value = strdup(val);
191
+ v->string.value = val ? sass_strdup(val) : 0;
190
192
  if (v->string.value == 0) { free(v); return 0; }
191
193
  return v;
192
194
  }
@@ -227,7 +229,7 @@ extern "C" {
227
229
  Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
228
230
  if (v == 0) return 0;
229
231
  v->error.tag = SASS_ERROR;
230
- v->error.message = strdup(msg);
232
+ v->error.message = msg ? sass_strdup(msg) : 0;
231
233
  if (v->error.message == 0) { free(v); return 0; }
232
234
  return v;
233
235
  }
@@ -237,7 +239,7 @@ extern "C" {
237
239
  Sass_Value* v = (Sass_Value*) calloc(1, sizeof(Sass_Value));
238
240
  if (v == 0) return 0;
239
241
  v->warning.tag = SASS_WARNING;
240
- v->warning.message = strdup(msg);
242
+ v->warning.message = msg ? sass_strdup(msg) : 0;
241
243
  if (v->warning.message == 0) { free(v); return 0; }
242
244
  return v;
243
245
  }
@@ -1,5 +1,5 @@
1
- #ifndef SASS_C_VALUES
2
- #define SASS_C_VALUES
1
+ #ifndef SASS_C_VALUES_H
2
+ #define SASS_C_VALUES_H
3
3
 
4
4
  #include <stddef.h>
5
5
  #include <stdbool.h>
@@ -83,7 +83,7 @@ ADDAPI void ADDCALL sass_list_set_value (union Sass_Value* v, size_t i, union Sa
83
83
 
84
84
  // Getter for the number of items in map
85
85
  ADDAPI size_t ADDCALL sass_map_get_length (const union Sass_Value* v);
86
- // Getters and setters for Sass_List keys and values
86
+ // Getters and setters for Sass_Map keys and values
87
87
  ADDAPI union Sass_Value* ADDCALL sass_map_get_key (const union Sass_Value* v, size_t i);
88
88
  ADDAPI void ADDCALL sass_map_set_key (union Sass_Value* v, size_t i, union Sass_Value*);
89
89
  ADDAPI union Sass_Value* ADDCALL sass_map_get_value (const union Sass_Value* v, size_t i);
@@ -30,13 +30,18 @@ else
30
30
  MAKE_TARGET="shared"
31
31
  fi
32
32
 
33
- MAKE_OPTS="$MAKE_OPTS -j3 V=1"
33
+ if [ "$(expr substr $(uname -s) 1 10)" == "MINGW32_NT" ]; then
34
+ MAKE_OPTS="$MAKE_OPTS -j1 V=1"
35
+ else
36
+ MAKE_OPTS="$MAKE_OPTS -j3 V=1"
37
+ fi
34
38
 
35
39
  if [ "x$AUTOTOOLS" == "xyes" ]; then
36
40
 
37
41
  echo -en 'travis_fold:start:configure\r'
38
42
  autoreconf --force --install
39
43
  ./configure --enable-tests $COVERAGE_OPT \
44
+ --prefix=build \
40
45
  --disable-silent-rules \
41
46
  --with-sassc-dir=$SASS_SASSC_PATH \
42
47
  --with-sass-spec-dir=$SASS_SPEC_PATH \
@@ -44,8 +49,15 @@ if [ "x$AUTOTOOLS" == "xyes" ]; then
44
49
  ${SHARED_OPT}
45
50
  echo -en 'travis_fold:end:configure\r'
46
51
 
52
+ make clean
53
+
47
54
  make $MAKE_OPTS install
48
55
 
56
+ if [ -d build/lib ]; then
57
+ mkdir -p lib
58
+ cp -a build/lib/* lib/
59
+ fi
60
+
49
61
  else
50
62
 
51
63
  make clean
@@ -9,7 +9,8 @@ if [ "x$COVERAGE" = "xyes" ]; then
9
9
  --exclude cencode.c --exclude b64
10
10
  --exclude utf8 --exclude utf8_string.hpp
11
11
  --exclude utf8.h --exclude utf8_string.cpp
12
- --exclude test"
12
+ --exclude sass2scss.h --exclude sass2scss.cpp
13
+ --exclude test --exclude posix"
13
14
  # debug via gcovr
14
15
  gcov -v
15
16
  gcovr -r .
@@ -1,18 +1,19 @@
1
- #include "source_map.hpp"
2
- #include "json.hpp"
3
-
4
- #ifndef SASS_CONTEXT
5
- #include "context.hpp"
6
- #endif
7
-
8
1
  #include <string>
9
2
  #include <sstream>
3
+ #include <iostream>
10
4
  #include <cstddef>
11
5
  #include <iomanip>
12
6
 
7
+ #include "ast.hpp"
8
+ #include "json.hpp"
9
+ #include "context.hpp"
10
+ #include "position.hpp"
11
+ #include "source_map.hpp"
12
+
13
13
  namespace Sass {
14
14
  using std::ptrdiff_t;
15
- SourceMap::SourceMap(const string& file) : current_position(Position(1, 1)), file(file) { }
15
+ SourceMap::SourceMap() : current_position(0, 0, 0), file("stdin") { }
16
+ SourceMap::SourceMap(const string& file) : current_position(0, 0, 0), file(file) { }
16
17
 
17
18
  string SourceMap::generate_source_map(Context &ctx) {
18
19
 
@@ -20,10 +21,16 @@ namespace Sass {
20
21
  const vector<string> includes = ctx.include_links;
21
22
  const vector<const char*> sources = ctx.sources;
22
23
 
23
- JsonNode *json_srcmap = json_mkobject();
24
+ JsonNode* json_srcmap = json_mkobject();
24
25
 
25
26
  json_append_member(json_srcmap, "version", json_mknumber(3));
26
27
 
28
+ // pass-through sourceRoot option
29
+ if (!ctx.source_map_root.empty()) {
30
+ JsonNode* root = json_mkstring(ctx.source_map_root.c_str());
31
+ json_append_member(json_srcmap, "sourceRoot", root);
32
+ }
33
+
27
34
  const char *include = file.c_str();
28
35
  JsonNode *json_include = json_mkstring(include);
29
36
  json_append_member(json_srcmap, "file", json_include);
@@ -71,11 +78,11 @@ namespace Sass {
71
78
  size_t previous_original_column = 0;
72
79
  size_t previous_original_file = 0;
73
80
  for (size_t i = 0; i < mappings.size(); ++i) {
74
- const size_t generated_line = mappings[i].generated_position.line - 1;
75
- const size_t generated_column = mappings[i].generated_position.column - 1;
76
- const size_t original_line = mappings[i].original_position.line - 1;
77
- const size_t original_column = mappings[i].original_position.column - 1;
78
- const size_t original_file = mappings[i].original_position.file - 1;
81
+ const size_t generated_line = mappings[i].generated_position.line;
82
+ const size_t generated_column = mappings[i].generated_position.column;
83
+ const size_t original_line = mappings[i].original_position.line;
84
+ const size_t original_column = mappings[i].original_position.column;
85
+ const size_t original_file = mappings[i].original_position.file;
79
86
 
80
87
  if (generated_line != previous_generated_line) {
81
88
  previous_generated_column = 0;
@@ -105,29 +112,73 @@ namespace Sass {
105
112
  return result;
106
113
  }
107
114
 
108
- void SourceMap::remove_line()
115
+ void SourceMap::prepend(const OutputBuffer& out)
109
116
  {
110
- // prevent removing non existing lines
111
- if (current_position.line > 1) {
112
- current_position.line -= 1;
113
- current_position.column = 1;
117
+ Offset size(out.smap.current_position);
118
+ for (Mapping mapping : out.smap.mappings) {
119
+ if (mapping.generated_position.line > size.line) {
120
+ throw(runtime_error("prepend sourcemap has illegal line"));
121
+ }
122
+ if (mapping.generated_position.line == size.line) {
123
+ if (mapping.generated_position.column > size.column) {
124
+ throw(runtime_error("prepend sourcemap has illegal column"));
125
+ }
126
+ }
114
127
  }
128
+ // will adjust the offset
129
+ prepend(Offset(out.buffer));
130
+ // now add the new mappings
131
+ VECTOR_UNSHIFT(mappings, out.smap.mappings);
115
132
  }
116
133
 
117
- void SourceMap::update_column(const string& str)
134
+ void SourceMap::append(const OutputBuffer& out)
118
135
  {
119
- const ptrdiff_t new_line_count = std::count(str.begin(), str.end(), '\n');
120
- current_position.line += new_line_count;
121
- if (new_line_count > 0) {
122
- current_position.column = str.size() - str.find_last_of('\n');
123
- } else {
124
- current_position.column += str.size();
136
+ append(Offset(out.buffer));
137
+ }
138
+
139
+ void SourceMap::prepend(const Offset& offset)
140
+ {
141
+ if (offset.line != 0 || offset.column != 0) {
142
+ for (Mapping& mapping : mappings) {
143
+ // move stuff on the first old line
144
+ if (mapping.generated_position.line == 0) {
145
+ mapping.generated_position.column += offset.column;
146
+ }
147
+ // make place for the new lines
148
+ mapping.generated_position.line += offset.line;
149
+ }
150
+ }
151
+ if (current_position.line == 0) {
152
+ current_position.column += offset.column;
125
153
  }
154
+ current_position.line += offset.line;
126
155
  }
127
156
 
128
- void SourceMap::add_mapping(AST_Node* node)
157
+ void SourceMap::append(const Offset& offset)
129
158
  {
130
- mappings.push_back(Mapping(node->position(), current_position));
159
+ current_position += offset;
160
+ }
161
+
162
+ void SourceMap::add_open_mapping(AST_Node* node)
163
+ {
164
+ mappings.push_back(Mapping(node->pstate(), current_position));
165
+ }
166
+
167
+ void SourceMap::add_close_mapping(AST_Node* node)
168
+ {
169
+ mappings.push_back(Mapping(node->pstate() + node->pstate().offset, current_position));
170
+ }
171
+
172
+ ParserState SourceMap::remap(const ParserState& pstate) {
173
+ for (size_t i = 0; i < mappings.size(); ++i) {
174
+ if (
175
+ mappings[i].generated_position.file == pstate.file &&
176
+ mappings[i].generated_position.line == pstate.line &&
177
+ mappings[i].generated_position.column == pstate.column
178
+ ) return ParserState(pstate.path, mappings[i].original_position, pstate.offset);
179
+ }
180
+ return ParserState(pstate.path, Position(-1, -1, -1), Offset(0, 0));
181
+
131
182
  }
132
183
 
133
184
  }
@@ -1,37 +1,41 @@
1
- #define SASS_SOURCE_MAP
1
+ #ifndef SASS_SOURCE_MAP_H
2
+ #define SASS_SOURCE_MAP_H
2
3
 
3
4
  #include <vector>
4
5
 
5
- #ifndef SASS_MAPPING
6
- #include "mapping.hpp"
7
- #endif
8
-
9
- #ifndef SASS_AST
10
- #include "ast.hpp"
11
- #endif
12
-
13
- #ifndef SASSS_BASE64VLQ
6
+ #include "ast_fwd_decl.hpp"
14
7
  #include "base64vlq.hpp"
15
- #endif
16
-
8
+ #include "position.hpp"
9
+ #include "mapping.hpp"
17
10
 
11
+ #define VECTOR_PUSH(vec, ins) vec.insert(vec.end(), ins.begin(), ins.end())
12
+ #define VECTOR_UNSHIFT(vec, ins) vec.insert(vec.begin(), ins.begin(), ins.end())
18
13
 
19
14
  namespace Sass {
20
15
  using std::vector;
21
16
 
22
- struct Context;
17
+ class Context;
18
+ class OutputBuffer;
23
19
 
24
20
  class SourceMap {
25
21
 
26
22
  public:
27
23
  vector<size_t> source_index;
24
+ SourceMap();
28
25
  SourceMap(const string& file);
29
26
 
30
- void remove_line();
31
- void update_column(const string& str);
32
- void add_mapping(AST_Node* node);
27
+ void setFile(const string& str) {
28
+ file = str;
29
+ }
30
+ void append(const Offset& offset);
31
+ void prepend(const Offset& offset);
32
+ void append(const OutputBuffer& out);
33
+ void prepend(const OutputBuffer& out);
34
+ void add_open_mapping(AST_Node* node);
35
+ void add_close_mapping(AST_Node* node);
33
36
 
34
37
  string generate_source_map(Context &ctx);
38
+ ParserState remap(const ParserState& pstate);
35
39
 
36
40
  private:
37
41
 
@@ -39,8 +43,23 @@ namespace Sass {
39
43
 
40
44
  vector<Mapping> mappings;
41
45
  Position current_position;
46
+ public:
42
47
  string file;
48
+ private:
43
49
  Base64VLQ base64vlq;
44
50
  };
45
51
 
52
+ class OutputBuffer {
53
+ public:
54
+ OutputBuffer(void)
55
+ : buffer(""),
56
+ smap()
57
+ { }
58
+ public:
59
+ string buffer;
60
+ SourceMap smap;
61
+ };
62
+
46
63
  }
64
+
65
+ #endif