Skip to content

Commit

Permalink
Merge pull request #927 from mgreter/bugfix/issue_317
Browse files Browse the repository at this point in the history
Fix multiple open small issues
  • Loading branch information
mgreter committed Mar 9, 2015
2 parents 5757248 + 14bfd99 commit 51ffdcd
Show file tree
Hide file tree
Showing 26 changed files with 381 additions and 85 deletions.
4 changes: 3 additions & 1 deletion ast.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -414,7 +414,9 @@ namespace Sass {
{
if (!tail()) return 0;
if (!head()) return tail()->context(ctx);
return new (ctx.mem) Complex_Selector(pstate(), combinator(), head(), tail()->context(ctx));
Complex_Selector* cpy = new (ctx.mem) Complex_Selector(pstate(), combinator(), head(), tail()->context(ctx));
cpy->media_block(media_block());
return cpy;
}

Complex_Selector* Complex_Selector::innermost()
Expand Down
15 changes: 11 additions & 4 deletions ast.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
#include "ast_def_macros.hpp"
#include "ast_fwd_decl.hpp"
#include "to_string.hpp"
#include "source_map.hpp"

#include "sass.h"
#include "sass_values.h"
Expand Down Expand Up @@ -1704,13 +1705,19 @@ namespace Sass {
ADD_PROPERTY(bool, has_line_feed);
// line break after list separator
ADD_PROPERTY(bool, has_line_break);
// maybe we have optional flag
ADD_PROPERTY(bool, is_optional);
// parent media block (for extend check)
ADD_PROPERTY(Media_Block*, media_block);
public:
Selector(ParserState pstate, bool r = false, bool h = false)
: AST_Node(pstate),
has_reference_(r),
has_placeholder_(h),
has_line_feed_(false),
has_line_break_(false)
has_line_break_(false),
is_optional_(false),
media_block_(0)
{ }
virtual ~Selector() = 0;
// virtual Selector_Placeholder* find_placeholder();
Expand Down Expand Up @@ -1962,9 +1969,9 @@ namespace Sass {
ADD_PROPERTY(Complex_Selector*, tail);
public:
Complex_Selector(ParserState pstate,
Combinator c,
Compound_Selector* h,
Complex_Selector* t)
Combinator c,
Compound_Selector* h,
Complex_Selector* t)
: Selector(pstate), combinator_(c), head_(h), tail_(t)
{
if ((h && h->has_reference()) || (t && t->has_reference())) has_reference(true);
Expand Down
5 changes: 1 addition & 4 deletions backtrace.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,8 @@

#include <sstream>

#include "position.hpp"

#ifndef SASS_FILE
#include "file.hpp"
#endif
#include "position.hpp"

namespace Sass {

Expand Down
3 changes: 2 additions & 1 deletion context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,8 @@ namespace Sass {
if (!root) return 0;
root->perform(&emitter);
emitter.finalize();
string output = emitter.get_buffer();
OutputBuffer emitted = emitter.get_buffer();
string output = emitted.buffer;
if (source_map_file != "" && !omit_source_map_url) {
output += linefeed + format_source_mapping_url(source_map_file);
}
Expand Down
3 changes: 3 additions & 0 deletions contextualize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ namespace Sass {
{
To_String to_string(&ctx);
Complex_Selector* ss = new (ctx.mem) Complex_Selector(*s);
// ss->media_block(s->media_block());
Compound_Selector* new_head = 0;
Complex_Selector* new_tail = 0;
if (ss->head()) {
Expand All @@ -72,6 +73,7 @@ namespace Sass {
}
if (ss->tail()) {
new_tail = static_cast<Complex_Selector*>(s->tail()->perform(this));
// new_tail->media_block(s->media_block());
ss->tail(new_tail);
}
if ((new_head && new_head->has_placeholder()) || (new_tail && new_tail->has_placeholder())) {
Expand All @@ -95,6 +97,7 @@ namespace Sass {
return extender;
}
Compound_Selector* ss = new (ctx.mem) Compound_Selector(s->pstate(), s->length());
ss->media_block(s->media_block());
ss->has_line_break(s->has_line_break());
for (size_t i = 0, L = s->length(); i < L; ++i) {
Simple_Selector* simp = static_cast<Simple_Selector*>((*s)[i]->perform(this));
Expand Down
7 changes: 1 addition & 6 deletions cssize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,17 +102,12 @@ namespace Sass {
p_stack.pop_back();

Block* props = new (ctx.mem) Block(rr->block()->pstate());
for (size_t i = 0, L = rr->block()->length(); i < L; i++)
{
Statement* s = (*rr->block())[i];
if (!bubblable(s)) *props << s;
}

Block* rules = new (ctx.mem) Block(rr->block()->pstate());
for (size_t i = 0, L = rr->block()->length(); i < L; i++)
{
Statement* s = (*rr->block())[i];
if (bubblable(s)) *rules << s;
if (!bubblable(s)) *props << s;
}

if (props->length())
Expand Down
56 changes: 51 additions & 5 deletions debugger.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#ifndef SASS_DEBUGGER_H
#define SASS_DEBUGGER_H

#include <string>
#include "ast_fwd_decl.hpp"

using namespace std;
Expand Down Expand Up @@ -37,7 +38,14 @@ inline void debug_ast(AST_Node* node, string ind = "", Env* env = 0)
if (root_block->block()) for(auto i : root_block->block()->elements()) { debug_ast(i, ind + " ", env); }
} else if (dynamic_cast<Selector_List*>(node)) {
Selector_List* selector = dynamic_cast<Selector_List*>(node);
cerr << ind << "Selector_List " << selector << (selector->has_line_break() ? " [line-break]": " -") << (selector->has_line_feed() ? " [line-feed]": " -") << endl;

cerr << ind << "Selector_List " << selector
<< " [mq:" << selector->media_block() << "]"
<< (selector->is_optional() ? " [is_optional]": " -")
<< (selector->has_line_break() ? " [line-break]": " -")
<< (selector->has_line_feed() ? " [line-feed]": " -")
<< endl;

for(auto i : selector->elements()) { debug_ast(i, ind + " ", env); }

// } else if (dynamic_cast<Expression*>(node)) {
Expand All @@ -46,7 +54,11 @@ inline void debug_ast(AST_Node* node, string ind = "", Env* env = 0)

} else if (dynamic_cast<Complex_Selector*>(node)) {
Complex_Selector* selector = dynamic_cast<Complex_Selector*>(node);
cerr << ind << "Complex_Selector " << selector << (selector->has_line_break() ? " [line-break]": " -") << (selector->has_line_feed() ? " [line-feed]": " -") << " -> ";
cerr << ind << "Complex_Selector " << selector
<< " [mq:" << selector->media_block() << "]"
<< (selector->is_optional() ? " [is_optional]": " -")
<< (selector->has_line_break() ? " [line-break]": " -")
<< (selector->has_line_feed() ? " [line-feed]": " -") << " -> ";
switch (selector->combinator()) {
case Complex_Selector::PARENT_OF: cerr << "{>}"; break;
case Complex_Selector::PRECEDES: cerr << "{~}"; break;
Expand All @@ -58,7 +70,11 @@ inline void debug_ast(AST_Node* node, string ind = "", Env* env = 0)
debug_ast(selector->tail(), ind + "-", env);
} else if (dynamic_cast<Compound_Selector*>(node)) {
Compound_Selector* selector = dynamic_cast<Compound_Selector*>(node);
cerr << ind << "Compound_Selector " << selector << (selector->has_line_break() ? " [line-break]": " -") << (selector->has_line_feed() ? " [line-feed]": " -") <<
cerr << ind << "Compound_Selector " << selector
<< " [mq:" << selector->media_block() << "]"
<< (selector->is_optional() ? " [is_optional]": " -")
<< (selector->has_line_break() ? " [line-break]": " -")
<< (selector->has_line_feed() ? " [line-feed]": " -") <<
" <" << prettyprint(selector->pstate().token.ws_before()) << "> X <" << prettyprint(selector->pstate().token.ws_after()) << ">" << endl;
for(auto i : selector->elements()) { debug_ast(i, ind + " ", env); }
} else if (dynamic_cast<Propset*>(node)) {
Expand All @@ -85,8 +101,15 @@ inline void debug_ast(AST_Node* node, string ind = "", Env* env = 0)
cerr << ind << "Type_Selector " << selector << " <<" << selector->name() << ">>" << (selector->has_line_break() ? " [line-break]": " -") <<
" <" << prettyprint(selector->pstate().token.ws_before()) << "> X <" << prettyprint(selector->pstate().token.ws_after()) << ">" << endl;
} else if (dynamic_cast<Selector_Placeholder*>(node)) {

Selector_Placeholder* selector = dynamic_cast<Selector_Placeholder*>(node);
cerr << ind << "Selector_Placeholder [" << selector->name() << "] " << selector << (selector->has_line_break() ? " [line-break]": " -") << (selector->has_line_feed() ? " [line-feed]": " -") << endl;
cerr << ind << "Selector_Placeholder [" << selector->name() << "] " << selector
<< " [mq:" << selector->media_block() << "]"
<< (selector->is_optional() ? " [is_optional]": " -")
<< (selector->has_line_break() ? " [line-break]": " -")
<< (selector->has_line_feed() ? " [line-feed]": " -")
<< endl;

} else if (dynamic_cast<Selector_Reference*>(node)) {
Selector_Reference* selector = dynamic_cast<Selector_Reference*>(node);
cerr << ind << "Selector_Reference " << selector << " @ref " << selector->selector() << endl;
Expand All @@ -102,10 +125,33 @@ inline void debug_ast(AST_Node* node, string ind = "", Env* env = 0)

} else if (dynamic_cast<Selector*>(node)) {
Selector* selector = dynamic_cast<Selector*>(node);
cerr << ind << "Selector " << selector << (selector->has_line_break() ? " [line-break]": " -") << (selector->has_line_feed() ? " [line-feed]": " -") << endl;
cerr << ind << "Selector " << selector
<< (selector->has_line_break() ? " [line-break]": " -")
<< (selector->has_line_feed() ? " [line-feed]": " -")
<< endl;

} else if (dynamic_cast<Media_Query_Expression*>(node)) {
Media_Query_Expression* block = dynamic_cast<Media_Query_Expression*>(node);
cerr << ind << "Media_Query_Expression " << block
<< (block->is_interpolated() ? " [is_interpolated]": " -")
<< endl;
debug_ast(block->feature(), ind + " f) ");
debug_ast(block->value(), ind + " v) ");

} else if (dynamic_cast<Media_Query*>(node)) {
Media_Query* block = dynamic_cast<Media_Query*>(node);
cerr << ind << "Media_Query " << block
<< (block->is_negated() ? " [is_negated]": " -")
<< (block->is_restricted() ? " [is_restricted]": " -")
<< endl;
debug_ast(block->media_type(), ind + " ");
for(auto i : block->elements()) { debug_ast(i, ind + " ", env); }

} else if (dynamic_cast<Media_Block*>(node)) {
Media_Block* block = dynamic_cast<Media_Block*>(node);
cerr << ind << "Media_Block " << block << " " << block->tabs() << endl;
debug_ast(block->media_queries(), ind + " =@ ");
debug_ast(block->selector(), ind + " -@ ");
if (block->block()) for(auto i : block->block()->elements()) { debug_ast(i, ind + " ", env); }
} else if (dynamic_cast<Feature_Block*>(node)) {
Feature_Block* block = dynamic_cast<Feature_Block*>(node);
Expand Down
18 changes: 16 additions & 2 deletions emitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,20 @@ namespace Sass {
}
}

// prepend some text or token to the buffer
void Emitter::prepend_output(const OutputBuffer& output)
{
wbuf.smap.prepend(output);
wbuf.buffer = output.buffer + wbuf.buffer;
}

// prepend some text or token to the buffer
void Emitter::prepend_string(const string& text)
{
wbuf.smap.prepend(Offset(text));
wbuf.buffer = text + wbuf.buffer;
}

// append some text or token to the buffer
void Emitter::append_string(const string& text)
{
Expand All @@ -97,12 +111,12 @@ namespace Sass {
// add to buffer
wbuf.buffer += out;
// account for data in source-maps
wbuf.smap.update_column(out);
wbuf.smap.append(Offset(out));
} else {
// add to buffer
wbuf.buffer += text;
// account for data in source-maps
wbuf.smap.update_column(text);
wbuf.smap.append(Offset(text));
}
}

Expand Down
15 changes: 4 additions & 11 deletions emitter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,6 @@ namespace Sass {
class Context;
using namespace std;

class OutputBuffer {
public:
OutputBuffer(void)
: buffer(""),
smap()
{ }
public:
string buffer;
SourceMap smap;
};

class Emitter {

public:
Expand All @@ -31,6 +20,7 @@ namespace Sass {
public:
const string buffer(void) { return wbuf.buffer; }
const SourceMap smap(void) { return wbuf.smap; }
const OutputBuffer output(void) { return wbuf; }
// proxy methods for source maps
void add_source_index(size_t idx);
void set_filename(const string& str);
Expand Down Expand Up @@ -62,6 +52,9 @@ namespace Sass {
void finalize(void);
// flush scheduled space/linefeed
void flush_schedules(void);
// prepend some text or token to the buffer
void prepend_string(const string& text);
void prepend_output(const OutputBuffer& out);
// append some text or token to the buffer
void append_string(const string& text);
// append some white-space only text
Expand Down
10 changes: 5 additions & 5 deletions eval.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -604,7 +604,7 @@ namespace Sass {
string name(v->name());
Expression* value = 0;
if (env->has(name)) value = static_cast<Expression*>((*env)[name]);
else error("unbound variable " + v->name(), v->pstate());
else error("Undefined variable: \"" + v->name() + "\".", v->pstate());
// cerr << "name: " << v->name() << "; type: " << typeid(*value).name() << "; value: " << value->perform(&to_string) << endl;
if (typeid(*value) == typeid(Argument)) value = static_cast<Argument*>(value)->value();

Expand Down Expand Up @@ -658,19 +658,19 @@ namespace Sass {
{
case Textual::NUMBER:
result = new (ctx.mem) Number(t->pstate(),
atof(num.c_str()),
sass_atof(num.c_str()),
"",
zero);
break;
case Textual::PERCENTAGE:
result = new (ctx.mem) Number(t->pstate(),
atof(num.c_str()),
sass_atof(num.c_str()),
"%",
zero);
break;
case Textual::DIMENSION:
result = new (ctx.mem) Number(t->pstate(),
atof(num.c_str()),
sass_atof(num.c_str()),
Token(number(text.c_str()), t->pstate()),
zero);
break;
Expand Down Expand Up @@ -770,7 +770,7 @@ namespace Sass {
} else if (Variable* var = dynamic_cast<Variable*>(s)) {

string name(var->name());
if (!env->has(name)) return name;
if (!env->has(name)) error("Undefined variable: \"" + var->name() + "\".", var->pstate());
Expression* value = static_cast<Expression*>((*env)[name]);
return evacuate_quotes(interpolation(value));

Expand Down
16 changes: 9 additions & 7 deletions expand.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,22 +70,23 @@ namespace Sass {
string str = isp.get_buffer();
str += ";";

Parser p(ctx, ParserState("[REPARSE]", 0));
Parser p(ctx, r->pstate());
p.last_media_block = r->selector() ? r->selector()->media_block() : 0;
p.source = str.c_str();
p.position = str.c_str();
p.end = str.c_str() + strlen(str.c_str());
Selector_List* sel_lst = p.parse_selector_group();
sel_lst->pstate(isp.remap(sel_lst->pstate()));
// sel_lst->pstate(isp.remap(sel_lst->pstate()));

for(size_t i = 0; i < sel_lst->length(); i++) {

Complex_Selector* pIter = (*sel_lst)[i];
while (pIter) {
Compound_Selector* pHead = pIter->head();
pIter->pstate(isp.remap(pIter->pstate()));
// pIter->pstate(isp.remap(pIter->pstate()));
if (pHead) {
pHead->pstate(isp.remap(pHead->pstate()));
(*pHead)[0]->pstate(isp.remap((*pHead)[0]->pstate()));
// pHead->pstate(isp.remap(pHead->pstate()));
// (*pHead)[0]->pstate(isp.remap((*pHead)[0]->pstate()));
}
pIter = pIter->tail();
}
Expand Down Expand Up @@ -403,7 +404,8 @@ namespace Sass {
To_String to_string(&ctx);
Selector_List* extender = static_cast<Selector_List*>(selector_stack.back());
if (!extender) return 0;
Selector_List* extendee = static_cast<Selector_List*>(e->selector()->perform(contextualize->with(0, env, backtrace)));
Selector_List* org_extendee = static_cast<Selector_List*>(e->selector());
Selector_List* extendee = static_cast<Selector_List*>(org_extendee->perform(contextualize->with(0, env, backtrace)));
if (extendee->length() != 1) {
error("selector groups may not be extended", extendee->pstate(), backtrace);
}
Expand All @@ -412,7 +414,7 @@ namespace Sass {
error("nested selectors may not be extended", c->pstate(), backtrace);
}
Compound_Selector* s = c->head();

s->is_optional(org_extendee->is_optional());
// // need to convert the compound selector into a by-value data structure
// vector<string> target_vec;
// for (size_t i = 0, L = s->length(); i < L; ++i)
Expand Down
Loading

0 comments on commit 51ffdcd

Please sign in to comment.