Support complicated variable references
Bug: 226974242 Test: go test Change-Id: Iaec16f5c498e7c75c9ee5d53d3499efadfba16bc
This commit is contained in:
@@ -1270,7 +1270,28 @@ func (ctx *parseContext) parseReference(node mkparser.Node, ref *mkparser.MakeSt
|
||||
// Handle only the case where the first (or only) word is constant
|
||||
words := ref.SplitN(" ", 2)
|
||||
if !words[0].Const() {
|
||||
return ctx.newBadExpr(node, "reference is too complex: %s", refDump)
|
||||
if len(words) == 1 {
|
||||
expr := ctx.parseMakeString(node, ref)
|
||||
return &callExpr{
|
||||
object: &identifierExpr{"cfg"},
|
||||
name: "get",
|
||||
args: []starlarkExpr{
|
||||
expr,
|
||||
&callExpr{
|
||||
object: &identifierExpr{"g"},
|
||||
name: "get",
|
||||
args: []starlarkExpr{
|
||||
expr,
|
||||
&stringLiteralExpr{literal: ""},
|
||||
},
|
||||
returnType: starlarkTypeUnknown,
|
||||
},
|
||||
},
|
||||
returnType: starlarkTypeUnknown,
|
||||
}
|
||||
} else {
|
||||
return ctx.newBadExpr(node, "reference is too complex: %s", refDump)
|
||||
}
|
||||
}
|
||||
|
||||
if name, _, ok := ctx.maybeParseFunctionCall(node, ref); ok {
|
||||
|
@@ -1597,6 +1597,27 @@ MY_VAR := foo
|
||||
def init(g, handle):
|
||||
cfg = rblf.cfg(handle)
|
||||
g["MY_VAR"] = "foo"
|
||||
`,
|
||||
},
|
||||
{
|
||||
desc: "Complicated variable references",
|
||||
mkname: "product.mk",
|
||||
in: `
|
||||
MY_VAR := foo
|
||||
MY_VAR_2 := MY_VAR
|
||||
MY_VAR_3 := $($(MY_VAR_2))
|
||||
MY_VAR_4 := $(foo bar)
|
||||
MY_VAR_5 := $($(MY_VAR_2) bar)
|
||||
`,
|
||||
expected: `load("//build/make/core:product_config.rbc", "rblf")
|
||||
|
||||
def init(g, handle):
|
||||
cfg = rblf.cfg(handle)
|
||||
g["MY_VAR"] = "foo"
|
||||
g["MY_VAR_2"] = "MY_VAR"
|
||||
g["MY_VAR_3"] = (cfg).get(g["MY_VAR_2"], (g).get(g["MY_VAR_2"], ""))
|
||||
g["MY_VAR_4"] = rblf.mk2rbc_error("product.mk:5", "cannot handle invoking foo")
|
||||
g["MY_VAR_5"] = rblf.mk2rbc_error("product.mk:6", "reference is too complex: $(MY_VAR_2) bar")
|
||||
`,
|
||||
},
|
||||
}
|
||||
|
Reference in New Issue
Block a user