Skip to content

Commit 37d2765

Browse files
committed
parser: Added line number, character number and current parsed style sheet to thrown errors
1 parent 2777b44 commit 37d2765

1 file changed

Lines changed: 21 additions & 6 deletions

File tree

lib/parse.js

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,27 @@ CSSOM.parse = function parse(token) {
5555

5656
var atKeyframesRegExp = /@(-(?:\w+-)+)?keyframes/g;
5757

58+
var lineNumber = 1,
59+
charNumber = 0,
60+
parseError = function (msg) {
61+
var err = new Error(msg + ' at Line ' + lineNumber + ', char ' + charNumber, null, lineNumber);
62+
err.line = lineNumber;
63+
err.char = charNumber;
64+
err.styleSheet = styleSheet;
65+
throw err;
66+
};
67+
68+
5869
for (var character; character = token.charAt(i); i++) {
5970

6071
switch (character) {
6172

73+
case "\n":
74+
lineNumber += 1;
75+
charNumber = 0;
6276
case " ":
6377
case "\t":
6478
case "\r":
65-
case "\n":
6679
case "\f":
6780
if (SIGNIFICANT_WHITESPACE[state]) {
6881
buffer += character;
@@ -73,7 +86,7 @@ CSSOM.parse = function parse(token) {
7386
case '"':
7487
index = token.indexOf('"', i + 1) + 1;
7588
if (!index) {
76-
throw '" is missing';
89+
parseError('Unmatched "');
7790
}
7891
buffer += token.slice(i, index);
7992
i = index - 1;
@@ -90,7 +103,7 @@ CSSOM.parse = function parse(token) {
90103
case "'":
91104
index = token.indexOf("'", i + 1) + 1;
92105
if (!index) {
93-
throw "' is missing";
106+
parseError("Unmatched '");
94107
}
95108
buffer += token.slice(i, index);
96109
i = index - 1;
@@ -110,7 +123,7 @@ CSSOM.parse = function parse(token) {
110123
i += 2;
111124
index = token.indexOf("*/", i);
112125
if (index === -1) {
113-
throw new SyntaxError("Missing */");
126+
parseError("Missing */");
114127
} else {
115128
i = index + 1;
116129
}
@@ -214,7 +227,7 @@ CSSOM.parse = function parse(token) {
214227
if (state === 'value') {
215228
index = token.indexOf(')', i + 1);
216229
if (index === -1) {
217-
throw i + ': unclosed "("';
230+
parseError('Unmatched "("');
218231
}
219232
buffer += token.slice(i, index + 1);
220233
i = index;
@@ -283,7 +296,7 @@ CSSOM.parse = function parse(token) {
283296
case "selector":
284297
// End of media rule.
285298
if (!parentRule) {
286-
throw "unexpected }";
299+
parseError("Unexpected }");
287300
}
288301
currentScope.__ends = i + 1;
289302
// Nesting rules aren't supported yet
@@ -316,6 +329,8 @@ CSSOM.parse = function parse(token) {
316329
buffer += character;
317330
break;
318331
}
332+
333+
charNumber += 1;
319334
}
320335

321336
return styleSheet;

0 commit comments

Comments
 (0)