| '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; |