code: function VMessage(reason, position, origin) {
    var parts
    var range
    var location
  
    if (typeof position === 'string') {
      origin = position
      position = null
    }
  
    parts = parseOrigin(origin)
    range = stringify(position) || '1:1'
  
    location = {
      start: {line: null, column: null},
      end: {line: null, column: null}
    }
  
    // Node.
    if (position && position.position) {
      position = position.position
    }
  
    if (position) {
      // Position.
      if (position.start) {
        location = position
        position = position.start
      } else {
        // Point.
        location.start = position
      }
    }
  
    if (reason.stack) {
      this.stack = reason.stack
      reason = reason.message
    }
  
    this.message = reason
    this.name = range
    this.reason = reason
    this.line = position ? position.line : null
    this.column = position ? position.column : null
    this.location = location
    this.source = parts[0]
    this.ruleId = parts[1]
  }
docs: Construct a new VMessage.  Note: We cannot invoke `Error` on the created context, as that adds readonly `line` and `column` attributes on Safari 9, thus throwing and failing the data.