aboutsummaryrefslogtreecommitdiff
path: root/tools/closure_linter-2.3.4/closure_linter/common/errorprinter.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/closure_linter-2.3.4/closure_linter/common/errorprinter.py')
-rwxr-xr-xtools/closure_linter-2.3.4/closure_linter/common/errorprinter.py203
1 files changed, 203 insertions, 0 deletions
diff --git a/tools/closure_linter-2.3.4/closure_linter/common/errorprinter.py b/tools/closure_linter-2.3.4/closure_linter/common/errorprinter.py
new file mode 100755
index 0000000..c975406
--- /dev/null
+++ b/tools/closure_linter-2.3.4/closure_linter/common/errorprinter.py
@@ -0,0 +1,203 @@
+#!/usr/bin/env python
+#
+# Copyright 2008 The Closure Linter Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS-IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Linter error handler class that prints errors to stdout."""
+
+__author__ = ('robbyw@google.com (Robert Walker)',
+ 'ajp@google.com (Andy Perelson)')
+
+from closure_linter.common import error
+from closure_linter.common import errorhandler
+
+Error = error.Error
+
+
+# The error message is of the format:
+# Line <number>, E:<code>: message
+DEFAULT_FORMAT = 1
+
+# The error message is of the format:
+# filename:[line number]:message
+UNIX_FORMAT = 2
+
+
+class ErrorPrinter(errorhandler.ErrorHandler):
+ """ErrorHandler that prints errors to stdout."""
+
+ def __init__(self, new_errors=None):
+ """Initializes this error printer.
+
+ Args:
+ new_errors: A sequence of error codes representing recently introduced
+ errors, defaults to None.
+ """
+ # Number of errors
+ self._error_count = 0
+
+ # Number of new errors
+ self._new_error_count = 0
+
+ # Number of files checked
+ self._total_file_count = 0
+
+ # Number of files with errors
+ self._error_file_count = 0
+
+ # Dict of file name to number of errors
+ self._file_table = {}
+
+ # List of errors for each file
+ self._file_errors = None
+
+ # Current file
+ self._filename = None
+
+ self._format = DEFAULT_FORMAT
+
+ if new_errors:
+ self._new_errors = frozenset(new_errors)
+ else:
+ self._new_errors = frozenset(set())
+
+ def SetFormat(self, format):
+ """Sets the print format of errors.
+
+ Args:
+ format: One of {DEFAULT_FORMAT, UNIX_FORMAT}.
+ """
+ self._format = format
+
+ def HandleFile(self, filename, first_token):
+ """Notifies this ErrorPrinter that subsequent errors are in filename.
+
+ Sets the current file name, and sets a flag stating the header for this file
+ has not been printed yet.
+
+ Should be called by a linter before a file is style checked.
+
+ Args:
+ filename: The name of the file about to be checked.
+ first_token: The first token in the file, or None if there was an error
+ opening the file
+ """
+ if self._filename and self._file_table[self._filename]:
+ print
+
+ self._filename = filename
+ self._file_table[filename] = 0
+ self._total_file_count += 1
+ self._file_errors = []
+
+ def HandleError(self, error):
+ """Prints a formatted error message about the specified error.
+
+ The error message is of the format:
+ Error #<code>, line #<number>: message
+
+ Args:
+ error: The error object
+ """
+ self._file_errors.append(error)
+ self._file_table[self._filename] += 1
+ self._error_count += 1
+
+ if self._new_errors and error.code in self._new_errors:
+ self._new_error_count += 1
+
+ def _PrintError(self, error):
+ """Prints a formatted error message about the specified error.
+
+ Args:
+ error: The error object
+ """
+ new_error = self._new_errors and error.code in self._new_errors
+ if self._format == DEFAULT_FORMAT:
+ line = ''
+ if error.token:
+ line = 'Line %d, ' % error.token.line_number
+
+ code = 'E:%04d' % error.code
+ if new_error:
+ print '%s%s: (New error) %s' % (line, code, error.message)
+ else:
+ print '%s%s: %s' % (line, code, error.message)
+ else:
+ # UNIX format
+ filename = self._filename
+ line = ''
+ if error.token:
+ line = '%d' % error.token.line_number
+
+ error_code = '%04d' % error.code
+ if new_error:
+ error_code = 'New Error ' + error_code
+ print '%s:%s:(%s) %s' % (filename, line, error_code, error.message)
+
+ def FinishFile(self):
+ """Finishes handling the current file."""
+ if self._file_errors:
+ self._error_file_count += 1
+
+ if self._format != UNIX_FORMAT:
+ print '----- FILE : %s -----' % (self._filename)
+
+ self._file_errors.sort(Error.Compare)
+
+ for error in self._file_errors:
+ self._PrintError(error)
+
+ def HasErrors(self):
+ """Whether this error printer encountered any errors.
+
+ Returns:
+ True if the error printer encountered any errors.
+ """
+ return self._error_count
+
+ def HasNewErrors(self):
+ """Whether this error printer encountered any new errors.
+
+ Returns:
+ True if the error printer encountered any new errors.
+ """
+ return self._new_error_count
+
+ def HasOldErrors(self):
+ """Whether this error printer encountered any old errors.
+
+ Returns:
+ True if the error printer encountered any old errors.
+ """
+ return self._error_count - self._new_error_count
+
+ def PrintSummary(self):
+ """Print a summary of the number of errors and files."""
+ if self.HasErrors() or self.HasNewErrors():
+ print ('Found %d errors, including %d new errors, in %d files '
+ '(%d files OK).' % (
+ self._error_count,
+ self._new_error_count,
+ self._error_file_count,
+ self._total_file_count - self._error_file_count))
+ else:
+ print '%d files checked, no errors found.' % self._total_file_count
+
+ def PrintFileSummary(self):
+ """Print a detailed summary of the number of errors in each file."""
+ keys = self._file_table.keys()
+ keys.sort()
+ for filename in keys:
+ print '%s: %d' % (filename, self._file_table[filename])