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))
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()
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
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))
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))
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,