@@ -23,6 +23,7 @@ def __init__(self, ns, parent, name, component, prototype = False):
2323 self .properties = []
2424 self .enums = OrderedDict ()
2525 self .consts = OrderedDict ()
26+ self .comp_assignments = OrderedDict ()
2627 self .assignments = OrderedDict ()
2728 self .animations = OrderedDict ()
2829 self .package = get_package (name )
@@ -81,15 +82,19 @@ def create_component_generator(self, component, suffix = '<anonymous>'):
8182 return value
8283
8384 def assign (self , target , value , loc ):
85+ assert target != "id"
86+
87+ if target in self .assignments or target in self .comp_assignments :
88+ raise Error ("double assignment to '%s' in %s of type %s" % (target , self .name , self .component .name ), loc )
89+
8490 t = type (value )
8591 if t is lang .Component :
8692 value = self .create_component_generator (value )
8793 #print("dep %s:%s.%s -> %s:%s" % (hex(id(self)),self.component.name, target, hex(id(value)),value.component.name))
88- if isinstance (value , (str , basestring )): #and value[0] == '"' and value[-1] == '"':
94+ self .comp_assignments [target ] = value
95+ else :
8996 value = str (value .replace ("\\ \n " , "" )) #multiline continuation \<NEWLINE>
90- if target in self .assignments :
91- raise Error ("double assignment to '%s' in %s of type %s" % (target , self .name , self .component .name ), loc )
92- self .assignments [target ] = value
97+ self .assignments [target ] = value
9398
9499 def has_property (self , name ):
95100 return (name in self .declared_properties ) or (name in self .aliases ) or (name in self .enums )
@@ -140,8 +145,9 @@ def add_child(self, child):
140145 raise Error ("modelData property is reserved for model row disambiguation and cannot be an id of the component" , child .loc )
141146 if child .name == "model" :
142147 raise Error ("id: model breaks model/delegate relationship and overrides current model row" , child .loc )
148+ if "." in child .name :
149+ raise Error ("expected identifier, not expression" , self .loc )
143150 self .id = child .name
144- self .assign ("id" , child .name , child .loc )
145151 elif t is lang .Component :
146152 value = self .create_component_generator (child )
147153 #print("dep %s:%s.<anonymous> -> %s:%s" % (hex(id(self)), self.component.name, hex(id(value)),value.component.name))
@@ -542,6 +548,9 @@ def generate_creators(self, registry, parent, closure, ident_n = 1):
542548 for name , prop in self .consts .items ():
543549 raise Error ('adding consts without prototype is not unsupported, consider putting this property (%s) in prototype' % name , self .loc )
544550
551+ if self .id is not None :
552+ r .append ("%s%s._setId('%s')" % (ident , parent , self .id ))
553+
545554 for idx , gen in enumerate (self .children ):
546555 var = "%s$child%d" % (escape (parent ), idx )
547556 component = registry .find_component (self .package , gen .component .name , mangle = True )
@@ -551,28 +560,22 @@ def generate_creators(self, registry, parent, closure, ident_n = 1):
551560 r .append (code )
552561 r .append ("%s%s.addChild(%s)" % (ident , parent , var ))
553562
554- for target , value in self .assignments .items ():
555- if target == "id" :
556- if "." in value :
557- raise Error ("expected identifier, not expression" , self .loc )
558- r .append ("%s%s._setId('%s')" % (ident , parent , value ))
559- elif target .endswith (".id" ):
560- raise Error ("setting id of the remote object is prohibited" , self .loc )
563+ for target , value in self .comp_assignments .items ():
564+ self .check_target_property (registry , target )
565+ if target != "delegate" :
566+ var = "%s$%s" % (escape (parent ), escape (target ))
567+ r .append ("//creating component %s" % value .name )
568+ r .append ("%svar %s = new %s(%s)" % (ident , var , registry .find_component (value .package , value .component .name , mangle = True ), parent ))
569+ r .append ("%s%s.%s = %s" % (ident , closure , var , var ))
570+ code = self .call_create (registry , ident_n , var , value , closure )
571+ r .append (code )
572+ r .append ('%s%s.%s = %s' % (ident , parent , target , var ))
561573 else :
562- self .check_target_property (registry , target )
563-
564- if isinstance (value , component_generator ):
565- if target != "delegate" :
566- var = "%s$%s" % (escape (parent ), escape (target ))
567- r .append ("//creating component %s" % value .name )
568- r .append ("%svar %s = new %s(%s)" % (ident , var , registry .find_component (value .package , value .component .name , mangle = True ), parent ))
569- r .append ("%s%s.%s = %s" % (ident , closure , var , var ))
570- code = self .call_create (registry , ident_n , var , value , closure )
571- r .append (code )
572- r .append ('%s%s.%s = %s' % (ident , parent , target , var ))
573- else :
574- code = self .generate_creator_function (registry , 'delegate' , value , ident_n )
575- r .append ("%s%s.%s = %s" % (ident , parent , target , code ))
574+ code = self .generate_creator_function (registry , 'delegate' , value , ident_n )
575+ r .append ("%s%s.%s = %s" % (ident , parent , target , code ))
576+
577+ for target , value in self .assignments .items ():
578+ self .check_target_property (registry , target )
576579
577580 for name , target in self .aliases .items ():
578581 get , pname = generate_accessors (parent , target , partial (self .transform_root , registry , None ))
@@ -645,10 +648,13 @@ def generate_setup_code(self, registry, parent, closure, ident_n = 1):
645648
646649 parse_deps_ctx = ParseDepsContext (registry , self )
647650
648- for target , value in self .assignments .items ():
649- if target == "id " :
651+ for target , value in self .comp_assignments .items ():
652+ if target == "delegate " :
650653 continue
651- t = type (value )
654+ var = "%s$%s" % (escape (parent ), escape (target ))
655+ r .append (self .call_setup (registry , ident_n , var , value , closure ))
656+
657+ for target , value in self .assignments .items ():
652658 #print self.name, target, value
653659 target_owner , target_lvalue , target_prop = self .get_lvalue (registry , parent , target )
654660 if isinstance (value , (str , basestring )):
@@ -665,12 +671,6 @@ def generate_setup_code(self, registry, parent, closure, ident_n = 1):
665671 r .append ("%s%s._replaceUpdater('%s', function() { %s = %s }, [%s])" % (ident , target_owner , target_prop , target_lvalue , value , "," .join (undep )))
666672 else :
667673 r .append ("%s%s._removeUpdater('%s'); %s = %s;" % (ident , target_owner , target_prop , target_lvalue , value ))
668-
669- elif t is component_generator :
670- if target == "delegate" :
671- continue
672- var = "%s$%s" % (escape (parent ), escape (target ))
673- r .append (self .call_setup (registry , ident_n , var , value , closure ))
674674 else :
675675 raise Error ("skip assignment %s = %s" % (target , value ), self .loc )
676676
0 commit comments