Allow generic $(findstring) calls

Previously they were only allowed in if statements.
Also update the if statement condition to allow comparisons
to the search term.

Bug: 201700692
Test: go test
Change-Id: I8bee8f716819d383423c0de233ab970e49890543
This commit is contained in:
Cole Faust
2021-12-13 16:33:25 -08:00
parent 789e5026b4
commit 0e9418ced0
2 changed files with 42 additions and 2 deletions

View File

@@ -105,7 +105,7 @@ var knownFunctions = map[string]struct {
"dist-for-goals": {baseName + ".mkdist_for_goals", starlarkTypeVoid, hiddenArgGlobal}, "dist-for-goals": {baseName + ".mkdist_for_goals", starlarkTypeVoid, hiddenArgGlobal},
"enforce-product-packages-exist": {baseName + ".enforce_product_packages_exist", starlarkTypeVoid, hiddenArgNone}, "enforce-product-packages-exist": {baseName + ".enforce_product_packages_exist", starlarkTypeVoid, hiddenArgNone},
"error": {baseName + ".mkerror", starlarkTypeVoid, hiddenArgNone}, "error": {baseName + ".mkerror", starlarkTypeVoid, hiddenArgNone},
"findstring": {"!findstring", starlarkTypeInt, hiddenArgNone}, "findstring": {baseName + ".findstring", starlarkTypeString, hiddenArgNone},
"find-copy-subdir-files": {baseName + ".find_and_copy", starlarkTypeList, hiddenArgNone}, "find-copy-subdir-files": {baseName + ".find_and_copy", starlarkTypeList, hiddenArgNone},
"find-word-in-list": {"!find-word-in-list", starlarkTypeUnknown, hiddenArgNone}, // internal macro "find-word-in-list": {"!find-word-in-list", starlarkTypeUnknown, hiddenArgNone}, // internal macro
"filter": {baseName + ".filter", starlarkTypeList, hiddenArgNone}, "filter": {baseName + ".filter", starlarkTypeList, hiddenArgNone},
@@ -1288,8 +1288,21 @@ func (ctx *parseContext) parseCheckFindstringFuncResult(directive *mkparser.Dire
right: &intLiteralExpr{-1}, right: &intLiteralExpr{-1},
isEq: !negate, isEq: !negate,
} }
} else if s, ok := maybeString(xValue); ok {
if s2, ok := maybeString(xCall.args[0]); ok && s == s2 {
return &eqExpr{
left: &callExpr{
object: xCall.args[1],
name: "find",
args: []starlarkExpr{xCall.args[0]},
returnType: starlarkTypeInt,
},
right: &intLiteralExpr{-1},
isEq: negate,
}
}
} }
return ctx.newBadExpr(directive, "findstring result can be compared only to empty: %s", xValue) return ctx.newBadExpr(directive, "$(findstring) can only be compared to nothing or its first argument")
} }
func (ctx *parseContext) parseCompareStripFuncResult(directive *mkparser.Directive, func (ctx *parseContext) parseCompareStripFuncResult(directive *mkparser.Directive,

View File

@@ -633,15 +633,42 @@ def init(g, handle):
desc: "findstring call", desc: "findstring call",
mkname: "product.mk", mkname: "product.mk",
in: ` in: `
result := $(findstring a,a b c)
result := $(findstring b,x y z)
`,
expected: `load("//build/make/core:product_config.rbc", "rblf")
def init(g, handle):
cfg = rblf.cfg(handle)
_result = rblf.findstring("a", "a b c")
_result = rblf.findstring("b", "x y z")
`,
},
{
desc: "findstring in if statement",
mkname: "product.mk",
in: `
ifeq ($(findstring foo,$(PRODUCT_PACKAGES)),)
endif
ifneq ($(findstring foo,$(PRODUCT_PACKAGES)),) ifneq ($(findstring foo,$(PRODUCT_PACKAGES)),)
endif endif
ifeq ($(findstring foo,$(PRODUCT_PACKAGES)),foo)
endif
ifneq ($(findstring foo,$(PRODUCT_PACKAGES)),foo)
endif
`, `,
expected: `load("//build/make/core:product_config.rbc", "rblf") expected: `load("//build/make/core:product_config.rbc", "rblf")
def init(g, handle): def init(g, handle):
cfg = rblf.cfg(handle) cfg = rblf.cfg(handle)
if (cfg.get("PRODUCT_PACKAGES", [])).find("foo") == -1:
pass
if (cfg.get("PRODUCT_PACKAGES", [])).find("foo") != -1: if (cfg.get("PRODUCT_PACKAGES", [])).find("foo") != -1:
pass pass
if (cfg.get("PRODUCT_PACKAGES", [])).find("foo") != -1:
pass
if (cfg.get("PRODUCT_PACKAGES", [])).find("foo") == -1:
pass
`, `,
}, },
{ {