1616from mypy .visitor import NodeVisitor , StatementVisitor , ExpressionVisitor
1717from mypy .mypyc_hacks import SymbolTable
1818
19+ from mypy .bogus_type import Bogus
20+
1921
2022class Context :
2123 """Base type for objects that are valid as error message locations."""
@@ -177,8 +179,11 @@ class SymbolNode(Node):
177179 @abstractmethod
178180 def name (self ) -> str : pass
179181
182+ # fullname can often be None even though the type system
183+ # disagrees. We mark this with Bogus to let mypyc know not to
184+ # worry about it.
180185 @abstractmethod
181- def fullname (self ) -> str : pass
186+ def fullname (self ) -> Bogus [ str ] : pass
182187
183188 @abstractmethod
184189 def serialize (self ) -> JsonDict : pass
@@ -195,10 +200,8 @@ def deserialize(cls, data: JsonDict) -> 'SymbolNode':
195200class MypyFile (SymbolNode ):
196201 """The abstract syntax tree of a single source file."""
197202
198- # Module name ('__main__' for initial file)
199- _name = None # type: str
200203 # Fully qualified module name
201- _fullname = None # type: str
204+ _fullname = None # type: Bogus[ str]
202205 # Path to the file (None if not known)
203206 path = ''
204207 # Top-level definitions and statements
@@ -238,9 +241,9 @@ def __init__(self,
238241 self .ignored_lines = set ()
239242
240243 def name (self ) -> str :
241- return self ._name
244+ return '' if not self ._fullname else self . _fullname . split ( '.' )[ - 1 ]
242245
243- def fullname (self ) -> str :
246+ def fullname (self ) -> Bogus [ str ] :
244247 return self ._fullname
245248
246249 def accept (self , visitor : NodeVisitor [T ]) -> T :
@@ -252,7 +255,6 @@ def is_package_init_file(self) -> bool:
252255
253256 def serialize (self ) -> JsonDict :
254257 return {'.class' : 'MypyFile' ,
255- '_name' : self ._name ,
256258 '_fullname' : self ._fullname ,
257259 'names' : self .names .serialize (self ._fullname ),
258260 'is_stub' : self .is_stub ,
@@ -264,7 +266,6 @@ def serialize(self) -> JsonDict:
264266 def deserialize (cls , data : JsonDict ) -> 'MypyFile' :
265267 assert data ['.class' ] == 'MypyFile' , data
266268 tree = MypyFile ([], [])
267- tree ._name = data ['_name' ]
268269 tree ._fullname = data ['_fullname' ]
269270 tree .names = SymbolTable .deserialize (data ['names' ])
270271 tree .is_stub = data ['is_stub' ]
@@ -405,12 +406,12 @@ def __init__(self) -> None:
405406 self .is_static = False
406407 # Name with module prefix
407408 # TODO: Type should be Optional[str]
408- self ._fullname = cast (str , None )
409+ self ._fullname = cast (Bogus [ str ] , None )
409410
410411 @abstractmethod
411412 def name (self ) -> str : pass
412413
413- def fullname (self ) -> str :
414+ def fullname (self ) -> Bogus [ str ] :
414415 return self ._fullname
415416
416417
@@ -660,7 +661,7 @@ def __init__(self, func: FuncDef, decorators: List[Expression],
660661 def name (self ) -> str :
661662 return self .func .name ()
662663
663- def fullname (self ) -> str :
664+ def fullname (self ) -> Bogus [ str ] :
664665 return self .func .fullname ()
665666
666667 @property
@@ -725,7 +726,7 @@ def __init__(self, name: str, type: 'Optional[mypy.types.Type]' = None) -> None:
725726 super ().__init__ ()
726727 self ._name = name # Name without module prefix
727728 # TODO: Should be Optional[str]
728- self ._fullname = cast (str , None ) # Name with module prefix
729+ self ._fullname = cast (Bogus [ str ] , None ) # Name with module prefix
729730 # TODO: Should be Optional[TypeInfo]
730731 self .info = VAR_NO_INFO
731732 self .type = type # type: Optional[mypy.types.Type] # Declared or inferred type, or None
@@ -748,7 +749,7 @@ def __init__(self, name: str, type: 'Optional[mypy.types.Type]' = None) -> None:
748749 def name (self ) -> str :
749750 return self ._name
750751
751- def fullname (self ) -> str :
752+ def fullname (self ) -> Bogus [ str ] :
752753 return self ._fullname
753754
754755 def accept (self , visitor : StatementVisitor [T ]) -> T :
@@ -780,7 +781,7 @@ class ClassDef(Statement):
780781 """Class definition"""
781782
782783 name = None # type: str # Name of the class without module prefix
783- fullname = None # type: str # Fully qualified name of the class
784+ fullname = None # type: Bogus[ str] # Fully qualified name of the class
784785 defs = None # type: Block
785786 type_vars = None # type: List[mypy.types.TypeVarDef]
786787 # Base class expressions (not semantically analyzed -- can be arbitrary expressions)
@@ -2053,7 +2054,7 @@ class is generic then it will be a type constructor of higher kind.
20532054 the appropriate number of arguments.
20542055 """
20552056
2056- _fullname = None # type: str # Fully qualified name
2057+ _fullname = None # type: Bogus[ str] # Fully qualified name
20572058 # Fully qualified name for the module this type was defined in. This
20582059 # information is also in the fullname, but is harder to extract in the
20592060 # case of nested class definitions.
@@ -2193,7 +2194,7 @@ def name(self) -> str:
21932194 """Short name."""
21942195 return self .defn .name
21952196
2196- def fullname (self ) -> str :
2197+ def fullname (self ) -> Bogus [ str ] :
21972198 return self ._fullname
21982199
21992200 def is_generic (self ) -> bool :
0 commit comments