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,48 +1,38 @@
1
- #ifndef SASS_INSPECT
2
- #define SASS_INSPECT
1
+ #ifndef SASS_INSPECT_H
2
+ #define SASS_INSPECT_H
3
3
 
4
4
  #include <string>
5
5
 
6
- #ifndef SASS_OPERATION
6
+ #include "position.hpp"
7
7
  #include "operation.hpp"
8
- #endif
9
-
10
- // #ifndef SASS_TO_STRING
11
- // #include "to_string.hpp"
12
- // #endif
8
+ #include "emitter.hpp"
13
9
 
14
10
  namespace Sass {
11
+ class Context;
15
12
  using namespace std;
16
- struct Context;
17
13
 
18
- class Inspect : public Operation_CRTP<void, Inspect> {
14
+ class Inspect : public Operation_CRTP<void, Inspect>, public Emitter {
15
+ protected:
19
16
  // import all the class-specific methods and override as desired
20
17
  using Operation_CRTP<void, Inspect>::operator();
21
18
 
22
- // To_String* to_string;
23
- string buffer;
24
- size_t indentation;
25
- Context* ctx;
26
- void indent();
27
-
28
19
  void fallback_impl(AST_Node* n);
29
20
 
30
- void append_to_buffer(const string& text);
31
-
32
21
  public:
33
22
 
34
- Inspect(Context* ctx = 0);
23
+ Inspect(Emitter emi);
35
24
  virtual ~Inspect();
36
25
 
37
- string get_buffer() { return buffer; }
38
-
39
26
  // statements
40
27
  virtual void operator()(Block*);
41
28
  virtual void operator()(Ruleset*);
42
29
  virtual void operator()(Propset*);
30
+ virtual void operator()(Bubble*);
43
31
  virtual void operator()(Feature_Block*);
44
32
  virtual void operator()(Media_Block*);
33
+ virtual void operator()(At_Root_Block*);
45
34
  virtual void operator()(At_Rule*);
35
+ virtual void operator()(Keyframe_Rule*);
46
36
  virtual void operator()(Declaration*);
47
37
  virtual void operator()(Assignment*);
48
38
  virtual void operator()(Import*);
@@ -74,10 +64,12 @@ namespace Sass {
74
64
  virtual void operator()(Boolean*);
75
65
  virtual void operator()(String_Schema*);
76
66
  virtual void operator()(String_Constant*);
67
+ virtual void operator()(String_Quoted*);
77
68
  virtual void operator()(Feature_Query*);
78
69
  virtual void operator()(Feature_Query_Condition*);
79
70
  virtual void operator()(Media_Query*);
80
71
  virtual void operator()(Media_Query_Expression*);
72
+ virtual void operator()(At_Root_Expression*);
81
73
  virtual void operator()(Null*);
82
74
  // parameters and arguments
83
75
  virtual void operator()(Parameter*);
@@ -97,12 +89,9 @@ namespace Sass {
97
89
  virtual void operator()(Complex_Selector*);
98
90
  virtual void operator()(Selector_List*);
99
91
 
100
- template <typename U>
101
- void fallback(U x) { fallback_impl(reinterpret_cast<AST_Node*>(x)); }
92
+ // template <typename U>
93
+ // void fallback(U x) { fallback_impl(reinterpret_cast<AST_Node*>(x)); }
102
94
  };
103
95
 
104
- string unquote(const string&);
105
- string quote(const string&, char);
106
-
107
96
  }
108
97
  #endif
@@ -1,3 +1,6 @@
1
+ #ifndef SASS_KWD_ARG_MACROS_H
2
+ #define SASS_KWD_ARG_MACROS_H
3
+
1
4
  // Example usage:
2
5
  // KWD_ARG_SET(Args) {
3
6
  // KWD_ARG(Args, string, foo);
@@ -21,3 +24,5 @@ public: \
21
24
  } \
22
25
  type name() { return name##_; } \
23
26
  private:
27
+
28
+ #endif
@@ -1,8 +1,7 @@
1
- #define SASS_MAPPING
1
+ #ifndef SASS_MAPPING_H
2
+ #define SASS_MAPPING_H
2
3
 
3
- #ifndef SASS_POSITION
4
4
  #include "position.hpp"
5
- #endif
6
5
 
7
6
  namespace Sass {
8
7
 
@@ -15,3 +14,5 @@ namespace Sass {
15
14
  };
16
15
 
17
16
  }
17
+
18
+ #endif
@@ -1,10 +1,11 @@
1
- #define SASS_MEMORY_MANAGER
1
+ #ifndef SASS_MEMORY_MANAGER_H
2
+ #define SASS_MEMORY_MANAGER_H
2
3
 
3
4
  #include <vector>
4
5
  #include <iostream>
5
- using namespace std;
6
6
 
7
7
  namespace Sass {
8
+ using namespace std;
8
9
  /////////////////////////////////////////////////////////////////////////////
9
10
  // A class for tracking allocations of AST_Node objects. The intended usage
10
11
  // is something like: Some_Node* n = new (mem_mgr) Some_Node(...);
@@ -52,3 +53,5 @@ inline void operator delete(void *np, Sass::Memory_Manager<T>& mem_mgr)
52
53
  mem_mgr.remove(reinterpret_cast<T*>(np));
53
54
  operator delete(np);
54
55
  }
56
+
57
+ #endif
@@ -11,43 +11,41 @@ namespace Sass {
11
11
  return Node(COMBINATOR, combinator, NULL /*pSelector*/, null /*pCollection*/);
12
12
  }
13
13
 
14
-
14
+
15
15
  Node Node::createSelector(Complex_Selector* pSelector, Context& ctx) {
16
16
  NodeDequePtr null;
17
17
 
18
18
  Complex_Selector* pStripped = pSelector->clone(ctx);
19
19
  pStripped->tail(NULL);
20
20
  pStripped->combinator(Complex_Selector::ANCESTOR_OF);
21
-
21
+
22
22
  return Node(SELECTOR, Complex_Selector::ANCESTOR_OF, pStripped, null /*pCollection*/);
23
23
  }
24
24
 
25
-
25
+
26
26
  Node Node::createCollection() {
27
27
  NodeDequePtr pEmptyCollection = make_shared<NodeDeque>();
28
28
  return Node(COLLECTION, Complex_Selector::ANCESTOR_OF, NULL /*pSelector*/, pEmptyCollection);
29
29
  }
30
30
 
31
-
31
+
32
32
  Node Node::createCollection(const NodeDeque& values) {
33
33
  NodeDequePtr pShallowCopiedCollection = make_shared<NodeDeque>(values);
34
34
  return Node(COLLECTION, Complex_Selector::ANCESTOR_OF, NULL /*pSelector*/, pShallowCopiedCollection);
35
35
  }
36
36
 
37
-
37
+
38
38
  Node Node::createNil() {
39
39
  NodeDequePtr null;
40
40
  return Node(NIL, Complex_Selector::ANCESTOR_OF, NULL /*pSelector*/, null /*pCollection*/);
41
41
  }
42
42
 
43
-
44
- Node::Node(const TYPE& type, Complex_Selector::Combinator combinator, Complex_Selector* pSelector, NodeDequePtr& pCollection) :
45
- mType(type),
46
- mCombinator(combinator),
47
- mpSelector(pSelector),
48
- mpCollection(pCollection) {}
49
43
 
50
-
44
+ Node::Node(const TYPE& type, Complex_Selector::Combinator combinator, Complex_Selector* pSelector, NodeDequePtr& pCollection)
45
+ : got_line_feed(false), mType(type), mCombinator(combinator), mpSelector(pSelector), mpCollection(pCollection)
46
+ { /* if (pSelector) got_line_feed = pSelector->has_line_feed(); */ }
47
+
48
+
51
49
  Node Node::clone(Context& ctx) const {
52
50
  NodeDequePtr pNewCollection = make_shared<NodeDeque>();
53
51
  if (mpCollection) {
@@ -56,14 +54,14 @@ namespace Sass {
56
54
  pNewCollection->push_back(toClone.clone(ctx));
57
55
  }
58
56
  }
59
-
57
+
60
58
  return Node(mType, mCombinator, mpSelector ? mpSelector->clone(ctx) : NULL, pNewCollection);
61
59
  }
62
-
63
-
60
+
61
+
64
62
  bool Node::contains(const Node& potentialChild, bool simpleSelectorOrderDependent) const {
65
63
  bool found = false;
66
-
64
+
67
65
  for (NodeDeque::iterator iter = mpCollection->begin(), iterEnd = mpCollection->end(); iter != iterEnd; iter++) {
68
66
  Node& toTest = *iter;
69
67
 
@@ -75,18 +73,18 @@ namespace Sass {
75
73
 
76
74
  return found;
77
75
  }
78
-
76
+
79
77
 
80
78
  bool Node::operator==(const Node& rhs) const {
81
79
  return nodesEqual(*this, rhs, true /*simpleSelectorOrderDependent*/);
82
80
  }
83
-
81
+
84
82
 
85
83
  bool nodesEqual(const Node& lhs, const Node& rhs, bool simpleSelectorOrderDependent) {
86
84
  if (lhs.type() != rhs.type()) {
87
85
  return false;
88
86
  }
89
-
87
+
90
88
  if (lhs.isCombinator()) {
91
89
 
92
90
  return lhs.combinator() == rhs.combinator();
@@ -117,20 +115,20 @@ namespace Sass {
117
115
  return true;
118
116
 
119
117
  }
120
-
118
+
121
119
  // We shouldn't get here.
122
120
  throw "Comparing unknown node types. A new type was probably added and this method wasn't implemented for it.";
123
121
  }
124
-
125
-
122
+
123
+
126
124
  void Node::plus(Node& rhs) {
127
125
  if (!this->isCollection() || !rhs.isCollection()) {
128
126
  throw "Both the current node and rhs must be collections.";
129
127
  }
130
128
  this->collection()->insert(this->collection()->end(), rhs.collection()->begin(), rhs.collection()->end());
131
129
  }
132
-
133
-
130
+
131
+ #ifdef DEBUG
134
132
  ostream& operator<<(ostream& os, const Node& node) {
135
133
 
136
134
  if (node.isCombinator()) {
@@ -141,20 +139,20 @@ namespace Sass {
141
139
  case Complex_Selector::PRECEDES: os << "\"~\""; break;
142
140
  case Complex_Selector::ADJACENT_TO: os << "\"+\""; break;
143
141
  }
144
-
142
+
145
143
  } else if (node.isNil()) {
146
-
144
+
147
145
  os << "nil";
148
-
146
+
149
147
  } else if (node.isSelector()){
150
-
148
+
151
149
  To_String to_string;
152
150
  os << node.selector()->head()->perform(&to_string);
153
-
151
+
154
152
  } else if (node.isCollection()) {
155
-
153
+
156
154
  os << "[";
157
-
155
+
158
156
  for (NodeDeque::iterator iter = node.collection()->begin(), iterBegin = node.collection()->begin(), iterEnd = node.collection()->end(); iter != iterEnd; iter++) {
159
157
  if (iter != iterBegin) {
160
158
  os << ", ";
@@ -162,23 +160,24 @@ namespace Sass {
162
160
 
163
161
  os << (*iter);
164
162
  }
165
-
163
+
166
164
  os << "]";
167
-
165
+
168
166
  }
169
-
167
+
170
168
  return os;
171
169
 
172
170
  }
173
-
174
-
171
+ #endif
172
+
173
+
175
174
  Node complexSelectorToNode(Complex_Selector* pToConvert, Context& ctx) {
176
175
  if (pToConvert == NULL) {
177
176
  return Node::createNil();
178
177
  }
179
178
 
180
- Node node = Node::createCollection();
181
-
179
+ Node node = Node::createCollection();
180
+
182
181
  while (pToConvert) {
183
182
 
184
183
  // the first Complex_Selector may contain a dummy head pointer, skip it.
@@ -192,7 +191,7 @@ namespace Sass {
192
191
 
193
192
  pToConvert = pToConvert->tail();
194
193
  }
195
-
194
+
196
195
  return node;
197
196
  }
198
197
 
@@ -206,30 +205,30 @@ namespace Sass {
206
205
  if (!toConvert.isCollection()) {
207
206
  throw "The node to convert to a Complex_Selector* must be a collection type or nil.";
208
207
  }
209
-
208
+
210
209
 
211
210
  NodeDeque& childNodes = *toConvert.collection();
212
-
211
+
213
212
  string noPath("");
214
- Position noPosition;
215
- Complex_Selector* pFirst = new (ctx.mem) Complex_Selector(noPath, noPosition, Complex_Selector::ANCESTOR_OF, NULL, NULL);
213
+ Position noPosition(-1, -1, -1);
214
+ Complex_Selector* pFirst = new (ctx.mem) Complex_Selector(ParserState("[NODE]"), Complex_Selector::ANCESTOR_OF, NULL, NULL);
216
215
  Complex_Selector* pCurrent = pFirst;
217
-
216
+
218
217
  for (NodeDeque::iterator childIter = childNodes.begin(), childIterEnd = childNodes.end(); childIter != childIterEnd; childIter++) {
219
218
 
220
219
  Node& child = *childIter;
221
-
220
+
222
221
  if (child.isSelector()) {
223
222
  pCurrent->tail(child.selector()->clone(ctx)); // JMA - need to clone the selector, because they can end up getting shared across Node collections, and can result in an infinite loop during the call to parentSuperselector()
224
223
  pCurrent = pCurrent->tail();
225
224
  } else if (child.isCombinator()) {
226
225
  pCurrent->combinator(child.combinator());
227
-
226
+
228
227
  // if the next node is also a combinator, create another Complex_Selector to hold it so it doesn't replace the current combinator
229
228
  if (childIter+1 != childIterEnd) {
230
229
  Node& nextNode = *(childIter+1);
231
230
  if (nextNode.isCombinator()) {
232
- pCurrent->tail(new (ctx.mem) Complex_Selector(noPath, noPosition, Complex_Selector::ANCESTOR_OF, NULL, NULL));
231
+ pCurrent->tail(new (ctx.mem) Complex_Selector(ParserState("[NODE]"), Complex_Selector::ANCESTOR_OF, NULL, NULL));
233
232
  pCurrent = pCurrent->tail();
234
233
  }
235
234
  }
@@ -239,11 +238,12 @@ namespace Sass {
239
238
  }
240
239
 
241
240
  // Put the dummy Compound_Selector in the first position, for consistency with the rest of libsass
242
- Compound_Selector* fakeHead = new (ctx.mem) Compound_Selector(noPath, noPosition, 1);
243
- Selector_Reference* selectorRef = new (ctx.mem) Selector_Reference(noPath, noPosition, NULL);
241
+ Compound_Selector* fakeHead = new (ctx.mem) Compound_Selector(ParserState("[NODE]"), 1);
242
+ Selector_Reference* selectorRef = new (ctx.mem) Selector_Reference(ParserState("[NODE]"), NULL);
244
243
  fakeHead->elements().push_back(selectorRef);
245
244
  pFirst->head(fakeHead);
246
-
245
+ pFirst->has_line_feed(pFirst->has_line_feed() || pFirst->tail()->has_line_feed() || toConvert.got_line_feed);
246
+
247
247
  return pFirst;
248
248
  }
249
249
 
@@ -1,22 +1,20 @@
1
- #define SASS_NODE
2
-
1
+ #ifndef SASS_NODE_H
2
+ #define SASS_NODE_H
3
3
 
4
4
  #include <deque>
5
5
  #include <iostream>
6
6
  #include <memory>
7
7
 
8
- #ifndef SASS_AST
9
8
  #include "ast.hpp"
10
- #endif
11
9
 
12
10
 
13
11
  namespace Sass {
14
12
 
15
-
13
+
16
14
  using namespace std;
17
15
 
18
16
 
19
- struct Context;
17
+ class Context;
20
18
 
21
19
  /*
22
20
  There are a lot of stumbling blocks when trying to port the ruby extend code to C++. The biggest is the choice of
@@ -29,11 +27,11 @@ namespace Sass {
29
27
  the inconsistent nesting levels. The variant nature (while making some of the C++ code uglier) allows the code to
30
28
  more closely match the ruby code, which is a huge benefit when attempting to implement an complex algorithm like
31
29
  the Extend operator.
32
-
30
+
33
31
  Note that the current libsass data model also pairs the combinator with the Complex_Selector that follows it, but
34
32
  ruby sass has no such restriction, so we attempt to create a data structure that can handle them split apart.
35
33
  */
36
-
34
+
37
35
  class Node;
38
36
  typedef deque<Node> NodeDeque;
39
37
  typedef shared_ptr<NodeDeque> NodeDequePtr;
@@ -52,49 +50,50 @@ namespace Sass {
52
50
  bool isSelector() const { return mType == SELECTOR; }
53
51
  bool isCollection() const { return mType == COLLECTION; }
54
52
  bool isNil() const { return mType == NIL; }
55
-
53
+ bool got_line_feed;
54
+
56
55
  Complex_Selector::Combinator combinator() const { return mCombinator; }
57
-
56
+
58
57
  Complex_Selector* selector() { return mpSelector; }
59
58
  const Complex_Selector* selector() const { return mpSelector; }
60
-
59
+
61
60
  NodeDequePtr collection() { return mpCollection; }
62
61
  const NodeDequePtr collection() const { return mpCollection; }
63
-
62
+
64
63
  static Node createCombinator(const Complex_Selector::Combinator& combinator);
65
64
 
66
65
  // This method will clone the selector, stripping off the tail and combinator
67
66
  static Node createSelector(Complex_Selector* pSelector, Context& ctx);
68
-
67
+
69
68
  static Node createCollection();
70
69
  static Node createCollection(const NodeDeque& values);
71
70
 
72
71
  static Node createNil();
73
-
72
+
74
73
  Node clone(Context& ctx) const;
75
-
74
+
76
75
  bool operator==(const Node& rhs) const;
77
76
  inline bool operator!=(const Node& rhs) const { return !(*this == rhs); }
78
-
79
-
77
+
78
+
80
79
  /*
81
80
  COLLECTION FUNCTIONS
82
-
81
+
83
82
  Most types don't need any helper methods (nil and combinator due to their simplicity and
84
83
  selector due to the fact that we leverage the non-node selector code on the Complex_Selector
85
84
  whereever possible). The following methods are intended to be called on Node objects whose
86
85
  type is COLLECTION only.
87
86
  */
88
-
87
+
89
88
  // rhs and this must be node collections. Shallow copy the nodes from rhs to the end of this.
90
89
  // This function DOES NOT remove the nodes from rhs.
91
90
  void plus(Node& rhs);
92
-
91
+
93
92
  // potentialChild must be a node collection of selectors/combinators. this must be a collection
94
93
  // of collections of nodes/combinators. This method checks if potentialChild is a child of this
95
94
  // Node.
96
95
  bool contains(const Node& potentialChild, bool simpleSelectorOrderDependent) const;
97
-
96
+
98
97
  private:
99
98
  // Private constructor; Use the static methods (like createCombinator and createSelector)
100
99
  // to instantiate this object. This is more expressive, and it allows us to break apart each
@@ -102,21 +101,21 @@ namespace Sass {
102
101
  Node(const TYPE& type, Complex_Selector::Combinator combinator, Complex_Selector* pSelector, NodeDequePtr& pCollection);
103
102
 
104
103
  TYPE mType;
105
-
104
+
106
105
  // TODO: can we union these to save on memory?
107
106
  Complex_Selector::Combinator mCombinator;
108
107
  Complex_Selector* mpSelector; // this is an AST_Node, so it will be handled by the Memory_Manager
109
108
  NodeDequePtr mpCollection;
110
109
  };
111
-
112
-
113
- ostream& operator<<(ostream& os, const Node& node);
114
-
115
110
 
111
+ #ifdef DEBUG
112
+ ostream& operator<<(ostream& os, const Node& node);
113
+ #endif
116
114
  Node complexSelectorToNode(Complex_Selector* pToConvert, Context& ctx);
117
115
  Complex_Selector* nodeToComplexSelector(const Node& toConvert, Context& ctx);
118
116
 
119
-
120
117
  bool nodesEqual(const Node& one, const Node& two, bool simpleSelectorOrderDependent);
121
118
 
122
119
  }
120
+
121
+ #endif