Blame src/backtrace.hpp

Packit bfcc33
#ifndef SASS_BACKTRACE_H
Packit bfcc33
#define SASS_BACKTRACE_H
Packit bfcc33
Packit bfcc33
#include <sstream>
Packit bfcc33
Packit bfcc33
#include "file.hpp"
Packit bfcc33
#include "position.hpp"
Packit bfcc33
Packit bfcc33
namespace Sass {
Packit bfcc33
Packit bfcc33
Packit bfcc33
  struct Backtrace {
Packit bfcc33
Packit bfcc33
    Backtrace*  parent;
Packit bfcc33
    ParserState pstate;
Packit bfcc33
    std::string      caller;
Packit bfcc33
Packit bfcc33
    Backtrace(Backtrace* prn, ParserState pstate, std::string c)
Packit bfcc33
    : parent(prn),
Packit bfcc33
      pstate(pstate),
Packit bfcc33
      caller(c)
Packit bfcc33
    { }
Packit bfcc33
Packit bfcc33
    const std::string to_string(bool warning = false)
Packit bfcc33
    {
Packit bfcc33
      size_t i = -1;
Packit bfcc33
      std::stringstream ss;
Packit bfcc33
      std::string cwd(Sass::File::get_cwd());
Packit bfcc33
      Backtrace* this_point = this;
Packit bfcc33
Packit bfcc33
      if (!warning) ss << std::endl << "Backtrace:";
Packit bfcc33
      // the first tracepoint (which is parent-less) is an empty placeholder
Packit bfcc33
      while (this_point->parent) {
Packit bfcc33
Packit bfcc33
        // make path relative to the current directory
Packit bfcc33
        std::string rel_path(Sass::File::abs2rel(this_point->pstate.path, cwd, cwd));
Packit bfcc33
Packit bfcc33
        if (warning) {
Packit bfcc33
          ss << std::endl
Packit bfcc33
             << "\t"
Packit bfcc33
             << (++i == 0 ? "on" : "from")
Packit bfcc33
             << " line "
Packit bfcc33
             << this_point->pstate.line + 1
Packit bfcc33
             << " of "
Packit bfcc33
             << rel_path;
Packit bfcc33
        } else {
Packit bfcc33
          ss << std::endl
Packit bfcc33
             << "\t"
Packit bfcc33
             << rel_path
Packit bfcc33
             << ":"
Packit bfcc33
             << this_point->pstate.line + 1
Packit bfcc33
             << this_point->parent->caller;
Packit bfcc33
        }
Packit bfcc33
Packit bfcc33
        this_point = this_point->parent;
Packit bfcc33
      }
Packit bfcc33
Packit bfcc33
      return ss.str();
Packit bfcc33
    }
Packit bfcc33
Packit bfcc33
    size_t depth()
Packit bfcc33
    {
Packit bfcc33
      size_t d = std::string::npos;
Packit bfcc33
      Backtrace* p = parent;
Packit bfcc33
      while (p) {
Packit bfcc33
        ++d;
Packit bfcc33
        p = p->parent;
Packit bfcc33
      }
Packit bfcc33
      return d;
Packit bfcc33
    }
Packit bfcc33
Packit bfcc33
  };
Packit bfcc33
Packit bfcc33
}
Packit bfcc33
Packit bfcc33
#endif