sassc 1.10.1 → 1.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -2
- data/ext/libsass/.github/CONTRIBUTING.md +65 -0
- data/ext/libsass/.github/ISSUE_TEMPLATE.md +29 -0
- data/ext/libsass/Makefile +8 -3
- data/ext/libsass/Makefile.conf +28 -22
- data/ext/libsass/Readme.md +14 -7
- data/ext/libsass/configure.ac +5 -8
- data/ext/libsass/docs/api-context-internal.md +3 -0
- data/ext/libsass/docs/api-context.md +7 -0
- data/ext/libsass/docs/api-doc.md +4 -0
- data/ext/libsass/docs/api-importer.md +2 -0
- data/ext/libsass/docs/api-value-example.md +55 -0
- data/ext/libsass/docs/api-value.md +49 -22
- data/ext/libsass/docs/implementations.md +4 -0
- data/ext/libsass/include/sass/base.h +5 -4
- data/ext/libsass/include/sass/context.h +3 -0
- data/ext/libsass/include/sass/values.h +28 -27
- data/ext/libsass/include/sass/version.h +1 -1
- data/ext/libsass/include/sass2scss.h +1 -1
- data/ext/libsass/script/ci-build-libsass +3 -3
- data/ext/libsass/script/ci-install-deps +12 -3
- data/ext/libsass/src/ast.cpp +321 -212
- data/ext/libsass/src/ast.hpp +273 -165
- data/ext/libsass/src/ast_factory.hpp +4 -5
- data/ext/libsass/src/ast_fwd_decl.hpp +8 -7
- data/ext/libsass/src/bind.cpp +2 -7
- data/ext/libsass/src/bind.hpp +0 -1
- data/ext/libsass/src/check_nesting.cpp +379 -0
- data/ext/libsass/src/check_nesting.hpp +60 -0
- data/ext/libsass/src/constants.cpp +7 -6
- data/ext/libsass/src/constants.hpp +2 -1
- data/ext/libsass/src/context.cpp +7 -1
- data/ext/libsass/src/context.hpp +1 -1
- data/ext/libsass/src/cssize.cpp +76 -32
- data/ext/libsass/src/cssize.hpp +7 -8
- data/ext/libsass/src/debugger.hpp +70 -40
- data/ext/libsass/src/error_handling.cpp +15 -2
- data/ext/libsass/src/error_handling.hpp +19 -0
- data/ext/libsass/src/eval.cpp +107 -161
- data/ext/libsass/src/eval.hpp +12 -8
- data/ext/libsass/src/expand.cpp +81 -74
- data/ext/libsass/src/expand.hpp +13 -12
- data/ext/libsass/src/extend.cpp +149 -142
- data/ext/libsass/src/extend.hpp +10 -3
- data/ext/libsass/src/file.cpp +2 -1
- data/ext/libsass/src/functions.cpp +96 -59
- data/ext/libsass/src/functions.hpp +2 -2
- data/ext/libsass/src/inspect.cpp +33 -45
- data/ext/libsass/src/inspect.hpp +7 -7
- data/ext/libsass/src/json.cpp +17 -5
- data/ext/libsass/src/lexer.cpp +3 -3
- data/ext/libsass/src/listize.cpp +10 -10
- data/ext/libsass/src/listize.hpp +3 -3
- data/ext/libsass/src/node.cpp +30 -30
- data/ext/libsass/src/node.hpp +13 -13
- data/ext/libsass/src/operation.hpp +21 -19
- data/ext/libsass/src/output.cpp +48 -103
- data/ext/libsass/src/output.hpp +0 -1
- data/ext/libsass/src/parser.cpp +161 -133
- data/ext/libsass/src/parser.hpp +10 -7
- data/ext/libsass/src/remove_placeholders.cpp +6 -6
- data/ext/libsass/src/remove_placeholders.hpp +1 -1
- data/ext/libsass/src/sass.cpp +21 -0
- data/ext/libsass/src/sass.hpp +8 -1
- data/ext/libsass/src/sass2scss.cpp +14 -3
- data/ext/libsass/src/sass_context.cpp +69 -24
- data/ext/libsass/src/sass_context.hpp +3 -0
- data/ext/libsass/src/source_map.cpp +22 -10
- data/ext/libsass/src/to_value.cpp +2 -2
- data/ext/libsass/src/to_value.hpp +1 -1
- data/ext/libsass/src/units.hpp +3 -1
- data/ext/libsass/src/util.cpp +20 -16
- data/ext/libsass/src/util.hpp +2 -1
- data/ext/libsass/win/libsass.targets +2 -0
- data/ext/libsass/win/libsass.vcxproj.filters +6 -0
- data/lib/sassc/engine.rb +5 -0
- data/lib/sassc/native/native_functions_api.rb +13 -1
- data/lib/sassc/script/value_conversion.rb +11 -1
- data/lib/sassc/script/value_conversion/list.rb +23 -0
- data/lib/sassc/version.rb +1 -1
- data/test/engine_test.rb +18 -2
- data/test/functions_test.rb +30 -0
- data/test/native_test.rb +1 -1
- metadata +8 -3
@@ -0,0 +1,60 @@
|
|
1
|
+
#ifndef SASS_CHECK_NESTING_H
|
2
|
+
#define SASS_CHECK_NESTING_H
|
3
|
+
|
4
|
+
#include "ast.hpp"
|
5
|
+
#include "operation.hpp"
|
6
|
+
|
7
|
+
namespace Sass {
|
8
|
+
|
9
|
+
typedef Environment<AST_Node*> Env;
|
10
|
+
|
11
|
+
class CheckNesting : public Operation_CRTP<Statement*, CheckNesting> {
|
12
|
+
|
13
|
+
std::vector<Statement*> parents;
|
14
|
+
Statement* parent;
|
15
|
+
Definition* current_mixin_definition;
|
16
|
+
|
17
|
+
Statement* fallback_impl(Statement*);
|
18
|
+
Statement* before(Statement*);
|
19
|
+
Statement* visit_children(Statement*);
|
20
|
+
|
21
|
+
public:
|
22
|
+
CheckNesting();
|
23
|
+
~CheckNesting() { }
|
24
|
+
|
25
|
+
Statement* operator()(Block*);
|
26
|
+
Statement* operator()(Definition*);
|
27
|
+
|
28
|
+
template <typename U>
|
29
|
+
Statement* fallback(U x) {
|
30
|
+
return fallback_impl(this->before(dynamic_cast<Statement*>(x)));
|
31
|
+
}
|
32
|
+
|
33
|
+
private:
|
34
|
+
void invalid_content_parent(Statement*);
|
35
|
+
void invalid_charset_parent(Statement*);
|
36
|
+
void invalid_extend_parent(Statement*);
|
37
|
+
// void invalid_import_parent(Statement*);
|
38
|
+
void invalid_mixin_definition_parent(Statement*);
|
39
|
+
void invalid_function_parent(Statement*);
|
40
|
+
|
41
|
+
void invalid_function_child(Statement*);
|
42
|
+
void invalid_prop_child(Statement*);
|
43
|
+
void invalid_prop_parent(Statement*);
|
44
|
+
void invalid_return_parent(Statement*);
|
45
|
+
|
46
|
+
bool is_transparent_parent(Statement*, Statement*);
|
47
|
+
|
48
|
+
bool should_visit(Statement*);
|
49
|
+
|
50
|
+
bool is_charset(Statement*);
|
51
|
+
bool is_mixin(Statement*);
|
52
|
+
bool is_function(Statement*);
|
53
|
+
bool is_root_node(Statement*);
|
54
|
+
bool is_at_root_node(Statement*);
|
55
|
+
bool is_directive_node(Statement*);
|
56
|
+
};
|
57
|
+
|
58
|
+
}
|
59
|
+
|
60
|
+
#endif
|
@@ -10,12 +10,13 @@ namespace Sass {
|
|
10
10
|
// https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity
|
11
11
|
// https://github.com/sass/sass/issues/1495#issuecomment-61189114
|
12
12
|
extern const unsigned long Specificity_Star = 0;
|
13
|
-
extern const unsigned long Specificity_Universal =
|
14
|
-
extern const unsigned long
|
15
|
-
extern const unsigned long
|
16
|
-
extern const unsigned long
|
17
|
-
extern const unsigned long
|
18
|
-
extern const unsigned long
|
13
|
+
extern const unsigned long Specificity_Universal = 0;
|
14
|
+
extern const unsigned long Specificity_Element = 1;
|
15
|
+
extern const unsigned long Specificity_Base = 1000;
|
16
|
+
extern const unsigned long Specificity_Class = 1000;
|
17
|
+
extern const unsigned long Specificity_Attr = 1000;
|
18
|
+
extern const unsigned long Specificity_Pseudo = 1000;
|
19
|
+
extern const unsigned long Specificity_ID = 1000000;
|
19
20
|
|
20
21
|
// sass keywords
|
21
22
|
extern const char at_root_kwd[] = "@at-root";
|
@@ -11,7 +11,8 @@ namespace Sass {
|
|
11
11
|
// The following list of selectors is by increasing specificity:
|
12
12
|
extern const unsigned long Specificity_Star;
|
13
13
|
extern const unsigned long Specificity_Universal;
|
14
|
-
extern const unsigned long
|
14
|
+
extern const unsigned long Specificity_Element;
|
15
|
+
extern const unsigned long Specificity_Base;
|
15
16
|
extern const unsigned long Specificity_Class;
|
16
17
|
extern const unsigned long Specificity_Attr;
|
17
18
|
extern const unsigned long Specificity_Pseudo;
|
data/ext/libsass/src/context.cpp
CHANGED
@@ -18,6 +18,7 @@
|
|
18
18
|
#include "output.hpp"
|
19
19
|
#include "expand.hpp"
|
20
20
|
#include "eval.hpp"
|
21
|
+
#include "check_nesting.hpp"
|
21
22
|
#include "cssize.hpp"
|
22
23
|
#include "listize.hpp"
|
23
24
|
#include "extend.hpp"
|
@@ -398,7 +399,7 @@ namespace Sass {
|
|
398
399
|
const Importer importer(imp_path, ctx_path);
|
399
400
|
Include include(load_import(importer, pstate));
|
400
401
|
if (include.abs_path.empty()) {
|
401
|
-
error("File to import not found or unreadable: " + imp_path + "
|
402
|
+
error("File to import not found or unreadable: " + imp_path + ".\nParent style sheet: " + ctx_path, pstate);
|
402
403
|
}
|
403
404
|
imp->incs().push_back(include);
|
404
405
|
}
|
@@ -648,8 +649,13 @@ namespace Sass {
|
|
648
649
|
// create crtp visitor objects
|
649
650
|
Expand expand(*this, &global, &backtrace);
|
650
651
|
Cssize cssize(*this, &backtrace);
|
652
|
+
CheckNesting check_nesting;
|
653
|
+
// check nesting
|
654
|
+
root->perform(&check_nesting)->block();
|
651
655
|
// expand and eval the tree
|
652
656
|
root = root->perform(&expand)->block();
|
657
|
+
// check nesting
|
658
|
+
root->perform(&check_nesting)->block();
|
653
659
|
// merge and bubble certain rules
|
654
660
|
root = root->perform(&cssize)->block();
|
655
661
|
// should we extend something?
|
data/ext/libsass/src/context.hpp
CHANGED
@@ -50,7 +50,7 @@ namespace Sass {
|
|
50
50
|
std::vector<char*> strings;
|
51
51
|
std::vector<Resource> resources;
|
52
52
|
std::map<const std::string, const StyleSheet> sheets;
|
53
|
-
Subset_Map<std::string, std::pair<
|
53
|
+
Subset_Map<std::string, std::pair<Sequence_Selector*, SimpleSequence_Selector*> > subset_map;
|
54
54
|
std::vector<Sass_Import_Entry> import_stack;
|
55
55
|
|
56
56
|
struct Sass_Compiler* c_compiler;
|
data/ext/libsass/src/cssize.cpp
CHANGED
@@ -13,22 +13,14 @@ namespace Sass {
|
|
13
13
|
: ctx(ctx),
|
14
14
|
block_stack(std::vector<Block*>()),
|
15
15
|
p_stack(std::vector<Statement*>()),
|
16
|
-
s_stack(std::vector<Selector_List*>()),
|
17
16
|
backtrace(bt)
|
18
|
-
{
|
19
|
-
s_stack.push_back(NULL);
|
20
|
-
}
|
17
|
+
{ }
|
21
18
|
|
22
19
|
Statement* Cssize::parent()
|
23
20
|
{
|
24
21
|
return p_stack.size() ? p_stack.back() : block_stack.front();
|
25
22
|
}
|
26
23
|
|
27
|
-
Selector_List* Cssize::selector()
|
28
|
-
{
|
29
|
-
return s_stack.size() ? s_stack.back() : NULL;
|
30
|
-
}
|
31
|
-
|
32
24
|
Statement* Cssize::operator()(Block* b)
|
33
25
|
{
|
34
26
|
Block* bb = SASS_MEMORY_NEW(ctx.mem, Block, b->pstate(), b->length(), b->is_root());
|
@@ -39,6 +31,50 @@ namespace Sass {
|
|
39
31
|
return bb;
|
40
32
|
}
|
41
33
|
|
34
|
+
Statement* Cssize::operator()(Trace* t)
|
35
|
+
{
|
36
|
+
return t->block()->perform(this);
|
37
|
+
}
|
38
|
+
|
39
|
+
Statement* Cssize::operator()(Declaration* d)
|
40
|
+
{
|
41
|
+
String* property = dynamic_cast<String*>(d->property());
|
42
|
+
|
43
|
+
if (Declaration* dd = dynamic_cast<Declaration*>(parent())) {
|
44
|
+
String* parent_property = dynamic_cast<String*>(dd->property());
|
45
|
+
property = SASS_MEMORY_NEW(ctx.mem, String_Constant,
|
46
|
+
d->property()->pstate(),
|
47
|
+
parent_property->to_string() + "-" + property->to_string());
|
48
|
+
if (!dd->value()) {
|
49
|
+
d->tabs(dd->tabs() + 1);
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
Declaration* dd = SASS_MEMORY_NEW(ctx.mem, Declaration,
|
54
|
+
d->pstate(),
|
55
|
+
property,
|
56
|
+
d->value(),
|
57
|
+
d->is_important());
|
58
|
+
dd->is_indented(d->is_indented());
|
59
|
+
dd->tabs(d->tabs());
|
60
|
+
|
61
|
+
p_stack.push_back(dd);
|
62
|
+
Block* bb = d->block() ? d->block()->perform(this)->block() : 0;
|
63
|
+
p_stack.pop_back();
|
64
|
+
|
65
|
+
if (bb && bb->length()) {
|
66
|
+
if (dd->value() && !dd->value()->is_invisible()) {
|
67
|
+
bb->unshift(dd);
|
68
|
+
}
|
69
|
+
return bb;
|
70
|
+
}
|
71
|
+
else if (dd->value() && !dd->value()->is_invisible()) {
|
72
|
+
return dd;
|
73
|
+
}
|
74
|
+
|
75
|
+
return 0;
|
76
|
+
}
|
77
|
+
|
42
78
|
Statement* Cssize::operator()(Directive* r)
|
43
79
|
{
|
44
80
|
if (!r->block() || !r->block()->length()) return r;
|
@@ -101,14 +137,22 @@ namespace Sass {
|
|
101
137
|
Statement* Cssize::operator()(Ruleset* r)
|
102
138
|
{
|
103
139
|
p_stack.push_back(r);
|
104
|
-
|
140
|
+
// this can return a string schema
|
141
|
+
// string schema is not a statement!
|
142
|
+
// r->block() is already a string schema
|
143
|
+
// and that is comming from propset expand
|
144
|
+
Statement* stmt = r->block()->perform(this);
|
145
|
+
// this should protect us (at least a bit) from our mess
|
146
|
+
// fixing this properly is harder that it should be ...
|
147
|
+
if (dynamic_cast<Statement*>((AST_Node*)stmt) == NULL) {
|
148
|
+
error("Illegal nesting: Only properties may be nested beneath properties.", r->block()->pstate());
|
149
|
+
}
|
105
150
|
Ruleset* rr = SASS_MEMORY_NEW(ctx.mem, Ruleset,
|
106
151
|
r->pstate(),
|
107
152
|
r->selector(),
|
108
|
-
|
153
|
+
stmt->block());
|
109
154
|
rr->is_root(r->is_root());
|
110
155
|
// rr->tabs(r->block()->tabs());
|
111
|
-
s_stack.pop_back();
|
112
156
|
p_stack.pop_back();
|
113
157
|
|
114
158
|
if (!rr->block()) {
|
@@ -419,46 +463,40 @@ namespace Sass {
|
|
419
463
|
}
|
420
464
|
else {
|
421
465
|
previous_parent = static_cast<Has_Block*>(shallow_copy(parent));
|
466
|
+
previous_parent->block(slice);
|
422
467
|
previous_parent->tabs(parent->tabs());
|
423
468
|
|
424
|
-
Has_Block* new_parent =
|
425
|
-
new_parent->block(slice);
|
426
|
-
new_parent->tabs(parent->tabs());
|
469
|
+
Has_Block* new_parent = previous_parent;
|
427
470
|
|
428
471
|
*result << new_parent;
|
429
472
|
}
|
430
473
|
continue;
|
431
474
|
}
|
432
475
|
|
433
|
-
Block* wrapper_block = SASS_MEMORY_NEW(ctx.mem, Block,
|
434
|
-
children->block()->pstate(),
|
435
|
-
children->block()->length(),
|
436
|
-
children->block()->is_root());
|
437
|
-
|
438
476
|
for (size_t j = 0, K = slice->length(); j < K; ++j)
|
439
477
|
{
|
440
478
|
Statement* ss = 0;
|
441
|
-
Bubble*
|
479
|
+
Bubble* node = static_cast<Bubble*>((*slice)[j]);
|
442
480
|
|
443
481
|
if (!parent ||
|
444
482
|
parent->statement_type() != Statement::MEDIA ||
|
445
|
-
|
446
|
-
static_cast<Media_Block*>(
|
483
|
+
node->node()->statement_type() != Statement::MEDIA ||
|
484
|
+
static_cast<Media_Block*>(node->node())->media_queries() == static_cast<Media_Block*>(parent)->media_queries())
|
447
485
|
{
|
448
|
-
ss =
|
486
|
+
ss = node->node();
|
449
487
|
}
|
450
488
|
else
|
451
489
|
{
|
452
|
-
List* mq = merge_media_queries(static_cast<Media_Block*>(
|
490
|
+
List* mq = merge_media_queries(static_cast<Media_Block*>(node->node()), static_cast<Media_Block*>(parent));
|
453
491
|
if (!mq->length()) continue;
|
454
|
-
static_cast<Media_Block*>(
|
455
|
-
ss =
|
492
|
+
static_cast<Media_Block*>(node->node())->media_queries(mq);
|
493
|
+
ss = node->node();
|
456
494
|
}
|
457
495
|
|
458
496
|
if (!ss) continue;
|
459
497
|
|
460
|
-
ss->tabs(ss->tabs() +
|
461
|
-
ss->group_end(
|
498
|
+
ss->tabs(ss->tabs() + node->tabs());
|
499
|
+
ss->group_end(node->group_end());
|
462
500
|
|
463
501
|
if (!ss) continue;
|
464
502
|
|
@@ -467,16 +505,22 @@ namespace Sass {
|
|
467
505
|
children->block()->length(),
|
468
506
|
children->block()->is_root());
|
469
507
|
*bb << ss->perform(this);
|
508
|
+
|
509
|
+
Block* wrapper_block = SASS_MEMORY_NEW(ctx.mem, Block,
|
510
|
+
children->block()->pstate(),
|
511
|
+
children->block()->length(),
|
512
|
+
children->block()->is_root());
|
513
|
+
|
470
514
|
Statement* wrapper = flatten(bb);
|
471
515
|
*wrapper_block << wrapper;
|
472
516
|
|
473
517
|
if (wrapper->block()->length()) {
|
474
518
|
previous_parent = 0;
|
475
519
|
}
|
476
|
-
}
|
477
520
|
|
478
|
-
|
479
|
-
|
521
|
+
if (wrapper_block) {
|
522
|
+
*result << wrapper_block;
|
523
|
+
}
|
480
524
|
}
|
481
525
|
}
|
482
526
|
|
data/ext/libsass/src/cssize.hpp
CHANGED
@@ -13,11 +13,10 @@ namespace Sass {
|
|
13
13
|
|
14
14
|
class Cssize : public Operation_CRTP<Statement*, Cssize> {
|
15
15
|
|
16
|
-
Context&
|
17
|
-
std::vector<Block*>
|
18
|
-
std::vector<Statement*>
|
19
|
-
|
20
|
-
Backtrace* backtrace;
|
16
|
+
Context& ctx;
|
17
|
+
std::vector<Block*> block_stack;
|
18
|
+
std::vector<Statement*> p_stack;
|
19
|
+
Backtrace* backtrace;
|
21
20
|
|
22
21
|
Statement* fallback_impl(AST_Node* n);
|
23
22
|
|
@@ -25,18 +24,18 @@ namespace Sass {
|
|
25
24
|
Cssize(Context&, Backtrace*);
|
26
25
|
~Cssize() { }
|
27
26
|
|
28
|
-
|
27
|
+
CommaSequence_Selector* selector();
|
29
28
|
|
30
29
|
Statement* operator()(Block*);
|
31
30
|
Statement* operator()(Ruleset*);
|
32
|
-
// Statement* operator()(Propset*);
|
33
31
|
// Statement* operator()(Bubble*);
|
34
32
|
Statement* operator()(Media_Block*);
|
35
33
|
Statement* operator()(Supports_Block*);
|
36
34
|
Statement* operator()(At_Root_Block*);
|
37
35
|
Statement* operator()(Directive*);
|
38
36
|
Statement* operator()(Keyframe_Rule*);
|
39
|
-
|
37
|
+
Statement* operator()(Trace*);
|
38
|
+
Statement* operator()(Declaration*);
|
40
39
|
// Statement* operator()(Assignment*);
|
41
40
|
// Statement* operator()(Import*);
|
42
41
|
// Statement* operator()(Import_Stub*);
|
@@ -65,6 +65,14 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
65
65
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
66
66
|
std::cerr << " " << bubble->tabs();
|
67
67
|
std::cerr << std::endl;
|
68
|
+
debug_ast(bubble->node(), ind + " ", env);
|
69
|
+
} else if (dynamic_cast<Trace*>(node)) {
|
70
|
+
Trace* trace = dynamic_cast<Trace*>(node);
|
71
|
+
std::cerr << ind << "Trace " << trace;
|
72
|
+
std::cerr << " (" << pstate_source_position(node) << ")"
|
73
|
+
<< " [name:" << trace->name() << "]"
|
74
|
+
<< std::endl;
|
75
|
+
debug_ast(trace->block(), ind + " ", env);
|
68
76
|
} else if (dynamic_cast<At_Root_Block*>(node)) {
|
69
77
|
At_Root_Block* root_block = dynamic_cast<At_Root_Block*>(node);
|
70
78
|
std::cerr << ind << "At_Root_Block " << root_block;
|
@@ -73,12 +81,14 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
73
81
|
std::cerr << std::endl;
|
74
82
|
debug_ast(root_block->expression(), ind + ":", env);
|
75
83
|
debug_ast(root_block->block(), ind + " ", env);
|
76
|
-
} else if (dynamic_cast<
|
77
|
-
|
78
|
-
std::cerr << ind << "
|
84
|
+
} else if (dynamic_cast<CommaSequence_Selector*>(node)) {
|
85
|
+
CommaSequence_Selector* selector = dynamic_cast<CommaSequence_Selector*>(node);
|
86
|
+
std::cerr << ind << "CommaSequence_Selector " << selector;
|
79
87
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
80
88
|
std::cerr << " <" << selector->hash() << ">";
|
81
89
|
std::cerr << " [@media:" << selector->media_block() << "]";
|
90
|
+
std::cerr << (selector->is_invisible() ? " [INVISIBLE]": " -");
|
91
|
+
std::cerr << (selector->has_placeholder() ? " [PLACEHOLDER]": " -");
|
82
92
|
std::cerr << (selector->is_optional() ? " [is_optional]": " -");
|
83
93
|
std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
|
84
94
|
std::cerr << (selector->has_line_break() ? " [line-break]": " -");
|
@@ -97,16 +107,20 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
97
107
|
// if (selector->not_selector()) cerr << " [in_declaration]";
|
98
108
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
99
109
|
std::cerr << " <" << selector->hash() << ">";
|
110
|
+
std::cerr << " [" << (selector->is_real_parent_ref() ? "REAL" : "FAKE") << "]";
|
100
111
|
std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
|
101
112
|
// debug_ast(selector->selector(), ind + "->", env);
|
102
113
|
|
103
|
-
} else if (dynamic_cast<
|
104
|
-
|
105
|
-
std::cerr << ind << "
|
114
|
+
} else if (dynamic_cast<Sequence_Selector*>(node)) {
|
115
|
+
Sequence_Selector* selector = dynamic_cast<Sequence_Selector*>(node);
|
116
|
+
std::cerr << ind << "Sequence_Selector " << selector
|
106
117
|
<< " (" << pstate_source_position(node) << ")"
|
107
118
|
<< " <" << selector->hash() << ">"
|
119
|
+
<< " [length:" << longToHex(selector->length()) << "]"
|
108
120
|
<< " [weight:" << longToHex(selector->specificity()) << "]"
|
109
121
|
<< " [@media:" << selector->media_block() << "]"
|
122
|
+
<< (selector->is_invisible() ? " [INVISIBLE]": " -")
|
123
|
+
<< (selector->has_placeholder() ? " [PLACEHOLDER]": " -")
|
110
124
|
<< (selector->is_optional() ? " [is_optional]": " -")
|
111
125
|
<< (selector->has_parent_ref() ? " [has parent]": " -")
|
112
126
|
<< (selector->has_line_feed() ? " [line-feed]": " -")
|
@@ -114,11 +128,11 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
114
128
|
<< " -- ";
|
115
129
|
std::string del;
|
116
130
|
switch (selector->combinator()) {
|
117
|
-
case
|
118
|
-
case
|
119
|
-
case
|
120
|
-
case
|
121
|
-
case
|
131
|
+
case Sequence_Selector::PARENT_OF: del = ">"; break;
|
132
|
+
case Sequence_Selector::PRECEDES: del = "~"; break;
|
133
|
+
case Sequence_Selector::ADJACENT_TO: del = "+"; break;
|
134
|
+
case Sequence_Selector::ANCESTOR_OF: del = " "; break;
|
135
|
+
case Sequence_Selector::REFERENCE: del = "//"; break;
|
122
136
|
}
|
123
137
|
// if (del = "/") del += selector->reference()->perform(&to_string) + "/";
|
124
138
|
std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
|
@@ -130,9 +144,9 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
130
144
|
}
|
131
145
|
SourcesSet set = selector->sources();
|
132
146
|
// debug_sources_set(set, ind + " @--> ");
|
133
|
-
} else if (dynamic_cast<
|
134
|
-
|
135
|
-
std::cerr << ind << "
|
147
|
+
} else if (dynamic_cast<SimpleSequence_Selector*>(node)) {
|
148
|
+
SimpleSequence_Selector* selector = dynamic_cast<SimpleSequence_Selector*>(node);
|
149
|
+
std::cerr << ind << "SimpleSequence_Selector " << selector;
|
136
150
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
137
151
|
std::cerr << " <" << selector->hash() << ">";
|
138
152
|
std::cerr << " [weight:" << longToHex(selector->specificity()) << "]";
|
@@ -144,12 +158,6 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
144
158
|
std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
|
145
159
|
std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">" << std::endl;
|
146
160
|
for(auto i : selector->elements()) { debug_ast(i, ind + " ", env); }
|
147
|
-
} else if (dynamic_cast<Propset*>(node)) {
|
148
|
-
Propset* selector = dynamic_cast<Propset*>(node);
|
149
|
-
std::cerr << ind << "Propset " << selector;
|
150
|
-
std::cerr << " (" << pstate_source_position(node) << ")";
|
151
|
-
std::cerr << " " << selector->tabs() << std::endl;
|
152
|
-
if (selector->block()) for(auto i : selector->block()->elements()) { debug_ast(i, ind + " ", env); }
|
153
161
|
} else if (dynamic_cast<Wrapped_Selector*>(node)) {
|
154
162
|
Wrapped_Selector* selector = dynamic_cast<Wrapped_Selector*>(node);
|
155
163
|
std::cerr << ind << "Wrapped_Selector " << selector;
|
@@ -186,9 +194,20 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
186
194
|
std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
|
187
195
|
std::cerr << std::endl;
|
188
196
|
debug_ast(selector->value(), ind + "[" + selector->matcher() + "] ", env);
|
189
|
-
} else if (dynamic_cast<
|
190
|
-
|
191
|
-
std::cerr << ind << "
|
197
|
+
} else if (dynamic_cast<Class_Selector*>(node)) {
|
198
|
+
Class_Selector* selector = dynamic_cast<Class_Selector*>(node);
|
199
|
+
std::cerr << ind << "Class_Selector " << selector;
|
200
|
+
std::cerr << " (" << pstate_source_position(node) << ")";
|
201
|
+
std::cerr << " <" << selector->hash() << ">";
|
202
|
+
std::cerr << " <<" << selector->ns_name() << ">>";
|
203
|
+
std::cerr << (selector->is_optional() ? " [is_optional]": " -");
|
204
|
+
std::cerr << (selector->has_parent_ref() ? " [has-parent]": " -");
|
205
|
+
std::cerr << (selector->has_line_break() ? " [line-break]": " -");
|
206
|
+
std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
|
207
|
+
std::cerr << std::endl;
|
208
|
+
} else if (dynamic_cast<Id_Selector*>(node)) {
|
209
|
+
Id_Selector* selector = dynamic_cast<Id_Selector*>(node);
|
210
|
+
std::cerr << ind << "Id_Selector " << selector;
|
192
211
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
193
212
|
std::cerr << " <" << selector->hash() << ">";
|
194
213
|
std::cerr << " <<" << selector->ns_name() << ">>";
|
@@ -197,9 +216,9 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
197
216
|
std::cerr << (selector->has_line_break() ? " [line-break]": " -");
|
198
217
|
std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
|
199
218
|
std::cerr << std::endl;
|
200
|
-
} else if (dynamic_cast<
|
201
|
-
|
202
|
-
std::cerr << ind << "
|
219
|
+
} else if (dynamic_cast<Element_Selector*>(node)) {
|
220
|
+
Element_Selector* selector = dynamic_cast<Element_Selector*>(node);
|
221
|
+
std::cerr << ind << "Element_Selector " << selector;
|
203
222
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
204
223
|
std::cerr << " <" << selector->hash() << ">";
|
205
224
|
std::cerr << " <<" << selector->ns_name() << ">>";
|
@@ -209,10 +228,10 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
209
228
|
std::cerr << (selector->has_line_feed() ? " [line-feed]": " -");
|
210
229
|
std::cerr << " <" << prettyprint(selector->pstate().token.ws_before()) << ">";
|
211
230
|
std::cerr << std::endl;
|
212
|
-
} else if (dynamic_cast<
|
231
|
+
} else if (dynamic_cast<Placeholder_Selector*>(node)) {
|
213
232
|
|
214
|
-
|
215
|
-
std::cerr << ind << "
|
233
|
+
Placeholder_Selector* selector = dynamic_cast<Placeholder_Selector*>(node);
|
234
|
+
std::cerr << ind << "Placeholder_Selector [" << selector->ns_name() << "] " << selector
|
216
235
|
<< " <" << selector->hash() << ">"
|
217
236
|
<< " [@media:" << selector->media_block() << "]"
|
218
237
|
<< (selector->is_optional() ? " [is_optional]": " -")
|
@@ -279,6 +298,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
279
298
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
280
299
|
std::cerr << " " << block->tabs() << std::endl;
|
281
300
|
debug_ast(block->condition(), ind + " =@ ");
|
301
|
+
debug_ast(block->block(), ind + " <>");
|
282
302
|
} else if (dynamic_cast<Supports_Operator*>(node)) {
|
283
303
|
Supports_Operator* block = dynamic_cast<Supports_Operator*>(node);
|
284
304
|
std::cerr << ind << "Supports_Operator " << block;
|
@@ -292,6 +312,13 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
292
312
|
std::cerr << " (" << pstate_source_position(node) << ")"
|
293
313
|
<< std::endl;
|
294
314
|
debug_ast(block->condition(), ind + " condition) ");
|
315
|
+
} else if (dynamic_cast<At_Root_Query*>(node)) {
|
316
|
+
At_Root_Query* block = dynamic_cast<At_Root_Query*>(node);
|
317
|
+
std::cerr << ind << "At_Root_Query " << block;
|
318
|
+
std::cerr << " (" << pstate_source_position(node) << ")"
|
319
|
+
<< std::endl;
|
320
|
+
debug_ast(block->feature(), ind + " feature) ");
|
321
|
+
debug_ast(block->value(), ind + " value) ");
|
295
322
|
} else if (dynamic_cast<Supports_Declaration*>(node)) {
|
296
323
|
Supports_Declaration* block = dynamic_cast<Supports_Declaration*>(node);
|
297
324
|
std::cerr << ind << "Supports_Declaration " << block;
|
@@ -311,6 +338,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
311
338
|
std::cerr << ind << "Warning " << block;
|
312
339
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
313
340
|
std::cerr << " " << block->tabs() << std::endl;
|
341
|
+
debug_ast(block->message(), ind + " : ");
|
314
342
|
} else if (dynamic_cast<Error*>(node)) {
|
315
343
|
Error* block = dynamic_cast<Error*>(node);
|
316
344
|
std::cerr << ind << "Error " << block;
|
@@ -381,6 +409,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
381
409
|
std::cerr << " " << block->tabs() << std::endl;
|
382
410
|
debug_ast(block->property(), ind + " prop: ", env);
|
383
411
|
debug_ast(block->value(), ind + " value: ", env);
|
412
|
+
debug_ast(block->block(), ind + " ", env);
|
384
413
|
} else if (dynamic_cast<Keyframe_Rule*>(node)) {
|
385
414
|
Keyframe_Rule* has_block = dynamic_cast<Keyframe_Rule*>(node);
|
386
415
|
std::cerr << ind << "Keyframe_Rule " << has_block;
|
@@ -425,18 +454,19 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
425
454
|
std::cerr << " [native: " << block->native_function() << "] ";
|
426
455
|
std::cerr << " " << block->tabs() << std::endl;
|
427
456
|
debug_ast(block->parameters(), ind + " params: ", env);
|
428
|
-
if (block->block())
|
457
|
+
if (block->block()) debug_ast(block->block(), ind + " ", env);
|
429
458
|
} else if (dynamic_cast<Mixin_Call*>(node)) {
|
430
459
|
Mixin_Call* block = dynamic_cast<Mixin_Call*>(node);
|
431
460
|
std::cerr << ind << "Mixin_Call " << block << " " << block->tabs();
|
432
461
|
std::cerr << " [" << block->name() << "]";
|
433
462
|
std::cerr << " [has_content: " << block->has_content() << "] " << std::endl;
|
434
463
|
debug_ast(block->arguments(), ind + " args: ");
|
435
|
-
if (block->block())
|
464
|
+
if (block->block()) debug_ast(block->block(), ind + " ", env);
|
436
465
|
} else if (Ruleset* ruleset = dynamic_cast<Ruleset*>(node)) {
|
437
466
|
std::cerr << ind << "Ruleset " << ruleset;
|
438
467
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
439
468
|
std::cerr << " [indent: " << ruleset->tabs() << "]";
|
469
|
+
std::cerr << (ruleset->is_invisible() ? " [INVISIBLE]" : "");
|
440
470
|
std::cerr << (ruleset->at_root() ? " [@ROOT]" : "");
|
441
471
|
std::cerr << (ruleset->is_root() ? " [root]" : "");
|
442
472
|
std::cerr << std::endl;
|
@@ -446,6 +476,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
446
476
|
Block* block = dynamic_cast<Block*>(node);
|
447
477
|
std::cerr << ind << "Block " << block;
|
448
478
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
479
|
+
std::cerr << (block->is_invisible() ? " [INVISIBLE]" : "");
|
449
480
|
std::cerr << " [indent: " << block->tabs() << "]" << std::endl;
|
450
481
|
for(auto i : block->elements()) { debug_ast(i, ind + " ", env); }
|
451
482
|
} else if (dynamic_cast<Textual*>(node)) {
|
@@ -523,6 +554,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
523
554
|
Unary_Expression* expression = dynamic_cast<Unary_Expression*>(node);
|
524
555
|
std::cerr << ind << "Unary_Expression " << expression;
|
525
556
|
std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
|
557
|
+
std::cerr << " [delayed: " << expression->is_delayed() << "] ";
|
526
558
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
527
559
|
std::cerr << " [" << expression->type() << "]" << std::endl;
|
528
560
|
debug_ast(expression->operand(), ind + " operand: ", env);
|
@@ -578,6 +610,7 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
578
610
|
Color* expression = dynamic_cast<Color*>(node);
|
579
611
|
std::cerr << ind << "Color " << expression;
|
580
612
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
613
|
+
std::cerr << " [delayed: " << expression->is_delayed() << "] ";
|
581
614
|
std::cerr << " [interpolant: " << expression->is_interpolant() << "] ";
|
582
615
|
std::cerr << " [" << expression->r() << ":" << expression->g() << ":" << expression->b() << "@" << expression->a() << "]" << std::endl;
|
583
616
|
} else if (dynamic_cast<Number*>(node)) {
|
@@ -594,7 +627,6 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
594
627
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
595
628
|
std::cerr << " [" << prettyprint(expression->value()) << "]";
|
596
629
|
if (expression->is_delayed()) std::cerr << " [delayed]";
|
597
|
-
if (expression->sass_fix_1291()) std::cerr << " [sass_fix_1291]";
|
598
630
|
if (expression->is_interpolant()) std::cerr << " [interpolant]";
|
599
631
|
if (expression->quote_mark()) std::cerr << " [quote_mark: " << expression->quote_mark() << "]";
|
600
632
|
std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
|
@@ -607,7 +639,6 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
607
639
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
608
640
|
std::cerr << " [" << prettyprint(expression->value()) << "]";
|
609
641
|
if (expression->is_delayed()) std::cerr << " [delayed]";
|
610
|
-
if (expression->sass_fix_1291()) std::cerr << " [sass_fix_1291]";
|
611
642
|
if (expression->is_interpolant()) std::cerr << " [interpolant]";
|
612
643
|
std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
|
613
644
|
} else if (dynamic_cast<String_Schema*>(node)) {
|
@@ -626,7 +657,6 @@ inline void debug_ast(AST_Node* node, std::string ind, Env* env)
|
|
626
657
|
std::cerr << ind << "String " << expression;
|
627
658
|
std::cerr << " " << expression->concrete_type();
|
628
659
|
std::cerr << " (" << pstate_source_position(node) << ")";
|
629
|
-
if (expression->sass_fix_1291()) std::cerr << " [sass_fix_1291]";
|
630
660
|
if (expression->is_interpolant()) std::cerr << " [interpolant]";
|
631
661
|
std::cerr << " <" << prettyprint(expression->pstate().token.ws_before()) << ">" << std::endl;
|
632
662
|
} else if (dynamic_cast<Expression*>(node)) {
|
@@ -673,11 +703,11 @@ inline void debug_node(Node* node, std::string ind = "")
|
|
673
703
|
std::cerr << node << " ";
|
674
704
|
if (node->got_line_feed) std::cerr << "[LF] ";
|
675
705
|
switch (node->combinator()) {
|
676
|
-
case
|
677
|
-
case
|
678
|
-
case
|
679
|
-
case
|
680
|
-
case
|
706
|
+
case Sequence_Selector::ADJACENT_TO: std::cerr << "{+} "; break;
|
707
|
+
case Sequence_Selector::PARENT_OF: std::cerr << "{>} "; break;
|
708
|
+
case Sequence_Selector::PRECEDES: std::cerr << "{~} "; break;
|
709
|
+
case Sequence_Selector::REFERENCE: std::cerr << "{@} "; break;
|
710
|
+
case Sequence_Selector::ANCESTOR_OF: std::cerr << "{ } "; break;
|
681
711
|
}
|
682
712
|
std::cerr << std::endl;
|
683
713
|
// debug_ast(node->combinator(), ind + " ");
|
@@ -733,7 +763,7 @@ inline void debug_subset_map(Sass::ExtensionSubsetMap& map, std::string ind = ""
|
|
733
763
|
if (ind == "") std::cerr << "#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
|
734
764
|
}
|
735
765
|
|
736
|
-
typedef std::pair<
|
766
|
+
typedef std::pair<Sequence_Selector*, SimpleSequence_Selector*> ExtensionPair;
|
737
767
|
typedef std::vector<ExtensionPair> SubsetMapEntries;
|
738
768
|
|
739
769
|
inline void debug_subset_entries(SubsetMapEntries* entries, std::string ind = "")
|