Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(820)

Unified Diff: third_party/closure_linter/closure_linter/aliaspass.py

Issue 2328693002: Updated linter with upstream release (2.3.19) (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/closure_linter/closure_linter/aliaspass.py
diff --git a/third_party/closure_linter/closure_linter/aliaspass.py b/third_party/closure_linter/closure_linter/aliaspass.py
index 8854380321ef080c459abb70a3ed37d8b509594f..bb37bfa07b2d9087ecff365dceb91a6dadfac3c2 100644
--- a/third_party/closure_linter/closure_linter/aliaspass.py
+++ b/third_party/closure_linter/closure_linter/aliaspass.py
@@ -20,8 +20,6 @@
__author__ = ('nnaze@google.com (Nathan Naze)')
-import itertools
-
from closure_linter import ecmametadatapass
from closure_linter import errors
from closure_linter import javascripttokens
@@ -58,6 +56,20 @@ def _GetAliasForIdentifier(identifier, alias_map):
return aliased_symbol + identifier[len(ns):]
+def _SetTypeAlias(js_type, alias_map):
+ """Updates the alias for identifiers in a type.
+
+ Args:
+ js_type: A typeannotation.TypeAnnotation instance.
+ alias_map: A dictionary mapping a symbol to an alias.
+ """
+ aliased_symbol = _GetAliasForIdentifier(js_type.identifier, alias_map)
+ if aliased_symbol:
+ js_type.alias = aliased_symbol
+ for sub_type in js_type.IterTypes():
+ _SetTypeAlias(sub_type, alias_map)
+
+
class AliasPass(object):
"""Pass to identify goog.scope() usages.
@@ -169,36 +181,45 @@ class AliasPass(object):
assert root_context.type is ecmametadatapass.EcmaContext.ROOT
- # Identify all goog.scope blocks.
- goog_scope_blocks = itertools.ifilter(
- scopeutil.IsGoogScopeBlock,
- self._YieldAllContexts(root_context))
+ # Process aliases in statements in the root scope for goog.module-style
+ # aliases.
+ global_alias_map = {}
+ for context in root_context.children:
+ if context.type == ecmametadatapass.EcmaContext.STATEMENT:
+ for statement_child in context.children:
+ if statement_child.type == ecmametadatapass.EcmaContext.VAR:
+ match = scopeutil.MatchModuleAlias(statement_child)
+ if match:
+ # goog.require aliases cannot use further aliases, the symbol is
+ # the second part of match, directly.
+ symbol = match[1]
+ if scopeutil.IsInClosurizedNamespace(symbol,
+ self._closurized_namespaces):
+ global_alias_map[match[0]] = symbol
# Process each block to find aliases.
- for scope_block in goog_scope_blocks:
- self._ProcessGoogScopeBlock(scope_block)
+ for context in root_context.children:
+ self._ProcessBlock(context, global_alias_map)
- def _ProcessGoogScopeBlock(self, scope_block):
+ def _ProcessBlock(self, context, global_alias_map):
"""Scans a goog.scope block to find aliases and mark alias tokens."""
+ alias_map = global_alias_map.copy()
- alias_map = dict()
-
- # Iterate over every token in the scope_block. Each token points to one
+ # Iterate over every token in the context. Each token points to one
# context, but multiple tokens may point to the same context. We only want
# to check each context once, so keep track of those we've seen.
seen_contexts = set()
- token = scope_block.start_token
- while token and self._IsTokenInParentBlock(token, scope_block):
-
- token_context = token.metadata.context
+ token = context.start_token
+ while token and self._IsTokenInParentBlock(token, context):
+ token_context = token.metadata.context if token.metadata else None
# Check to see if this token is an alias.
- if token_context not in seen_contexts:
+ if token_context and token_context not in seen_contexts:
seen_contexts.add(token_context)
# If this is a alias statement in the goog.scope block.
if (token_context.type == ecmametadatapass.EcmaContext.VAR and
- token_context.parent.parent is scope_block):
+ scopeutil.IsGoogScopeBlock(token_context.parent.parent)):
match = scopeutil.MatchAlias(token_context)
# If this is an alias, remember it in the map.
@@ -219,4 +240,9 @@ class AliasPass(object):
if aliased_symbol:
token.metadata.aliased_symbol = aliased_symbol
+ elif token.type == javascripttokens.JavaScriptTokenType.DOC_FLAG:
+ flag = token.attached_object
+ if flag and flag.HasType() and flag.jstype:
+ _SetTypeAlias(flag.jstype, alias_map)
+
token = token.next # Get next token

Powered by Google App Engine
This is Rietveld 408576698