| 'use strict'; |
| |
| const ErrorReportingMixinBase = require('./mixin-base'); |
| const ErrorReportingTokenizerMixin = require('./tokenizer-mixin'); |
| const LocationInfoTokenizerMixin = require('../location-info/tokenizer-mixin'); |
| const Mixin = require('../../utils/mixin'); |
| |
| class ErrorReportingParserMixin extends ErrorReportingMixinBase { |
| constructor(parser, opts) { |
| super(parser, opts); |
| |
| this.opts = opts; |
| this.ctLoc = null; |
| this.locBeforeToken = false; |
| } |
| |
| _setErrorLocation(err) { |
| if (this.ctLoc) { |
| err.startLine = this.ctLoc.startLine; |
| err.startCol = this.ctLoc.startCol; |
| err.startOffset = this.ctLoc.startOffset; |
| |
| err.endLine = this.locBeforeToken ? this.ctLoc.startLine : this.ctLoc.endLine; |
| err.endCol = this.locBeforeToken ? this.ctLoc.startCol : this.ctLoc.endCol; |
| err.endOffset = this.locBeforeToken ? this.ctLoc.startOffset : this.ctLoc.endOffset; |
| } |
| } |
| |
| _getOverriddenMethods(mxn, orig) { |
| return { |
| _bootstrap(document, fragmentContext) { |
| orig._bootstrap.call(this, document, fragmentContext); |
| |
| Mixin.install(this.tokenizer, ErrorReportingTokenizerMixin, mxn.opts); |
| Mixin.install(this.tokenizer, LocationInfoTokenizerMixin); |
| }, |
| |
| _processInputToken(token) { |
| mxn.ctLoc = token.location; |
| |
| orig._processInputToken.call(this, token); |
| }, |
| |
| _err(code, options) { |
| mxn.locBeforeToken = options && options.beforeToken; |
| mxn._reportError(code); |
| } |
| }; |
| } |
| } |
| |
| module.exports = ErrorReportingParserMixin; |