From e309a91ca8d088a60bc7335f4688cc6e8a81b04f Mon Sep 17 00:00:00 2001 From: Cole Faust Date: Wed, 16 Mar 2022 13:42:34 -0700 Subject: [PATCH] Parse variable references with #s Inside a variable reference, a # does not start a comment. Fixes: 218742602 Test: go test Change-Id: I16cf04c74a8aa30482fd9293175f893e4efb60f1 --- androidmk/parser/parser.go | 9 ++---- androidmk/parser/parser_test.go | 50 +++++++++++++++++++++++++++++++++ mk2rbc/mk2rbc_test.go | 4 +++ 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/androidmk/parser/parser.go b/androidmk/parser/parser.go index d24efc10d..fb6be38e9 100644 --- a/androidmk/parser/parser.go +++ b/androidmk/parser/parser.go @@ -222,7 +222,7 @@ func (p *parser) parseDirective() bool { if d == "ifdef" || d == "ifndef" || d == "ifeq" || d == "ifneq" { d = "el" + d p.ignoreSpaces() - expression = p.parseExpression() + expression = p.parseExpression('#') expression.TrimRightSpaces() } else { p.errorf("expected ifdef/ifndef/ifeq/ifneq, found %s", d) @@ -232,7 +232,7 @@ func (p *parser) parseDirective() bool { expression, endPos = p.parseDefine() default: p.ignoreSpaces() - expression = p.parseExpression() + expression = p.parseExpression('#') } p.nodes = append(p.nodes, &Directive{ @@ -338,9 +338,6 @@ loop: value.appendString(`\` + string(p.tok)) } p.accept(p.tok) - case '#': - p.parseComment() - break loop case '$': var variable Variable variable = p.parseVariable() @@ -522,7 +519,7 @@ func (p *parser) parseAssignment(t string, target *MakeString, ident *MakeString // non-whitespace character after the = until the end of the logical line, // which may included escaped newlines p.accept('=') - value := p.parseExpression() + value := p.parseExpression('#') value.TrimLeftSpaces() if ident.EndsWith('+') && t == "=" { ident.TrimRightOne() diff --git a/androidmk/parser/parser_test.go b/androidmk/parser/parser_test.go index f562c29e8..9efebf8e1 100644 --- a/androidmk/parser/parser_test.go +++ b/androidmk/parser/parser_test.go @@ -34,6 +34,56 @@ var parserTestCases = []struct { }, }, }, + { + name: "Simple warning", + in: `$(warning A warning)`, + out: []Node{ + &Variable{ + Name: SimpleMakeString("warning A warning", NoPos), + }, + }, + }, + { + name: "Warning with #", + in: `$(warning # A warning)`, + out: []Node{ + &Variable{ + Name: SimpleMakeString("warning # A warning", NoPos), + }, + }, + }, + { + name: "Findstring with #", + in: `$(findstring x,x a #)`, + out: []Node{ + &Variable{ + Name: SimpleMakeString("findstring x,x a #", NoPos), + }, + }, + }, + { + name: "If statement", + in: `ifeq (a,b) # comment +endif`, + out: []Node{ + &Directive{ + NamePos: NoPos, + Name: "ifeq", + Args: SimpleMakeString("(a,b) ", NoPos), + EndPos: NoPos, + }, + &Comment{ + CommentPos: NoPos, + Comment: " comment", + }, + &Directive{ + NamePos: NoPos, + Name: "endif", + Args: SimpleMakeString("", NoPos), + EndPos: NoPos, + }, + }, + }, } func TestParse(t *testing.T) { diff --git a/mk2rbc/mk2rbc_test.go b/mk2rbc/mk2rbc_test.go index 408466041..f60cd6ea5 100644 --- a/mk2rbc/mk2rbc_test.go +++ b/mk2rbc/mk2rbc_test.go @@ -254,6 +254,8 @@ def init(g, handle): in: ` $(warning this is the warning) $(warning) +$(warning # this warning starts with a pound) +$(warning this warning has a # in the middle) $(info this is the info) $(error this is the error) PRODUCT_NAME:=$(shell echo *) @@ -264,6 +266,8 @@ def init(g, handle): cfg = rblf.cfg(handle) rblf.mkwarning("product.mk", "this is the warning") rblf.mkwarning("product.mk", "") + rblf.mkwarning("product.mk", "# this warning starts with a pound") + rblf.mkwarning("product.mk", "this warning has a # in the middle") rblf.mkinfo("product.mk", "this is the info") rblf.mkerror("product.mk", "this is the error") cfg["PRODUCT_NAME"] = rblf.shell("echo *")