@@ -257,7 +257,7 @@ def visit_ClassDef(self, node):
257257
258258 if self ._catch_attributes :
259259 self ._inline_classes [ name ] = self ._catch_attributes
260- writer . write ( '#$---: %s' % self . _function_return_types )
260+
261261 self ._catch_attributes = None
262262 self ._decorator_properties = None
263263 self ._instances .pop ('self' )
@@ -394,21 +394,24 @@ def visit_UnaryOp(self, node):
394394 return self .visit (node .op ) + self .visit (node .operand )
395395
396396 def visit_Attribute (self , node ):
397+ node_value = self .visit (node .value )
398+ typedef = None
397399 if isinstance (node .value , Name ):
398- name = self .visit ( node .value )
399- typedef = self . get_typedef ( node .value )
400- if typedef :
401- if node . attr in typedef . properties :
402- getter = typedef . properties [ node . attr ][ 'get' ]
403- if getter in self . _function_return_types :
404- node .returns_type = self . _function_return_types [ getter ]
405- return '%s( [%s] )' % ( getter , name )
406- else :
407- return 'get_attribute(%s, "%s" )' % ( name , node . attr )
400+ typedef = self .get_typedef ( instance = node .value )
401+ elif hasattr ( node .value , 'returns_type' ):
402+ typedef = self . get_typedef ( class_name = node . value . returns_type )
403+
404+ if typedef :
405+ if node . attr in typedef . properties :
406+ getter = typedef . properties [ node .attr ][ 'get' ]
407+ if getter in self . _function_return_types :
408+ node . returns_type = self . _function_return_types [ getter ]
409+ return '%s( [%s] )' % ( getter , node_value )
408410 else :
409- return 'get_attribute(%s, "%s")' % (name , node .attr )
411+ return 'get_attribute(%s, "%s")' % (node_value , node .attr )
410412 else :
411- return 'get_attribute(%s, "%s")' % (self .visit (node .value ), node .attr )
413+ return 'get_attribute(%s, "%s")' % (node_value , node .attr )
414+
412415
413416 def visit_Attribute_OLD (self , node ):
414417 name = self .visit (node .value )
@@ -480,49 +483,25 @@ def visit_Assign(self, node):
480483 code = "get_attribute(get_attribute('%s', '__setitem__'), '__call__')([%s, %s], JSObject())"
481484 code = code % (self .visit (target .value ), self .visit (target .slice .value ), self .visit (node .value ))
482485 writer .write (code )
483- elif isinstance (target , Attribute ):
484- #name = self.visit(target.value)
485- #if name == 'self' and isinstance(self._catch_attributes, set):
486- # self._catch_attributes.add( target.attr )
487-
488- fallback = True
489- #if name in self._instances: ## support '.' operator overloading
490- # klass = self._instances[ name ]
491- # if klass in self._decorator_class_props and target.attr in self._decorator_class_props[klass]:
492- # setter = self._decorator_class_props[klass][target.attr].get( 'set', None )
493- # if setter:
494- # #writer.write( '''JS('%s( [%s, %s] )')''' %(setter, name, self.visit(node.value)) ) ## can not nest have nested JS() calls
495- # writer.write( '%s( [%s, %s] )' %(setter, name, self.visit(node.value)) )
496- # fallback = False
497- # else:
498- # writer.write('#!!!! class is known: %s' %klass)
499- #else:
500- # writer.write('##fallback--unknown-type: %s - %s' %(target.value, name))
501486
487+ elif isinstance (target , Attribute ):
502488 target_value = self .visit (target .value ) ## target.value may have "returns_type" after being visited
489+ typedef = None
503490 if isinstance (target .value , Name ):
504491 if target .value .id == 'self' and isinstance (self ._catch_attributes , set ):
505492 self ._catch_attributes .add ( target .attr )
506-
507493 typedef = self .get_typedef ( instance = target .value )
508- if typedef and target .attr in typedef .properties :
509- setter = typedef .properties [ target .attr ].get ('set' ,None )
510- if setter :
511- writer .write ( '%s( [%s, %s] )' % (setter , target_value , self .visit (node .value )) )
512- fallback = False
513-
514494 elif hasattr (target .value , 'returns_type' ):
515- writer .write ('#### HEY: %s' % target .value .returns_type )
516495 typedef = self .get_typedef ( class_name = target .value .returns_type )
517- if typedef and target .attr in typedef .properties :
518- setter = typedef .properties [ target .attr ].get ('set' ,None )
519- if setter :
520- writer .write ( '%s( [%s, %s] )' % (setter , target_value , self .visit (node .value )) )
521- fallback = False
522496
497+ fallback = True
498+ if typedef and target .attr in typedef .properties :
499+ setter = typedef .properties [ target .attr ].get ('set' ,None )
500+ if setter :
501+ writer .write ( '%s( [%s, %s] )' % (setter , target_value , self .visit (node .value )) )
502+ fallback = False
523503
524504 if fallback :
525- writer .write ('#FALLBACK' )
526505 code = 'set_attribute(%s, "%s", %s)' % (
527506 target_value ,
528507 target .attr ,
0 commit comments