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:
@@ -105,7 +105,7 @@ var knownFunctions = map[string]struct {
|
||||
"dist-for-goals": {baseName + ".mkdist_for_goals", starlarkTypeVoid, hiddenArgGlobal},
|
||||
"enforce-product-packages-exist": {baseName + ".enforce_product_packages_exist", 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-word-in-list": {"!find-word-in-list", starlarkTypeUnknown, hiddenArgNone}, // internal macro
|
||||
"filter": {baseName + ".filter", starlarkTypeList, hiddenArgNone},
|
||||
@@ -1288,8 +1288,21 @@ func (ctx *parseContext) parseCheckFindstringFuncResult(directive *mkparser.Dire
|
||||
right: &intLiteralExpr{-1},
|
||||
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,
|
||||
|
@@ -633,15 +633,42 @@ def init(g, handle):
|
||||
desc: "findstring call",
|
||||
mkname: "product.mk",
|
||||
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)),)
|
||||
endif
|
||||
ifeq ($(findstring foo,$(PRODUCT_PACKAGES)),foo)
|
||||
endif
|
||||
ifneq ($(findstring foo,$(PRODUCT_PACKAGES)),foo)
|
||||
endif
|
||||
`,
|
||||
expected: `load("//build/make/core:product_config.rbc", "rblf")
|
||||
|
||||
def init(g, handle):
|
||||
cfg = rblf.cfg(handle)
|
||||
if (cfg.get("PRODUCT_PACKAGES", [])).find("foo") == -1:
|
||||
pass
|
||||
if (cfg.get("PRODUCT_PACKAGES", [])).find("foo") != -1:
|
||||
pass
|
||||
if (cfg.get("PRODUCT_PACKAGES", [])).find("foo") != -1:
|
||||
pass
|
||||
if (cfg.get("PRODUCT_PACKAGES", [])).find("foo") == -1:
|
||||
pass
|
||||
`,
|
||||
},
|
||||
{
|
||||
|
Reference in New Issue
Block a user