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 |
index 6dda3aeb0f18a0585321642d1c2c95074093df6b..8e2648013489e13e40f24da5c5ff03e5bb4ac8c9 100755 |
--- a/third_party/closure_linter/closure_linter/requireprovidesorter.py |
+++ b/third_party/closure_linter/closure_linter/requireprovidesorter.py |
@@ -54,10 +54,7 @@ class RequireProvideSorter(object): |
token: A token in the token stream before any goog.provide tokens. |
Returns: |
- A tuple containing the first provide token in the token stream and a list |
- of provided objects sorted alphabetically. For example: |
- |
- (JavaScriptToken, ['object.a', 'object.b', ...]) |
+ The first provide token in the token stream. |
None is returned if all goog.provide statements are already sorted. |
""" |
@@ -65,7 +62,7 @@ class RequireProvideSorter(object): |
provide_strings = self._GetRequireOrProvideTokenStrings(provide_tokens) |
sorted_provide_strings = sorted(provide_strings) |
if provide_strings != sorted_provide_strings: |
- return [provide_tokens[0], sorted_provide_strings] |
+ return provide_tokens[0] |
return None |
def CheckRequires(self, token): |
@@ -79,10 +76,7 @@ class RequireProvideSorter(object): |
token: A token in the token stream before any goog.require tokens. |
Returns: |
- A tuple containing the first require token in the token stream and a list |
- of required dependencies sorted alphabetically. For example: |
- |
- (JavaScriptToken, ['object.a', 'object.b', ...]) |
+ The first require token in the token stream. |
None is returned if all goog.require statements are already sorted. |
""" |
@@ -90,7 +84,7 @@ class RequireProvideSorter(object): |
require_strings = self._GetRequireOrProvideTokenStrings(require_tokens) |
sorted_require_strings = sorted(require_strings) |
if require_strings != sorted_require_strings: |
- return (require_tokens[0], sorted_require_strings) |
+ return require_tokens[0] |
return None |
def FixProvides(self, token): |
@@ -127,7 +121,7 @@ class RequireProvideSorter(object): |
first_token = tokens[0] |
last_token = tokens[-1] |
i = last_token |
- while i != first_token: |
+ while i != first_token and i is not None: |
if i.type is Type.BLANK_LINE: |
tokenutil.DeleteToken(i) |
i = i.previous |
@@ -143,12 +137,18 @@ class RequireProvideSorter(object): |
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]: |
- tokenutil.InsertTokenAfter(i, insert_after) |
- insert_after = i |
+ 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. |
@@ -167,9 +167,10 @@ class RequireProvideSorter(object): |
if token.type == Type.IDENTIFIER: |
if token.string == token_string: |
tokens.append(token) |
- elif token.string not in ['goog.require', 'goog.provide']: |
- # The goog.provide and goog.require identifiers are at the top of the |
- # file. So if any other identifier is encountered, return. |
+ 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. |
break |
token = token.next |
@@ -193,8 +194,9 @@ class RequireProvideSorter(object): |
""" |
token_strings = [] |
for token in tokens: |
- name = tokenutil.Search(token, Type.STRING_TEXT).string |
- token_strings.append(name) |
+ if not token.is_deleted: |
+ name = tokenutil.GetStringAfterToken(token) |
+ token_strings.append(name) |
return token_strings |
def _GetTokensMap(self, tokens): |
@@ -228,13 +230,14 @@ class RequireProvideSorter(object): |
""" |
tokens_map = {} |
for token in tokens: |
- object_name = tokenutil.Search(token, Type.STRING_TEXT).string |
+ 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.IsAnyType(Type.COMMENT_TYPES): |
+ while (previous_first_token and |
+ previous_first_token.IsAnyType(Type.COMMENT_TYPES)): |
first_token = previous_first_token |
previous_first_token = tokenutil.GetFirstTokenInPreviousLine( |
first_token) |
@@ -270,3 +273,54 @@ class RequireProvideSorter(object): |
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 |