Skip to content

Commit 1bfbe7c

Browse files
committed
split assignments into id, component and expression assignments. assign id earlier
1 parent 74fa0a9 commit 1bfbe7c

File tree

1 file changed

+35
-35
lines changed

1 file changed

+35
-35
lines changed

compiler/js/component.py

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)