15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright 2010 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)"""Linter error rules class for Closure Linter."""
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__author__ = 'robbyw@google.com (Robert Walker)'
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import gflags as flags
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from closure_linter import errors
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FLAGS = flags.FLAGS
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)flags.DEFINE_boolean('jsdoc', True,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     'Whether to report errors for missing JsDoc.')
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)flags.DEFINE_list('disable', None,
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                  'Disable specific error. Usage Ex.: gjslint --disable 1,'
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                  '0011 foo.js.')
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)flags.DEFINE_integer('max_line_length', 80, 'Maximum line length allowed '
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     'without warning.', lower_bound=1)
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)disabled_error_nums = None
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def GetMaxLineLength():
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  """Returns allowed maximum length of line.
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Returns:
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Length of line allowed without any warning.
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  """
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return FLAGS.max_line_length
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def ShouldReportError(error):
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Whether the given error should be reported.
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Returns:
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    True for all errors except missing documentation errors and disabled
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    errors.  For missing documentation, it returns the value of the
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    jsdoc flag.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  global disabled_error_nums
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if disabled_error_nums is None:
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    disabled_error_nums = []
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if FLAGS.disable:
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      for error_str in FLAGS.disable:
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        error_num = 0
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        try:
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          error_num = int(error_str)
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        except ValueError:
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          pass
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        disabled_error_nums.append(error_num)
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return ((FLAGS.jsdoc or error not in (
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      errors.MISSING_PARAMETER_DOCUMENTATION,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      errors.MISSING_RETURN_DOCUMENTATION,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      errors.MISSING_MEMBER_DOCUMENTATION,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      errors.MISSING_PRIVATE,
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      errors.MISSING_JSDOC_TAG_THIS)) and
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          (not FLAGS.disable or error not in disabled_error_nums))
73