summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mk2rbc/mk2rbc.go26
-rw-r--r--mk2rbc/mk2rbc_test.go16
-rw-r--r--mk2rbc/variable.go7
3 files changed, 36 insertions, 13 deletions
diff --git a/mk2rbc/mk2rbc.go b/mk2rbc/mk2rbc.go
index 55a35e9c2..abfd0824d 100644
--- a/mk2rbc/mk2rbc.go
+++ b/mk2rbc/mk2rbc.go
@@ -99,7 +99,7 @@ var knownFunctions = map[string]struct {
// TODO(asmundak): remove it once all calls are removed from configuration makefiles. see b/183161002
"shell": {baseName + ".shell", starlarkTypeString},
"strip": {baseName + ".mkstrip", starlarkTypeString},
- "subst": {baseName + ".subst", starlarkTypeString},
+ "subst": {baseName + ".mksubst", starlarkTypeString},
"warning": {baseName + ".mkwarning", starlarkTypeVoid},
"word": {baseName + "!word", starlarkTypeString},
"wildcard": {baseName + ".expand_wildcard", starlarkTypeList},
@@ -509,13 +509,7 @@ func (ctx *parseContext) handleAssignment(a *mkparser.Assignment) {
}
inferred_type := asgn.value.typ()
if inferred_type != starlarkTypeUnknown {
- if ogv, ok := lhs.(*otherGlobalVariable); ok {
- ogv.typ = inferred_type
- } else if pcv, ok := lhs.(*productConfigVariable); ok {
- pcv.typ = inferred_type
- } else {
- panic(fmt.Errorf("cannot assign new type to a variable %s, its flavor is %T", lhs.name(), lhs))
- }
+ lhs.setValueType(inferred_type)
}
}
if lhs.valueType() == starlarkTypeList {
@@ -1114,11 +1108,19 @@ func (ctx *parseContext) parseSubstFunc(node mkparser.Node, args *mkparser.MakeS
words[2].TrimLeftSpaces()
words[2].TrimRightSpaces()
obj := ctx.parseMakeString(node, words[2])
+ typ := obj.typ()
+ if typ == starlarkTypeString {
+ return &callExpr{
+ object: obj,
+ name: "replace",
+ args: []starlarkExpr{&stringLiteralExpr{from}, &stringLiteralExpr{to}},
+ returnType: typ,
+ }
+ }
return &callExpr{
- object: obj,
- name: "replace",
- args: []starlarkExpr{&stringLiteralExpr{from}, &stringLiteralExpr{to}},
- returnType: starlarkTypeString,
+ name: "subst",
+ args: []starlarkExpr{&stringLiteralExpr{from}, &stringLiteralExpr{to}, obj},
+ returnType: obj.typ(),
}
}
diff --git a/mk2rbc/mk2rbc_test.go b/mk2rbc/mk2rbc_test.go
index 54263b8d4..bb6484b9a 100644
--- a/mk2rbc/mk2rbc_test.go
+++ b/mk2rbc/mk2rbc_test.go
@@ -640,6 +640,22 @@ def init(g, handle):
`,
},
{
+ desc: "subst in list",
+ mkname: "product.mk",
+ in: `
+files = $(call find-copy-subdir-files,*,from,to)
+PRODUCT_COPY_FILES += $(subst foo,bar,$(files))
+`,
+ expected: `load("//build/make/core:product_config.rbc", "rblf")
+
+def init(g, handle):
+ cfg = rblf.cfg(handle)
+ _files = rblf.find_and_copy("*", "from", "to")
+ rblf.setdefault(handle, "PRODUCT_COPY_FILES")
+ cfg["PRODUCT_COPY_FILES"] += rblf.mksubst("foo", "bar", _files)
+`,
+ },
+ {
desc: "assignment flavors",
mkname: "product.mk",
in: `
diff --git a/mk2rbc/variable.go b/mk2rbc/variable.go
index 56db192d8..a650453ea 100644
--- a/mk2rbc/variable.go
+++ b/mk2rbc/variable.go
@@ -26,6 +26,7 @@ type variable interface {
emitSet(gctx *generationContext, asgn *assignmentNode)
emitDefined(gctx *generationContext)
valueType() starlarkType
+ setValueType(t starlarkType)
defaultValueString() string
isPreset() bool
}
@@ -44,6 +45,10 @@ func (v baseVariable) valueType() starlarkType {
return v.typ
}
+func (v *baseVariable) setValueType(t starlarkType) {
+ v.typ = t
+}
+
func (v baseVariable) isPreset() bool {
return v.preset
}
@@ -279,7 +284,7 @@ func (ctx *parseContext) addVariable(name string) variable {
} else if name == strings.ToLower(name) {
// Heuristics: if variable's name is all lowercase, consider it local
// string variable.
- v = &localVariable{baseVariable{nam: name, typ: starlarkTypeString}}
+ v = &localVariable{baseVariable{nam: name, typ: starlarkTypeUnknown}}
} else {
vt := starlarkTypeUnknown
if strings.HasPrefix(name, "LOCAL_") {