abulka / pynsource

Reverse engineer Python source code into UML
http://pynsource.com
283 stars 40 forks source link

UnboundLocalError: local variable 't' referenced before assignment #80

Closed auphofBSF closed 3 years ago

auphofBSF commented 3 years ago

When importing a python module that has code like the following the import fails with an exception after self = Foo()

Otherwise the pynsource works fantastic, Thank You

class Foo(object):

    @classmethod
    def create(cls,VAR1):
        self = Foo()
        self.var1 = VAR1
        return self
    def test(self):
        print("Hello")

image

pynsource commit: https://github.com/abulka/pynsource/commit/aeb22b673261c72d7cbc369882372b84b2ca84b3 Python 3.7.6 | packaged by conda-forge | (default, Jun 1 2020, 18:11:50) [MSC v.1916 64 bit (AMD64)] on win32

Excerpt from debug.log

Actual exception:

local variable 't' referenced before assignment'
[Thu 10:52 PM] [ERROR] parsing.core_parser_ast - 288 - Parsing Visit error: local variable 't' referenced before assignment, Debug info: Parse History: 
    visit_Module Line: 2 col_offset: 0 
    visit_ClassDef class Foo   (inside class Foo) ['Foo'] 
    visit_Name object object LHS 1 ['object'] classesinheritsfrom append object cos lhs is ['object'] Line: 4 col_offset: 4 
    visit_FunctionDef def create(  found decorator classmethod   (PUSH method) [False, True]  ): 
    visit_Assign  Line: 6 col_offset: 8 
    visit_Name self self LHS 1 ['self'] = 
    visit_Name Foo Foo RHS 1 ['Foo'] 
    visit_Call ['Foo'] FIRST BRACKET ['Foo'] len is 1 stop_recording_rhs_inside_first_bracket INITIAL SET to 1 stop_recording_rhs_inside_first_bracket INCREMENTED 2 ( ) stop_recording_rhs_inside_first_bracket decremented 1 
    visit_Assign  Line: 7 col_offset: 8 
[Thu 10:52 PM] [ERROR] parsing.core_parser_ast - 289 - Full traceback: Traceback (most recent call last):
  File "C:\Users\<USER>\axternal\pynsource\src\parsing\core_parser_ast.py", line 273, in _convert_ast_to_old_parser
    v.visit(node)
  File "C:\Users\<USER>\Anaconda3\envs\<ENV>\lib\site-packages\typed_ast\ast3.py", line 279, in visit
    return visitor(node)
  File "C:\Users\<USER>\axternal\pynsource\src\parsing\core_parser_ast.py", line 660, in visit_Module
    self.generic_visit(node)  # need this to keep the visiting going...
  File "C:\Users\<USER>\Anaconda3\envs\<ENV>\lib\site-packages\typed_ast\ast3.py", line 287, in generic_visit
    self.visit(item)
  File "C:\Users\<USER>\Anaconda3\envs\<ENV>\lib\site-packages\typed_ast\ast3.py", line 279, in visit
    return visitor(node)
  File "C:\Users\<USER>\axternal\pynsource\src\parsing\core_parser_ast.py", line 825, in visit_ClassDef
    self.body(node.body)
  File "C:\Users\<USER>\axternal\pynsource\src\parsing\core_parser_ast.py", line 597, in body
    self.visit(stmt)
  File "C:\Users\<USER>\Anaconda3\envs\<ENV>\lib\site-packages\typed_ast\ast3.py", line 279, in visit
    return visitor(node)
  File "C:\Users\<USER>\axternal\pynsource\src\parsing\core_parser_ast.py", line 793, in visit_FunctionDef
    self.body(node.body)
  File "C:\Users\<USER>\axternal\pynsource\src\parsing\core_parser_ast.py", line 597, in body
    self.visit(stmt)
  File "C:\Users\<USER>\Anaconda3\envs\<ENV>\lib\site-packages\typed_ast\ast3.py", line 279, in visit
    return visitor(node)
  File "C:\Users\<USER>\axternal\pynsource\src\parsing\core_parser_ast.py", line 667, in visit_Assign
    self.newline(node)
  File "C:\Users\<USER>\axternal\pynsource\src\parsing\core_parser_ast.py", line 591, in newline
    self.flush()
  File "C:\Users\<USER>\axternal\pynsource\src\parsing\core_parser_ast.py", line 545, in flush
    self.add_composite_dependency((t, ra.rhs_ref_to_class))
UnboundLocalError: local variable 't' referenced before assignment
abulka commented 3 years ago

Thank you for reporting this - I will take a look.