blob: 4d9f71c44a08e45ac351f169a38e842a7a56a1b4 [file] [log] [blame]
WI.Formatter.prototype.debug = function(from, to)
{
var debug = "";
var outerMode = this._codeMirror.getMode();
var content = this._codeMirror.getRange(from, to);
var state = CodeMirror.copyState(outerMode, this._codeMirror.getTokenAt(from).state);
function pad(str, x, doNotQuote)
{
var result = doNotQuote ? str : "'" + str + "'";
for (var toPad = x - result.length; toPad > 0; --toPad)
result += " ";
return result;
}
function debugToken(mode, token, state, stream, originalPosition, startOfNewLine)
{
// Token Type
debug += "Token: " + pad(String(token), 14, !token);
// Original Position
debug += "Position: " + pad(String(originalPosition), 10);
// Language Specific Info
if (state.lexical) {
// JavaScript
debug += "Lexical: " + pad(String(state.lexical.type), 10); // JavaScript
debug += "Prev: " + pad(String(state.lexical.prev ? state.lexical.prev.type : state.lexical.prev), 10, !state.lexical.prev);
} else if (state.state) {
// CSS
debug += "State: " + pad(String(state.state), 16);
}
// String
debug += "Current: '" + stream.current() + "'\n";
}
var lineOffset = 0;
var lines = content.split("\n");
for (var i = 0; i < lines.length; ++i) {
var line = lines[i];
var startOfNewLine = true;
var stream = new CodeMirror.StringStream(line);
while (!stream.eol()) {
var innerMode = CodeMirror.innerMode(outerMode, state);
var token = outerMode.token(stream, state);
debugToken(innerMode.mode, token, state, stream, lineOffset + stream.start, startOfNewLine);
stream.start = stream.pos;
startOfNewLine = false;
}
}
return debug;
};