15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright 2008 The Closure Linter Authors. All Rights Reserved.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Licensed under the Apache License, Version 2.0 (the "License");
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# you may not use this file except in compliance with the License.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# You may obtain a copy of the License at
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#      http://www.apache.org/licenses/LICENSE-2.0
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Unless required by applicable law or agreed to in writing, software
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# distributed under the License is distributed on an "AS-IS" BASIS,
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# See the License for the specific language governing permissions and
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# limitations under the License.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Interface for a linter error handler.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Error handlers aggregate a set of errors from multiple files and can optionally
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)perform some action based on the reported errors, for example, logging the error
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)or automatically fixing it.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__author__ = ('robbyw@google.com (Robert Walker)',
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              'ajp@google.com (Andy Perelson)')
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ErrorHandler(object):
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Error handler interface."""
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if self.__class__ == ErrorHandler:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      raise NotImplementedError('class ErrorHandler is abstract')
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def HandleFile(self, filename, first_token):
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Notifies this ErrorHandler that subsequent errors are in filename.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      filename: The file being linted.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      first_token: The first token of the file.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def HandleError(self, error):
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Append the error to the list.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Args:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error: The error object
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def FinishFile(self):
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Finishes handling the current file.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Should be called after all errors in a file have been handled.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetErrors(self):
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Returns the accumulated errors.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Returns:
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      A sequence of errors.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
62