Merge "Recognize some unsupported functions"

This commit is contained in:
Cole Faust
2022-04-29 00:41:15 +00:00
committed by Gerrit Code Review
3 changed files with 32 additions and 22 deletions

View File

@@ -741,8 +741,8 @@ func (_ *badExpr) typ() starlarkType {
return starlarkTypeUnknown return starlarkTypeUnknown
} }
func (_ *badExpr) emitListVarCopy(_ *generationContext) { func (b *badExpr) emitListVarCopy(gctx *generationContext) {
panic("implement me") b.emit(gctx)
} }
func (b *badExpr) transform(transformer func(expr starlarkExpr) starlarkExpr) starlarkExpr { func (b *badExpr) transform(transformer func(expr starlarkExpr) starlarkExpr) starlarkExpr {

View File

@@ -131,6 +131,14 @@ var knownNodeFunctions = map[string]interface {
"foreach": &foreachCallNodeParser{}, "foreach": &foreachCallNodeParser{},
} }
// These look like variables, but are actually functions, and would give
// undefined variable errors if we converted them as variables. Instead,
// emit an error instead of converting them.
var unsupportedFunctions = map[string]bool{
"local-generated-sources-dir": true,
"local-intermediates-dir": true,
}
// These are functions that we don't implement conversions for, but // These are functions that we don't implement conversions for, but
// we allow seeing their definitions in the product config files. // we allow seeing their definitions in the product config files.
var ignoredDefines = map[string]bool{ var ignoredDefines = map[string]bool{
@@ -563,9 +571,6 @@ func (ctx *parseContext) handleAssignment(a *mkparser.Assignment) []starlarkNode
if lhs.valueType() == starlarkTypeUnknown { if lhs.valueType() == starlarkTypeUnknown {
// Try to divine variable type from the RHS // Try to divine variable type from the RHS
asgn.value = ctx.parseMakeString(a, a.Value) asgn.value = ctx.parseMakeString(a, a.Value)
if xBad, ok := asgn.value.(*badExpr); ok {
return []starlarkNode{&exprNode{xBad}}
}
inferred_type := asgn.value.typ() inferred_type := asgn.value.typ()
if inferred_type != starlarkTypeUnknown { if inferred_type != starlarkTypeUnknown {
lhs.setValueType(inferred_type) lhs.setValueType(inferred_type)
@@ -574,21 +579,19 @@ func (ctx *parseContext) handleAssignment(a *mkparser.Assignment) []starlarkNode
if lhs.valueType() == starlarkTypeList { if lhs.valueType() == starlarkTypeList {
xConcat, xBad := ctx.buildConcatExpr(a) xConcat, xBad := ctx.buildConcatExpr(a)
if xBad != nil { if xBad != nil {
return []starlarkNode{&exprNode{expr: xBad}} asgn.value = xBad
} } else {
switch len(xConcat.items) { switch len(xConcat.items) {
case 0: case 0:
asgn.value = &listExpr{} asgn.value = &listExpr{}
case 1: case 1:
asgn.value = xConcat.items[0] asgn.value = xConcat.items[0]
default: default:
asgn.value = xConcat asgn.value = xConcat
}
} }
} else { } else {
asgn.value = ctx.parseMakeString(a, a.Value) asgn.value = ctx.parseMakeString(a, a.Value)
if xBad, ok := asgn.value.(*badExpr); ok {
return []starlarkNode{&exprNode{expr: xBad}}
}
} }
if asgn.lhs.valueType() == starlarkTypeString && if asgn.lhs.valueType() == starlarkTypeString &&
@@ -1269,6 +1272,12 @@ func (ctx *parseContext) parseReference(node mkparser.Node, ref *mkparser.MakeSt
return ctx.newBadExpr(node, "reference is too complex: %s", refDump) return ctx.newBadExpr(node, "reference is too complex: %s", refDump)
} }
if name, _, ok := ctx.maybeParseFunctionCall(node, ref); ok {
if _, unsupported := unsupportedFunctions[name]; unsupported {
return ctx.newBadExpr(node, "%s is not supported", refDump)
}
}
// If it is a single word, it can be a simple variable // If it is a single word, it can be a simple variable
// reference or a function call // reference or a function call
if len(words) == 1 && !isMakeControlFunc(refDump) && refDump != "shell" && refDump != "eval" { if len(words) == 1 && !isMakeControlFunc(refDump) && refDump != "shell" && refDump != "eval" {
@@ -1316,9 +1325,8 @@ func (ctx *parseContext) parseReference(node mkparser.Node, ref *mkparser.MakeSt
} else { } else {
return ctx.newBadExpr(node, "cannot handle invoking %s", name) return ctx.newBadExpr(node, "cannot handle invoking %s", name)
} }
} else {
return ctx.newBadExpr(node, "cannot handle %s", refDump)
} }
return ctx.newBadExpr(node, "cannot handle %s", refDump)
} }
type simpleCallParser struct { type simpleCallParser struct {

View File

@@ -117,8 +117,8 @@ PRODUCT_NAME := $(call foo0)
def init(g, handle): def init(g, handle):
cfg = rblf.cfg(handle) cfg = rblf.cfg(handle)
rblf.mk2rbc_error("product.mk:2", "cannot handle invoking foo1") cfg["PRODUCT_NAME"] = rblf.mk2rbc_error("product.mk:2", "cannot handle invoking foo1")
rblf.mk2rbc_error("product.mk:3", "cannot handle invoking foo0") cfg["PRODUCT_NAME"] = rblf.mk2rbc_error("product.mk:3", "cannot handle invoking foo0")
`, `,
}, },
{ {
@@ -987,7 +987,7 @@ def init(g, handle):
rblf.soong_config_namespace(g, "cvd") rblf.soong_config_namespace(g, "cvd")
rblf.soong_config_set(g, "cvd", "launch_configs", "cvd_config_auto.json") rblf.soong_config_set(g, "cvd", "launch_configs", "cvd_config_auto.json")
rblf.soong_config_append(g, "cvd", "grub_config", "grub.cfg") rblf.soong_config_append(g, "cvd", "grub_config", "grub.cfg")
rblf.mk2rbc_error("product.mk:7", "SOONG_CONFIG_ variables cannot be referenced, use soong_config_get instead: SOONG_CONFIG_cvd_grub_config") _x = rblf.mk2rbc_error("product.mk:7", "SOONG_CONFIG_ variables cannot be referenced, use soong_config_get instead: SOONG_CONFIG_cvd_grub_config")
`, `,
}, { }, {
desc: "soong namespace accesses", desc: "soong namespace accesses",
@@ -1303,6 +1303,7 @@ def init(g, handle):
in: ` in: `
ifeq (,$(call foobar)) ifeq (,$(call foobar))
endif endif
my_sources := $(local-generated-sources-dir)
`, `,
expected: `load("//build/make/core:product_config.rbc", "rblf") expected: `load("//build/make/core:product_config.rbc", "rblf")
@@ -1310,6 +1311,7 @@ def init(g, handle):
cfg = rblf.cfg(handle) cfg = rblf.cfg(handle)
if rblf.mk2rbc_error("build/product.mk:2", "cannot handle invoking foobar"): if rblf.mk2rbc_error("build/product.mk:2", "cannot handle invoking foobar"):
pass pass
_my_sources = rblf.mk2rbc_error("build/product.mk:4", "local-generated-sources-dir is not supported")
`, `,
}, },
{ {