15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright 2012 The Closure Linter Authors. All Rights Reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Licensed under the Apache License, Version 2.0 (the "License");
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# you may not use this file except in compliance with the License.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# You may obtain a copy of the License at
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#      http://www.apache.org/licenses/LICENSE-2.0
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Unless required by applicable law or agreed to in writing, software
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# distributed under the License is distributed on an "AS-IS" BASIS,
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# See the License for the specific language governing permissions and
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# limitations under the License.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""A simple, pickle-serializable class to represent a lint error."""
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)__author__ = 'nnaze@google.com (Nathan Naze)'
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import gflags as flags
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from closure_linter import errors
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from closure_linter.common import erroroutput
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FLAGS = flags.FLAGS
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ErrorRecord(object):
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Record-keeping struct that can be serialized back from a process.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Attributes:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path: Path to the file.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error_string: Error string for the user.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_error: Whether this is a "new error" (see errors.NEW_ERRORS).
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, path, error_string, new_error):
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.path = path
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.error_string = error_string
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.new_error = new_error
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def MakeErrorRecord(path, error):
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Make an error record with correctly formatted error string.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Errors are not able to be serialized (pickled) over processes because of
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  their pointers to the complex token/context graph.  We use an intermediary
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  serializable class to pass back just the relevant information.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Args:
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path: Path of file the error was found in.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error: An error.Error instance.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Returns:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _ErrorRecord instance.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_error = error.code in errors.NEW_ERRORS
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if FLAGS.unix_mode:
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    error_string = erroroutput.GetUnixErrorOutput(
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        path, error, new_error=new_error)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    error_string = erroroutput.GetErrorOutput(error, new_error=new_error)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ErrorRecord(path, error_string, new_error)
67