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},
|
"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,
|
||||||
|
@@ -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
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user