Beispiel #1
0
 def visit_placeholder_type(self, t: PlaceholderType) -> Type:
     return PlaceholderType(t.fullname, self.translate_types(t.args), t.line)
Beispiel #2
0
 def visit_unbound_type_nonoptional(self, t: UnboundType, defining_literal: bool) -> Type:
     sym = self.lookup_qualified(t.name, t)
     if sym is not None:
         node = sym.node
         if isinstance(node, PlaceholderNode):
             if node.becomes_typeinfo:
                 # Reference to placeholder type.
                 if self.api.final_iteration:
                     self.cannot_resolve_type(t)
                     return AnyType(TypeOfAny.from_error)
                 elif self.allow_placeholder:
                     self.api.defer()
                 else:
                     self.api.record_incomplete_ref()
                 return PlaceholderType(node.fullname(), self.anal_array(t.args), t.line)
             else:
                 if self.api.final_iteration:
                     self.cannot_resolve_type(t)
                     return AnyType(TypeOfAny.from_error)
                 else:
                     # Reference to an unknown placeholder node.
                     self.api.record_incomplete_ref()
                     return AnyType(TypeOfAny.special_form)
         if node is None:
             self.fail('Internal error (node is None, kind={})'.format(sym.kind), t)
             return AnyType(TypeOfAny.special_form)
         fullname = node.fullname()
         hook = self.plugin.get_type_analyze_hook(fullname)
         if hook is not None:
             return hook(AnalyzeTypeContext(t, t, self))
         if (fullname in nongen_builtins
                 and t.args and
                 not self.allow_unnormalized):
             self.fail(no_subscript_builtin_alias(fullname,
                                                  propose_alt=not self.defining_alias), t)
         tvar_def = self.tvar_scope.get_binding(sym)
         if isinstance(sym.node, TypeVarExpr) and tvar_def is not None and self.defining_alias:
             self.fail('Can\'t use bound type variable "{}"'
                       ' to define generic alias'.format(t.name), t)
             return AnyType(TypeOfAny.from_error)
         if isinstance(sym.node, TypeVarExpr) and tvar_def is not None:
             if len(t.args) > 0:
                 self.fail('Type variable "{}" used with arguments'.format(t.name), t)
             return TypeVarType(tvar_def, t.line)
         special = self.try_analyze_special_unbound_type(t, fullname)
         if special is not None:
             return special
         if isinstance(node, TypeAlias):
             self.aliases_used.add(fullname)
             all_vars = node.alias_tvars
             target = node.target
             an_args = self.anal_array(t.args)
             res = expand_type_alias(target, all_vars, an_args, self.fail, node.no_args, t)
             # The only case where expand_type_alias() can return an incorrect instance is
             # when it is top-level instance, so no need to recurse.
             if (isinstance(res, Instance) and len(res.args) != len(res.type.type_vars) and
                     not self.defining_alias):
                 fix_instance(res, self.fail)
             return res
         elif isinstance(node, TypeInfo):
             return self.analyze_type_with_type_info(node, t.args, t)
         else:
             return self.analyze_unbound_type_without_type_info(t, sym, defining_literal)
     else:  # sym is None
         return AnyType(TypeOfAny.special_form)
Beispiel #3
0
def union_hook(ctx) -> Type:
    return PlaceholderType(None, args=[AnyType(2)], line=-1)