Show correct line numbers for errors in an $(eval)

Bug: 264488559
Test: go test
Change-Id: I95ce0345912a2af351be0ecc4595bdc4a2047c0c
This commit is contained in:
Cole Faust
2023-01-05 11:07:47 -08:00
parent 49dd3d583e
commit 7366042870
2 changed files with 17 additions and 0 deletions

View File

@@ -1872,6 +1872,18 @@ func (p *evalNodeParser) parse(ctx *parseContext, node mkparser.Node, args *mkpa
if len(nodes) == 0 { if len(nodes) == 0 {
return []starlarkNode{} return []starlarkNode{}
} else if len(nodes) == 1 { } else if len(nodes) == 1 {
// Replace the nodeLocator with one that just returns the location of
// the $(eval) node. Otherwise, statements inside an $(eval) will show as
// being on line 1 of the file, because they're on line 1 of
// strings.NewReader(args.Dump())
oldNodeLocator := ctx.script.nodeLocator
ctx.script.nodeLocator = func(pos mkparser.Pos) int {
return oldNodeLocator(node.Pos())
}
defer func() {
ctx.script.nodeLocator = oldNodeLocator
}()
switch n := nodes[0].(type) { switch n := nodes[0].(type) {
case *mkparser.Assignment: case *mkparser.Assignment:
if n.Name.Const() { if n.Name.Const() {

View File

@@ -1567,6 +1567,9 @@ $(foreach x,$(MY_LIST_VAR), \
$(foreach x,$(MY_LIST_VAR), \ $(foreach x,$(MY_LIST_VAR), \
$(eval include foo/$(x).mk)) $(eval include foo/$(x).mk))
# Check that we get as least close to correct line numbers for errors on statements inside evals
$(eval $(call inherit-product,$(A_VAR)))
`, `,
expected: `load("//build/make/core:product_config.rbc", "rblf") expected: `load("//build/make/core:product_config.rbc", "rblf")
load("//foo:font.star", _font_init = "init") load("//foo:font.star", _font_init = "init")
@@ -1592,6 +1595,8 @@ def init(g, handle):
if not _varmod_init: if not _varmod_init:
rblf.mkerror("product.mk", "Cannot find %s" % ("foo/%s.mk" % x)) rblf.mkerror("product.mk", "Cannot find %s" % ("foo/%s.mk" % x))
_varmod_init(g, handle) _varmod_init(g, handle)
# Check that we get as least close to correct line numbers for errors on statements inside evals
rblf.mk2rbc_error("product.mk:17", "inherit-product/include argument is too complex")
`, `,
}, },
{ {