15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu# Copyright 2014 The Chromium Authors. All rights reserved.
25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu# Use of this source code is governed by a BSD-style license that can be
35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu# found in the LICENSE file.
45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass Error(Exception):
65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  """Base class for Mojo IDL bindings parser/generator errors."""
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  def __init__(self, filename, message, lineno=None, addenda=None, **kwargs):
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    """|filename| is the (primary) file which caused the error, |message| is the
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    error message, |lineno| is the 1-based line number (or |None| if not
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    applicable/available), and |addenda| is a list of additional lines to append
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    to the final error message."""
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    Exception.__init__(self, **kwargs)
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    self.filename = filename
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    self.message = message
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    self.lineno = lineno
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    self.addenda = addenda
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  def __str__(self):
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if self.lineno:
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      s = "%s:%d: Error: %s" % (self.filename, self.lineno, self.message)
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    else:
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      s = "%s: Error: %s" % (self.filename, self.message)
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return "\n".join([s] + self.addenda) if self.addenda else s
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  def __repr__(self):
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return str(self)
28