Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9d011abc authored by Sasha Smundak's avatar Sasha Smundak
Browse files

Emit mksubst call for $(subst ...)

Bug: 172923994
Test: internal
Change-Id: I7994bee61f6f8bdee6eac50ecb8a6064830447a4
parent b643c7a0
Loading
Loading
Loading
Loading
+14 −12
Original line number Diff line number Diff line
@@ -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: starlarkTypeString,
			returnType: typ,
		}
	}
	return &callExpr{
		name:       "subst",
		args:       []starlarkExpr{&stringLiteralExpr{from}, &stringLiteralExpr{to}, obj},
		returnType: obj.typ(),
	}
}

+16 −0
Original line number Diff line number Diff line
@@ -637,6 +637,22 @@ def init(g, handle):
  cfg["PRODUCT_COPY_FILES"] = rblf.addprefix("pfx-", "a b c")
  cfg["PRODUCT_COPY_FILES"] = rblf.addsuffix(".sff", "a b c")
  cfg["PRODUCT_NAME"] = ((g.get("TARGET_BOARD_PLATFORM", "")).replace(".", " ")).split()[0]
`,
	},
	{
		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)
`,
	},
	{
+6 −1
Original line number Diff line number Diff line
@@ -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_") {