예제 #1
0
 def load(self, options):
     """Read builtins.pytd and typing.pytd, and return the parsed modules."""
     t = self._parse_predefined("typing", options)
     b = self._parse_predefined("builtins", options)
     b = b.Visit(
         visitors.LookupExternalTypes({"typing": t}, self_name="builtins"))
     t = t.Visit(visitors.LookupBuiltins(b))
     b = b.Visit(visitors.NamedTypeToClassType())
     t = t.Visit(visitors.NamedTypeToClassType())
     b = b.Visit(visitors.AdjustTypeParameters())
     t = t.Visit(visitors.AdjustTypeParameters())
     b = b.Visit(visitors.CanonicalOrderingVisitor())
     t = t.Visit(visitors.CanonicalOrderingVisitor())
     b.Visit(
         visitors.FillInLocalPointers({
             "": b,
             "typing": t,
             "builtins": b
         }))
     t.Visit(
         visitors.FillInLocalPointers({
             "": t,
             "typing": t,
             "builtins": b
         }))
     b.Visit(visitors.VerifyLookup())
     t.Visit(visitors.VerifyLookup())
     b.Visit(visitors.VerifyContainers())
     t.Visit(visitors.VerifyContainers())
     return b, t
 def parse_and_solve(self, src):
   ast = self.parse(src)
   ast = ast.Visit(visitors.NamedTypeToClassType())
   ast = ast.Visit(visitors.AdjustTypeParameters())
   types, _ = convert_structural.solve(ast, builtins_pytd=self.builtins_pytd)
   # Drop "__builtin__" prefix, for more readable tests.
   return {k: {v.rpartition("__builtin__.")[2] for v in l}
           for k, l in types.items()}
예제 #3
0
 def ParseWithBuiltins(self, src):
   ast = parser.parse_string(textwrap.dedent(src), options=self.options)
   ast = ast.Visit(visitors.LookupExternalTypes(
       {"builtins": self.loader.builtins, "typing": self.loader.typing}))
   ast = ast.Visit(visitors.NamedTypeToClassType())
   ast = ast.Visit(visitors.AdjustTypeParameters())
   ast.Visit(visitors.FillInLocalPointers({
       "": ast, "builtins": self.loader.builtins}))
   ast.Visit(visitors.VerifyVisitor())
   return ast
예제 #4
0
파일: builtins.py 프로젝트: songzcn/pytype
def GetBuiltinsAndTyping(python_version):  # Deprecated. Use load_pytd instead.
    """Get __builtin__.pytd and typing.pytd."""
    assert python_version
    global _cached_builtins_pytd
    if _cached_builtins_pytd.cache:
        assert _cached_builtins_pytd.version == python_version
    else:
        t = parser.parse_string(_FindBuiltinFile("typing", python_version),
                                name="typing",
                                python_version=python_version)
        b = parser.parse_string(_FindBuiltinFile("__builtin__",
                                                 python_version),
                                name="__builtin__",
                                python_version=python_version)
        b = b.Visit(
            visitors.LookupExternalTypes({"typing": t},
                                         full_names=True,
                                         self_name="__builtin__"))
        t = t.Visit(visitors.LookupBuiltins(b))
        b = b.Visit(visitors.NamedTypeToClassType())
        t = t.Visit(visitors.NamedTypeToClassType())
        b = b.Visit(visitors.AdjustTypeParameters())
        t = t.Visit(visitors.AdjustTypeParameters())
        b = b.Visit(visitors.CanonicalOrderingVisitor())
        t = t.Visit(visitors.CanonicalOrderingVisitor())
        b.Visit(
            visitors.FillInLocalPointers({
                "": b,
                "typing": t,
                "__builtin__": b
            }))
        t.Visit(
            visitors.FillInLocalPointers({
                "": t,
                "typing": t,
                "__builtin__": b
            }))
        b.Visit(visitors.VerifyLookup())
        t.Visit(visitors.VerifyLookup())
        b.Visit(visitors.VerifyContainers())
        t.Visit(visitors.VerifyContainers())
        _cached_builtins_pytd = Cache(python_version, (b, t))
    return _cached_builtins_pytd.cache
예제 #5
0
 def ParseWithBuiltins(self, src):
   ast = parser.parse_string(textwrap.dedent(src),
                             python_version=self.PYTHON_VERSION)
   ast = ast.Visit(visitors.LookupExternalTypes(
       {"__builtin__": self.loader.builtins, "typing": self.loader.typing}))
   ast = ast.Visit(visitors.NamedTypeToClassType())
   ast = ast.Visit(visitors.AdjustTypeParameters())
   ast.Visit(visitors.FillInLocalPointers({
       "": ast, "__builtin__": self.loader.builtins}))
   ast.Visit(visitors.VerifyVisitor())
   return ast
