예제 #1
0
    def _CheckGoogScopeCalls(self, start_token):
        """Check goog.scope calls for lint/usage errors."""
        def IsScopeToken(token):
            return (
                token.type is javascripttokens.JavaScriptTokenType.IDENTIFIER
                and token.string == 'goog.scope')

        # Find all the goog.scope tokens in the file
        scope_tokens = [t for t in start_token if IsScopeToken(t)]

        for token in scope_tokens:
            scope_context = token.metadata.context

            if not (scope_context.type
                    == ecmametadatapass.EcmaContext.STATEMENT
                    and scope_context.parent.type
                    == ecmametadatapass.EcmaContext.ROOT):
                self._MaybeReportError(
                    error.Error(errors.INVALID_USE_OF_GOOG_SCOPE,
                                'goog.scope call not in global scope', token))

        # There should be only one goog.scope reference.  Register errors for
        # every instance after the first.
        for token in scope_tokens[1:]:
            self._MaybeReportError(
                error.Error(errors.EXTRA_GOOG_SCOPE_USAGE,
                            'More than one goog.scope call in file.', token))
예제 #2
0
def Run(filename, error_handler, source=None):
    """Tokenize, run passes, and check the given file.

  Args:
    filename: The path of the file to check
    error_handler: The error handler to report errors to.
    source: A file-like object with the file source. If omitted, the file will
      be read from the filename path.
  """
    if not source:
        try:
            source = open(filename)
        except IOError:
            error_handler.HandleFile(filename, None)
            error_handler.HandleError(
                error.Error(errors.FILE_NOT_FOUND, 'File not found'))
            error_handler.FinishFile()
            return

    if _IsHtml(filename):
        source_file = htmlutil.GetScriptLines(source)
    else:
        source_file = source

    token, tokenizer_mode = _Tokenize(source_file)

    error_handler.HandleFile(filename, token)

    # If we did not end in the basic mode, this a failed parse.
    if tokenizer_mode is not javascripttokenizer.JavaScriptModes.TEXT_MODE:
        error_handler.HandleError(
            error.Error(errors.FILE_IN_BLOCK,
                        'File ended in mode "%s".' % tokenizer_mode,
                        _GetLastNonWhiteSpaceToken(token)))

    # Run the ECMA pass
    error_token = None

    ecma_pass = ecmametadatapass.EcmaMetaDataPass()
    error_token = RunMetaDataPass(token, ecma_pass, error_handler, filename)

    is_limited_doc_check = (_IsLimitedDocCheck(filename,
                                               flags.FLAGS.limited_doc_files))

    _RunChecker(token,
                error_handler,
                is_limited_doc_check,
                is_html=_IsHtml(filename),
                stop_token=error_token)

    error_handler.FinishFile()
예제 #3
0
def RunMetaDataPass(start_token, metadata_pass, error_handler, filename=''):
    """Run a metadata pass over a token stream.

  Args:
    start_token: The first token in a token stream.
    metadata_pass: Metadata pass to run.
    error_handler: The error handler to report errors to.
    filename: Filename of the source.

  Returns:
    The token where the error occurred (if any).
  """

    try:
        metadata_pass.Process(start_token)
    except ecmametadatapass.ParseError, parse_err:
        if flags.FLAGS.error_trace:
            traceback.print_exc()
        error_token = parse_err.token
        error_handler.HandleError(
            error.Error(errors.FILE_DOES_NOT_PARSE,
                        ('Error parsing file at token "%s". Unable to '
                         'check the rest of file.' % error_token),
                        error_token))
        return error_token
예제 #4
0
 def Error(self, token, message):
     """Calls the error_handler to post an error message."""
     if self._error_handler:
         self._error_handler.HandleError(
             error.Error(
                 errors.JSDOC_DOES_NOT_PARSE,
                 'Error parsing jsdoc type at token "%s" (column: %d): %s' %
                 (token.string, token.start_index, message), token))
예제 #5
0
    def HandleError(self, code, message, token, position=None, fix_data=None):
        """Prints out the given error message including a line number.

    Args:
      code: The error code.
      message: The error to print.
      token: The token where the error occurred, or None if it was a file-wide
          issue.
      position: The position of the error, defaults to None.
      fix_data: Metadata used for fixing the error.
    """
        self._has_errors = True
        self._error_handler.HandleError(
            error.Error(code, message, token, position, fix_data))
예제 #6
0
    try:
        metadata_pass.Process(start_token)
    except ecmametadatapass.ParseError, parse_err:
        if flags.FLAGS.error_trace:
            traceback.print_exc()
        error_token = parse_err.token
        error_handler.HandleError(
            error.Error(errors.FILE_DOES_NOT_PARSE,
                        ('Error parsing file at token "%s". Unable to '
                         'check the rest of file.' % error_token),
                        error_token))
        return error_token
    except Exception:  # pylint: disable-msg=W0703
        traceback.print_exc()
        error_handler.HandleError(
            error.Error(errors.FILE_DOES_NOT_PARSE,
                        'Internal error in %s' % filename))


def _RunChecker(start_token,
                error_handler,
                limited_doc_checks,
                is_html,
                stop_token=None):

    state_tracker = javascriptstatetracker.JavaScriptStateTracker()

    style_checker = checker.JavaScriptStyleChecker(state_tracker=state_tracker,
                                                   error_handler=error_handler)

    style_checker.Check(start_token,
                        is_html=is_html,