Index: third_party/closure_linter/closure_linter/scopeutil.py |
diff --git a/third_party/closure_linter/closure_linter/scopeutil.py b/third_party/closure_linter/closure_linter/scopeutil.py |
deleted file mode 100644 |
index a7ca9b630a470c66c7acd28448da814a0ad06231..0000000000000000000000000000000000000000 |
--- a/third_party/closure_linter/closure_linter/scopeutil.py |
+++ /dev/null |
@@ -1,206 +0,0 @@ |
-#!/usr/bin/env python |
-# |
-# Copyright 2012 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. |
- |
-"""Tools to match goog.scope alias statements.""" |
- |
-# Allow non-Google copyright |
-# pylint: disable=g-bad-file-header |
- |
-__author__ = ('nnaze@google.com (Nathan Naze)') |
- |
-import itertools |
- |
-from closure_linter import ecmametadatapass |
-from closure_linter import tokenutil |
-from closure_linter.javascripttokens import JavaScriptTokenType |
- |
- |
- |
-def IsGoogScopeBlock(context): |
- """Whether the given context is a goog.scope block. |
- |
- This function only checks that the block is a function block inside |
- a goog.scope() call. |
- |
- TODO(nnaze): Implement goog.scope checks that verify the call is |
- in the root context and contains only a single function literal. |
- |
- Args: |
- context: An EcmaContext of type block. |
- |
- Returns: |
- Whether the context is a goog.scope block. |
- """ |
- |
- if context.type != ecmametadatapass.EcmaContext.BLOCK: |
- return False |
- |
- if not _IsFunctionLiteralBlock(context): |
- return False |
- |
- # Check that this function is contained by a group |
- # of form "goog.scope(...)". |
- parent = context.parent |
- if parent and parent.type is ecmametadatapass.EcmaContext.GROUP: |
- |
- last_code_token = parent.start_token.metadata.last_code |
- |
- if (last_code_token and |
- last_code_token.type is JavaScriptTokenType.IDENTIFIER and |
- last_code_token.string == 'goog.scope'): |
- return True |
- |
- return False |
- |
- |
-def _IsFunctionLiteralBlock(block_context): |
- """Check if a context is a function literal block (without parameters). |
- |
- Example function literal block: 'function() {}' |
- |
- Args: |
- block_context: An EcmaContext of type block. |
- |
- Returns: |
- Whether this context is a function literal block. |
- """ |
- |
- previous_code_tokens_iter = itertools.ifilter( |
- lambda token: token not in JavaScriptTokenType.NON_CODE_TYPES, |
- reversed(block_context.start_token)) |
- |
- # Ignore the current token |
- next(previous_code_tokens_iter, None) |
- |
- # Grab the previous three tokens and put them in correct order. |
- previous_code_tokens = list(itertools.islice(previous_code_tokens_iter, 3)) |
- previous_code_tokens.reverse() |
- |
- # There aren't three previous tokens. |
- if len(previous_code_tokens) is not 3: |
- return False |
- |
- # Check that the previous three code tokens are "function ()" |
- previous_code_token_types = [token.type for token in previous_code_tokens] |
- if (previous_code_token_types == [ |
- JavaScriptTokenType.FUNCTION_DECLARATION, |
- JavaScriptTokenType.START_PARAMETERS, |
- JavaScriptTokenType.END_PARAMETERS]): |
- return True |
- |
- return False |
- |
- |
-def IsInClosurizedNamespace(symbol, closurized_namespaces): |
- """Match a goog.scope alias. |
- |
- Args: |
- symbol: An identifier like 'goog.events.Event'. |
- closurized_namespaces: Iterable of valid Closurized namespaces (strings). |
- |
- Returns: |
- True if symbol is an identifier in a Closurized namespace, otherwise False. |
- """ |
- for ns in closurized_namespaces: |
- if symbol.startswith(ns + '.'): |
- return True |
- |
- return False |
- |
- |
-def _GetVarAssignmentTokens(context): |
- """Returns the tokens from context if it is a var assignment. |
- |
- Args: |
- context: An EcmaContext. |
- |
- Returns: |
- If a var assignment, the tokens contained within it w/o the trailing |
- semicolon. |
- """ |
- if context.type != ecmametadatapass.EcmaContext.VAR: |
- return |
- |
- # Get the tokens in this statement. |
- if context.start_token and context.end_token: |
- statement_tokens = tokenutil.GetTokenRange(context.start_token, |
- context.end_token) |
- else: |
- return |
- |
- # And now just those tokens that are actually code. |
- is_non_code_type = lambda t: t.type not in JavaScriptTokenType.NON_CODE_TYPES |
- code_tokens = filter(is_non_code_type, statement_tokens) |
- |
- # Pop off the semicolon if present. |
- if code_tokens and code_tokens[-1].IsType(JavaScriptTokenType.SEMICOLON): |
- code_tokens.pop() |
- |
- if len(code_tokens) < 4: |
- return |
- |
- if (code_tokens[0].IsKeyword('var') and |
- code_tokens[1].IsType(JavaScriptTokenType.SIMPLE_LVALUE) and |
- code_tokens[2].IsOperator('=')): |
- return code_tokens |
- |
- |
-def MatchAlias(context): |
- """Match an alias statement (some identifier assigned to a variable). |
- |
- Example alias: var MyClass = proj.longNamespace.MyClass. |
- |
- Args: |
- context: An EcmaContext of type EcmaContext.VAR. |
- |
- Returns: |
- If a valid alias, returns a tuple of alias and symbol, otherwise None. |
- """ |
- code_tokens = _GetVarAssignmentTokens(context) |
- if code_tokens is None: |
- return |
- |
- if all(tokenutil.IsIdentifierOrDot(t) for t in code_tokens[3:]): |
- # var Foo = bar.Foo; |
- alias, symbol = code_tokens[1], code_tokens[3] |
- # Mark both tokens as an alias definition to not count them as usages. |
- alias.metadata.is_alias_definition = True |
- symbol.metadata.is_alias_definition = True |
- return alias.string, tokenutil.GetIdentifierForToken(symbol) |
- |
- |
-def MatchModuleAlias(context): |
- """Match an alias statement in a goog.module style import. |
- |
- Example alias: var MyClass = goog.require('proj.longNamespace.MyClass'). |
- |
- Args: |
- context: An EcmaContext. |
- |
- Returns: |
- If a valid alias, returns a tuple of alias and symbol, otherwise None. |
- """ |
- code_tokens = _GetVarAssignmentTokens(context) |
- if code_tokens is None: |
- return |
- |
- if(code_tokens[3].IsType(JavaScriptTokenType.IDENTIFIER) and |
- code_tokens[3].string == 'goog.require'): |
- # var Foo = goog.require('bar.Foo'); |
- alias = code_tokens[1] |
- symbol = tokenutil.GetStringAfterToken(code_tokens[3]) |
- if symbol: |
- alias.metadata.is_alias_definition = True |
- return alias.string, symbol |