Simplify and correct variable assignments
- Remove asgnMaybeAppend, it was only used to indicate
that the asignment needs a setDefault. But really, all
types of variable assignments need setDefault if they're
self-referential.
- Remove local_append/local_set_default because there was
no implementation for them written in product_config.rbc
anyways.
- Correct productConfigVariable.emitDefined using the global
variables instead of the product config variables.
- Emit setDefaults for all types of assignments if they're
self referential.
Bug: 222737841
Test: go test
Change-Id: I06a0f90f16d5900049d473281e6d5ef5e93e67da
diff --git a/mk2rbc/variable.go b/mk2rbc/variable.go
index 6805744..3241a38 100644
--- a/mk2rbc/variable.go
+++ b/mk2rbc/variable.go
@@ -97,29 +97,27 @@
gctx.newLine()
}
+ // If we are not sure variable has been assigned before, emit setdefault
+ needsSetDefault := asgn.previous == nil && !pcv.isPreset() && asgn.isSelfReferential()
+
switch asgn.flavor {
case asgnSet:
- isSelfReferential := false
- asgn.value.transform(func(expr starlarkExpr) starlarkExpr {
- if ref, ok := expr.(*variableRefExpr); ok && ref.ref.name() == pcv.name() {
- isSelfReferential = true
- }
- return nil
- })
- if isSelfReferential {
+ if needsSetDefault {
emitSetDefault()
}
emitAssignment()
case asgnAppend:
- emitAppend()
- case asgnMaybeAppend:
- // If we are not sure variable has been assigned before, emit setdefault
- emitSetDefault()
+ if needsSetDefault {
+ emitSetDefault()
+ }
emitAppend()
case asgnMaybeSet:
gctx.writef("if cfg.get(%q) == None:", pcv.nam)
gctx.indentLevel++
gctx.newLine()
+ if needsSetDefault {
+ emitSetDefault()
+ }
emitAssignment()
gctx.indentLevel--
}
@@ -134,7 +132,7 @@
}
func (pcv productConfigVariable) emitDefined(gctx *generationContext) {
- gctx.writef("g.get(%q) != None", pcv.name())
+ gctx.writef("cfg.get(%q) != None", pcv.name())
}
type otherGlobalVariable struct {
@@ -159,20 +157,30 @@
value.emit(gctx)
}
+ // If we are not sure variable has been assigned before, emit setdefault
+ needsSetDefault := asgn.previous == nil && !scv.isPreset() && asgn.isSelfReferential()
+
switch asgn.flavor {
case asgnSet:
+ if needsSetDefault {
+ gctx.writef("g.setdefault(%q, %s)", scv.name(), scv.defaultValueString())
+ gctx.newLine()
+ }
emitAssignment()
case asgnAppend:
- emitAppend()
- case asgnMaybeAppend:
- // If we are not sure variable has been assigned before, emit setdefault
- gctx.writef("g.setdefault(%q, %s)", scv.name(), scv.defaultValueString())
- gctx.newLine()
+ if needsSetDefault {
+ gctx.writef("g.setdefault(%q, %s)", scv.name(), scv.defaultValueString())
+ gctx.newLine()
+ }
emitAppend()
case asgnMaybeSet:
gctx.writef("if g.get(%q) == None:", scv.nam)
gctx.indentLevel++
gctx.newLine()
+ if needsSetDefault {
+ gctx.writef("g.setdefault(%q, %s)", scv.name(), scv.defaultValueString())
+ gctx.newLine()
+ }
emitAssignment()
gctx.indentLevel--
}
@@ -204,7 +212,7 @@
func (lv localVariable) emitSet(gctx *generationContext, asgn *assignmentNode) {
switch asgn.flavor {
- case asgnSet:
+ case asgnSet, asgnMaybeSet:
gctx.writef("%s = ", lv)
asgn.value.emitListVarCopy(gctx)
case asgnAppend:
@@ -216,14 +224,6 @@
value = &toStringExpr{expr: value}
}
value.emit(gctx)
- case asgnMaybeAppend:
- gctx.writef("%s(%q, ", cfnLocalAppend, lv)
- asgn.value.emit(gctx)
- gctx.write(")")
- case asgnMaybeSet:
- gctx.writef("%s(%q, ", cfnLocalSetDefault, lv)
- asgn.value.emit(gctx)
- gctx.write(")")
}
}