| Index: third_party/closure_linter/closure_linter/requireprovidesorter.py
|
| diff --git a/third_party/closure_linter/closure_linter/requireprovidesorter.py b/third_party/closure_linter/closure_linter/requireprovidesorter.py
|
| deleted file mode 100755
|
| index e7e08a13c2946fff99aef8b273c0ae89eaf52a54..0000000000000000000000000000000000000000
|
| --- a/third_party/closure_linter/closure_linter/requireprovidesorter.py
|
| +++ /dev/null
|
| @@ -1,329 +0,0 @@
|
| -#!/usr/bin/env python
|
| -#
|
| -# Copyright 2011 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.
|
| -
|
| -"""Contains logic for sorting goog.provide and goog.require statements.
|
| -
|
| -Closurized JavaScript files use goog.provide and goog.require statements at the
|
| -top of the file to manage dependencies. These statements should be sorted
|
| -alphabetically, however, it is common for them to be accompanied by inline
|
| -comments or suppression annotations. In order to sort these statements without
|
| -disrupting their comments and annotations, the association between statements
|
| -and comments/annotations must be maintained while sorting.
|
| -
|
| - RequireProvideSorter: Handles checking/fixing of provide/require statements.
|
| -"""
|
| -
|
| -
|
| -
|
| -from closure_linter import javascripttokens
|
| -from closure_linter import tokenutil
|
| -
|
| -# Shorthand
|
| -Type = javascripttokens.JavaScriptTokenType
|
| -
|
| -
|
| -class RequireProvideSorter(object):
|
| - """Checks for and fixes alphabetization of provide and require statements.
|
| -
|
| - When alphabetizing, comments on the same line or comments directly above a
|
| - goog.provide or goog.require statement are associated with that statement and
|
| - stay with the statement as it gets sorted.
|
| - """
|
| -
|
| - def CheckProvides(self, token):
|
| - """Checks alphabetization of goog.provide statements.
|
| -
|
| - Iterates over tokens in given token stream, identifies goog.provide tokens,
|
| - and checks that they occur in alphabetical order by the object being
|
| - provided.
|
| -
|
| - Args:
|
| - token: A token in the token stream before any goog.provide tokens.
|
| -
|
| - Returns:
|
| - The first provide token in the token stream.
|
| -
|
| - None is returned if all goog.provide statements are already sorted.
|
| - """
|
| - provide_tokens = self._GetRequireOrProvideTokens(token, 'goog.provide')
|
| - provide_strings = self._GetRequireOrProvideTokenStrings(provide_tokens)
|
| - sorted_provide_strings = sorted(provide_strings)
|
| - if provide_strings != sorted_provide_strings:
|
| - return provide_tokens[0]
|
| - return None
|
| -
|
| - def CheckRequires(self, token):
|
| - """Checks alphabetization of goog.require statements.
|
| -
|
| - Iterates over tokens in given token stream, identifies goog.require tokens,
|
| - and checks that they occur in alphabetical order by the dependency being
|
| - required.
|
| -
|
| - Args:
|
| - token: A token in the token stream before any goog.require tokens.
|
| -
|
| - Returns:
|
| - The first require token in the token stream.
|
| -
|
| - None is returned if all goog.require statements are already sorted.
|
| - """
|
| - require_tokens = self._GetRequireOrProvideTokens(token, 'goog.require')
|
| - require_strings = self._GetRequireOrProvideTokenStrings(require_tokens)
|
| - sorted_require_strings = sorted(require_strings)
|
| - if require_strings != sorted_require_strings:
|
| - return require_tokens[0]
|
| - return None
|
| -
|
| - def FixProvides(self, token):
|
| - """Sorts goog.provide statements in the given token stream alphabetically.
|
| -
|
| - Args:
|
| - token: The first token in the token stream.
|
| - """
|
| - self._FixProvidesOrRequires(
|
| - self._GetRequireOrProvideTokens(token, 'goog.provide'))
|
| -
|
| - def FixRequires(self, token):
|
| - """Sorts goog.require statements in the given token stream alphabetically.
|
| -
|
| - Args:
|
| - token: The first token in the token stream.
|
| - """
|
| - self._FixProvidesOrRequires(
|
| - self._GetRequireOrProvideTokens(token, 'goog.require'))
|
| -
|
| - def _FixProvidesOrRequires(self, tokens):
|
| - """Sorts goog.provide or goog.require statements.
|
| -
|
| - Args:
|
| - tokens: A list of goog.provide or goog.require tokens in the order they
|
| - appear in the token stream. i.e. the first token in this list must
|
| - be the first goog.provide or goog.require token.
|
| - """
|
| - strings = self._GetRequireOrProvideTokenStrings(tokens)
|
| - sorted_strings = sorted(strings)
|
| -
|
| - # Make a separate pass to remove any blank lines between goog.require/
|
| - # goog.provide tokens.
|
| - first_token = tokens[0]
|
| - last_token = tokens[-1]
|
| - i = last_token
|
| - while i != first_token and i is not None:
|
| - if i.type is Type.BLANK_LINE:
|
| - tokenutil.DeleteToken(i)
|
| - i = i.previous
|
| -
|
| - # A map from required/provided object name to tokens that make up the line
|
| - # it was on, including any comments immediately before it or after it on the
|
| - # same line.
|
| - tokens_map = self._GetTokensMap(tokens)
|
| -
|
| - # Iterate over the map removing all tokens.
|
| - for name in tokens_map:
|
| - tokens_to_delete = tokens_map[name]
|
| - for i in tokens_to_delete:
|
| - tokenutil.DeleteToken(i)
|
| -
|
| - # Save token to rest of file. Sorted token will be inserted before this.
|
| - rest_of_file = tokens_map[strings[-1]][-1].next
|
| -
|
| - # Re-add all tokens in the map in alphabetical order.
|
| - insert_after = tokens[0].previous
|
| - for string in sorted_strings:
|
| - for i in tokens_map[string]:
|
| - if rest_of_file:
|
| - tokenutil.InsertTokenBefore(i, rest_of_file)
|
| - else:
|
| - tokenutil.InsertTokenAfter(i, insert_after)
|
| - insert_after = i
|
| -
|
| - def _GetRequireOrProvideTokens(self, token, token_string):
|
| - """Gets all goog.provide or goog.require tokens in the given token stream.
|
| -
|
| - Args:
|
| - token: The first token in the token stream.
|
| - token_string: One of 'goog.provide' or 'goog.require' to indicate which
|
| - tokens to find.
|
| -
|
| - Returns:
|
| - A list of goog.provide or goog.require tokens in the order they appear in
|
| - the token stream.
|
| - """
|
| - tokens = []
|
| - while token:
|
| - if token.type == Type.IDENTIFIER:
|
| - if token.string == token_string:
|
| - tokens.append(token)
|
| - elif token.string not in [
|
| - 'goog.provide', 'goog.require', 'goog.setTestOnly']:
|
| - # These 3 identifiers are at the top of the file. So if any other
|
| - # identifier is encountered, return.
|
| - # TODO(user): Once it's decided what ordering goog.require
|
| - # should use, add 'goog.module' to the list above and implement the
|
| - # decision.
|
| - break
|
| - token = token.next
|
| -
|
| - return tokens
|
| -
|
| - def _GetRequireOrProvideTokenStrings(self, tokens):
|
| - """Gets a list of strings corresponding to the given list of tokens.
|
| -
|
| - The string will be the next string in the token stream after each token in
|
| - tokens. This is used to find the object being provided/required by a given
|
| - goog.provide or goog.require token.
|
| -
|
| - Args:
|
| - tokens: A list of goog.provide or goog.require tokens.
|
| -
|
| - Returns:
|
| - A list of object names that are being provided or required by the given
|
| - list of tokens. For example:
|
| -
|
| - ['object.a', 'object.c', 'object.b']
|
| - """
|
| - token_strings = []
|
| - for token in tokens:
|
| - if not token.is_deleted:
|
| - name = tokenutil.GetStringAfterToken(token)
|
| - token_strings.append(name)
|
| - return token_strings
|
| -
|
| - def _GetTokensMap(self, tokens):
|
| - """Gets a map from object name to tokens associated with that object.
|
| -
|
| - Starting from the goog.provide/goog.require token, searches backwards in the
|
| - token stream for any lines that start with a comment. These lines are
|
| - associated with the goog.provide/goog.require token. Also associates any
|
| - tokens on the same line as the goog.provide/goog.require token with that
|
| - token.
|
| -
|
| - Args:
|
| - tokens: A list of goog.provide or goog.require tokens.
|
| -
|
| - Returns:
|
| - A dictionary that maps object names to the tokens associated with the
|
| - goog.provide or goog.require of that object name. For example:
|
| -
|
| - {
|
| - 'object.a': [JavaScriptToken, JavaScriptToken, ...],
|
| - 'object.b': [...]
|
| - }
|
| -
|
| - The list of tokens includes any comment lines above the goog.provide or
|
| - goog.require statement and everything after the statement on the same
|
| - line. For example, all of the following would be associated with
|
| - 'object.a':
|
| -
|
| - /** @suppress {extraRequire} */
|
| - goog.require('object.a'); // Some comment.
|
| - """
|
| - tokens_map = {}
|
| - for token in tokens:
|
| - object_name = tokenutil.GetStringAfterToken(token)
|
| - # If the previous line starts with a comment, presume that the comment
|
| - # relates to the goog.require or goog.provide and keep them together when
|
| - # sorting.
|
| - first_token = token
|
| - previous_first_token = tokenutil.GetFirstTokenInPreviousLine(first_token)
|
| - while (previous_first_token and
|
| - previous_first_token.IsAnyType(Type.COMMENT_TYPES)):
|
| - first_token = previous_first_token
|
| - previous_first_token = tokenutil.GetFirstTokenInPreviousLine(
|
| - first_token)
|
| -
|
| - # Find the last token on the line.
|
| - last_token = tokenutil.GetLastTokenInSameLine(token)
|
| -
|
| - all_tokens = self._GetTokenList(first_token, last_token)
|
| - tokens_map[object_name] = all_tokens
|
| - return tokens_map
|
| -
|
| - def _GetTokenList(self, first_token, last_token):
|
| - """Gets a list of all tokens from first_token to last_token, inclusive.
|
| -
|
| - Args:
|
| - first_token: The first token to get.
|
| - last_token: The last token to get.
|
| -
|
| - Returns:
|
| - A list of all tokens between first_token and last_token, including both
|
| - first_token and last_token.
|
| -
|
| - Raises:
|
| - Exception: If the token stream ends before last_token is reached.
|
| - """
|
| - token_list = []
|
| - token = first_token
|
| - while token != last_token:
|
| - if not token:
|
| - raise Exception('ran out of tokens')
|
| - token_list.append(token)
|
| - token = token.next
|
| - token_list.append(last_token)
|
| -
|
| - return token_list
|
| -
|
| - def GetFixedRequireString(self, token):
|
| - """Get fixed/sorted order of goog.require statements.
|
| -
|
| - Args:
|
| - token: The first token in the token stream.
|
| -
|
| - Returns:
|
| - A string for correct sorted order of goog.require.
|
| - """
|
| - return self._GetFixedRequireOrProvideString(
|
| - self._GetRequireOrProvideTokens(token, 'goog.require'))
|
| -
|
| - def GetFixedProvideString(self, token):
|
| - """Get fixed/sorted order of goog.provide statements.
|
| -
|
| - Args:
|
| - token: The first token in the token stream.
|
| -
|
| - Returns:
|
| - A string for correct sorted order of goog.provide.
|
| - """
|
| - return self._GetFixedRequireOrProvideString(
|
| - self._GetRequireOrProvideTokens(token, 'goog.provide'))
|
| -
|
| - def _GetFixedRequireOrProvideString(self, tokens):
|
| - """Sorts goog.provide or goog.require statements.
|
| -
|
| - Args:
|
| - tokens: A list of goog.provide or goog.require tokens in the order they
|
| - appear in the token stream. i.e. the first token in this list must
|
| - be the first goog.provide or goog.require token.
|
| -
|
| - Returns:
|
| - A string for sorted goog.require or goog.provide statements
|
| - """
|
| -
|
| - # A map from required/provided object name to tokens that make up the line
|
| - # it was on, including any comments immediately before it or after it on the
|
| - # same line.
|
| - tokens_map = self._GetTokensMap(tokens)
|
| - sorted_strings = sorted(tokens_map.keys())
|
| -
|
| - new_order = ''
|
| - for string in sorted_strings:
|
| - for i in tokens_map[string]:
|
| - new_order += i.string
|
| - if i.IsLastInLine():
|
| - new_order += '\n'
|
| -
|
| - return new_order
|
|
|