You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.6 KiB
93 lines
2.6 KiB
var createCustomError = require('../utils/createCustomError'); |
|
var generate = require('../definition-syntax/generate'); |
|
|
|
function fromMatchResult(matchResult) { |
|
var tokens = matchResult.tokens; |
|
var longestMatch = matchResult.longestMatch; |
|
var node = longestMatch < tokens.length ? tokens[longestMatch].node : null; |
|
var mismatchOffset = -1; |
|
var entries = 0; |
|
var css = ''; |
|
|
|
for (var i = 0; i < tokens.length; i++) { |
|
if (i === longestMatch) { |
|
mismatchOffset = css.length; |
|
} |
|
|
|
if (node !== null && tokens[i].node === node) { |
|
if (i <= longestMatch) { |
|
entries++; |
|
} else { |
|
entries = 0; |
|
} |
|
} |
|
|
|
css += tokens[i].value; |
|
} |
|
|
|
return { |
|
node: node, |
|
css: css, |
|
mismatchOffset: mismatchOffset === -1 ? css.length : mismatchOffset, |
|
last: node === null || entries > 1 |
|
}; |
|
} |
|
|
|
function getLocation(node, point) { |
|
var loc = node && node.loc && node.loc[point]; |
|
|
|
if (loc) { |
|
return { |
|
offset: loc.offset, |
|
line: loc.line, |
|
column: loc.column |
|
}; |
|
} |
|
|
|
return null; |
|
} |
|
|
|
var SyntaxReferenceError = function(type, referenceName) { |
|
var error = createCustomError( |
|
'SyntaxReferenceError', |
|
type + (referenceName ? ' `' + referenceName + '`' : '') |
|
); |
|
|
|
error.reference = referenceName; |
|
|
|
return error; |
|
}; |
|
|
|
var MatchError = function(message, syntax, node, matchResult) { |
|
var error = createCustomError('SyntaxMatchError', message); |
|
var details = fromMatchResult(matchResult); |
|
var mismatchOffset = details.mismatchOffset || 0; |
|
var badNode = details.node || node; |
|
var end = getLocation(badNode, 'end'); |
|
var start = details.last ? end : getLocation(badNode, 'start'); |
|
var css = details.css; |
|
|
|
error.rawMessage = message; |
|
error.syntax = syntax ? generate(syntax) : '<generic>'; |
|
error.css = css; |
|
error.mismatchOffset = mismatchOffset; |
|
error.loc = { |
|
source: (badNode && badNode.loc && badNode.loc.source) || '<unknown>', |
|
start: start, |
|
end: end |
|
}; |
|
error.line = start ? start.line : undefined; |
|
error.column = start ? start.column : undefined; |
|
error.offset = start ? start.offset : undefined; |
|
error.message = message + '\n' + |
|
' syntax: ' + error.syntax + '\n' + |
|
' value: ' + (error.css || '<empty string>') + '\n' + |
|
' --------' + new Array(error.mismatchOffset + 1).join('-') + '^'; |
|
|
|
return error; |
|
}; |
|
|
|
module.exports = { |
|
SyntaxReferenceError: SyntaxReferenceError, |
|
MatchError: MatchError |
|
};
|
|
|