7e803a0e83e3392baaffe193fea4c9fe2b29b20a
[WebKit-https.git] / Source / WebInspectorUI / Tools / PrettyPrinting / FormatterDebug.js
1 Formatter.prototype.debug = function(from, to)
2 {
3     var debug = "";
4     var outerMode = this._codeMirror.getMode();
5     var content = this._codeMirror.getRange(from, to);
6     var state = CodeMirror.copyState(outerMode, this._codeMirror.getTokenAt(from).state);
7
8     function pad(str, x, doNotQuote)
9     {
10         var result = doNotQuote ? str : "'" + str + "'";
11         for (var toPad = x - result.length; toPad > 0; --toPad)
12             result += " ";
13         return result;
14     }
15
16     function debugToken(mode, token, state, stream, originalPosition, startOfNewLine)
17     {
18         // Token Type
19         debug += "Token: " + pad(String(token), 14, !token);
20
21         // Original Position
22         debug += "Position: " + pad(String(originalPosition), 10);
23
24         // Language Specific Info
25         if (state.lexical) {
26             debug += "Lexical: " + pad(String(state.lexical.type), 10); // JavaScript
27             debug += "Prev: " + pad(String(state.lexical.prev ? state.lexical.prev.type : state.lexical.prev), 10, !state.lexical.prev);
28         }
29         else if (state.stack)
30             debug += "Stack: " + pad(String(state.stack[state.stack.length-1]), 16); // CSS
31
32         // String
33         debug += "Current: '" + stream.current() + "'\n";
34     }
35
36     var lineOffset = 0;
37     var lines = content.split("\n");
38     for (var i = 0; i < lines.length; ++i) {
39         var line = lines[i];
40         var startOfNewLine = true;
41         var stream = new CodeMirror.StringStream(line);
42         while (!stream.eol()) {
43             var innerMode = CodeMirror.innerMode(outerMode, state);
44             var token = outerMode.token(stream, state);
45             debugToken(innerMode.mode, token, state, stream, lineOffset + stream.start, startOfNewLine);
46             stream.start = stream.pos;
47             startOfNewLine = false;
48         }
49     }
50
51     return debug;
52 };