# (c) 2005 Divmod, Inc.  See LICENSE file for details

class Message(object):
	message = ''
	message_args = ()
	def __init__(self, filename, lineno):
		self.filename = filename
		self.lineno = lineno
	def __str__(self):
		return '%s:%s: %s' % (self.filename, self.lineno, self.message % self.message_args)

class UnusedImport(Message):
	message = '%r imported but unused'
	def __init__(self, filename, lineno, name):
		Message.__init__(self, filename, lineno)
		self.message_args = (name,)

class RedefinedWhileUnused(Message):
	message = 'redefinition of unused %r from line %r'
	def __init__(self, filename, lineno, name, orig_lineno):
		Message.__init__(self, filename, lineno)
		self.message_args = (name, orig_lineno)

class ImportShadowedByLoopVar(Message):
	message = 'import %r from line %r shadowed by loop variable'
	def __init__(self, filename, lineno, name, orig_lineno):
		Message.__init__(self, filename, lineno)
		self.message_args = (name, orig_lineno)

class ImportStarUsed(Message):
	message = "'from %s import *' used; unable to detect undefined names"
	def __init__(self, filename, lineno, modname):
		Message.__init__(self, filename, lineno)
		self.message_args = (modname,)

class UndefinedName(Message):
	message = 'undefined name %r'
	def __init__(self, filename, lineno, name):
		Message.__init__(self, filename, lineno)
		self.message_args = (name,)

class UndefinedExport(Message):
	message = 'undefined name %r in __all__'
	def __init__(self, filename, lineno, name):
		Message.__init__(self, filename, lineno)
		self.message_args = (name,)

class UndefinedLocal(Message):
	message = "local variable %r (defined in enclosing scope on line %r) referenced before assignment"
	def __init__(self, filename, lineno, name, orig_lineno):
		Message.__init__(self, filename, lineno)
		self.message_args = (name, orig_lineno)

class DuplicateArgument(Message):
	message = 'duplicate argument %r in function definition'
	def __init__(self, filename, lineno, name):
		Message.__init__(self, filename, lineno)
		self.message_args = (name,)

class RedefinedFunction(Message):
	message = 'redefinition of function %r from line %r'
	def __init__(self, filename, lineno, name, orig_lineno):
		Message.__init__(self, filename, lineno)
		self.message_args = (name, orig_lineno)

class LateFutureImport(Message):
	message = 'future import(s) %r after other statements'
	def __init__(self, filename, lineno, names):
		Message.__init__(self, filename, lineno)
		self.message_args = (names,)

class UnusedVariable(Message):
	"""
	Indicates that a variable has been explicity assigned to but not actually
	used.
	"""

	message = 'local variable %r is assigned to but never used'
	def __init__(self, filename, lineno, names):
		Message.__init__(self, filename, lineno)
		self.message_args = (names,)
