From 1323877b7ed8dea3e0da4ba15fa13aaa04aaec5c Mon Sep 17 00:00:00 2001 From: Cole Faust Date: Thu, 28 Apr 2022 14:29:57 -0700 Subject: [PATCH] Support complicated variable references Bug: 226974242 Test: go test Change-Id: Iaec16f5c498e7c75c9ee5d53d3499efadfba16bc --- androidmk/parser/make_strings.go | 4 ++-- androidmk/parser/make_strings_test.go | 10 ++++++++++ mk2rbc/mk2rbc.go | 23 ++++++++++++++++++++++- mk2rbc/mk2rbc_test.go | 21 +++++++++++++++++++++ 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/androidmk/parser/make_strings.go b/androidmk/parser/make_strings.go index 416e43005..8afbe7edc 100644 --- a/androidmk/parser/make_strings.go +++ b/androidmk/parser/make_strings.go @@ -234,10 +234,10 @@ func (ms *MakeString) splitNFunc(n int, splitFunc func(s string, n int) []string if n != 0 { split := splitFunc(s, n) if n != -1 { - if len(split) > n { + if len(split) > n || len(split) == 0 { panic("oops!") } else { - n -= len(split) + n -= len(split) - 1 } } curMs.appendString(split[0]) diff --git a/androidmk/parser/make_strings_test.go b/androidmk/parser/make_strings_test.go index e243eceef..7e842a51b 100644 --- a/androidmk/parser/make_strings_test.go +++ b/androidmk/parser/make_strings_test.go @@ -75,6 +75,16 @@ var splitNTestCases = []struct { genMakeString(""), }, }, + { + // "x$(var1)y bar" + in: genMakeString("x", "var1", "y bar"), + sep: " ", + n: 2, + expected: []*MakeString{ + genMakeString("x", "var1", "y"), + genMakeString("bar"), + }, + }, } func TestMakeStringSplitN(t *testing.T) { diff --git a/mk2rbc/mk2rbc.go b/mk2rbc/mk2rbc.go index f36d4f741..e59146be1 100644 --- a/mk2rbc/mk2rbc.go +++ b/mk2rbc/mk2rbc.go @@ -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 { diff --git a/mk2rbc/mk2rbc_test.go b/mk2rbc/mk2rbc_test.go index b812b617d..a09764c17 100644 --- a/mk2rbc/mk2rbc_test.go +++ b/mk2rbc/mk2rbc_test.go @@ -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") `, }, }