예제 #6
0
 def Parse(self, src, name=None, version=None, platform=None):
   version = version or self.PYTHON_VERSION
   tree = parser.parse_string(
       textwrap.dedent(src), name=name, python_version=version,
       platform=platform)
   tree = tree.Visit(visitors.NamedTypeToClassType())
   tree = tree.Visit(visitors.AdjustTypeParameters())
   # Convert back to named types for easier testing
   tree = tree.Visit(visitors.ClassTypeToNamedType())
   tree.Visit(visitors.VerifyVisitor())
   return tree
예제 #7
0
 def Parse(self, src, name=None, version=None, platform=None):
   if version:
     self.options.python_version = version
   if platform:
     self.options.platform = platform
   tree = parser.parse_string(
       textwrap.dedent(src), name=name, options=self.options)
   tree = tree.Visit(visitors.NamedTypeToClassType())
   tree = tree.Visit(visitors.AdjustTypeParameters())
   # Convert back to named types for easier testing
   tree = tree.Visit(visitors.ClassTypeToNamedType())
   tree.Visit(visitors.VerifyVisitor())
   return tree
예제 #8
0
def GetBuiltinsAndTyping(python_version):  # Deprecated. Use load_pytd instead.
    """Get builtins.pytd and typing.pytd."""
    assert python_version
    if python_version not in _cached_builtins_pytd:
        t = parser.parse_string(_FindBuiltinFile("typing", python_version),
                                name="typing",
                                python_version=python_version)
        b = parser.parse_string(_FindBuiltinFile("builtins", python_version),
                                name="builtins",
                                python_version=python_version)
        b = b.Visit(
            visitors.LookupExternalTypes({"typing": t}, self_name="builtins"))
        t = t.Visit(visitors.LookupBuiltins(b))
        b = b.Visit(visitors.NamedTypeToClassType())
        t = t.Visit(visitors.NamedTypeToClassType())
        b = b.Visit(visitors.AdjustTypeParameters())
        t = t.Visit(visitors.AdjustTypeParameters())
        b = b.Visit(visitors.CanonicalOrderingVisitor())
        t = t.Visit(visitors.CanonicalOrderingVisitor())
        b.Visit(
            visitors.FillInLocalPointers({
                "": b,
                "typing": t,
                "builtins": b
            }))
        t.Visit(
            visitors.FillInLocalPointers({
                "": t,
                "typing": t,
                "builtins": b
            }))
        b.Visit(visitors.VerifyLookup())
        t.Visit(visitors.VerifyLookup())
        b.Visit(visitors.VerifyContainers())
        t.Visit(visitors.VerifyContainers())
        _cached_builtins_pytd[python_version] = (b, t)
    return _cached_builtins_pytd[python_version]
예제 #9
0
def PrepareForExport(module_name, python_version, ast, loader):
    """Prepare an ast as if it was parsed and loaded.

  External dependencies will not be resolved, as the ast generated by this
  method is supposed to be exported.

  Args:
    module_name: The module_name as a string for the returned ast.
    python_version: A tuple of (major, minor) python version as string
      (see config.python_version).
    ast: pytd.TypeDeclUnit, is only used if src is None.
    loader: A load_pytd.Loader instance.

  Returns:
    A pytd.TypeDeclUnit representing the supplied AST as it would look after
    being written to a file and parsed.
  """
    # This is a workaround for functionality which crept into places it doesn't
    # belong. Ideally this would call some transformation Visitors on ast to
    # transform it into the same ast we get after parsing and loading (compare
    # load_pytd.Loader.load_file). Unfortunately parsing has some special cases,
    # e.g. '__init__' return type and '__new__' being a 'staticmethod', which
    # need to be moved to visitors before we can do this. Printing an ast also
    # applies transformations,
    # e.g. visitors.PrintVisitor._FormatContainerContents, which need to move to
    # their own visitors so they can be applied without printing.
    src = pytd_utils.Print(ast)
    ast = parser.parse_string(src=src,
                              name=module_name,
                              python_version=python_version)
    ast = ast.Visit(visitors.LookupBuiltins(loader.builtins, full_names=False))
    ast = ast.Visit(
        visitors.ExpandCompatibleBuiltins(loader.builtins, python_version))
    ast = ast.Visit(visitors.LookupLocalTypes())
    ast = ast.Visit(visitors.AdjustTypeParameters())
    ast = ast.Visit(visitors.NamedTypeToClassType())
    ast = ast.Visit(visitors.FillInLocalPointers({"": ast, module_name: ast}))
    ast = ast.Visit(visitors.CanonicalOrderingVisitor())
    ast = ast.Visit(
        visitors.ClassTypeToLateType(
            ignore=[module_name + ".", "__builtin__.", "typing."]))
    return ast